def test_link_simple(scope): spec = StructTypeSpec('SimpleStruct', fields=[ FieldSpec(1, 'a', spec=prim_spec.TextTypeSpec, required=True), FieldSpec(2, 'b', spec=prim_spec.BinaryTypeSpec, required=False), FieldSpec(3, 'c', spec=prim_spec.I32TypeSpec, required=True), FieldSpec(4, 'd', spec=prim_spec.I64TypeSpec, required=False), ]) spec = spec.link(scope) SimpleStruct = spec.surface assert SimpleStruct.type_spec is spec assert 'SimpleStruct(a, c, b=None, d=None)' in SimpleStruct.__doc__
def test_compile_reference(parse): struct_ast = parse('''struct RefStruct { 1: optional string x; 2: required SomeCustomType y; 3: optional AnotherCustomType z; }''') spec = StructTypeSpec.compile(struct_ast) assert spec.name == 'RefStruct' assert spec.fields == [ FieldSpec(id=1, name='x', spec=prim_spec.TextTypeSpec, required=False), FieldSpec( id=2, name='y', spec=TypeReference('SomeCustomType', 3), required=True, ), FieldSpec( id=3, name='z', spec=TypeReference('AnotherCustomType', 4), required=False, ), ]
def test_compile_primitives(parse): struct_ast = parse('''struct PrimitiveStruct { 1: required string x; 2: optional i32 y; 3: required double z; }''') spec = StructTypeSpec.compile(struct_ast) assert spec.name == 'PrimitiveStruct' assert spec.fields == [ FieldSpec(id=1, name='x', spec=prim_spec.TextTypeSpec, required=True), FieldSpec(id=2, name='y', spec=prim_spec.I32TypeSpec, required=False), FieldSpec(id=3, name='z', spec=prim_spec.DoubleTypeSpec, required=True), ]
def test_compile(parse): spec = ServiceSpec.compile( parse(''' service KeyValue extends BaseService { void putItem( 1: string key, 2: Item item ) throws (1: ItemAlreadyExists alreadyExists); Item getItem( 1: string key ) throws (1: KeyDoesNotExist doesNotExist); bool healthy(); // Does not accept or return anything void noop(); } ''')) assert spec.name == 'KeyValue' assert spec.parent == ServiceReference('BaseService', 2) put_item_spec = spec.functions[0] get_item_spec = spec.functions[1] healthy_spec = spec.functions[2] noop_spec = spec.functions[3] assert put_item_spec.name == 'putItem' assert put_item_spec.args_spec.fields == [ FieldSpec(1, 'key', prim_spec.TextTypeSpec, False), FieldSpec(2, 'item', TypeReference('Item', 5), False), ] assert put_item_spec.result_spec.fields == [ FieldSpec(1, 'alreadyExists', TypeReference('ItemAlreadyExists', 6), False), ] assert put_item_spec.result_spec.return_spec is None assert get_item_spec.name == 'getItem' assert get_item_spec.args_spec.fields == [ FieldSpec(1, 'key', prim_spec.TextTypeSpec, False), ] assert get_item_spec.result_spec.fields == [ FieldSpec(0, 'success', TypeReference('Item', 8), False), FieldSpec(1, 'doesNotExist', TypeReference('KeyDoesNotExist', 10), False), ] assert get_item_spec.result_spec.return_spec == TypeReference('Item', 8) assert healthy_spec.name == 'healthy' assert healthy_spec.args_spec.fields == [] assert healthy_spec.result_spec.fields == [ FieldSpec(0, 'success', prim_spec.BoolTypeSpec, False) ] assert noop_spec.name == 'noop' assert noop_spec.args_spec.fields == [] assert noop_spec.result_spec.fields == []
def test_compile(parse): spec = UnionTypeSpec.compile( parse('''union Foo { 1: binary b 2: string s 3: i32 i 4: list<Foo> l }''')) assert spec.name == 'Foo' assert spec.fields == [ FieldSpec(id=1, name='b', spec=prim_spec.BinaryTypeSpec, required=False), FieldSpec(id=2, name='s', spec=prim_spec.TextTypeSpec, required=False), FieldSpec(id=3, name='i', spec=prim_spec.I32TypeSpec, required=False), FieldSpec(id=4, name='l', required=False, spec=ListTypeSpec(TypeReference('Foo', 5))), ]