def testMethod(self):
        source = """
class A
	method static first
	method const second: int
		param a: A
		param x: double
		"""
        core = WppCore()
        module = core.createRootModule(
            Context.createFromMemory(source, 'A.memory'))
        a = module.dictionary['A']
        self.assertIn('first', a.dictionary)
        over1 = a.dictionary['first']
        self.assertEqual(over1.name, 'first')
        self.assertIn('static', over1.attrs)

        self.assertIn('second', a.dictionary)
        over2 = a.dictionary['second']
        self.assertEqual(over2.name, 'second')
        self.assertEqual(over2.attrs, {'public'})
        fn2 = over2.items[0]
        self.assertEqual(fn2.name, 'second')
        self.assertIn('const', fn2.attrs)
        self.assertIn('a', fn2.dictionary)
        self.assertIn('x', fn2.dictionary)
        paramA = fn2.getParams()[0]
        self.assertEqual(paramA.name, 'a')
        self.assertEqual(paramA.getLocalType().type, 'TypeName')
        self.assertEqual(paramA.getLocalType().getTypeTaxon(), a)
    def testFieldInClass(self):
        source = """
class public simple Point
class public Rect
	field public a: Point
		# this is a
	field b: Point
		# this is b
		"""
        core = WppCore()
        module = core.createRootModule(
            Context.createFromMemory(source, 'First.memory'))
        classPoint = module.dictionary['Point']
        classRect = module.dictionary['Rect']
        self.assertIn('a', classRect.dictionary)
        self.assertIn('b', classRect.dictionary)

        a = classRect.dictionary['a']
        self.assertEqual(a.type, 'Field')
        self.assertEqual(a.name, 'a')
        self.assertEqual(a.getLocalType().getTypeTaxon(), classPoint)
        self.assertEqual(a.getAccessLevel(), 'public')

        b = classRect.dictionary['b']
        self.assertEqual(b.name, 'b')
        self.assertEqual(b.getAccessLevel(), 'private')
        outContext = OutContextMemory()
        b.export(outContext)
        self.assertEqual(str(outContext), 'field b: Point\n\t# this is b')
    def testExtends(self):
        source = """
class public A
class public B
	extends A
class public C
	extends B
		"""
        ctx = Context.createFromMemory(source, 'textExt.memory')
        core = WppCore()
        module = core.createRootModule(ctx)
        self.assertEqual(module.type, 'Module')
        self.assertEqual(module.name, 'textExt')
        self.assertIn('A', module.dictionary)
        self.assertIn('B', module.dictionary)
        self.assertIn('C', module.dictionary)
        a = module.dictionary['A']
        b = module.dictionary['B']
        c = module.dictionary['C']
        self.assertEqual(b.getParent(), a)

        outCtx = OutContextMemory()
        b.export(outCtx)
        text = '\n'.join(outCtx.lines)
        self.assertEqual(text, 'class public B\n\textends A')

        outCtx = OutContextMemory()
        c.export(outCtx)
        text = '\n'.join(outCtx.lines)
        self.assertEqual(text, 'class public C\n\textends B')
	def testLocalVar(self):
		source = """
func localVar
	var tmp: int = 222
	var second: int = tmp + 1
		"""
		core = WppCore()
		module = core.createRootModule(Context.createFromMemory(source, 'localVar.fake'))
		over = module.dictionary['localVar']
		func = over.items[0]
		block = func.getBody()
		self.assertEqual(len(block.items), 2)
		cmd1 = block.items[0]
		self.assertEqual(cmd1.type, 'Var')

		outContext = OutContextMemory()
		cmd1.export(outContext)
		self.assertEqual(str(outContext), 'var tmp: int = 222')

		cmd2 = block.items[1]
		self.assertEqual(cmd2.type, 'Var')
		self.assertEqual(cmd2.name, 'second')
		val = cmd2.getValueTaxon()
		self.assertEqual(val.type, 'BinOp')
		varExpr = val.getLeft()
		self.assertEqual(varExpr.type, 'IdExpr')
		self.assertEqual(varExpr.id, 'tmp')
		self.assertEqual(varExpr.name, '')
		d1 = varExpr.getDeclaration()
		self.assertEqual(d1, cmd1)
    def testFuncWithParams(self):
        source = """
func func03: double
	# with params
	param in x: double = 0
	param in y: double = -1
		"""
        core = WppCore()
        module = core.createRootModule(
            Context.createFromMemory(source, 'func03.fake'))
        over = module.dictionary['func03']
        func = over.items[0]
        params = func.getParams()
        self.assertEqual(len(params), 2)
        self.assertIn('x', func.dictionary)
        self.assertEqual(params[1].name, 'y')
        self.assertEqual(params[1].type, 'Param')

        outContext = OutContextMemory()
        params[0].export(outContext)
        self.assertEqual(str(outContext), 'param in x: double = 0')

        outContext = OutContextMemoryStream()
        module.export(outContext)
        self.assertEqual(str(outContext), source.strip())
 def testAttributes(self):
     core = WppCore()
     # Error - Incompatible attributes used
     ctx = Context.createFromMemory('class public private A', 'A.memory')
     with self.assertRaises(ErrorTaxon) as ex:
         module = core.createRootModule(ctx)
     ctx = Context.createFromMemory('class static abstract B', 'B.memory')
     with self.assertRaises(ErrorTaxon) as ex:
         module = core.createRootModule(ctx)
     ctx = Context.createFromMemory('class protected C', 'C.memory')
     with self.assertRaises(ErrorTaxon) as ex:
         module = core.createRootModule(ctx)
     ctx = Context.createFromMemory('class static D', 'D.memory')
     module = core.createRootModule(ctx)
     self.assertIn('D', module.dictionary)
     d = module.dictionary['D']
     # Квалификатор доступа должен автоматически установиться в public
     self.assertEqual(d.getAccessLevel(), 'public')
	def testWrongLocalVar(self):
		source = """
func localVar
	var tmp: int = 222
	var second: int = tmp1 + 1
		"""
		core = WppCore()
		with self.assertRaises(ErrorTaxon) as ex:
			module = core.createRootModule(Context.createFromMemory(source, 'localVar.fake'))
		self.assertEqual(ex.exception.args[0], 'Name "tmp1" is not defined')
    def testInitValue(self):
        source = """
class A
	field counter: int = -1
		"""
        core = WppCore()
        module = core.createRootModule(
            Context.createFromMemory(source, 'First.memory'))
        classA = module.dictionary['A']
        counter = classA.dictionary['counter']
        self.assertEqual(counter.getLocalType().exportString(), 'int')
        v = counter.getValueTaxon()
        self.assertIsNotNone(v)
        self.assertEqual(v.exportString(), '-1')
 def testTypeName(self):
     source = """class public A"""
     core = WppCore()
     ctx = Context.createFromMemory(source, 'A.memory')
     module = core.createRootModule(ctx)
     classA = module.dictionary['A']
     self.assertEqual(classA.type, 'Class')
     # Создать таксон типа из строкового описания. Со ссылкой на класс внутри модуля
     typeTaxon = WppType.create('const ref A', ctx)
     self.assertEqual(typeTaxon.type, 'TypeName')
     # Хотя это бессмысленно, но добавить тип в модуль.Чтобы в процессе update была найдена ссылка на класс A
     module.addItem(typeTaxon)
     typeTaxon.fullUpdate()
     declA = typeTaxon.getTypeTaxon()
     self.assertEqual(classA, declA)
    def testComments(self):
        source = """
class public MyClass
	# This is comment
		"""
        core = WppCore()
        module = core.createRootModule(
            Context.createFromMemory(source, 'MyClass.memory'))
        myClass = module.dictionary['MyClass']
        self.assertEqual(myClass.getComment(), ' This is comment')

        outCtx = OutContextMemory()
        myClass.export(outCtx)
        self.assertEqual(str(outCtx),
                         'class public MyClass\n\t# This is comment')
 def testFuncSimple(self):
     core = WppCore()
     module = core.createRootModule(
         Context.createFromMemory('func simple1', 'simple1.fake'))
     self.assertIn('simple1', module.dictionary)
     over = module.dictionary['simple1']
     self.assertEqual(over.type, 'Overloads')
     self.assertEqual(over.name, 'simple1')
     self.assertEqual(len(over.items), 1)
     self.assertIn('public', over.attrs)  # Autoincluded by module
     func = over.items[0]
     self.assertEqual(func.type, 'Func')
     self.assertEqual(func.name, 'simple1')
     self.assertIsNone(func.getResultType())
     self.assertEqual(func.getParams(), [])
    def testFuncWithResult(self):
        core = WppCore()
        module = core.createRootModule(
            Context.createFromMemory('func pure simple2: int', 'simple2.fake'))
        over = module.dictionary['simple2']
        func = over.items[0]
        self.assertEqual(func.name, 'simple2')
        self.assertIn('pure', func.attrs)
        taxonResult = func.getResultType()
        self.assertEqual(taxonResult.type, 'TypeName')

        outContext = OutContextMemory()
        func.export(outContext)
        self.assertEqual(str(outContext), 'func pure simple2: int')

        outContext = OutContextMemoryStream()
        module.export(outContext)
        self.assertEqual(str(outContext), 'func pure simple2: int')
    def testVarInModule(self):
        source = """
class public First
var private myVar: First
	# This is my variable
		"""
        core = WppCore()
        module = core.createRootModule(
            Context.createFromMemory(source, 'First.memory'))
        self.assertIn('First', module.dictionary)
        self.assertIn('myVar', module.dictionary)
        classFirst = module.dictionary['First']
        myVar = module.dictionary['myVar']
        self.assertEqual(myVar.name, 'myVar')
        self.assertEqual(myVar.type, 'Var')
        localType = myVar.getLocalType()
        self.assertEqual(localType.type, 'TypeName')
        self.assertEqual(localType.getTypeTaxon(), classFirst)

        outContext = OutContextMemory()
        myVar.export(outContext)
        self.assertEqual(str(outContext),
                         'var private myVar: First\n\t# This is my variable')