Warning, file /sdk/doxyqml/tests/unit/qmlparsertestcase.py was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 from unittest import TestCase
0002 
0003 from doxyqml.lexer import Lexer
0004 from doxyqml.qmlclass import QmlClass
0005 from doxyqml import qmlparser
0006 
0007 
0008 class QmlParserTestCase(TestCase):
0009     def test(self):
0010         src = "Item { function foo() {} function bar() {} }"
0011         lexer = Lexer(src)
0012         lexer.tokenize()
0013         qmlclass = QmlClass("Foo")
0014         qmlparser.parse(lexer.tokens, qmlclass)
0015 
0016         self.assertEqual(qmlclass.base_name, "Item")
0017 
0018         functions = qmlclass.get_functions()
0019         self.assertEqual(len(functions), 2)
0020         self.assertEqual(functions[0].name, "foo")
0021         self.assertEqual(functions[1].name, "bar")
0022 
0023     def test_default_property(self):
0024         src = """Item {
0025             /// v1 doc
0026             default property int v1
0027             /// v2 doc
0028             property int v2
0029             }"""
0030         lexer = Lexer(src)
0031         lexer.tokenize()
0032         qmlclass = QmlClass("Foo")
0033         qmlparser.parse(lexer.tokens, qmlclass)
0034 
0035         properties = qmlclass.get_properties()
0036         self.assertEqual(len(properties), 2)
0037         self.assertEqual(properties[0].name, "v1")
0038         self.assertEqual(properties[0].type, "int")
0039         self.assertEqual(properties[0].doc, "/// v1 doc")
0040         self.assertTrue(properties[0].is_default)
0041 
0042         self.assertEqual(properties[1].name, "v2")
0043         self.assertEqual(properties[1].type, "int")
0044         self.assertEqual(properties[1].doc, "/// v2 doc")
0045         self.assertFalse(properties[1].is_default)
0046 
0047     def test_readonly_property(self):
0048         src = """Item {
0049             /// v1 doc
0050             readonly property int v1
0051             /// v2 doc
0052             property int v2
0053             }"""
0054         lexer = Lexer(src)
0055         lexer.tokenize()
0056         qmlclass = QmlClass("Foo")
0057         qmlparser.parse(lexer.tokens, qmlclass)
0058 
0059         properties = qmlclass.get_properties()
0060         self.assertEqual(len(properties), 2)
0061         self.assertEqual(properties[0].name, "v1")
0062         self.assertEqual(properties[0].type, "int")
0063         self.assertEqual(properties[0].doc, "/// v1 doc")
0064         self.assertTrue(properties[0].is_readonly)
0065 
0066         self.assertEqual(properties[1].name, "v2")
0067         self.assertEqual(properties[1].type, "int")
0068         self.assertEqual(properties[1].doc, "/// v2 doc")
0069         self.assertFalse(properties[1].is_readonly)
0070 
0071     def test_var_property(self):
0072         src = """Item {
0073             property var varProperty: { "key1": "value1", "key2": "value2" }
0074             }"""
0075 
0076         lexer = Lexer(src)
0077         lexer.tokenize()
0078         qmlclass = QmlClass("Foo")
0079         qmlparser.parse(lexer.tokens, qmlclass)
0080 
0081         properties = qmlclass.get_properties()
0082         self.assertEqual(len(properties), 1)
0083         self.assertEqual(properties[0].name, "varProperty")
0084         self.assertEqual(properties[0].type, "var")
0085 
0086     def test_function_property(self):
0087         src = """Item {
0088             property var fnProperty: function (arg1, arg2) { return arg1 + arg2; }
0089             }"""
0090 
0091         lexer = Lexer(src)
0092         lexer.tokenize()
0093         qmlclass = QmlClass("Foo")
0094         qmlparser.parse(lexer.tokens, qmlclass)
0095 
0096         properties = qmlclass.get_properties()
0097         self.assertEqual(len(properties), 1)
0098         self.assertEqual(properties[0].name, "fnProperty")
0099         self.assertEqual(properties[0].type, "var")
0100 
0101     def test_multiline_string(self):
0102         src = """Item {
0103             prop1: "A string that spans \\
0104             multiple lines"
0105             /// prop2 doc
0106             property string prop2: "bar"
0107             }"""
0108 
0109         lexer = Lexer(src)
0110         lexer.tokenize()
0111         qmlclass = QmlClass("Foo")
0112         qmlparser.parse(lexer.tokens, qmlclass)
0113 
0114         properties = qmlclass.get_properties()
0115         self.assertEqual(len(properties), 1)
0116         self.assertEqual(properties[0].name, "prop2")
0117         self.assertEqual(properties[0].type, "string")
0118         self.assertEqual(properties[0].doc, "/// prop2 doc")
0119 
0120     def test_normal_arguments(self):
0121         src = """Item {
0122                      function foo(arg1, arg2) {
0123                          return arg1 + arg2;
0124                      }
0125                  }"""
0126 
0127         lexer = Lexer(src)
0128         lexer.tokenize()
0129         qmlclass = QmlClass("Foo")
0130         qmlparser.parse(lexer.tokens, qmlclass)
0131 
0132         functions = qmlclass.get_functions()
0133         self.assertEqual(len(functions), 1)
0134         self.assertEqual(functions[0].name, "foo")
0135         self.assertEqual(functions[0].type, "void")
0136 
0137     def test_keyword_arguments(self):
0138         src = """Item {
0139                      function foo(propertyArgument, signalArgument) {
0140                          return propertyArgument + signalArgument;
0141                      }
0142                  }"""
0143 
0144         lexer = Lexer(src)
0145         lexer.tokenize()
0146         qmlclass = QmlClass("Foo")
0147         qmlparser.parse(lexer.tokens, qmlclass)
0148 
0149         functions = qmlclass.get_functions()
0150         self.assertEqual(len(functions), 1)
0151         self.assertEqual(functions[0].name, "foo")
0152         self.assertEqual(functions[0].type, "void")
0153 
0154     def test_signals(self):
0155         src = """Item {
0156                      signal userAdded(string username, int age)
0157                  }"""
0158 
0159         lexer = Lexer(src)
0160         lexer.tokenize()
0161         qmlclass = QmlClass("Foo")
0162         qmlparser.parse(lexer.tokens, qmlclass)
0163 
0164         signals = qmlclass.get_signals()
0165         self.assertEqual(len(signals), 1)
0166         signal = signals[0]
0167         self.assertEqual(signal.name, "userAdded")
0168 
0169         self.assertEqual(len(signal.args), 2)
0170         self.assertEqual(signal.args[0].name, "username")
0171         self.assertEqual(signal.args[0].type, "string")
0172         self.assertEqual(signal.args[1].name, "age")
0173         self.assertEqual(signal.args[1].type, "int")
0174 
0175     def test_functions(self):
0176         src = """Item {
0177                     function scale(aspect = 4.0 / 3.0) {}
0178                  }"""
0179         lexer = Lexer(src)
0180         lexer.tokenize()
0181         qmlclass = QmlClass("Foo")
0182         qmlparser.parse(lexer.tokens, qmlclass)
0183         functions = qmlclass.get_functions()
0184         self.assertEqual(len(functions), 1)
0185         self.assertEqual(functions[0].args[0].name, "aspect")
0186         self.assertEqual(functions[0].args[0].default_value, "4.0/3.0")