def test_call(self):
        self.assert_output('foo(1, 2)', 'foo(1,2);')
        self.assert_output('foo.bar(1, 2)', 'foo.bar(1,2);')
        self.assert_output('foo(1, *bar)', 'foo(1,...bar);')

        with self.assertRaises(TranslationError):
            translate('foo(1, bar=2)')
    def test_delete(self):
        self.assert_output("del foo['bar']", 'delete foo["bar"]')
        self.assert_output('del foo.bar', 'delete foo.bar')

        with self.assertRaises(TranslationError):
            translate('del foo')

        with self.assertRaises(TranslationError):
            translate('del foo.bar, bar["baz"]')
    def test_subscript(self):
        self.assert_output('a[1]', 'a[1];')
        self.assert_output("a['b']", 'a["b"];')
        self.assert_output('a[:2]', 'a.slice(0,2);')
        self.assert_output('a[2:]', 'a.slice(2);')
        self.assert_output('a[:]', 'a.slice();')

        with self.assertRaises(TranslationError):
            translate('a[::2]')

        with self.assertRaises(TranslationError):
            translate('a[1:2, 3]')
    def test_binary_op(self):
        self.assert_output('a + b', 'a+b;')
        self.assert_output('a - b', 'a-b;')
        self.assert_output('a * b', 'a*b;')
        self.assert_output('a / b', 'a/b;')
        self.assert_output('a // b', 'Math.floor(a/b);')
        self.assert_output('a % b', 'a%b;')
        self.assert_output('a ** b', 'Math.pow(a,b);')
        self.assert_output('a << b', 'a<<b;')
        self.assert_output('a >> b', 'a>>b;')
        self.assert_output('a | b', 'a|b;')
        self.assert_output('a & b', 'a&b;')
        self.assert_output('a ^ b', 'a^b;')

        with self.assertRaises(TranslationError):
            translate('a @ b')
    def test_function_def(self):
        self.assert_output(
            'def foo(a):\n    return a + 1',
            'function foo(a) {return a+1;}'
        )

        self.assert_output(
            'def foo(a, *b):\n    pass',
            'function foo(a,...b) {}',
        )

        with self.assertRaises(TranslationError):
            translate('def foo(a, **b):\n    pass')

        with self.assertRaises(TranslationError):
            translate('@bar\ndef foo(a):\n    pass')
    def test_compare(self):
        self.assert_output('a < b > c', 'a<b>c;')

        with self.assertRaises(TranslationError):
            translate('a not in b')
 def assert_output(self, source, expected):
     actual = translate(source)
     self.assertEqual(actual, expected)
    def test_dict(self):
        self.assert_output("{'a': 1, 'b': 2}", '{a:1,b:2};')

        with self.assertRaises(TranslationError):
            translate("{a: 1}")
 def test_ellipsis(self):
     with self.assertRaises(TranslationError):
         translate('[1, ..., 2]')
    def test_raise(self):
        self.assert_output('raise "foo"', 'throw "foo"')

        with self.assertRaises(TranslationError):
            translate('raise "foo" from "bar"')