Beispiel #1
0
    def test_odd_identifiers(self):
        t = cast(JSGPairDef, parse("'String' : INT", "pairDef", JSGPairDef))
        self.assertEqual('pairDef: String : valueType: LEXER_ID_REF: INT',
                         str(t))
        self.assertEqual([('String', 'INT')], t.members_entries())
        self.assertEqual([('String', 'typing.Optional[INT]')],
                         t.members_entries(True))
        self.assertEqual(['String: str = None'], t.signatures())
        self.assertEqual(['self.String = String'], t.initializers())
        self.assertEqual("pairDef: String : valueType: LEXER_ID_REF: INT",
                         str(t))

        t = cast(JSGPairDef, parse("'def' : INT", "pairDef", JSGPairDef))
        self.assertEqual('pairDef: def : valueType: LEXER_ID_REF: INT', str(t))
        self.assertEqual([('def', 'INT')], t.members_entries())
        self.assertEqual(['def_: str = None'], t.signatures())
        self.assertEqual([
            "setattr(self, 'def', def_ if def_ is not None else _kwargs.get('def', None))"
        ], t.initializers())
        self.assertEqual("pairDef: def : valueType: LEXER_ID_REF: INT", str(t))

        t = cast(JSGPairDef, parse("'a var' : @number", "pairDef", JSGPairDef))
        self.assertEqual(
            "pairDef: a var : valueType: builtinValueType: @number", str(t))
        self.assertEqual([('a var', 'jsg.Number')], t.members_entries())
        self.assertEqual([], t.signatures())
        self.assertEqual(
            ["setattr(self, 'a var', _kwargs.get('a var', None))"],
            t.initializers())
Beispiel #2
0
 def test_single_option(self):
     t = cast(JSGDocParser, parse("macro = labeledShapeOr ; labeledShapeOr {}", "doc", JSGDocParser))
     exec(t.as_python(self.__class__.__name__), dict())
     t = cast(JSGDocParser, parse("macro = a:@int | b:@int ;", "doc", JSGDocParser))
     exec(t.as_python(self.__class__.__name__), dict())
     t = cast(JSGDocParser, parse("macro = a| b ; a {} b {}", "doc", JSGDocParser))
     exec(t.as_python(self.__class__.__name__), dict())
Beispiel #3
0
    def test_array(self):
        t = cast(JSGValueType,
                 parse('id = [.] ;', "valueTypeMacro", JSGValueType))
        self.assertEqual(
            'valueType: arrayExpr: [valueType: builtinValueType: jsg.AnyType]',
            str(t))
        self.assertEqual([], t.dependency_list())
        self.assertEqual([], t.members_entries())
        self.assertEqual('typing.List[object]', t.python_type())
        self.assertEqual(
            "jsg.ArrayFactory('{name}', _CONTEXT, jsg.AnyTypeFactory('{name}', _CONTEXT), 0, None)",
            t.signature_type())
        self.assertEqual('None', t.mt_value())

        t = cast(
            JSGValueType,
            parse('id = [@int | "AB*" +] ;', "valueTypeMacro", JSGValueType))
        self.assertEqual(
            "valueType: arrayExpr: [(valueType: builtinValueType: "
            "@int | valueType: STRING: pattern: r'AB\*')+]", str(t))
        self.assertEqual(['_Anon1'], t.dependency_list())
        self.assertEqual([], t.members_entries())
        self.assertEqual('typing.List[typing.Union[int, str]]',
                         t.python_type())
        self.assertEqual(
            "jsg.ArrayFactory('{name}', _CONTEXT, typing.Union[jsg.Integer, _Anon1], 1, None)",
            t.signature_type())
        self.assertEqual('None', t.mt_value())
Beispiel #4
0
 def test_ref_escapes(self):
     self.assertEqual(
         "Undefined(Class)",
         cast(JSGValueType, parse("Class", "valueType",
                                  JSGValueType)).signature_type())
     t = cast(JSGValueType, parse("class", "valueType", JSGValueType))
     self.assertEqual("Undefined(class_)", t.signature_type())
     self.assertEqual("Undefined(class_)", t.python_type())
     self.assertEqual([], t.members_entries())
