# class defs
class A_CLASS(object):
    a_class_i:int = 0
    def __init__(self:"A_CLASS", x:int):
        self.x = x

    # Bad, self param is missing
    def add(y:int) -> int:
        y = y+self.x
        return y

class B_CLASS(object):
    b_class_i:int = 0

class C_CLASS(B_CLASS):
    pass

# Bad, duplicate class def
class A_CLASS(object):
    pass

# Bad, E_CLASS is not declared
class D_CLASS(E_CLASS):
    pass


# var defs
a_s:str = "a_s"
b_s:str = "b_s"
c_s:str = "c_s"

a_i:int = 0
b_i:int = 0
c_i:int = 0

a_b:bool = False
b_b:bool = False
c_b:bool = False

a_list:[int] = None
b_list:[int] = None
c_list:[int] = None

a_class:A_CLASS = None
b_class:B_CLASS = None
c_class:C_CLASS = None


# fun defs
def f_1() -> object:
    def f_f_1() -> object:
        # a_s:int = 0 Fails if we uncomment this line
        global a_s # Bad, duplicate declarion
        print(a_s)
        pass
    pass

def f_2() -> object:
    f_a_s:str = "s"
    def f_f_2() -> object:
        nonlocal f_a_s
        print(f_a_s)
        pass
    pass

def f_3(x:int) -> bool:
    f_b_s:int = 3
    if (x + f_b_s > 3):
        return True
    elif (x + f_b_s == 3):
        print("Equal") # Bad, this path should return
    return False

def f_4() -> object:
    f_a_i:int = 2
    a_i = f_a_i + 1 # Bad, cant assign to a_i without declaring it as global or nonlocal
    return f_a_i

# NEGATIVE TEST CASES - SEMANTIC
# Bad, f_2 cannot be redefined in the same scope
def f_2() -> object:
    pass

# Bad, print cannot be redefined in the same scope
def print(val:object) -> object:
    pass

# Bad, a_i cannot be redefined in the same scope
a_i:int = 2

# Bad return
return a_i

