| Index: tools/nixysa/nixysa/syntax_tree_unittest.py
|
| ===================================================================
|
| --- tools/nixysa/nixysa/syntax_tree_unittest.py (revision 0)
|
| +++ tools/nixysa/nixysa/syntax_tree_unittest.py (revision 0)
|
| @@ -0,0 +1,1114 @@
|
| +#!/usr/bin/python2.4
|
| +#
|
| +# Copyright 2008 Google Inc.
|
| +#
|
| +# Licensed under the Apache License, Version 2.0 (the "License");
|
| +# you may not use this file except in compliance with the License.
|
| +# You may obtain a copy of the License at
|
| +#
|
| +# http://www.apache.org/licenses/LICENSE-2.0
|
| +#
|
| +# Unless required by applicable law or agreed to in writing, software
|
| +# distributed under the License is distributed on an "AS IS" BASIS,
|
| +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +# See the License for the specific language governing permissions and
|
| +# limitations under the License.
|
| +
|
| +"""Test for syntax_tree."""
|
| +
|
| +import unittest
|
| +import idl_parser
|
| +import syntax_tree
|
| +
|
| +_location = idl_parser.SourceLocation(idl_parser.File('test.idl'), 0)
|
| +
|
| +
|
| +def MakeType(name):
|
| + return syntax_tree.Typename(_location, {}, name)
|
| +
|
| +
|
| +def MakeScope(name):
|
| + return ContextMock([], [], name, None)
|
| +
|
| +
|
| +class TypeReferenceMock(syntax_tree.TypeReference):
|
| + def __init__(self, return_type):
|
| + syntax_tree.TypeReference.__init__(self, _location)
|
| + self.return_type = return_type
|
| + self.context = None
|
| + self.scoped = None
|
| +
|
| + def GetTypeInternal(self, context, scoped):
|
| + self.context = context
|
| + self.scoped = scoped
|
| + return self.return_type
|
| +
|
| +
|
| +class ContextMock(syntax_tree.Definition):
|
| + defn_type = 'ContextMock'
|
| +
|
| + def __init__(self, types_list, scopes_list, name, parent):
|
| + syntax_tree.Definition.__init__(self, _location, [], name)
|
| + self.is_scope = True
|
| + self.types_dict = dict([(type_defn.name, type_defn) for type_defn
|
| + in types_list])
|
| + self.scopes_list = scopes_list
|
| + for o in scopes_list + types_list:
|
| + o.parent = self
|
| + self.parent = parent
|
| +
|
| + def LookUpType(self, name):
|
| + if name in self.types_dict:
|
| + return self.types_dict[name]
|
| + else:
|
| + return None
|
| +
|
| + def FindScopes(self, name):
|
| + return [scope for scope in self.scopes_list if scope.name == name]
|
| +
|
| +
|
| +class TypeReferenceTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.type_defn = MakeType('Type')
|
| + self.context = ContextMock([], [], None, None)
|
| +
|
| + def testGetTypeSuccess(self):
|
| + mock = TypeReferenceMock(self.type_defn)
|
| + return_type = mock.GetType(self.context)
|
| + self.assertEquals(return_type, self.type_defn)
|
| + self.assertEquals(mock.context, self.context)
|
| + self.assertEquals(mock.scoped, False)
|
| +
|
| + def testGetTypeFailure(self):
|
| + mock = TypeReferenceMock(None)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, mock.GetType, self.context)
|
| + self.assertEquals(mock.context, self.context)
|
| + self.assertEquals(mock.scoped, False)
|
| +
|
| +
|
| +class NameTypeReferenceTest(unittest.TestCase):
|
| + def setUp(self):
|
| + # Context2 {
|
| + # Type1;
|
| + # Type3;
|
| + # Context1 {
|
| + # Type1;
|
| + # Type2;
|
| + # }
|
| + # }
|
| + self.type1_c1 = MakeType('Type1')
|
| + self.type2_c1 = MakeType('Type2')
|
| + self.context1 = ContextMock([self.type1_c1, self.type2_c1], [], 'Context1',
|
| + None)
|
| + self.type1_c2 = MakeType('Type1')
|
| + self.type3_c2 = MakeType('Type3')
|
| + self.context2 = ContextMock([self.type1_c2, self.type3_c2], [self.context1],
|
| + 'Context2', None)
|
| + self.type1_ref = syntax_tree.NameTypeReference(_location, 'Type1')
|
| + self.type2_ref = syntax_tree.NameTypeReference(_location, 'Type2')
|
| + self.type3_ref = syntax_tree.NameTypeReference(_location, 'Type3')
|
| +
|
| + def testGetTypeInScope(self):
|
| + self.assertEquals(self.type1_c1, self.type1_ref.GetType(self.context1))
|
| + self.assertEquals(self.type2_c1, self.type2_ref.GetType(self.context1))
|
| + self.assertEquals(self.type3_c2, self.type3_ref.GetType(self.context2))
|
| +
|
| + def testGetTypeFromOuterScope(self):
|
| + self.assertEquals(self.type1_c2, self.type1_ref.GetType(self.context2))
|
| + self.assertRaises(syntax_tree.TypeNotFoundError,
|
| + self.type2_ref.GetType, self.context2)
|
| +
|
| + def testGetTypeFromInnerScope(self):
|
| + self.assertEquals(self.type3_c2, self.type3_ref.GetType(self.context1))
|
| +
|
| +
|
| +class ScopedTypeReferenceTest(unittest.TestCase):
|
| + def setUp(self):
|
| + # Context3 {
|
| + # Type1;
|
| + # Type2;
|
| + # Context1 {
|
| + # Type1;
|
| + # }
|
| + # Context2 {
|
| + # Type1;
|
| + # }
|
| + # }
|
| + self.type1_c1 = MakeType('Type1')
|
| + self.context1 = ContextMock([self.type1_c1], [], 'Context1', None)
|
| + self.type1_c2 = MakeType('Type1')
|
| + self.context2 = ContextMock([self.type1_c2], [], 'Context2', None)
|
| + self.type1_c3 = MakeType('Type1')
|
| + self.type2_c3 = MakeType('Type2')
|
| + self.context3 = ContextMock([self.type1_c3, self.type2_c3],
|
| + [self.context1, self.context2], 'Context3',
|
| + None)
|
| + self.type1_ref = syntax_tree.NameTypeReference(_location, 'Type1')
|
| + self.type2_ref = syntax_tree.NameTypeReference(_location, 'Type2')
|
| + self.c1_t1_ref = syntax_tree.ScopedTypeReference(_location, 'Context1',
|
| + self.type1_ref)
|
| + self.c2_t1_ref = syntax_tree.ScopedTypeReference(_location, 'Context2',
|
| + self.type1_ref)
|
| + self.c1_t2_ref = syntax_tree.ScopedTypeReference(_location, 'Context1',
|
| + self.type2_ref)
|
| +
|
| + def testGetTypeFromOuterScope(self):
|
| + self.assertEquals(self.type1_c1, self.c1_t1_ref.GetType(self.context3))
|
| + self.assertEquals(self.type1_c2, self.c2_t1_ref.GetType(self.context3))
|
| +
|
| + def testGetTypeFromInnerScope(self):
|
| + self.assertEquals(self.type1_c1, self.c1_t1_ref.GetType(self.context1))
|
| + self.assertEquals(self.type1_c2, self.c2_t1_ref.GetType(self.context1))
|
| + self.assertEquals(self.type1_c1, self.c1_t1_ref.GetType(self.context2))
|
| + self.assertEquals(self.type1_c2, self.c2_t1_ref.GetType(self.context2))
|
| +
|
| + def testGetInexistentType(self):
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, self.c1_t2_ref.GetType,
|
| + self.context1)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, self.c1_t2_ref.GetType,
|
| + self.context2)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, self.c1_t2_ref.GetType,
|
| + self.context3)
|
| +
|
| +
|
| +class ArrayTypeReferenceTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.type_defn = MakeType('Type')
|
| + self.context = ContextMock([self.type_defn], [], 'Context', None)
|
| + self.type_ref = syntax_tree.NameTypeReference(_location, 'Type')
|
| + self.nonexist_type_ref = syntax_tree.NameTypeReference(_location,
|
| + 'NonexistentType')
|
| +
|
| + def testGetType(self):
|
| + unsized_ref = syntax_tree.ArrayTypeReference(_location, self.type_ref, None)
|
| + unsized_array = self.type_defn.GetArrayType(None)
|
| + self.assertEquals(unsized_ref.GetType(self.context), unsized_array)
|
| + sized_ref = syntax_tree.ArrayTypeReference(_location, self.type_ref, 3)
|
| + sized_array = self.type_defn.GetArrayType(3)
|
| + self.assertEquals(sized_ref.GetType(self.context), sized_array)
|
| +
|
| + def testGetInexistentType(self):
|
| + unsized_ref = syntax_tree.ArrayTypeReference(_location,
|
| + self.nonexist_type_ref, None)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, unsized_ref.GetType,
|
| + self.context)
|
| + sized_ref = syntax_tree.ArrayTypeReference(_location,
|
| + self.nonexist_type_ref, 5)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, sized_ref.GetType,
|
| + self.context)
|
| +
|
| +
|
| +class QualifiedTypeReferenceTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.type_defn = MakeType('Type')
|
| + self.context = ContextMock([self.type_defn], [], 'Context', None)
|
| + self.type_ref = syntax_tree.NameTypeReference(_location, 'Type')
|
| + self.nonexist_type_ref = syntax_tree.NameTypeReference(_location,
|
| + 'NonexistentType')
|
| +
|
| + def testGetType(self):
|
| + qualified_ref = syntax_tree.QualifiedTypeReference(_location, 'const',
|
| + self.type_ref)
|
| + self.assertEquals(qualified_ref.GetType(self.context), self.type_defn)
|
| +
|
| + def testGetInexistentType(self):
|
| + qualified_ref = syntax_tree.QualifiedTypeReference(_location, 'const',
|
| + self.nonexist_type_ref)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, qualified_ref.GetType,
|
| + self.context)
|
| +
|
| +
|
| +class DefinitionTest(unittest.TestCase):
|
| + def setUp(self):
|
| + pass
|
| +
|
| + def testGetParentScopeStack(self):
|
| + definition1 = syntax_tree.Definition(_location, [], 'Definition1')
|
| + definition1.is_scope = True
|
| + definition2 = syntax_tree.Definition(_location, [], 'Definition2')
|
| + definition2.parent = definition1
|
| + definition2.is_scope = True
|
| + definition3 = syntax_tree.Definition(_location, [], 'Definition3')
|
| + definition3.parent = definition2
|
| + self.assertEquals(definition1.GetParentScopeStack(), [])
|
| + self.assertEquals(definition2.GetParentScopeStack(), [definition1])
|
| + self.assertEquals(definition3.GetParentScopeStack(), [definition1,
|
| + definition2])
|
| +
|
| + def testGetDefinitionInclude(self):
|
| + definition1 = syntax_tree.Definition(_location, [], 'Definition1')
|
| + self.assertEquals(definition1.GetDefinitionInclude(), _location.file.header)
|
| + include = '/path/to/header.h'
|
| + definition2 = syntax_tree.Definition(_location, {'include': include},
|
| + 'Definition2')
|
| + self.assertEquals(definition2.GetDefinitionInclude(), include)
|
| +
|
| + def testGetArrayTypeFail(self):
|
| + definition = syntax_tree.Definition(_location, [], 'Definition')
|
| + definition.is_type = False
|
| + self.assertRaises(syntax_tree.ArrayOfNonTypeError, definition.GetArrayType,
|
| + None)
|
| + self.assertRaises(syntax_tree.ArrayOfNonTypeError, definition.GetArrayType,
|
| + 5)
|
| +
|
| + def testGetArrayType(self):
|
| + definition = syntax_tree.Definition(_location, [], 'Definition')
|
| + definition.is_type = True
|
| + unsized = definition.GetArrayType(None)
|
| + self.assertEquals(unsized.data_type, definition)
|
| + self.assertEquals(unsized.size, None)
|
| + self.assertEquals(unsized, definition.GetArrayType(None))
|
| + sized = definition.GetArrayType(3)
|
| + self.assertEquals(sized.data_type, definition)
|
| + self.assertEquals(sized.size, 3)
|
| + self.assertEquals(sized, definition.GetArrayType(3))
|
| +
|
| + def testLookUpTypeRecursive(self):
|
| + type1_c1 = MakeType('Type1')
|
| + type2_c1 = MakeType('Type2')
|
| + context1 = ContextMock([type1_c1, type2_c1], [], 'Context1', None)
|
| + type1_c2 = MakeType('Type1')
|
| + context2 = ContextMock([type1_c2], [], 'Context2', context1)
|
| + self.assertEquals(context1.LookUpTypeRecursive('Type1'), type1_c1)
|
| + self.assertEquals(context1.LookUpTypeRecursive('Type2'), type2_c1)
|
| + self.assertEquals(context1.LookUpTypeRecursive('Type3'), None)
|
| + self.assertEquals(context2.LookUpTypeRecursive('Type1'), type1_c2)
|
| + self.assertEquals(context2.LookUpTypeRecursive('Type2'), type2_c1)
|
| + self.assertEquals(context2.LookUpTypeRecursive('Type3'), None)
|
| +
|
| + def testFindScopesRecursive(self):
|
| + scope1_c1 = MakeScope('Scope1')
|
| + scope2_c1 = MakeScope('Scope2')
|
| + context1 = ContextMock([], [scope1_c1, scope2_c1], 'Context1', None)
|
| + scope1_c2 = MakeScope('Scope1')
|
| + context2 = ContextMock([], [scope1_c2], 'Context2', context1)
|
| + self.assertEquals(context1.FindScopesRecursive('Scope1'), [scope1_c1])
|
| + self.assertEquals(context1.FindScopesRecursive('Scope2'), [scope2_c1])
|
| + self.assertEquals(context2.FindScopesRecursive('Scope1'), [scope1_c2,
|
| + scope1_c1])
|
| + self.assertEquals(context2.FindScopesRecursive('Scope2'), [scope2_c1])
|
| + context3 = ContextMock([], [context1], 'Context3', None)
|
| + self.assertEquals(context3.FindScopesRecursive('Scope1'), [])
|
| + self.assertEquals(context3.FindScopesRecursive('Scope2'), [])
|
| +
|
| + def testSetBindingModel(self):
|
| + class DefinitionMock(syntax_tree.Definition):
|
| + defn_type = 'DefinitionMock'
|
| +
|
| + def __init__(self, name, binding_model_name):
|
| + syntax_tree.Definition.__init__(self, _location, [], name)
|
| + self.binding_model_name = binding_model_name
|
| + self.is_type = True
|
| +
|
| + def LookUpBindingModel(self):
|
| + return self.binding_model_name
|
| +
|
| + bm_binding_model = object()
|
| + unsized_array_binding_model = object()
|
| + sized_array_binding_model = object()
|
| + binding_models = {'bm': bm_binding_model,
|
| + 'unsized_array': unsized_array_binding_model,
|
| + 'sized_array': sized_array_binding_model}
|
| + definition1 = DefinitionMock('Definition1', 'bm')
|
| + definition1.SetBindingModel(binding_models)
|
| + self.assertEquals(definition1.binding_model, bm_binding_model)
|
| + definition2 = DefinitionMock('Definition2', 'non_bm')
|
| + self.assertRaises(syntax_tree.UnknownBindingModelError,
|
| + definition2.SetBindingModel, binding_models)
|
| + definition3 = DefinitionMock('Definition3', 'bm')
|
| + unsized_array = definition3.GetArrayType(None)
|
| + sized_array = definition3.GetArrayType(21)
|
| + definition3.SetBindingModel(binding_models)
|
| + self.assertEquals(unsized_array.binding_model, unsized_array_binding_model)
|
| + self.assertEquals(sized_array.binding_model, sized_array_binding_model)
|
| +
|
| +
|
| +class ClassTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.type1_c1 = MakeType('Type1')
|
| + self.type2 = MakeType('Type2')
|
| + self.scope1_c1 = MakeScope('Scope1')
|
| + self.scope2 = MakeScope('Scope2')
|
| + self.class1 = syntax_tree.Class(_location, {'binding_model': 'bm1'},
|
| + 'Class1', None,
|
| + [self.type1_c1, self.type2, self.scope1_c1,
|
| + self.scope2])
|
| + self.type1_c2 = MakeType('Type1')
|
| + self.type3 = MakeType('Type3')
|
| + self.scope1_c2 = MakeScope('Scope1')
|
| + self.scope3 = MakeScope('Scope3')
|
| + self.class1_ref = TypeReferenceMock(self.class1)
|
| + self.class2 = syntax_tree.Class(_location, {}, 'Class2', self.class1_ref,
|
| + [self.type1_c2, self.type3, self.scope1_c2,
|
| + self.scope3])
|
| + self.class3 = syntax_tree.Class(_location, {},
|
| + 'Class3', None, [self.class1, self.class2])
|
| + invalid_base = MakeType('Type5')
|
| + self.class4 = syntax_tree.Class(_location, {}, 'Class4',
|
| + TypeReferenceMock(invalid_base), [])
|
| + self.type1_global = MakeType('Type1')
|
| + self.type4 = MakeType('Type4')
|
| + self.context = ContextMock([self.class3, self.type1_global, self.type4],
|
| + [self.class3], 'Context', None)
|
| +
|
| + def testTypeScope(self):
|
| + for c in [self.class1, self.class2, self.class3, self.class4]:
|
| + self.assertTrue(c.is_type)
|
| + self.assertTrue(c.is_scope)
|
| +
|
| + def testParent(self):
|
| + self.assertEquals(self.type1_c1.parent, self.class1)
|
| + self.assertEquals(self.type2.parent, self.class1)
|
| + self.assertEquals(self.scope1_c1.parent, self.class1)
|
| + self.assertEquals(self.scope2.parent, self.class1)
|
| + self.assertEquals(self.type1_c2.parent, self.class2)
|
| + self.assertEquals(self.type3.parent, self.class2)
|
| + self.assertEquals(self.scope1_c2.parent, self.class2)
|
| + self.assertEquals(self.scope3.parent, self.class2)
|
| + self.assertEquals(self.class1.parent, self.class3)
|
| + self.assertEquals(self.class2.parent, self.class3)
|
| +
|
| + def testResolveTypeReferences(self):
|
| + self.assertEquals(self.class1._types_resolved, False)
|
| + self.class1.ResolveTypeReferences()
|
| + self.assertEquals(self.class1.base_type, None)
|
| + self.assertEquals(self.class1._types_resolved, True)
|
| + self.class2.ResolveTypeReferences()
|
| + self.assertEquals(self.class2._types_resolved, True)
|
| + self.assertEquals(self.class2.base_type, self.class1)
|
| + # check that the type resolution for class2 happened in the correct scope
|
| + self.assertEquals(self.class1_ref.context, self.class3)
|
| + self.assertEquals(self.class1_ref.scoped, False)
|
| + self.assertRaises(syntax_tree.DerivingFromNonClassError,
|
| + self.class4.ResolveTypeReferences)
|
| +
|
| + def testGetBaseSafe(self):
|
| + self.assertEquals(self.class1.GetBaseSafe(), None)
|
| + self.assertEquals(self.class2.GetBaseSafe(), self.class1)
|
| + self.assertEquals(self.class3.GetBaseSafe(), None)
|
| + self.assertRaises(syntax_tree.DerivingFromNonClassError,
|
| + self.class4.GetBaseSafe)
|
| +
|
| + def testGetObjectsRecursive(self):
|
| + class1_list = self.class1.GetObjectsRecursive()
|
| + self.assertEquals(class1_list[0], self.class1)
|
| + class1_list.sort()
|
| + class1_list_expected = [self.class1, self.type1_c1, self.type2,
|
| + self.scope1_c1, self.scope2]
|
| + class1_list_expected.sort()
|
| + self.assertEquals(class1_list, class1_list_expected)
|
| + class2_list = self.class2.GetObjectsRecursive()
|
| + self.assertEquals(class2_list[0], self.class2)
|
| + class2_list.sort()
|
| + class2_list_expected = [self.class2, self.type1_c2, self.type3,
|
| + self.scope1_c2, self.scope3]
|
| + class2_list_expected.sort()
|
| + self.assertEquals(class2_list, class2_list_expected)
|
| + class3_list = self.class3.GetObjectsRecursive()
|
| + self.assertEquals(class3_list[0], self.class3)
|
| + class3_list.sort()
|
| + class3_list_expected = [self.class3] + class1_list + class2_list
|
| + class3_list_expected.sort()
|
| + self.assertEquals(class3_list, class3_list_expected)
|
| +
|
| + def testLookUpType(self):
|
| + self.assertEquals(self.class1.LookUpType('Type1'), self.type1_c1)
|
| + self.assertEquals(self.class1.LookUpType('Type2'), self.type2)
|
| + self.assertEquals(self.class1.LookUpType('Type3'), None)
|
| + self.assertEquals(self.class1.LookUpType('Type4'), None)
|
| + self.assertEquals(self.class1.LookUpType('Class1'), None)
|
| + self.assertEquals(self.class1.LookUpType('Class2'), None)
|
| + self.assertEquals(self.class1.LookUpType('Class3'), None)
|
| + self.assertEquals(self.class1.LookUpType('Scope1'), None)
|
| + self.assertEquals(self.class1.LookUpType('Scope2'), None)
|
| + self.assertEquals(self.class1.LookUpType('Scope3'), None)
|
| +
|
| + self.assertEquals(self.class2.LookUpType('Type1'), self.type1_c2)
|
| + self.assertEquals(self.class2.LookUpType('Type2'), self.type2)
|
| + self.assertEquals(self.class2.LookUpType('Type3'), self.type3)
|
| + self.assertEquals(self.class2.LookUpType('Type4'), None)
|
| + self.assertEquals(self.class2.LookUpType('Class1'), None)
|
| + self.assertEquals(self.class2.LookUpType('Class2'), None)
|
| + self.assertEquals(self.class2.LookUpType('Class3'), None)
|
| + self.assertEquals(self.class2.LookUpType('Scope1'), None)
|
| + self.assertEquals(self.class2.LookUpType('Scope2'), None)
|
| + self.assertEquals(self.class2.LookUpType('Scope3'), None)
|
| +
|
| + self.assertEquals(self.class3.LookUpType('Type1'), None)
|
| + self.assertEquals(self.class3.LookUpType('Type2'), None)
|
| + self.assertEquals(self.class3.LookUpType('Type3'), None)
|
| + self.assertEquals(self.class3.LookUpType('Type4'), None)
|
| + self.assertEquals(self.class3.LookUpType('Class1'), self.class1)
|
| + self.assertEquals(self.class3.LookUpType('Class2'), self.class2)
|
| + self.assertEquals(self.class3.LookUpType('Class3'), None)
|
| + self.assertEquals(self.class3.LookUpType('Scope1'), None)
|
| + self.assertEquals(self.class3.LookUpType('Scope2'), None)
|
| + self.assertEquals(self.class3.LookUpType('Scope3'), None)
|
| +
|
| + def testFindScopes(self):
|
| + self.assertEquals(self.class1.FindScopes('Class1'), [])
|
| + self.assertEquals(self.class1.FindScopes('Class2'), [])
|
| + self.assertEquals(self.class1.FindScopes('Type1'), [])
|
| + self.assertEquals(self.class1.FindScopes('Type2'), [])
|
| + self.assertEquals(self.class1.FindScopes('Scope1'), [self.scope1_c1])
|
| + self.assertEquals(self.class1.FindScopes('Scope2'), [self.scope2])
|
| + self.assertEquals(self.class1.FindScopes('Scope3'), [])
|
| +
|
| + self.assertEquals(self.class2.FindScopes('Class1'), [])
|
| + self.assertEquals(self.class2.FindScopes('Class2'), [])
|
| + self.assertEquals(self.class2.FindScopes('Type1'), [])
|
| + self.assertEquals(self.class2.FindScopes('Type2'), [])
|
| + self.assertEquals(self.class2.FindScopes('Scope1'), [self.scope1_c2,
|
| + self.scope1_c1])
|
| + self.assertEquals(self.class2.FindScopes('Scope2'), [self.scope2])
|
| + self.assertEquals(self.class2.FindScopes('Scope3'), [self.scope3])
|
| +
|
| + self.assertEquals(self.class3.FindScopes('Class1'), [self.class1])
|
| + self.assertEquals(self.class3.FindScopes('Class2'), [self.class2])
|
| + self.assertEquals(self.class3.FindScopes('Type1'), [])
|
| + self.assertEquals(self.class3.FindScopes('Type2'), [])
|
| + self.assertEquals(self.class3.FindScopes('Scope1'), [])
|
| + self.assertEquals(self.class3.FindScopes('Scope2'), [])
|
| + self.assertEquals(self.class3.FindScopes('Scope3'), [])
|
| +
|
| + def testLookUpBindingModel(self):
|
| + self.assertEquals(self.class1.LookUpBindingModel(), 'bm1')
|
| + self.assertEquals(self.class2.LookUpBindingModel(), 'bm1')
|
| + self.assertEquals(self.class3.LookUpBindingModel(), None)
|
| + self.assertRaises(syntax_tree.DerivingFromNonClassError,
|
| + self.class4.LookUpBindingModel)
|
| +
|
| +
|
| +class NamespaceTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.type1_n1 = MakeType('Type1')
|
| + self.type2 = MakeType('Type2')
|
| + self.scope1_n1 = MakeScope('Scope1')
|
| + self.scope2 = MakeScope('Scope2')
|
| + self.ns1 = syntax_tree.Namespace(_location, {}, 'ns1',
|
| + [self.type1_n1, self.type2,
|
| + self.scope1_n1, self.scope2])
|
| + self.type1_n2 = MakeType('Type1')
|
| + self.type3 = MakeType('Type3')
|
| + self.scope1_n2 = MakeScope('Scope1')
|
| + self.scope3 = MakeScope('Scope3')
|
| + self.ns2 = syntax_tree.Namespace(_location, {}, 'ns2',
|
| + [self.type1_n2, self.type3,
|
| + self.scope1_n2, self.scope3])
|
| + self.type_ns1 = MakeType('ns1')
|
| + self.ns3 = syntax_tree.Namespace(_location, {}, 'ns3', [self.ns1, self.ns2,
|
| + self.type_ns1])
|
| +
|
| + def testTypeScope(self):
|
| + for ns in [self.ns1, self.ns2, self.ns3]:
|
| + self.assertFalse(ns.is_type)
|
| + self.assertTrue(ns.is_scope)
|
| +
|
| + def testParents(self):
|
| + self.assertEquals(self.type1_n1.parent, self.ns1)
|
| + self.assertEquals(self.type2.parent, self.ns1)
|
| + self.assertEquals(self.scope1_n1.parent, self.ns1)
|
| + self.assertEquals(self.scope2.parent, self.ns1)
|
| + self.assertEquals(self.type1_n2.parent, self.ns2)
|
| + self.assertEquals(self.type3.parent, self.ns2)
|
| + self.assertEquals(self.scope1_n2.parent, self.ns2)
|
| + self.assertEquals(self.scope3.parent, self.ns2)
|
| + self.assertEquals(self.ns1.parent, self.ns3)
|
| + self.assertEquals(self.ns2.parent, self.ns3)
|
| + self.assertEquals(self.type_ns1.parent, self.ns3)
|
| +
|
| + def testGetObjectsRecursive(self):
|
| + ns1_list = self.ns1.GetObjectsRecursive()
|
| + self.assertEquals(ns1_list[0], self.ns1)
|
| + ns1_list.sort()
|
| + ns1_list_expected = [self.ns1, self.type1_n1, self.type2,
|
| + self.scope1_n1, self.scope2]
|
| + ns1_list_expected.sort()
|
| + self.assertEquals(ns1_list, ns1_list_expected)
|
| + ns2_list = self.ns2.GetObjectsRecursive()
|
| + self.assertEquals(ns2_list[0], self.ns2)
|
| + ns2_list.sort()
|
| + ns2_list_expected = [self.ns2, self.type1_n2, self.type3,
|
| + self.scope1_n2, self.scope3]
|
| + ns2_list_expected.sort()
|
| + self.assertEquals(ns2_list, ns2_list_expected)
|
| + ns3_list = self.ns3.GetObjectsRecursive()
|
| + self.assertEquals(ns3_list[0], self.ns3)
|
| + ns3_list.sort()
|
| + ns3_list_expected = [self.ns3, self.type_ns1] + ns1_list + ns2_list
|
| + ns3_list_expected.sort()
|
| + self.assertEquals(ns3_list, ns3_list_expected)
|
| +
|
| + def testLookUpType(self):
|
| + self.assertEquals(self.ns1.LookUpType('Type1'), self.type1_n1)
|
| + self.assertEquals(self.ns1.LookUpType('Type2'), self.type2)
|
| + self.assertEquals(self.ns1.LookUpType('Type3'), None)
|
| + self.assertEquals(self.ns1.LookUpType('ns1'), None)
|
| + self.assertEquals(self.ns1.LookUpType('ns2'), None)
|
| + self.assertEquals(self.ns1.LookUpType('ns3'), None)
|
| + self.assertEquals(self.ns1.LookUpType('Scope1'), None)
|
| + self.assertEquals(self.ns1.LookUpType('Scope2'), None)
|
| + self.assertEquals(self.ns1.LookUpType('Scope3'), None)
|
| +
|
| + self.assertEquals(self.ns2.LookUpType('Type1'), self.type1_n2)
|
| + self.assertEquals(self.ns2.LookUpType('Type2'), None)
|
| + self.assertEquals(self.ns2.LookUpType('Type3'), self.type3)
|
| + self.assertEquals(self.ns2.LookUpType('ns1'), None)
|
| + self.assertEquals(self.ns2.LookUpType('ns2'), None)
|
| + self.assertEquals(self.ns2.LookUpType('ns3'), None)
|
| + self.assertEquals(self.ns2.LookUpType('Scope1'), None)
|
| + self.assertEquals(self.ns2.LookUpType('Scope2'), None)
|
| + self.assertEquals(self.ns2.LookUpType('Scope3'), None)
|
| +
|
| + self.assertEquals(self.ns3.LookUpType('Type1'), None)
|
| + self.assertEquals(self.ns3.LookUpType('Type2'), None)
|
| + self.assertEquals(self.ns3.LookUpType('Type3'), None)
|
| + self.assertEquals(self.ns3.LookUpType('ns1'), self.type_ns1)
|
| + self.assertEquals(self.ns3.LookUpType('ns2'), None)
|
| + self.assertEquals(self.ns3.LookUpType('ns3'), None)
|
| + self.assertEquals(self.ns3.LookUpType('Scope1'), None)
|
| + self.assertEquals(self.ns3.LookUpType('Scope2'), None)
|
| + self.assertEquals(self.ns3.LookUpType('Scope3'), None)
|
| +
|
| + def testFindScopes(self):
|
| + self.assertEquals(self.ns1.FindScopes('ns1'), [])
|
| + self.assertEquals(self.ns1.FindScopes('ns2'), [])
|
| + self.assertEquals(self.ns1.FindScopes('Type1'), [])
|
| + self.assertEquals(self.ns1.FindScopes('Type2'), [])
|
| + self.assertEquals(self.ns1.FindScopes('Scope1'), [self.scope1_n1])
|
| + self.assertEquals(self.ns1.FindScopes('Scope2'), [self.scope2])
|
| + self.assertEquals(self.ns1.FindScopes('Scope3'), [])
|
| +
|
| + self.assertEquals(self.ns2.FindScopes('ns1'), [])
|
| + self.assertEquals(self.ns2.FindScopes('ns2'), [])
|
| + self.assertEquals(self.ns2.FindScopes('Type1'), [])
|
| + self.assertEquals(self.ns2.FindScopes('Type2'), [])
|
| + self.assertEquals(self.ns2.FindScopes('Scope1'), [self.scope1_n2])
|
| + self.assertEquals(self.ns2.FindScopes('Scope2'), [])
|
| + self.assertEquals(self.ns2.FindScopes('Scope3'), [self.scope3])
|
| +
|
| + self.assertEquals(self.ns3.FindScopes('ns1'), [self.ns1])
|
| + self.assertEquals(self.ns3.FindScopes('ns2'), [self.ns2])
|
| + self.assertEquals(self.ns3.FindScopes('Type1'), [])
|
| + self.assertEquals(self.ns3.FindScopes('Type2'), [])
|
| + self.assertEquals(self.ns3.FindScopes('Scope1'), [])
|
| + self.assertEquals(self.ns3.FindScopes('Scope2'), [])
|
| + self.assertEquals(self.ns3.FindScopes('Scope3'), [])
|
| +
|
| + def testMergeLookUpScope(self):
|
| + type1 = MakeType('Type1')
|
| + type2 = MakeType('Type2')
|
| + scope1 = MakeScope('Scope1')
|
| + scope2 = MakeScope('Scope2')
|
| + ns1 = syntax_tree.Namespace(_location, {}, 'ns', [type1, type2, scope1,
|
| + scope2])
|
| + ns1_list_copy = ns1.defn_list[:]
|
| + type3 = MakeType('Type3')
|
| + type4 = MakeType('Type4')
|
| + scope3 = MakeScope('Scope3')
|
| + scope4 = MakeScope('Scope4')
|
| + ns2 = syntax_tree.Namespace(_location, {}, 'ns', [type3, type4, scope3,
|
| + scope4])
|
| + ns2_list_copy = ns2.defn_list[:]
|
| + ns1.MergeLookUpScope(ns2)
|
| + self.assertEquals(ns1.scope, ns2.scope)
|
| + for ns in [ns1, ns2]:
|
| + self.assertEquals(ns.LookUpType('Type1'), type1)
|
| + self.assertEquals(ns.LookUpType('Type2'), type2)
|
| + self.assertEquals(ns.LookUpType('Type3'), type3)
|
| + self.assertEquals(ns.LookUpType('Type4'), type4)
|
| + self.assertEquals(ns.FindScopes('Scope1'), [scope1])
|
| + self.assertEquals(ns.FindScopes('Scope2'), [scope2])
|
| + self.assertEquals(ns.FindScopes('Scope3'), [scope3])
|
| + self.assertEquals(ns.FindScopes('Scope4'), [scope4])
|
| + self.assertEquals(ns1.defn_list, ns1_list_copy)
|
| + self.assertEquals(ns2.defn_list, ns2_list_copy)
|
| +
|
| +
|
| +class EnumTest(unittest.TestCase):
|
| + def setUp(self):
|
| + value1 = syntax_tree.Enum.Value('VALUE1', 1)
|
| + value2 = syntax_tree.Enum.Value('VALUE2', None)
|
| + self.enum1 = syntax_tree.Enum(_location, {}, 'Enum1', [value1, value2])
|
| + self.enum2 = syntax_tree.Enum(_location, {'binding_model': 'ignored'},
|
| + 'Enum1', [value1, value2])
|
| +
|
| + def testTypeScope(self):
|
| + for e in [self.enum1, self.enum2]:
|
| + self.assertTrue(e.is_type)
|
| + self.assertFalse(e.is_scope)
|
| +
|
| + def testGetObjectsRecursive(self):
|
| + for e in [self.enum1, self.enum2]:
|
| + self.assertEquals(e.GetObjectsRecursive(), [e])
|
| +
|
| + def testLookUpBindingModel(self):
|
| + for e in [self.enum1, self.enum2]:
|
| + self.assertEquals(e.LookUpBindingModel(), 'enum')
|
| +
|
| +
|
| +class FunctionTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.type1 = MakeType('Type1')
|
| + self.type2 = MakeType('Type2')
|
| + self.f1_p1_ref = TypeReferenceMock(self.type1)
|
| + self.f1_p2_ref = TypeReferenceMock(self.type2)
|
| + self.function1 = syntax_tree.Function(_location, {}, 'Function1', None,
|
| + [(self.f1_p1_ref, 'p1'),
|
| + (self.f1_p2_ref, 'p2')])
|
| + self.f2_ret_ref = TypeReferenceMock(self.type1)
|
| + self.function2 = syntax_tree.Function(_location, {}, 'Function2',
|
| + self.f2_ret_ref, [])
|
| + self.f3_p1_ref = TypeReferenceMock(None)
|
| + self.function3 = syntax_tree.Function(_location, {}, 'Function3', None,
|
| + [(self.f3_p1_ref, 'p1')])
|
| + self.f4_ret_ref = TypeReferenceMock(None)
|
| + self.function4 = syntax_tree.Function(_location, {}, 'Function4',
|
| + self.f4_ret_ref, [])
|
| + self.scope = ContextMock([self.type1, self.type2, self.function1,
|
| + self.function2, self.function3, self.function4],
|
| + [], 'globals', None)
|
| +
|
| + def testTypeScope(self):
|
| + for f in [self.function1, self.function2, self.function3, self.function4]:
|
| + self.assertFalse(f.is_type)
|
| + self.assertFalse(f.is_scope)
|
| +
|
| + def testParams(self):
|
| + self.assertEquals(self.function1.params[0].name, 'p1')
|
| + self.assertEquals(self.function1.params[0].mutable, False)
|
| + self.assertEquals(self.function1.params[1].name, 'p2')
|
| + self.assertEquals(self.function1.params[1].mutable, False)
|
| + self.assertEquals(self.function2.params, [])
|
| + self.assertEquals(self.function3.params[0].name, 'p1')
|
| + self.assertEquals(self.function3.params[0].mutable, False)
|
| + self.assertEquals(self.function4.params, [])
|
| +
|
| + def testResolveTypeReferences(self):
|
| + self.function1.ResolveTypeReferences()
|
| + self.assertEquals(self.function1.type_defn, None)
|
| + self.assertEquals(self.function1.params[0].type_defn, self.type1)
|
| + self.assertEquals(self.function1.params[1].type_defn, self.type2)
|
| + self.function2.ResolveTypeReferences()
|
| + self.assertEquals(self.function2.type_defn, self.type1)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError,
|
| + self.function3.ResolveTypeReferences)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError,
|
| + self.function4.ResolveTypeReferences)
|
| + for ref in [self.f1_p1_ref, self.f1_p2_ref, self.f2_ret_ref,
|
| + self.f3_p1_ref, self.f4_ret_ref]:
|
| + self.assertEquals(ref.context, self.scope)
|
| + self.assertEquals(ref.scoped, False)
|
| +
|
| +
|
| +class CallbackTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.type1 = MakeType('Type1')
|
| + self.type2 = MakeType('Type2')
|
| + self.c1_p1_ref = TypeReferenceMock(self.type1)
|
| + self.c1_p2_ref = TypeReferenceMock(self.type2)
|
| + self.callback1 = syntax_tree.Callback(_location, {}, 'Callback1', None,
|
| + [(self.c1_p1_ref, 'p1'),
|
| + (self.c1_p2_ref, 'p2')])
|
| + self.c2_ret_ref = TypeReferenceMock(self.type1)
|
| + self.callback2 = syntax_tree.Callback(_location, {}, 'Callback2',
|
| + self.c2_ret_ref, [])
|
| + self.c3_p1_ref = TypeReferenceMock(None)
|
| + self.callback3 = syntax_tree.Callback(_location, {}, 'Callback3', None,
|
| + [(self.c3_p1_ref, 'p1')])
|
| + self.c4_ret_ref = TypeReferenceMock(None)
|
| + self.callback4 = syntax_tree.Callback(_location,
|
| + {'binding_model': 'test_bm'},
|
| + 'Callback4', self.c4_ret_ref, [])
|
| + self.scope = ContextMock([self.type1, self.type2, self.callback1,
|
| + self.callback2, self.callback3, self.callback4],
|
| + [], 'globals', None)
|
| +
|
| + def testTypeScope(self):
|
| + for c in [self.callback1, self.callback2, self.callback3, self.callback4]:
|
| + self.assertTrue(c.is_type)
|
| + self.assertFalse(c.is_scope)
|
| +
|
| + def testParams(self):
|
| + self.assertEquals(self.callback1.params[0].name, 'p1')
|
| + self.assertEquals(self.callback1.params[0].mutable, False)
|
| + self.assertEquals(self.callback1.params[1].name, 'p2')
|
| + self.assertEquals(self.callback1.params[1].mutable, False)
|
| + self.assertEquals(self.callback2.params, [])
|
| + self.assertEquals(self.callback3.params[0].name, 'p1')
|
| + self.assertEquals(self.callback3.params[0].mutable, False)
|
| + self.assertEquals(self.callback4.params, [])
|
| +
|
| + def testResolveTypeReferences(self):
|
| + self.callback1.ResolveTypeReferences()
|
| + self.assertEquals(self.callback1.type_defn, None)
|
| + self.assertEquals(self.callback1.params[0].type_defn, self.type1)
|
| + self.assertEquals(self.callback1.params[1].type_defn, self.type2)
|
| + self.callback2.ResolveTypeReferences()
|
| + self.assertEquals(self.callback2.type_defn, self.type1)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError,
|
| + self.callback3.ResolveTypeReferences)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError,
|
| + self.callback4.ResolveTypeReferences)
|
| + for ref in [self.c1_p1_ref, self.c1_p2_ref, self.c2_ret_ref,
|
| + self.c3_p1_ref, self.c4_ret_ref]:
|
| + self.assertEquals(ref.context, self.scope)
|
| + self.assertEquals(ref.scoped, False)
|
| +
|
| + def testLookUpBindingModel(self):
|
| + self.assertEquals(self.callback1.LookUpBindingModel(), 'callback')
|
| + self.assertEquals(self.callback2.LookUpBindingModel(), 'callback')
|
| + self.assertEquals(self.callback3.LookUpBindingModel(), 'callback')
|
| + self.assertEquals(self.callback4.LookUpBindingModel(), 'test_bm')
|
| +
|
| +
|
| +class VariableTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.type_defn = MakeType('Type')
|
| + self.v1_type_ref = TypeReferenceMock(self.type_defn)
|
| + self.v2_type_ref = TypeReferenceMock(None)
|
| + self.variable1 = syntax_tree.Variable(_location, {}, 'Variable1',
|
| + self.v1_type_ref)
|
| + self.variable2 = syntax_tree.Variable(_location, {}, 'Variable2',
|
| + self.v2_type_ref)
|
| + self.scope = ContextMock([self.type_defn, self.variable1, self.variable2],
|
| + [], 'globals', None)
|
| +
|
| + def testTypeScope(self):
|
| + for v in [self.variable1, self.variable2]:
|
| + self.assertFalse(v.is_type)
|
| + self.assertFalse(v.is_scope)
|
| +
|
| + def testResolveTypeReferences(self):
|
| + self.variable1.ResolveTypeReferences()
|
| + self.assertEquals(self.variable1.type_defn, self.type_defn)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError,
|
| + self.variable2.ResolveTypeReferences)
|
| + for ref in [self.v1_type_ref, self.v2_type_ref]:
|
| + self.assertEquals(ref.context, self.scope)
|
| + self.assertEquals(ref.scoped, False)
|
| +
|
| +
|
| +class TypedefTest(unittest.TestCase):
|
| + def setUp(self):
|
| + self.base_type1 = syntax_tree.Typename(_location, {'binding_model': 'bm1'},
|
| + 'BaseType1')
|
| + self.base_type2_t = MakeType('Type')
|
| + self.base_type2_s = MakeScope('Scope')
|
| + self.base_type2 = syntax_tree.Class(_location, {'binding_model': 'bm2'},
|
| + 'BaseType2', None, [self.base_type2_t,
|
| + self.base_type2_s])
|
| + self.t1_ref = TypeReferenceMock(self.base_type1)
|
| + self.typedef1 = syntax_tree.Typedef(_location, {}, 'Typedef1', self.t1_ref)
|
| + self.t2_ref = TypeReferenceMock(self.typedef1)
|
| + self.typedef2 = syntax_tree.Typedef(_location, {}, 'Typedef2', self.t2_ref)
|
| + self.t3_ref = TypeReferenceMock(None)
|
| + self.typedef3 = syntax_tree.Typedef(_location, {}, 'Typedef3', self.t3_ref)
|
| + self.t4_ref = TypeReferenceMock(self.base_type2)
|
| + self.typedef4 = syntax_tree.Typedef(_location, {}, 'Typedef4', self.t4_ref)
|
| + self.t5_ref = TypeReferenceMock(self.base_type2)
|
| + self.typedef5 = syntax_tree.Typedef(_location, {'binding_model': 'bm3'},
|
| + 'Typedef5', self.t5_ref)
|
| + self.scope = ContextMock([self.base_type1, self.base_type2, self.typedef1,
|
| + self.typedef2, self.typedef3, self.typedef4,
|
| + self.typedef5], [], 'globals', None)
|
| +
|
| + def testTypeScope(self):
|
| + for t in [self.typedef1, self.typedef2, self.typedef3, self.typedef4,
|
| + self.typedef5]:
|
| + self.assertTrue(t.is_type)
|
| + self.assertTrue(t.is_scope)
|
| +
|
| + def testResolveTypeReferences(self):
|
| + self.typedef1.ResolveTypeReferences()
|
| + self.assertEquals(self.typedef1.type_defn, self.base_type1)
|
| + self.typedef2.ResolveTypeReferences()
|
| + self.assertEquals(self.typedef2.type_defn, self.typedef1)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError,
|
| + self.typedef3.ResolveTypeReferences)
|
| + self.typedef4.ResolveTypeReferences()
|
| + self.assertEquals(self.typedef4.type_defn, self.base_type2)
|
| + self.typedef5.ResolveTypeReferences()
|
| + self.assertEquals(self.typedef5.type_defn, self.base_type2)
|
| + for typedef in [self.typedef1, self.typedef2, self.typedef3, self.typedef4,
|
| + self.typedef5]:
|
| + self.assertTrue(typedef._types_resolved)
|
| + for ref in [self.t1_ref, self.t2_ref, self.t3_ref, self.t4_ref,
|
| + self.t5_ref]:
|
| + self.assertEquals(ref.context, self.scope)
|
| + self.assertEquals(ref.scoped, False)
|
| +
|
| + def testGetTypeSafe(self):
|
| + self.assertEquals(self.typedef1.GetTypeSafe(), self.base_type1)
|
| + self.assertEquals(self.typedef2.GetTypeSafe(), self.typedef1)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, self.typedef3.GetTypeSafe)
|
| + self.assertEquals(self.typedef4.GetTypeSafe(), self.base_type2)
|
| + self.assertEquals(self.typedef5.GetTypeSafe(), self.base_type2)
|
| +
|
| + def testLookUpBindingModel(self):
|
| + self.assertEquals(self.typedef1.LookUpBindingModel(), 'bm1')
|
| + self.assertEquals(self.typedef2.LookUpBindingModel(), 'bm1')
|
| + self.assertRaises(syntax_tree.TypeNotFoundError,
|
| + self.typedef3.LookUpBindingModel)
|
| + self.assertEquals(self.typedef4.LookUpBindingModel(), 'bm2')
|
| + self.assertEquals(self.typedef5.LookUpBindingModel(), 'bm3')
|
| +
|
| + def testGetFinalType(self):
|
| + self.assertEquals(self.typedef1.GetFinalType(), self.base_type1)
|
| + self.assertEquals(self.typedef2.GetFinalType(), self.base_type1)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, self.typedef3.GetFinalType)
|
| + self.assertEquals(self.typedef4.GetFinalType(), self.base_type2)
|
| + self.assertEquals(self.typedef5.GetFinalType(), self.base_type2)
|
| +
|
| + def testLookUpType(self):
|
| + for t in [self.typedef1, self.typedef2]:
|
| + self.assertEquals(t.LookUpType('Type'), None)
|
| + self.assertEquals(t.LookUpType('NonType'), None)
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, self.typedef3.LookUpType,
|
| + 'Type')
|
| + for t in [self.typedef4, self.typedef5]:
|
| + self.assertEquals(t.LookUpType('Type'), self.base_type2_t)
|
| + self.assertEquals(t.LookUpType('NonType'), None)
|
| +
|
| + def testFindScopes(self):
|
| + for t in [self.typedef1, self.typedef2]:
|
| + self.assertEquals(t.FindScopes('Scope'), [])
|
| + self.assertEquals(t.FindScopes('NonScope'), [])
|
| + self.assertRaises(syntax_tree.TypeNotFoundError, self.typedef3.FindScopes,
|
| + 'Scope')
|
| + for t in [self.typedef4, self.typedef5]:
|
| + self.assertEquals(t.FindScopes('Scope'), [self.base_type2_s])
|
| + self.assertEquals(t.FindScopes('NonScope'), [])
|
| +
|
| +
|
| +class TypenameTest(unittest.TestCase):
|
| + def testTypename(self):
|
| + typename = syntax_tree.Typename(_location, {'binding_model': 'bm'}, 'Type')
|
| + self.assertTrue(typename.is_type)
|
| + self.assertFalse(typename.is_scope)
|
| + self.assertEquals(typename.LookUpBindingModel(), 'bm')
|
| +
|
| +
|
| +class VerbatimTest(unittest.TestCase):
|
| + def testVerbatim(self):
|
| + verbatim = syntax_tree.Verbatim(_location, {}, 'verbatim')
|
| + self.assertFalse(verbatim.is_type)
|
| + self.assertFalse(verbatim.is_scope)
|
| +
|
| +
|
| +class ArrayTest(unittest.TestCase):
|
| + def testArray(self):
|
| + data_type = syntax_tree.Typename(_location, {'binding_model': 'bm1'},
|
| + 'BaseType')
|
| + unsized_array = syntax_tree.Array(data_type, None)
|
| + sized_array = syntax_tree.Array(data_type, 42)
|
| + for a in [unsized_array, sized_array]:
|
| + self.assertTrue(a.is_type)
|
| + self.assertFalse(a.is_scope)
|
| + self.assertEquals(a.GetObjectsRecursive(), [a])
|
| + self.assertEquals(sized_array.LookUpBindingModel(), 'sized_array')
|
| + self.assertEquals(unsized_array.LookUpBindingModel(), 'unsized_array')
|
| +
|
| +
|
| +class CheckTypeInChainTest(unittest.TestCase):
|
| + def testTypedef2(self):
|
| + # typedef Typedef1 Typedef2;
|
| + # typedef Typedef2 Typedef1;
|
| + type1_ref = syntax_tree.NameTypeReference(_location, 'Typedef2')
|
| + type1 = syntax_tree.Typedef(_location, {}, 'Typedef1', type1_ref)
|
| + type2_ref = syntax_tree.NameTypeReference(_location, 'Typedef1')
|
| + type2 = syntax_tree.Typedef(_location, {}, 'Typedef2', type2_ref)
|
| + unused_scope1 = ContextMock([type1, type2], [], 'globals', None)
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type1)
|
| + type1.ResolveTypeReferences()
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + syntax_tree.CheckTypeInChain, type2, type1)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + type2.ResolveTypeReferences)
|
| +
|
| + def testTypedef3(self):
|
| + # typedef Typedef1 Typedef2;
|
| + # typedef Typedef2 Typedef3;
|
| + # typedef Typedef3 Typedef1;
|
| + type1_ref = syntax_tree.NameTypeReference(_location, 'Typedef2')
|
| + type1 = syntax_tree.Typedef(_location, {}, 'Typedef1', type1_ref)
|
| + type2_ref = syntax_tree.NameTypeReference(_location, 'Typedef3')
|
| + type2 = syntax_tree.Typedef(_location, {}, 'Typedef2', type2_ref)
|
| + type3_ref = syntax_tree.NameTypeReference(_location, 'Typedef1')
|
| + type3 = syntax_tree.Typedef(_location, {}, 'Typedef3', type3_ref)
|
| + unused_scope1 = ContextMock([type1, type2, type3], [], 'globals', None)
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type3)
|
| + syntax_tree.CheckTypeInChain(type3, type1)
|
| + type1.ResolveTypeReferences()
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type3)
|
| + syntax_tree.CheckTypeInChain(type3, type1)
|
| + type2.ResolveTypeReferences()
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type3)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + syntax_tree.CheckTypeInChain, type3, type1)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + type3.ResolveTypeReferences)
|
| +
|
| + def testClass2(self):
|
| + # class Class1: Class2 {};
|
| + # class Class2: Class1 {};
|
| + type1_ref = syntax_tree.NameTypeReference(_location, 'Class2')
|
| + type1 = syntax_tree.Class(_location, {}, 'Class1', type1_ref, [])
|
| + type2_ref = syntax_tree.NameTypeReference(_location, 'Class1')
|
| + type2 = syntax_tree.Class(_location, {}, 'Class2', type2_ref, [])
|
| + unused_scope1 = ContextMock([type1, type2], [], 'globals', None)
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type1)
|
| + type1.ResolveTypeReferences()
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + syntax_tree.CheckTypeInChain, type2, type1)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + type2.ResolveTypeReferences)
|
| +
|
| + def testClass3(self):
|
| + # class Class1: Class2 {};
|
| + # class Class2: Class3 {};
|
| + # class Class3: Class1 {};
|
| + type1_ref = syntax_tree.NameTypeReference(_location, 'Class2')
|
| + type1 = syntax_tree.Class(_location, {}, 'Class1', type1_ref, [])
|
| + type2_ref = syntax_tree.NameTypeReference(_location, 'Class3')
|
| + type2 = syntax_tree.Class(_location, {}, 'Class2', type2_ref, [])
|
| + type3_ref = syntax_tree.NameTypeReference(_location, 'Class1')
|
| + type3 = syntax_tree.Class(_location, {}, 'Class3', type3_ref, [])
|
| + unused_scope1 = ContextMock([type1, type2, type3], [], 'globals', None)
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type3)
|
| + syntax_tree.CheckTypeInChain(type3, type1)
|
| + type1.ResolveTypeReferences()
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type3)
|
| + syntax_tree.CheckTypeInChain(type3, type1)
|
| + type2.ResolveTypeReferences()
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type3)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + syntax_tree.CheckTypeInChain, type3, type1)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + type3.ResolveTypeReferences)
|
| +
|
| + def testArray(self):
|
| + # typedef Typedef1[] Typedef1;
|
| + type1_ref_ref = syntax_tree.NameTypeReference(_location, 'Typedef1')
|
| + type1_ref = syntax_tree.ArrayTypeReference(_location, type1_ref_ref, None)
|
| + type1 = syntax_tree.Typedef(_location, {}, 'Typedef1', type1_ref)
|
| + unused_scope1 = ContextMock([type1], [], 'globals', None)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + type1.ResolveTypeReferences)
|
| +
|
| + def testMixed(self):
|
| + # typedef Class Typedef;
|
| + # class Class: Typedef {};
|
| + type1_ref = syntax_tree.NameTypeReference(_location, 'Class')
|
| + type1 = syntax_tree.Typedef(_location, {}, 'Typedef', type1_ref)
|
| + type2_ref = syntax_tree.NameTypeReference(_location, 'Typedef')
|
| + type2 = syntax_tree.Class(_location, {}, 'Class', type2_ref, [])
|
| + unused_scope1 = ContextMock([type1, type2], [], 'globals', None)
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + syntax_tree.CheckTypeInChain(type2, type1)
|
| + type1.ResolveTypeReferences()
|
| + syntax_tree.CheckTypeInChain(type1, type2)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + syntax_tree.CheckTypeInChain, type2, type1)
|
| + self.assertRaises(syntax_tree.CircularTypedefError,
|
| + type2.ResolveTypeReferences)
|
| +
|
| +
|
| +class LookUpScopeTest(unittest.TestCase):
|
| + def testLookUpScope(self):
|
| + type1 = MakeType('Type1')
|
| + type2 = MakeType('Type2')
|
| + scope1 = MakeScope('Scope1')
|
| + scope2 = MakeScope('Scope2')
|
| + scope = syntax_tree.LookUpScope([type1, type2, scope1, scope2])
|
| + self.assertEquals(scope.LookUpType('Type1'), type1)
|
| + self.assertEquals(scope.LookUpType('Type2'), type2)
|
| + self.assertEquals(scope.LookUpType('Type3'), None)
|
| + self.assertEquals(scope.LookUpType('Scope1'), None)
|
| + self.assertEquals(scope.LookUpType('Scope2'), None)
|
| + self.assertEquals(scope.LookUpType('Scope3'), None)
|
| + self.assertEquals(scope.FindScopes('Type1'), [])
|
| + self.assertEquals(scope.FindScopes('Type2'), [])
|
| + self.assertEquals(scope.FindScopes('Type3'), [])
|
| + self.assertEquals(scope.FindScopes('Scope1'), [scope1])
|
| + self.assertEquals(scope.FindScopes('Scope2'), [scope2])
|
| + self.assertEquals(scope.FindScopes('Scope3'), [])
|
| + type3 = MakeType('Type3')
|
| + scope3 = MakeScope('Scope3')
|
| + scope3_bis = MakeScope('Scope3')
|
| + scope.list.extend([type3, scope3, scope3_bis])
|
| + scope.ResetCache()
|
| + self.assertEquals(scope.LookUpType('Type1'), type1)
|
| + self.assertEquals(scope.LookUpType('Type2'), type2)
|
| + self.assertEquals(scope.LookUpType('Type3'), type3)
|
| + self.assertEquals(scope.LookUpType('Scope1'), None)
|
| + self.assertEquals(scope.LookUpType('Scope2'), None)
|
| + self.assertEquals(scope.LookUpType('Scope3'), None)
|
| + self.assertEquals(scope.FindScopes('Type1'), [])
|
| + self.assertEquals(scope.FindScopes('Type2'), [])
|
| + self.assertEquals(scope.FindScopes('Type3'), [])
|
| + self.assertEquals(scope.FindScopes('Scope1'), [scope1])
|
| + self.assertEquals(scope.FindScopes('Scope2'), [scope2])
|
| + self.assertEquals(scope.FindScopes('Scope3'), [scope3, scope3_bis])
|
| +
|
| +
|
| +class GetObjectsRecursiveTest(unittest.TestCase):
|
| + def testGetObjectsRecursive(self):
|
| + class1 = syntax_tree.Class(_location, {}, 'Class1', None,
|
| + [MakeType('Type1'), MakeType('Type2'),
|
| + MakeScope('Scope1'), MakeScope('Scope2')])
|
| + class2 = syntax_tree.Class(_location, {}, 'Class1', None,
|
| + [MakeType('Type1'), MakeType('Type3'),
|
| + MakeScope('Scope2'), MakeScope('Scope3')])
|
| + type1 = MakeType('Type1')
|
| + scope1 = MakeScope('Scope1')
|
| + self.assertEquals(syntax_tree.GetObjectsRecursive([class1, class2, type1,
|
| + scope1]),
|
| + class1.GetObjectsRecursive() +
|
| + class2.GetObjectsRecursive() +
|
| + type1.GetObjectsRecursive() +
|
| + scope1.GetObjectsRecursive())
|
| +
|
| +
|
| +class MergeNamespacesRecursive(unittest.TestCase):
|
| + def testMergeNamespaceResucrsive(self):
|
| + def MakeNamespace(name, defn_list):
|
| + return syntax_tree.Namespace(_location, {}, name, defn_list)
|
| +
|
| + ns1_1 = MakeNamespace('Namespace1', [MakeType('Type1_1'),
|
| + MakeScope('Scope1_1')])
|
| + ns1_2 = MakeNamespace('Namespace1', [MakeType('Type1_2'),
|
| + MakeScope('Scope1_2')])
|
| + ns2_1 = MakeNamespace('Namespace2', [ns1_1, ns1_2])
|
| + ns1_3 = MakeNamespace('Namespace1', [MakeType('Type1_3'),
|
| + MakeScope('Scope1_3')])
|
| + ns1_4 = MakeNamespace('Namespace1', [MakeType('Type1_4'),
|
| + MakeScope('Scope1_4')])
|
| + ns2_2 = MakeNamespace('Namespace2', [ns1_3, ns1_4])
|
| + ns = MakeNamespace('global', [ns2_1, ns2_2])
|
| + syntax_tree.MergeNamespacesRecursive(ns)
|
| + self.assertEquals(ns2_1.scope, ns2_2.scope)
|
| + self.assertNotEquals(ns2_1.defn_list, ns2_2.defn_list)
|
| + self.assertEquals(ns1_1.scope, ns1_2.scope)
|
| + self.assertEquals(ns1_1.scope, ns1_3.scope)
|
| + self.assertEquals(ns1_1.scope, ns1_4.scope)
|
| + self.assertNotEquals(ns1_1.defn_list, ns1_2.defn_list)
|
| + self.assertNotEquals(ns1_1.defn_list, ns1_3.defn_list)
|
| + self.assertNotEquals(ns1_1.defn_list, ns1_4.defn_list)
|
| + self.assertNotEquals(ns1_2.defn_list, ns1_3.defn_list)
|
| + self.assertNotEquals(ns1_2.defn_list, ns1_4.defn_list)
|
| + self.assertNotEquals(ns1_3.defn_list, ns1_4.defn_list)
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
|
|
| Property changes on: tools/nixysa/nixysa/syntax_tree_unittest.py
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|