Beispiel #5
0
 def test_basics(self):
     ty = cast(JSGValueType, parse('"[a-z]+"', 'valueType', JSGValueType))
     for te in self.tests:
         t = cast(JSGEbnf, parse(te.text, "ebnfSuffix", JSGEbnf))
         self.assertEqual(str(t), te.text.replace(' ', ''))
         self.assertEqual(te.min, t.min, te.text)
         self.assertEqual(te.max, t.max, te.text)
         self.assertEqual(te.ptype, t.python_cardinality("k"), te.text)
         self.assertEqual(te.stype, t.signature_cardinality("k"), te.text)
         self.assertEqual(te.oneopt, t.one_optional_element, te.text)
         self.assertEqual(te.mult, t.multiple_elements, te.text)
Beispiel #6
0
 def test_all_optional(self):
     t = cast(JSGEbnf, parse('?', 'ebnfSuffix', JSGEbnf))
     self.assertEqual('typing.Optional[k]', t.python_cardinality('k', True))
     self.assertEqual("typing.Optional[k]",
                      t.signature_cardinality('k', True))
     t = cast(JSGEbnf, parse('+', 'ebnfSuffix', JSGEbnf))
     self.assertEqual('typing.Optional[typing.List[k]]',
                      t.python_cardinality('k', True))
     self.assertEqual(
         "typing.Optional[jsg.ArrayFactory('{name}', _CONTEXT, k, 1, None)]",
         t.signature_cardinality('k', True))
Beispiel #7
0
 def test_1(self):
     outf = StringIO()
     with redirect_stderr(outf):
         d = cast(JSGDocParser, parse("a a {}", "objectDef", JSGDocParser))
     self.assertIsNone(d)
     self.assertEqual("line 1:2 extraneous input 'a' expecting OBRACE",
                      outf.getvalue().strip())
Beispiel #8
0
 def test_pairdef_valuetype_ref(self):
     text = "nonobj = {a:@string b:@number?};  obj = {nonobj}"
     t = cast(JSGPairDef, parse(text, "grammarElt", JSGPairDef))
     self.assertEqual([
         'a: typing.Optional[float] = None',
         'b: typing.Optional[float] = None'
     ], t.signatures())
Beispiel #9
0
 def test_pairdef_builtins(self):
     for text, sig, init, s in builtins:
         t = cast(JSGPairDef, parse(text, "pairDef", JSGPairDef))
         self.assertEqual(sig, t.signatures())
         self.assertEqual(init, t.initializers())
         self.assertEqual(s, str(t))
         self.assertEqual([], t.dependency_list())
         self.assertEqual([('k', 'jsg.String')], t.members_entries())
Beispiel #10
0
 def test_options(self):
     txt = "exclusions [(objectValue|LanguageStem) +]"
     t = cast(JSGArrayExpr, parse(txt, "arrayDef", JSGArrayExpr))
     self.check(t, (
         'arrayExpr: [valueType: (Undefined(objectValue) | Undefined(LanguageStem))+]',
         'typing.List[typing.Union[Undefined(objectValue), Undefined(LanguageStem)]]',
         ['objectValue', 'LanguageStem'],
         "jsg.ArrayFactory('{name}', _CONTEXT, typing.Union[Undefined(objectValue), Undefined(LanguageStem)], 1, None)",
         'None', []))
Beispiel #11
0
 def test_objectmacro_opts(self):
     t = cast(
         JSGValueType,
         parse("a = @string | KT | {} ;", "valueTypeMacro", JSGValueType))
     self.assertEqual('valueType: (jsg.String | KT | _Anon1)', str(t))
     self.assertEqual('typing.Union[jsg.String, KT, _Anon1]',
                      t.signature_type())
     self.assertEqual('typing.Union[str, str, _Anon1]', t.python_type())
     self.assertEqual('None', t.mt_value())
     self.assertEqual([], t.members_entries())
