commit
						9bf0c359ee
					
				@ -1,14 +1,93 @@
 | 
				
			||||
x:int = 1
 | 
				
			||||
x:int = 2
 | 
				
			||||
# class defs
 | 
				
			||||
class A_CLASS(object):
 | 
				
			||||
    a_class_i:int = 0
 | 
				
			||||
    def __init__(self:"A_CLASS", x:int):
 | 
				
			||||
        self.x = x
 | 
				
			||||
 | 
				
			||||
x
 | 
				
			||||
    # Bad, self param is missing
 | 
				
			||||
    def add(y:int) -> int:
 | 
				
			||||
        y = y+self.x
 | 
				
			||||
        return y
 | 
				
			||||
 | 
				
			||||
def fun_1() -> bool:
 | 
				
			||||
    if True:
 | 
				
			||||
        if True:
 | 
				
			||||
            return True
 | 
				
			||||
    # All path should return, not just one
 | 
				
			||||
class B_CLASS(object):
 | 
				
			||||
    b_class_i:int = 0
 | 
				
			||||
 | 
				
			||||
class C_CLASS(B_CLASS):
 | 
				
			||||
    pass
 | 
				
			||||
 | 
				
			||||
fun_1()
 | 
				
			||||
# 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
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@ -1,83 +1,109 @@
 | 
				
			||||
# Below this point we have all the same test cases from PA1 for validation purposes.
 | 
				
			||||
class Foo(object):
 | 
				
			||||
    x:int = 0
 | 
				
			||||
 | 
				
			||||
    def __init__(self:"Foo", x:int):
 | 
				
			||||
# class defs
 | 
				
			||||
class A_CLASS(object):
 | 
				
			||||
    a_class_i:int = 0
 | 
				
			||||
    def __init__(self:"A_CLASS", x:int):
 | 
				
			||||
        self.x = x
 | 
				
			||||
 | 
				
			||||
    def bar(y:int):
 | 
				
			||||
        print("Hello World!",self.x+y)
 | 
				
			||||
        y = 10
 | 
				
			||||
 | 
				
			||||
def get_stones(name:str)->str:
 | 
				
			||||
    def map_name(nm:str)->str:
 | 
				
			||||
        return stones[color.index(nm)]
 | 
				
			||||
    color=["Red","Blue"]
 | 
				
			||||
    stones=["Mind","Soul"]
 | 
				
			||||
    return map_name(name)
 | 
				
			||||
 | 
				
			||||
def funa():
 | 
				
			||||
    def funb():
 | 
				
			||||
        print("Hello")
 | 
				
			||||
    funb()
 | 
				
			||||
 | 
				
			||||
def fund():
 | 
				
			||||
    def fune():
 | 
				
			||||
        print("Hello")
 | 
				
			||||
    c = 4 + 5
 | 
				
			||||
 | 
				
			||||
def funf():
 | 
				
			||||
    def fung():
 | 
				
			||||
        print("Hello")
 | 
				
			||||
    c = 6
 | 
				
			||||
    c = 4 + 5
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
if True:
 | 
				
			||||
    if True:
 | 
				
			||||
        if True:
 | 
				
			||||
            print("Hello")
 | 
				
			||||
print("World")
 | 
				
			||||
 | 
				
			||||
if True:
 | 
				
			||||
    if True:
 | 
				
			||||
        if True:
 | 
				
			||||
            print("Hello")
 | 
				
			||||
        print("World")
 | 
				
			||||
 | 
				
			||||
if True:
 | 
				
			||||
    if True:
 | 
				
			||||
        if True:
 | 
				
			||||
            print("Hello")
 | 
				
			||||
    print("World")
 | 
				
			||||
 | 
				
			||||
if True:
 | 
				
			||||
    if True:
 | 
				
			||||
        if True:
 | 
				
			||||
            print("Hello")
 | 
				
			||||
    else:
 | 
				
			||||
        print("World")
 | 
				
			||||
 | 
				
			||||
if True:
 | 
				
			||||
    if True:
 | 
				
			||||
        if True:
 | 
				
			||||
            print("Hello")
 | 
				
			||||
else:
 | 
				
			||||
    print("World")
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
f = Foo(1)
 | 
				
			||||
print(f.x)
 | 
				
			||||
f.bar(4)
 | 
				
			||||
 | 
				
			||||
a=[[[1],[2]],[[3],[4]]]
 | 
				
			||||
print(a[0][0][1]*a[1][1][0])
 | 
				
			||||
 | 
				
			||||
multiline_string="Hi World,\
 | 
				
			||||
Here I am"
 | 
				
			||||
 | 
				
			||||
expr_precedence = -a + b * (c + d)
 | 
				
			||||
 | 
				
			||||
stone="Blue"
 | 
				
			||||
print(get_stones(stone))
 | 
				
			||||
    def add(self:"A_CLASS", y:int) -> int:
 | 
				
			||||
        y = y+self.x
 | 
				
			||||
        return y
 | 
				
			||||
 | 
				
			||||
class B_CLASS(object):
 | 
				
			||||
    b_class_i:int = 0
 | 
				
			||||
 | 
				
			||||
class C_CLASS(B_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:
 | 
				
			||||
        global a_s
 | 
				
			||||
        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) -> int:
 | 
				
			||||
    f_b_s:int = 3
 | 
				
			||||
    return x*f_b_s
 | 
				
			||||
 | 
				
			||||
# Declarations
 | 
				
			||||
a_list = [1, 2, 3]
 | 
				
			||||
b_list = [0, 0, 0]
 | 
				
			||||
c_list = [-1, -2, -3]
 | 
				
			||||
 | 
				
			||||
a_class = A_CLASS(5)
 | 
				
			||||
b_class = B_CLASS()
 | 
				
			||||
c_class = C_CLASS()
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# POSITIVE TEST CASES
 | 
				
			||||
 | 
				
			||||
#-------------------
 | 
				
			||||
# String operations
 | 
				
			||||
# String addition and assignment operations
 | 
				
			||||
a_s = a_s + b_s
 | 
				
			||||
print(a_s)
 | 
				
			||||
 | 
				
			||||
# Assigning to a string with string indexing operation
 | 
				
			||||
c_s = a_s[0]
 | 
				
			||||
print(c_s)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# --------------------
 | 
				
			||||
# Boolean operations
 | 
				
			||||
a_b = a_i == b_i and not b_b
 | 
				
			||||
print(a_b)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# --------------------
 | 
				
			||||
# List operations
 | 
				
			||||
a_list = a_list + b_list
 | 
				
			||||
c_i = a_list[0]
 | 
				
			||||
a_list[1] = 2
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# --------------------
 | 
				
			||||
# function operations
 | 
				
			||||
a_i = f_3(3) + 5
 | 
				
			||||
f_1()
 | 
				
			||||
f_2()
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# --------------------
 | 
				
			||||
# class operations
 | 
				
			||||
a_i = a_class.add(2)
 | 
				
			||||
print(a_i)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
a_i = a_class.add(c_class.b_class_i)
 | 
				
			||||
print(a_i)
 | 
				
			||||
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue