def test_function_in_jsx_map_array(self):
        tree = parse_statement(
            "#frontend\n<input\n\tonChange=function(event)\n\t\tfoo()\n\tvalue=\"bar\"\n/>\n"
        )
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(
            result["frontend"],
            _wrap_front(
                "new Component(\"input\", {\n    onChange: async (event) => {\n        await foo();\n    },\n    value: \"bar\",\n\n}, []);\n"
            ))

        tree = parse_statement(
            "foo = {\n\tonChange: function(event)\n\t\tfoo()\n\tvalue: \"bar\"\n"
        )
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(
            result["backend"],
            _wrap_back(
                "var foo = {\n    \"onChange\": async (event) => {\n        await foo();\n    },\n    \"value\": \"bar\",\n}\n"
            ))

        tree = parse_statement(
            "foo = [\n\tfunction(event)\n\t\tfoo()\n\t\"bar\"\n]\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(
            result["backend"],
            _wrap_back(
                "var foo = [\n    async (event) => {\n        await foo();\n    },\n    \"bar\",\n\n];\n"
            ))
    def test_variables(self):
        tree = parse_statement("foo = 'abcd'\nbar = foo\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(result["backend"],
                         _wrap_back("var foo = \"abcd\";\nvar bar = foo;\n"))

        tree = parse_statement("foo = 5.45\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(result["backend"], _wrap_back("var foo = 5.45;\n"))

        tree = parse_statement("foo = 5\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(result["backend"], _wrap_back("var foo = 5;\n"))

        tree = parse_statement("foo = 5\nfoo = foo ++\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(result["backend"],
                         _wrap_back("var foo = 5;\nfoo = foo++;\n"))
    def test_function_definition(self):
        tree = parse_statement("function foo()\n    bar = baz\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(
            result["backend"],
            _wrap_back(
                "async function foo() {\n    var bar = baz;\n}\n\nmodule.exports = {\n\tfoo\n};\n"
            ))

        tree = parse_statement("function()\n    bar = baz\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(result["backend"],
                         _wrap_back("async () => {\n    var bar = baz;\n}\n"))

        tree = parse_statement("function foo(bar, baz)\n    bar = baz\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(
            result["backend"],
            _wrap_back(
                "async function foo(bar, baz) {\n    var bar = baz;\n}\n\nmodule.exports = {\n\tfoo\n};\n"
            ))
    def test_boolean(self):
        tree = parse_statement("foo = false")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(result["backend"], _wrap_back("var foo = false;\n"))

        tree = parse_statement("foo = true")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(result["backend"], _wrap_back("var foo = true;\n"))
    def test_class_method_call(self):
        tree = parse_statement("foo = bar.baz(\n\n)\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(result["backend"],
                         _wrap_back("var foo = await bar.baz(\n\n);\n"))

        tree = parse_statement("foo = bar.baz.biz.buzz(\n\n)\n")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(
            result["backend"],
            _wrap_back("var foo = await bar.baz.biz.buzz(\n\n);\n"))
    def test_mysql(self):
        tree = parse_statement(
            "table = Table(\n\t\"table1\"\n\t[\n\t]\n\tTable.SOURCE_MYSQL\n)\n"
        )
        processed = process_tree(tree)
        output = generate(processed, "js")
        imports = output['external_imports']
        self.assertEqual(imports, [{"module": "mysql", "version": "2.18.1"}])

        tree = parse_statement(
            "table = Table(\n\t\"table1\"\n\t[\n\t]\n\tTable.SOURCE_FILE\n)\n")
        processed = process_tree(tree)
        output = generate(processed, "js")
        imports = output['external_imports']
        self.assertEqual(imports, [])
 def test_class_variables(self):
     tree = parse_statement("foo = bar.baz.biz")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(result["backend"],
                      _wrap_back("var foo = bar.baz.biz;\n"))
 def test_one_line_function(self):
     tree = parse_statement("foo = bar()")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(result["backend"],
                      _wrap_back("var foo = await bar();\n"))
 def test_function_call_and_platform(self):
     tree = parse_statement("foo()\n#frontend\nfoo()\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(result["backend"], _wrap_back("await foo();\n"))
     self.assertEqual(result["frontend"], _wrap_front("await foo();\n"))
 def test_else(self):
     tree = parse_statement("if foo == true\nelse\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(result["backend"],
                      _wrap_back("if (foo == true) {\n}\nelse {\n}\n"))
 def test_maps(self):
     tree = parse_statement("foo = {\n\tabcd: 'foo'\n}\n")
     processed = process_tree(tree)
     self.assertEqual(processed, [
         statement(
             {
                 "type":
                 TYPES["VARIABLE_ASSIGNMENT"],
                 "name":
                 "foo",
                 "value":
                 statement({
                     "type": TYPES["MAP"],
                     "self_closes": False,
                 }, 0),
             }, 0),
         statement(
             {
                 "type": TYPES["MAP_ROW"],
                 "key": "abcd",
                 "value": statement("\"foo\"", 0),
             }, 4),
         statement({
             "type": TYPES["MAP_END"],
         }, 0),
     ])
 def test_labels(self):
     tree = parse_statement("#frontend\nfoo = bar\n")
     processed = process_tree(tree)
     result = generate(processed, "js", "frontend_label")
     result = result["code"]
     self.assertTrue(result["frontend"].startswith(
         "Modules[\"frontend_label\"] = (async ()"))
 def test_variable_chain(self):
     tree = parse_statement("this.foo.bar = baz")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(result["backend"],
                      _wrap_back("this.foo.bar = baz;\n"))
 def test_value_manipulation_with_function(self):
     tree = parse_statement("bar + foo(\n\tbaz\n)\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(result["backend"],
                      _wrap_back("bar + await foo(\n    baz,\n\n);\n"))
 def test_platforms_and_imports(self):
     tree = parse_statement(
         "#frontend\nprint(\n    foo\n)\n#backend\nprint(\n    foo\n)\n")
     processed = process_tree(tree)
     output = generate(processed, "js")
     result = output["code"]
     imports = output["internal_imports"]
     self.assertEqual(
         result["backend"],
         _wrap_back(
             "const {\n    print\n} = require(\"./stdlib_js_backend_common.js\");\n\nawait print(\n    foo,\n\n);\n"
         ))
     self.assertEqual(imports["backend"], [{
         "category": "backend",
         "extension": "js",
         "type": "stdlib",
         "lang": "js",
         "library": "common",
     }])
     self.assertEqual(result["frontend"],
                      _wrap_front("await print(\n    foo,\n\n);\n"))
     self.assertEqual(imports["frontend"], [{
         "extension": "js",
         "type": "stdlib",
         "lang": "js",
         "library": "common",
         "category": "frontend",
     }])
    def test_functions(self):
        tree = parse_statement("""function abba(a, b, c)
    foo = bar
function(a,b,c)
    foo = bar
function abba()
    foo = bar
function()
    foo = bar
""")
        processed = process_tree(tree)
        self.assertEqual(processed, [
            statement(
                {
                    "type": TYPES["FUNCTION"],
                    "name": "abba",
                    "params": ["a", "b", "c"],
                }, 0),
            statement(
                {
                    "type": TYPES["VARIABLE_ASSIGNMENT"],
                    "name": "foo",
                    "value": statement("bar", 0),
                }, 4),
            statement(
                {
                    "type": TYPES["FUNCTION"],
                    "name": None,
                    "params": ["a", "b", "c"],
                }, 0),
            statement(
                {
                    "type": TYPES["VARIABLE_ASSIGNMENT"],
                    "name": "foo",
                    "value": statement("bar", 0),
                }, 4),
            statement(
                {
                    "type": TYPES["FUNCTION"],
                    "name": "abba",
                    "params": [],
                }, 0),
            statement(
                {
                    "type": TYPES["VARIABLE_ASSIGNMENT"],
                    "name": "foo",
                    "value": statement("bar", 0),
                }, 4),
            statement({
                "type": TYPES["FUNCTION"],
                "name": None,
                "params": [],
            }, 0),
            statement(
                {
                    "type": TYPES["VARIABLE_ASSIGNMENT"],
                    "name": "foo",
                    "value": statement("bar", 0),
                }, 4),
        ])
    def test_jsx(self):
        expected_imports = [{
            "category": "frontend",
            "extension": "js",
            "lang": "js",
            "library": "frontend",
            "type": "stdlib",
        }]
        tree = parse_statement("#frontend\n<div>\n</div>\n")
        processed = process_tree(tree)
        output = generate(processed, "js")
        result = output["code"]
        imports = output["internal_imports"]
        self.assertEqual(result["frontend"],
                         _wrap_front("new Component(\"div\", {}, [\n\n]);\n"))
        self.assertEqual(imports["frontend"], expected_imports)

        tree = parse_statement("#frontend\n<div/>\n")
        processed = process_tree(tree)
        output = generate(processed, "js")
        result = output["code"]
        imports = output["internal_imports"]
        self.assertEqual(result["frontend"],
                         _wrap_front("new Component(\"div\", {}, []);\n"))
        self.assertEqual(imports["frontend"], expected_imports)

        tree = parse_statement("#frontend\n<div\n\tfoo=\"bar\"\n>\n</div>\n")
        processed = process_tree(tree)
        output = generate(processed, "js")
        result = output["code"]
        imports = output["internal_imports"]
        self.assertEqual(
            result["frontend"],
            _wrap_front(
                "new Component(\"div\", {\n    foo: \"bar\",\n\n}, [\n\n]);\n")
        )
        self.assertEqual(imports["frontend"], expected_imports)

        tree = parse_statement("#frontend\n<input\n/>\n")
        processed = process_tree(tree)
        output = generate(processed, "js")
        result = output["code"]
        imports = output["internal_imports"]
        self.assertEqual(
            result["frontend"],
            _wrap_front("new Component(\"input\", {\n\n}, []);\n"))
        self.assertEqual(imports["frontend"], expected_imports)
 def test_maps(self):
     tree = parse_statement("foo = {\n\tabcd: 'foo'\n}\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back("var foo = {\n    \"abcd\": \"foo\",\n\n};\n"))
 def test_arrays(self):
     tree = parse_statement("foo = [\n\t'bar'\n\t'baz'\n]\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back("var foo = [\n    \"bar\",\n    \"baz\",\n\n];\n"))
 def test_for_as_array(self):
     tree = parse_statement("for foo as bar\n    baz = bar\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back("for (var bar of foo) {\n    var baz = bar;\n}\n"))
 def test_for_normal(self):
     tree = parse_statement("for i=0;i<5;i++\n    foo = i\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back("for (var i = 0;i < 5;i++) {\n    var foo = i;\n}\n"))
 def test_function_call(self):
     tree = parse_statement("func(\n    foo\n    bar\n    baz\n)\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back("await func(\n    foo,\n    bar,\n    baz,\n\n);\n"))
    def test_value_manipulation(self):
        tree = parse_statement("bar + baz")
        processed = process_tree(tree)
        self.assertEqual(processed, [
            statement(
                {
                    "type": TYPES["VALUE_MANIPULATION"],
                    "values": [
                        statement("bar", 0),
                        "+",
                        statement("baz", 0),
                    ],
                }, 0),
        ])

        tree = parse_statement("bar    -    \"string\"")
        processed = process_tree(tree)
        self.assertEqual(processed, [
            statement(
                {
                    "type":
                    TYPES["VALUE_MANIPULATION"],
                    "values": [
                        statement("bar", 0),
                        "-",
                        statement("\"string\"", 0),
                    ],
                }, 0),
        ])

        tree = parse_statement("bar + baz + 'foo'")
        processed = process_tree(tree)
        self.assertEqual(processed, [
            statement(
                {
                    "type":
                    TYPES["VALUE_MANIPULATION"],
                    "values": [
                        statement("bar", 0),
                        "+",
                        statement("baz", 0),
                        "+",
                        statement("\"foo\"", 0),
                    ],
                }, 0),
        ])
 def test_for_as_object(self):
     tree = parse_statement("for foo as bar : baz\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back("for (var bar in foo) {\n    var baz = foo[bar];\n}\n"))
    def test_class_definition(self):
        tree = parse_statement("class Foo")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(
            result["backend"],
            _wrap_back("class Foo {\n}\n\nmodule.exports = {\n\tFoo\n};\n"))

        tree = parse_statement("class Foo extends Bar")
        processed = process_tree(tree)
        result = generate(processed, "js")
        result = result["code"]
        self.assertEqual(
            result["backend"],
            _wrap_back(
                "class Foo extends Bar {\n}\n\nmodule.exports = {\n\tFoo\n};\n"
            ))
 def test_while(self):
     tree = parse_statement("foo = 5\nwhile foo > bar\n    foo = bar\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back(
             "var foo = 5;\nwhile (foo > bar) {\n    foo = bar;\n}\n"))
 def test_map_one_line(self):
     tree = parse_statement("{}")
     processed = process_tree(tree)
     self.assertEqual(processed, [
         statement({
             "type": TYPES["MAP"],
             "self_closes": True,
         }, 0),
     ])
 def test_conditionals(self):
     tree = parse_statement("foo = 10\nif foo == bar\n    foo = bar\n")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back(
             "var foo = 10;\nif (foo == bar) {\n    foo = bar;\n}\n"))
 def test_imports_frontend(self):
     tree = parse_statement("#frontend\nfoo = Bar()\n")
     processed = process_tree(tree)
     result = generate(processed, "js", None,
                       {"frontend": {
                           "classes": ["Bar"]
                       }})
     result = result["code"]
     self.assertEqual(result["frontend"],
                      _wrap_front("var foo = new Bar();\n"))
 def test_imports_with_chain(self):
     tree = parse_statement("Api.post()")
     processed = process_tree(tree)
     result = generate(processed, "js")
     result = result["code"]
     self.assertEqual(
         result["backend"],
         _wrap_back(
             "const {\n    Api\n} = require(\"./stdlib_js_backend_common.js\");\n\nawait Api.post();\n"
         ))