Beispiel #12
0
 def test_simple_pairdef(self):
     for text, sig, py, deps, sigs, memins, v in tests:
         t = cast(JSGPairDef, parse(text, "pairDef", JSGPairDef))
         self.assertEqual(v, str(t))
         self.assertEqual(sig, t.signature_type(), text)
         self.assertEqual(py, t.python_type(), text)
         self.assertEqual(deps, t.dependency_list(), text)
         self.assertEqual(sigs, t.signatures(), text)
         self.assertEqual(memins, t.members_entries(), text)
         self.assertEqual(initializers[text], t.initializers())
Beispiel #13
0
 def test1(self):
     i = 0
     for text, k, rslt, s in tests:
         i += 1
         t = cast(JSGLexerRuleBlock,
                  parse(terminals + text, "lexerRules", JSGLexerRuleBlock))
         self.assertEqual(s, str(t))
         t_python = t.as_python(k)
         self.assertEqual(rslt, t_python.strip())
         exec(t_python, globals(), locals())
Beispiel #14
0
 def test_multi_types(self):
     txt = "x [objectValue | languageStem {3,7}]"
     t = cast(JSGArrayExpr, parse(txt, "arrayDef", JSGArrayExpr))
     self.check(t, (
         'arrayExpr: [(valueType: ID: objectValue | valueType: ID: '
         'languageStem){3,7}]',
         'typing.List[typing.Union[Undefined(objectValue), Undefined(languageStem)]]',
         ['objectValue', 'languageStem'],
         "jsg.ArrayFactory('{name}', _CONTEXT, typing.Union[Undefined(objectValue), Undefined(languageStem)], 3, 7)",
         'None', []))
Beispiel #15
0
 def test_any(self):
     t = cast(JSGValueType, parse("id = .;", "valueTypeMacro",
                                  JSGValueType))
     self.assertEqual("object", t.python_type())
     self.assertEqual("jsg.AnyTypeFactory('{name}', _CONTEXT)",
                      t.signature_type())
     self.assertEqual("jsg.Empty", t.mt_value())
     self.assertEqual([], t.members_entries())
     self.assertEqual([], t.dependency_list())
     self.assertEqual("valueType: builtinValueType: jsg.AnyType", str(t))
Beispiel #16
0
    def test_basics(self):
        d = cast(JSGDocParser,
                 parse('a ' + test_entries[0][0], "objectDef", JSGDocParser))
        t = d._context.reference('a')
        self.assertEqual("None", t.mt_value())

        for te in test_entries:
            text = "a " + te[0]
            e = te[1]
            d = cast(JSGDocParser, parse(text, "objectDef", JSGDocParser))
            self.assertIsNotNone(d, f"Parse error: {text}")
            t = d._context.reference('a')
            self.assertEqual(e.name, str(t))
            self.assertEqual('a', t.signature_type(), text)
            self.assertEqual('a', t.python_type(), text)
            self.assertEqual(e.deps, t.dependency_list(), text)
            self.assertEqual(e.sigs, t.signatures(), text)
            self.assertEqual(e.membs, t.members_entries(), text)
            self.assertEqual(e.inits, t.initializers(), text)
Beispiel #17
0
    def test_lexeridref(self):
        t = cast(JSGValueType,
                 parse('("[a-z]*" | "0-9*")', "valueType", JSGValueType))
        self.assertEqual(
            "valueType: STRING: pattern: r'(\[a\-z\]\*)|(0\-9\*)'", str(t))
        self.assertEqual("_Anon1", t.signature_type())
        self.assertEqual("str", t.python_type())
        self.assertEqual("None", t.mt_value())
        self.assertEqual([], t.members_entries())

        t = cast(JSGValueType,
                 parse('("[a-z]*" | "0-9*" | ID)', "valueType", JSGValueType))
        self.assertEqual(
            "valueType: ((STRING: pattern: r'(\[a\-z\]\*)|(0\-9\*)') | ID)",
            str(t))
        self.assertEqual("typing.Union[_Anon1, ID]", t.signature_type())
        self.assertEqual("typing.Union[str, str]", t.python_type())
        self.assertEqual("None", t.mt_value())
        self.assertEqual([], t.members_entries())
