def test_get_enum_expression_with_generics(self): generictype = DataType("GT") A = EnumType("A", generic_types={generictype: None}) A.add_case("a", [generictype]) concretetype = DataType("CT") concretetype.newvalue = unittest.mock.MagicMock( return_value="concrete") self.assertEqual( A.specialize(GT=concretetype).newvalue(), "A<CT>.a(concrete)")
def test_deeply_nested_type_is_accessible(self): A = EnumType("A") scope = Scope() scope.add_child(Scope()) scope.children[0].add_child(Scope()) scope.children[0].children[0].add_child(Scope()) scope.children[0].children[0].children[0].add_child(Scope(datatype=A)) self.assertSetEqual(set(scope.accessible_types()), {A})
def test_failable_initializer(self): A = EnumType("A") A.add_case("b", []) tree = SemanticParseTree(statement, [ SemanticParseTree(EnumDeclaration(), [ "enum ", Enum(), " {", EOL(), SemanticParseTree(case_statements, ["case ", Case()]), EOL(), "}" ]), Expression(A) ]) tree.annotate() failable_initializer(tree) self.assertEqual( "enum A {\n\tinit?() { self = A.b }\n\n\tcase b\n}.init()!", tree.string())
def test_enclosing_sibling_type_is_accessible(self): A = EnumType("A") grandparent = Scope() parent = Scope() grandparent.add_child(parent) uncle = Scope(datatype=A) grandparent.add_child(uncle) child = Scope() parent.add_child(child) self.assertSetEqual(set(child.accessible_types()), {A})
def test_accessible_types_access_level_filter(self): A = EnumType("A", access=AccessLevel.public) B = EnumType("B", access=AccessLevel.internal) C = EnumType("C", access=AccessLevel.fileprivate) root = Scope() root.add_child(Scope(None, A)) root.add_child(Scope(None, B)) root.add_child(Scope(None, C)) self.assertSetEqual( set(root.accessible_types(at_least=AccessLevel.fileprivate)), {A, B, C} ) self.assertSetEqual( set(root.accessible_types(at_least=AccessLevel.internal)), {A, B} ) self.assertSetEqual( set(root.accessible_types(at_least=AccessLevel.public)), {A} )
def test_get_enum_expression_with_too_few_generics_throws(self): generictype = DataType("GT") A = EnumType("A", generic_types={generictype: None}) A.add_case("a", [generictype]) with self.assertRaises(AssertionError): A.newvalue()
def test_get_enum_expression_with_associated_value(self): A = EnumType("A") av = DataType("AV") av.newvalue = unittest.mock.MagicMock(return_value="3") A.add_case("a", [av]) self.assertEqual(A.newvalue(), "A.a(3)")
def test_get_enum_expression_with_inferred_type(self): A = EnumType("A") A.add_case("a", []) self.assertEqual(A.newvalue(type_inferred=True), ".a")
def test_get_enum_expression(self): A = EnumType("A") A.add_case("a", []) self.assertEqual(A.newvalue(), "A.a")
def test_build_enum(self): A = EnumType("A") A.add_case("a", []) A.add_case("b", []) A.add_case("c", []) self.assertEqual(len(A.cases), 3)
def test_accessible_types_include_self_filter(self): A = EnumType("A") root = Scope(datatype=A) self.assertSetEqual(set(root.accessible_types()), set()) self.assertSetEqual(set(root.accessible_types(include_self=False)), set()) self.assertSetEqual(set(root.accessible_types(include_self=True)), {A})