print("Now comes the language constructions tests.")

# function
def test_func():
    def test_sub_func():
        print("test_function")

    test_sub_func()

# closure
def test_closure(msg):

    def make_closure():
        print(msg)

    return make_closure

# exception
def test_exception():
    try:
        raise Exception("test_exception")

    except Exception:
        pass
    
    finally:
        pass

# listcomp
def test_listcomp():
    print("test_listcomp", [x for x in range(3)])

# lambda
def test_lambda():
    func_obj_1 = lambda a, b: a + b
    print(func_obj_1(10, 20))

# import
def test_import():
    from sys_settrace_subdir import trace_importme
    trace_importme.dummy()
    trace_importme.saysomething()

# class
class TLClass():
    def method():
        pass
    pass

def test_class():
    class TestClass:
        __anynum = -9
        def method(self):
            print("test_class_method")
            self.__anynum += 1
        
        def prprty_getter(self):
            return self.__anynum
        
        def prprty_setter(self, what):
            self.__anynum = what

        prprty = property(prprty_getter, prprty_setter)

    cls = TestClass()
    cls.method()
    print("test_class_property", cls.prprty)
    cls.prprty = 12
    print("test_class_property", cls.prprty)


def run_tests():
    test_func()
    test_closure_inst = test_closure("test_closure")
    test_closure_inst()
    test_exception()
    test_listcomp()
    test_lambda()
    test_class()
    test_import()

print("And it's done!")
