import stdio
import t, c
import string


# ============================================================
# eq_test - ==、!=、is、is not、None 比较测试
#
# 验证比较表达式的翻译，特别是 None 常量和 is/is not 操作符
# ============================================================


def test_int_eq():
    stdio.printf("--- Test 1: int == / != ---\n")

    a: t.CInt = 42
    b: t.CInt = 42
    c3: t.CInt = 99

    if a == b:
        stdio.printf("int == int (same) OK\n")
    else:
        stdio.printf("int == int (same) FAIL\n")

    if a != c3:
        stdio.printf("int != int (diff) OK\n")
    else:
        stdio.printf("int != int (diff) FAIL\n")

    if not (a == c3):
        stdio.printf("not (int == diff) OK\n")
    else:
        stdio.printf("not (int == diff) FAIL\n")


def test_int_cmp():
    stdio.printf("--- Test 2: int < > <= >= ---\n")

    a: t.CInt = 5
    b: t.CInt = 10

    if a < b:
        stdio.printf("int < OK\n")
    else:
        stdio.printf("int < FAIL\n")

    if b > a:
        stdio.printf("int > OK\n")
    else:
        stdio.printf("int > FAIL\n")

    if a <= 5:
        stdio.printf("int <= OK\n")
    else:
        stdio.printf("int <= FAIL\n")

    if b >= 10:
        stdio.printf("int >= OK\n")
    else:
        stdio.printf("int >= FAIL\n")


def test_ptr_is_none():
    stdio.printf("--- Test 3: ptr is None / is not None ---\n")

    # strchr 找到字符返回非空指针，找不到返回 None
    p: str = string.strchr("Hello", 108)  # 'l' = 108
    if p is not None:
        stdio.printf("strchr found, is not None OK\n")
    else:
        stdio.printf("strchr found, is not None FAIL\n")

    p2: str = string.strchr("Hello", 122)  # 'z' = 122, not found
    if p2 is None:
        stdio.printf("strchr not found, is None OK\n")
    else:
        stdio.printf("strchr not found, is None FAIL\n")


def test_ptr_assign_none():
    stdio.printf("--- Test 4: assign None and compare ---\n")

    p: str = None
    if p is None:
        stdio.printf("None assign, is None OK\n")
    else:
        stdio.printf("None assign, is None FAIL\n")

    if p is not None:
        stdio.printf("None assign, is not None FAIL\n")
    else:
        stdio.printf("None assign, is not None OK\n")


def test_ptr_eq_none():
    stdio.printf("--- Test 5: ptr == None / != None ---\n")

    p: str = string.strstr("Hello World", "World")
    if p != None:
        stdio.printf("strstr found, != None OK\n")
    else:
        stdio.printf("strstr found, != None FAIL\n")

    p2: str = string.strstr("Hello", "xyz")
    if p2 == None:
        stdio.printf("strstr not found, == None OK\n")
    else:
        stdio.printf("strstr not found, == None FAIL\n")


def test_bool_logic():
    stdio.printf("--- Test 6: bool and/or ---\n")

    a: t.CInt = 1
    b: t.CInt = 0

    if a and b:
        stdio.printf("1 and 0 = true FAIL\n")
    else:
        stdio.printf("1 and 0 = false OK\n")

    if a or b:
        stdio.printf("1 or 0 = true OK\n")
    else:
        stdio.printf("1 or 0 = true FAIL\n")

    if not b:
        stdio.printf("not 0 = true OK\n")
    else:
        stdio.printf("not 0 = true FAIL\n")


def eq_test() -> int:
    stdio.printf("=== eq_test: ==、!=、is、None 比较测试 ===\n\n")

    test_int_eq()
    test_int_cmp()
    test_ptr_is_none()
    test_ptr_assign_none()
    test_ptr_eq_none()
    test_bool_logic()

    stdio.printf("\n=== eq_test 完成 ===\n")
    return 0