Beispiel #18
0
 def test_anon_typeid(self):
     t = cast(JSGValueType,
              parse("{a: @int b: @string+}", "valueType", JSGValueType))
     self.assertEqual(
         'valueType: (anonymous: _Anon1): objectExpr: simple object',
         str(t))
     self.assertEqual('_Anon1', t.signature_type())
     self.assertEqual('_Anon1', t.python_type())
     self.assertEqual('None', t.mt_value())
     self.assertEqual([], t.members_entries())
Beispiel #19
0
 def test_builtins(self):
     for text, sig, typ_, mt_typ in builtin_tests:
         t = cast(JSGValueType, parse(text, "valueType", JSGValueType))
         self.assertEqual(sig, t.signature_type(), text)
         self.assertEqual(typ_, t.python_type(), text)
         self.assertEqual(
             f"valueType: builtinValueType: {'jsg.AnyType' if text == '.' else text}",
             str(t), text)
         self.assertEqual(mt_typ, t.mt_value(), text)
         self.assertEqual([], t.members_entries(), text)
         self.assertEqual([], t.dependency_list(), text)
Beispiel #20
0
 def test_anonymous_entries(self):
     for te in test_entries:
         e = te[2]
         t = cast(JSGObjectExpr, parse(te[0], "objectExpr", JSGObjectExpr))
         self.assertIsNotNone(t, f"Parse error: {e.text}")
         self.assertEqual(e.name, str(t))
         self.assertEqual('_Anon1', t.signature_type(), e.text)
         self.assertEqual('_Anon1', t.python_type(), e.text)
         self.assertEqual(e.deps, t.dependency_list(), e.text)
         self.assertEqual(e.sigs, t.signatures(), e.text)
         self.assertEqual(e.membs, t.members_entries(), e.text)
         self.assertEqual(e.inits, t.initializers(), e.text)
Beispiel #21
0
    def test_basics(self):
        t = cast(JSGArrayExpr, parse("id [@string] ", "arrayDef",
                                     JSGArrayExpr))
        self.check(
            t, ('arrayExpr: [valueType: builtinValueType: @string]',
                'typing.List[str]', [],
                "jsg.ArrayFactory('{name}', _CONTEXT, jsg.String, 0, None)",
                'None', []))

        t = cast(JSGArrayExpr, parse("id [@int] ", "arrayDef", JSGArrayExpr))
        self.check(
            t, ('arrayExpr: [valueType: builtinValueType: @int]',
                'typing.List[int]', [],
                "jsg.ArrayFactory('{name}', _CONTEXT, jsg.Integer, 0, None)",
                'None', []))

        t = cast(JSGArrayExpr, parse("id [.] ", "arrayDef", JSGArrayExpr))
        self.check(t, (
            'arrayExpr: [valueType: builtinValueType: jsg.AnyType]',
            'typing.List[object]', [],
            "jsg.ArrayFactory('{name}', _CONTEXT, jsg.AnyTypeFactory('{name}', _CONTEXT), 0, None)",
            'None', []))

        t = cast(JSGArrayExpr,
                 parse("id [(Aa|BB|'foo')] ", "arrayDef", JSGArrayExpr))
        self.check(t, (
            "arrayExpr: [valueType: ((STRING: pattern: r'foo') | Undefined(Aa) | BB)]",
            'typing.List[typing.Union[str, Undefined(Aa), str]]',
            ['_Anon1', 'Aa', 'BB'],
            "jsg.ArrayFactory('{name}', _CONTEXT, typing.Union[_Anon1, Undefined(Aa), BB], 0, None)",
            'None', []))

        t = cast(JSGArrayExpr,
                 parse("id [(Aa|BB|'foo'){0,}] ", "arrayDef", JSGArrayExpr))
        self.check(t, (
            "arrayExpr: [valueType: ((STRING: pattern: r'foo') | Undefined(Aa) | BB){0,}]",
            'typing.List[typing.Union[str, Undefined(Aa), str]]',
            ['_Anon1', 'Aa', 'BB'],
            "jsg.ArrayFactory('{name}', _CONTEXT, typing.Union[_Anon1, Undefined(Aa), BB], 0, None)",
            'None', []))
