def test_list_element(self) -> None: x = List__i32([1, 2, 3]) self.assertTrue(inspectable(x)) self.assertTrue(inspectable(List__i32)) r = inspect(x) self.assertEqual(r.value, int) self.assertEqual(r.kind, NumberType.I32)
def test_set_element(self) -> None: x = Set__Color({Color.red, Color.blue}) self.assertTrue(inspectable(x)) self.assertTrue(inspectable(Set__Color)) r = inspect(x) self.assertEqual(r.value, Color) self.assertEqual(r.kind, NumberType.NOT_A_NUMBER)
def test_struct_fields(self) -> None: r = inspect(Messy) self.assertEqual(len(r.fields), 4) self.assertEqual(r.fields[0].name, "opt_field") self.assertEqual(r.fields[0].type, str) self.assertEqual(r.fields[0].qualifier, Qualifier.OPTIONAL) self.assertEqual(r.fields[0].default, None) self.assertEqual( r.fields[0].annotations, {"some": "annotation", "a.b.c": "d.e.f"} ) self.assertEqual(r.fields[1].name, "req_field") self.assertEqual(r.fields[1].type, str) self.assertEqual(r.fields[1].qualifier, Qualifier.REQUIRED) self.assertEqual(r.fields[1].default, None) self.assertEqual(r.fields[1].annotations, {}) self.assertEqual(r.fields[2].name, "unq_field") self.assertEqual(r.fields[2].type, str) self.assertEqual(r.fields[2].qualifier, Qualifier.NONE) self.assertEqual(r.fields[2].default, "xyzzy") self.assertEqual(r.fields[2].annotations, {}) self.assertEqual(r.fields[3].name, "struct_field") self.assertEqual(r.fields[3].type, Runtime) self.assertEqual(r.fields[3].qualifier, Qualifier.NONE) self.assertEqual( r.fields[3].default, Runtime(bool_val=True, enum_val=Color.blue, int_list_val=[10, 20, 30]), ) self.assertEqual(r.fields[3].annotations, {})
def test_map_key_value(self) -> None: x = StrStrIntListMapMap({"a": StrI32ListMap({"b": I32List([7, 8, 9])})}) self.assertTrue(inspectable(x)) self.assertTrue(inspectable(StrStrIntListMapMap)) r = inspect(x) self.assertEqual(r.key, str) self.assertEqual(r.value, StrI32ListMap)
def _to_py_struct(cls: Type[T], obj: Struct) -> T: try: field_id_to_py3_name = { field_spec.id: (field_spec.annotations.get("py3.name") or field_spec.name) for field_spec in inspect(obj).fields } except TypeError: field_id_to_py3_name = {} # pyre-fixme[16]: `T` has no attribute `isUnion`. if cls.isUnion(): return cls( **{ field.name: _to_py_field( field.type, field.type_args, getattr(obj, field_id_to_py3_name.get( field.id, field.name)), ) for field in parse_struct_spec(cls) # pyre-fixme[16]: `Struct` has no attribute `type`. if field_id_to_py3_name.get(field.id, field.name) == obj.type.name }) else: return cls( **{ field.name: _to_py_field( field.type, field.type_args, getattr(obj, field_id_to_py3_name.get( field.id, field.name)), ) for field in parse_struct_spec(cls) })
def test_union(self) -> None: x = Integers(large=100) self.assertTrue(inspectable(x)) self.assertTrue(inspectable(Integers)) r = inspect(x) self.assertEqual(r.name, "Integers") self.assertEqual(r.kind, StructType.UNION) self.assertEqual(r.annotations, {})
def test_exception(self) -> None: x = SimpleError(color=Color.red) self.assertTrue(inspectable(x)) self.assertTrue(inspectable(SimpleError)) r = inspect(x) self.assertEqual(r.name, "SimpleError") self.assertEqual(r.kind, StructType.EXCEPTION) self.assertEqual(r.annotations, {})
def test_struct(self) -> None: x = easy(val=1, an_int=Integers(small=300), name="foo", val_list=[1, 2, 3, 4]) self.assertTrue(inspectable(x)) self.assertTrue(inspectable(easy)) r = inspect(x) self.assertEqual(r.name, "easy") self.assertEqual(r.kind, StructType.STRUCT) self.assertEqual(r.annotations, {"anno1": "foo", "bar": "1"})
def test_struct_fields(self) -> None: r = inspect(Messy) self.assertEqual(len(r.fields), 3) self.assertEqual(r.fields[0].id, 1) self.assertEqual(r.fields[0].name, "opt_field") self.assertEqual(r.fields[0].type, str) self.assertEqual(r.fields[0].kind, NumberType.NOT_A_NUMBER) self.assertEqual(r.fields[0].qualifier, Qualifier.OPTIONAL) self.assertEqual(r.fields[0].default, None) self.assertEqual(r.fields[0].annotations, { "some": "annotation", "a.b.c": "d.e.f" }) self.assertEqual(r.fields[1].id, 3) self.assertEqual(r.fields[1].name, "unq_field") self.assertEqual(r.fields[1].type, str) self.assertEqual(r.fields[1].kind, NumberType.NOT_A_NUMBER) self.assertEqual(r.fields[1].qualifier, Qualifier.UNQUALIFIED) self.assertEqual(r.fields[1].default, "xyzzy") self.assertEqual(r.fields[1].annotations, {}) self.assertEqual(r.fields[2].id, 4) self.assertEqual(r.fields[2].name, "struct_field") self.assertEqual(r.fields[2].type, Runtime) self.assertEqual(r.fields[2].kind, NumberType.NOT_A_NUMBER) self.assertEqual(r.fields[2].qualifier, Qualifier.UNQUALIFIED) self.assertEqual( r.fields[2].default, Runtime(bool_val=True, enum_val=Color.blue, int_list_val=[10, 20, 30]), ) self.assertEqual(r.fields[2].annotations, {})
def test_interface(self) -> None: self.assertTrue(inspectable(TestingService)) self.assertTrue(inspectable(TestingServiceInterface)) x = inspect(TestingService) self.assertEqual(x, inspect(TestingServiceInterface)) self.assertEqual(x.name, "TestingService") self.assertEqual( x.annotations, { "fun_times": "yes", "single_quote": "'", "double_quotes": '"""', "py3.pass_context": "1", }, ) methods = ( MethodSpec( name="getName", arguments=[], result=str, result_kind=NumberType.NOT_A_NUMBER, exceptions=[], annotations={}, ), MethodSpec( name="shutdown", arguments=[], result=None, result_kind=NumberType.NOT_A_NUMBER, exceptions=[], annotations={}, ), MethodSpec( name="invert", arguments=[ ArgumentSpec( name="value", type=bool, kind=NumberType.NOT_A_NUMBER, annotations={}, ) ], result=bool, result_kind=NumberType.NOT_A_NUMBER, exceptions=[], annotations={}, ), MethodSpec( name="complex_action", arguments=[ ArgumentSpec( name="first", type=str, kind=NumberType.NOT_A_NUMBER, annotations={}, ), ArgumentSpec( name="second", type=str, kind=NumberType.NOT_A_NUMBER, annotations={}, ), ArgumentSpec(name="third", type=int, kind=NumberType.I64, annotations={}), ArgumentSpec( name="fourth", type=str, kind=NumberType.NOT_A_NUMBER, annotations={"iv": "4"}, ), ], result=int, result_kind=NumberType.I32, exceptions=[], annotations={}, ), MethodSpec( name="takes_a_list", arguments=[ ArgumentSpec( name="ints", type=I32List, kind=NumberType.NOT_A_NUMBER, annotations={}, ) ], result=None, result_kind=NumberType.NOT_A_NUMBER, exceptions=[SimpleError], annotations={}, ), MethodSpec( name="take_it_easy", arguments=[ ArgumentSpec(name="how", type=int, kind=NumberType.I32, annotations={}), ArgumentSpec( name="what", type=easy, kind=NumberType.NOT_A_NUMBER, annotations={}, ), ], result=None, result_kind=NumberType.NOT_A_NUMBER, exceptions=[], annotations={"a": "b.c.d"}, ), MethodSpec( name="pick_a_color", arguments=[ ArgumentSpec( name="color", type=Color, kind=NumberType.NOT_A_NUMBER, annotations={}, ) ], result=None, result_kind=NumberType.NOT_A_NUMBER, exceptions=[], annotations={}, ), MethodSpec( name="int_sizes", arguments=[ ArgumentSpec(name="one", type=int, kind=NumberType.BYTE, annotations={}), ArgumentSpec(name="two", type=int, kind=NumberType.I16, annotations={}), ArgumentSpec(name="three", type=int, kind=NumberType.I32, annotations={}), ArgumentSpec(name="four", type=int, kind=NumberType.I64, annotations={}), ], result=None, result_kind=NumberType.NOT_A_NUMBER, exceptions=[], annotations={}, ), MethodSpec( name="hard_error", arguments=[ ArgumentSpec( name="valid", type=bool, kind=NumberType.NOT_A_NUMBER, annotations={}, ) ], result=None, result_kind=NumberType.NOT_A_NUMBER, exceptions=[HardError], annotations={}, ), ) self.assertEqual(x.methods, methods)
def test_set_element(self) -> None: x = Set__Color({Color.red, Color.blue}) self.assertTrue(inspectable(x)) self.assertTrue(inspectable(Set__Color)) r = inspect(x) self.assertEqual(r.value, Color)