Beispiel #22
0
 def test_refs(self):
     for text, typ in ref_tests:
         t = cast(JSGValueType, parse(text, "valueType", JSGValueType))
         self.assertEqual(
             f'Undefined({text})' if typ != 'LEXER_ID_REF' else text,
             t.signature_type())
         self.assertEqual(
             f'Undefined({text})' if typ != 'LEXER_ID_REF' else 'str',
             t.python_type())
         self.assertEqual(f"valueType: {typ}: {text}", str(t))
         self.assertEqual([text], t.dependency_list())
         self.assertEqual([], t.members_entries())
         self.assertEqual("None", t.mt_value())
Beispiel #23
0
 def test_alternatives(self):
     t = cast(JSGValueType,
              parse("id = ('x'|'y') ;", "valueTypeMacro", JSGValueType))
     self.assertEqual("_Anon1", t.signature_type())
     self.assertEqual("str", t.python_type())
     self.assertEqual("valueType: STRING: pattern: r'(x)|(y)'", str(t))
     t = cast(
         JSGValueType,
         parse("id = (Aa | Bb | (Cc | Dd)) ;", "valueTypeMacro",
               JSGValueType))
     self.assertEqual(
         "typing.Union[Undefined(Aa), Undefined(Bb), typing.Union[Undefined(Cc), Undefined(Dd)]]",
         t.signature_type())
     self.assertEqual(
         "typing.Union[Undefined(Aa), Undefined(Bb), typing.Union[Undefined(Cc), Undefined(Dd)]]",
         t.python_type())
     self.assertEqual(t.dependency_list(), ['Aa', 'Bb', 'Cc', 'Dd'])
     self.assertEqual(
         "valueType: (Undefined(Aa) | Undefined(Bb) | typing.Union[Undefined(Cc), Undefined(Dd)])",
         str(t))
     self.assertEqual([], t.members_entries())
     t = cast(
         JSGValueType,
         parse("id = (Aa | Bb | 'foo' | (Cc | Dd) | 'bar') ;",
               "valueTypeMacro", JSGValueType))
     self.assertEqual(
         "typing.Union[_Anon1, Undefined(Aa), Undefined(Bb), "
         "typing.Union[Undefined(Cc), Undefined(Dd)]]", t.signature_type())
     self.assertEqual(
         "typing.Union[str, Undefined(Aa), Undefined(Bb), typing.Union[Undefined(Cc), Undefined(Dd)]]",
         t.python_type())
     self.assertEqual(['_Anon1', 'Aa', 'Bb', 'Cc', 'Dd'],
                      t.dependency_list())
     self.assertEqual(
         "valueType: ((STRING: pattern: r'(foo)|(bar)') | Undefined(Aa) | Undefined(Bb) | "
         "typing.Union[Undefined(Cc), Undefined(Dd)])", str(t))
Beispiel #24
0
 def test_opt_choice_branch(self):
     text = '{id: @string |}'
     t = cast(JSGObjectExpr, parse(text, 'objectExpr', JSGObjectExpr))
     self.assertIsNotNone(t, f"Parse error")
     self.assertEqual('objectExpr: object choices', str(t))
     self.assertEqual('_Anon1', t.signature_type(), text)
     self.assertEqual('_Anon1', t.python_type(), text)
     self.assertEqual(['_Anon1_1_', '_Anon1_2_'], t.dependency_list(), text)
     self.assertEqual(['opts_: typing.Union[_Anon1_1_, _Anon1_2_] = None'],
                      t.signatures(), text)
     self.assertEqual([('id', 'typing.Optional[jsg.String]')],
                      t.members_entries(), text)
     self.assertEqual([
         'if opts_ is not None:', '    if isinstance(opts_, _Anon1_1_):',
         '        self.id = opts_.id',
         '    elif isinstance(opts_, _Anon1_2_):', '        pass',
         '    else:',
         '        raise ValueError(f"Unrecognized value type: {opts_}")'
     ], t.initializers(), text)
Beispiel #25
0
    def test_pairdef_reference(self):
        text = """
Patient {name: @string+ age: @int}
b {Patient*}
"""
        d = cast(JSGDocParser, parse(text, "doc", JSGDocParser))
        self.assertIsNotNone(d)
        t = d._context.reference('b')
        self.assertEqual('objectExpr: simple object', str(t))
        self.assertEqual(['name: typing.List[str] = None', 'age: int = None'],
                         t.signatures())
        self.assertEqual(['self.name = name', 'self.age = age'],
                         t.initializers())
        self.assertEqual(['Patient'], t.dependency_list())
        self.assertEqual([(
            'name',
            "jsg.ArrayFactory('name', _CONTEXT, jsg.ArrayFactory('name', _CONTEXT, jsg.String, 1, None), 0, None)"
        ), ('age', "jsg.ArrayFactory('age', _CONTEXT, jsg.Integer, 0, None)")],
                         t.members_entries())
        self.assertEqual('None', t.mt_value())
Beispiel #26
0
    def test_pairdef_shorthand(self):
        text = "(x1 'v 2' 'class') : @number {3,17}"
        t = cast(JSGPairDef, parse(text, "pairDef", JSGPairDef))
        self.assertEqual([
            'x1: typing.List[float] = None',
            'class_: typing.List[float] = None'
        ], t.signatures())
        self.assertEqual([
            'self.x1 = x1', "setattr(self, 'v 2', _kwargs.get('v 2', None))",
            "setattr(self, 'class', class_ if class_ is not None else "
            "_kwargs.get('class', None))"
        ], t.initializers())
        self.assertEqual(
            "pairDef: (x1 | v 2 | class) : valueType: builtinValueType: @number{3,17}",
            str(t))
        self.assertEqual([], t.dependency_list())

        text = "(x1 'v 2' 'class') : @bool ?"
        t = cast(JSGPairDef, parse(text, "pairDef", JSGPairDef))
        self.assertEqual([
            'x1: typing.Optional[bool] = None',
            'class_: typing.Optional[bool] = None'
        ], t.signatures())
        self.assertEqual([
            'self.x1 = x1', "setattr(self, 'v 2', _kwargs.get('v 2', None))",
            "setattr(self, 'class', class_ if class_ is not None else _kwargs.get('class', None))"
        ], t.initializers())
        self.assertEqual(
            "pairDef: (x1 | v 2 | class) : valueType: builtinValueType: @bool?",
            str(t))
        self.assertEqual([], t.dependency_list())
        self.assertEqual([('x1', 'typing.Optional[jsg.Boolean]'),
                          ('v 2', 'typing.Optional[jsg.Boolean]'),
                          ('class', 'typing.Optional[jsg.Boolean]')],
                         t.members_entries())

        text = "(x1 'v 2' 'class') : @null"
        t = cast(JSGPairDef, parse(text, "pairDef", JSGPairDef))
        self.assertEqual(
            ['x1: type(None) = jsg.Empty', 'class_: type(None) = jsg.Empty'],
            t.signatures())
        self.assertEqual([
            'self.x1 = x1',
            "setattr(self, 'v 2', _kwargs.get('v 2', jsg.Empty))",
            "setattr(self, 'class', class_ if class_ is not jsg.Empty else _kwargs.get('class', jsg.Empty))"
        ], t.initializers())
        self.assertEqual(
            "pairDef: (x1 | v 2 | class) : valueType: builtinValueType: @null",
            str(t))
        self.assertEqual([], t.dependency_list())
        self.assertEqual([('x1', 'jsg.JSGNull'), ('v 2', 'jsg.JSGNull'),
                          ('class', 'jsg.JSGNull')], t.members_entries())
        text = "(def 'v 2' class) : @null"
        t = cast(JSGPairDef, parse(text, "pairDef", JSGPairDef))
        self.assertEqual([
            "setattr(self, 'def', def_ if def_ is not jsg.Empty else _kwargs.get('def', "
            'jsg.Empty))',
            "setattr(self, 'v 2', _kwargs.get('v 2', jsg.Empty))",
            "setattr(self, 'class', class_ if class_ is not jsg.Empty else "
            "_kwargs.get('class', jsg.Empty))"
        ], t.initializers())
Beispiel #27
0
 def test_double_optional(self):
     t = cast(JSGEbnf, parse('?', 'ebnfSuffix', JSGEbnf))
     self.assertEqual('typing.Optional[k]',
                      t.python_cardinality('typing.Optional[k]'))
     self.assertEqual('typing.Optional[k]',
                      t.signature_cardinality('typing.Optional[k]'))
Beispiel #28
0
    def test_objectmacro(self):
        t = cast(
            JSGObjectExpr,
            parse(
                "stringFacet = (length minlength maxlength):"
                "INTEGER pattern:STRING flags:STRING? ;", "objectMacro",
                JSGObjectExpr))
        self.assertEqual(
            """class stringFacet(jsg.JSGObject):
    _reference_types = []
    _members = {'length': INTEGER,
                'minlength': INTEGER,
                'maxlength': INTEGER,
                'pattern': STRING,
                'flags': typing.Optional[STRING]}
    _strict = True

    def __init__(self,
                 length: str = None,
                 minlength: str = None,
                 maxlength: str = None,
                 pattern: str = None,
                 flags: typing.Optional[str] = None,
                 **_kwargs: typing.Dict[str, object]):
        super().__init__(_CONTEXT, **_kwargs)
        self.length = length
        self.minlength = minlength
        self.maxlength = maxlength
        self.pattern = pattern
        self.flags = flags""",
            t.as_python('stringFacet').strip())
        self.assertEqual(['INTEGER', 'STRING'], t.dependency_list())

        t = cast(
            JSGObjectExpr,
            parse(
                "stringFacet = (length minlength maxlength):INTEGER "
                "pattern:STRING | flags:STRING? ;", "objectMacro",
                JSGObjectExpr))
        self.assertEqual(
            """class stringFacet(jsg.JSGObject):
    _reference_types = [_Anon1_1_, _Anon1_2_]
    _members = {'length': typing.Optional[INTEGER],
                'minlength': typing.Optional[INTEGER],
                'maxlength': typing.Optional[INTEGER],
                'pattern': typing.Optional[STRING],
                'flags': typing.Optional[STRING]}
    _strict = True

    def __init__(self,
                 opts_: typing.Union[_Anon1_1_, _Anon1_2_] = None,
                 **_kwargs: typing.Dict[str, object]):
        super().__init__(_CONTEXT, **_kwargs)
        if opts_ is not None:
            if isinstance(opts_, _Anon1_1_):
                self.length = opts_.length
                self.minlength = opts_.minlength
                self.maxlength = opts_.maxlength
                self.pattern = opts_.pattern
            elif isinstance(opts_, _Anon1_2_):
                self.flags = opts_.flags
            else:
                raise ValueError(f"Unrecognized value type: {opts_}")""",
            t.as_python('stringFacet').strip())
        self.assertEqual(['INTEGER', 'STRING', '_Anon1_1_', '_Anon1_2_'],
                         t.dependency_list())

        t = cast(
            JSGObjectExpr,
            parse("x = a:@number | b:@null | ;", "objectMacro", JSGObjectExpr))
        self.assertEqual(
            """class stringFacet(jsg.JSGObject):
    _reference_types = [_Anon1_1_, _Anon1_2_, _Anon1_3_]
    _members = {'a': typing.Optional[jsg.Number],
                'b': typing.Optional[jsg.JSGNull]}
    _strict = True

    def __init__(self,
                 opts_: typing.Union[_Anon1_1_, _Anon1_2_, _Anon1_3_] = None,
                 **_kwargs: typing.Dict[str, object]):
        super().__init__(_CONTEXT, **_kwargs)
        if opts_ is not None:
            if isinstance(opts_, _Anon1_1_):
                self.a = opts_.a
            elif isinstance(opts_, _Anon1_2_):
                self.b = opts_.b
            elif isinstance(opts_, _Anon1_3_):
                pass
            else:
                raise ValueError(f"Unrecognized value type: {opts_}")""",
            t.as_python('stringFacet').strip())
        self.assertEqual(['_Anon1_1_', '_Anon1_2_', '_Anon1_3_'],
                         t.dependency_list())
Beispiel #29
0
 def test_literals(self):
     t = cast(JSGValueType, parse("'literal'", "valueType", JSGValueType))
     self.assertEqual("_Anon1", t.signature_type())
     self.assertEqual("str", t.python_type())
     self.assertEqual("valueType: STRING: pattern: r'literal'", str(t))