Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_print(self):
# Test code
assert py2js('print()') == 'console.log();'
assert py2js('print(3)') == 'console.log(3);'
assert py2js('foo.print()') == 'foo.print();'
# Test single
assert evalpy('print(3)') == '3'
assert evalpy('print(3); print(3)') == '3\n3'
assert evalpy('print(); print(3)') == '\n3' # Test \n
assert evalpy('print("hello world")') == 'hello world'
# Test multiple args
assert evalpy('print(3, "hello")') == '3 hello'
assert evalpy('print(3+1, "hello", 3+1)') == '4 hello 4'
# Test sep and end
assert evalpy('print(3, 4, 5)') == '3 4 5'
assert evalpy('print(3, 4, 5, sep="")') == '345'
assert evalpy('print(3, 4, 5, sep="\\n")') == '3\n4\n5'
assert evalpy('print(3, 4, 5, sep="--")') == '3--4--5'
assert evalpy('print(3, 4, 5, end="-")') == '3 4 5-'
def test_var_args3(self):
code1 = 'var x = ' + self.method3.js.jscode
lines = [line for line in code1.split('\n') if line]
code2 = py2js('x(2, 3)')
assert evaljs(code1 + code2, False) == '[2,3]'
code2 = py2js('x()')
assert evaljs(code1 + code2, False) == '[]'
code2 = py2js('a=[2,3]\nx(*a)')
assert evaljs(code1 + code2, False) == '[2,3]'
code2 = py2js('a=[2,3]\nx(1,2,*a)')
assert evaljs(code1 + code2, False) == '[1,2,2,3]'
def test_ops(self):
# Test code
assert py2js('2+3') == '2 + 3;' # Binary
assert py2js('2/3') == '2 / 3;'
assert py2js('not 2') == '!2;' # Unary
assert py2js('-(2+3)') == '-(2 + 3);'
assert py2js('True and False') == 'true && false;' # Boolean
assert py2js('4 > 3') == '4 > 3;' # Comparisons
assert py2js('4 is 3') == '4 === 3;'
# No parentices around names, numbers and strings
assert py2js('foo + bar') == "foo + bar;"
assert py2js('_foo3 + _bar4') == "_foo3 + _bar4;"
assert py2js('3 + 4') == "3 + 4;"
assert py2js('"abc" + "def"') == "'abc' + 'def';"
assert py2js("'abc' + 'def'") == "'abc' + 'def';"
assert py2js("'abc' + \"'def\"") == "'abc' + \"'def\";"
# But they should be if it gets more complex
assert py2js('foo + bar == 3') == "(foo + bar) == 3;"
def test_assignments(self):
assert py2js('foo = 3') == 'var foo = 3;' # with var
assert py2js('foo.bar = 3') == 'foo.bar = 3;' # without var
code = py2js('foo = 3; bar = 4') # define both
assert code.count('var') == 2
code = py2js('foo = 3; foo = 4') # only define first time
assert code.count('var') == 1
code = py2js('foo = bar = 3') # multiple assignment
assert 'foo = bar = 3' in code
assert 'var foo, bar' in code
# self -> this
assert py2js('self') == 'this;'
assert py2js('self.foo') == 'this.foo;'
# Indexing
assert evalpy('a=[0,0]\na[0]=2\na[1]=3\na', False) == '[2,3]'
def test_basic_types(self):
assert py2js('True') == 'true;'
assert py2js('False') == 'false;'
assert py2js('None') == 'null;'
assert py2js('"bla\\"bla"') == "'bla\"bla';"
assert py2js('3') == '3;'
assert py2js('3.1415') == '3.1415;'
assert py2js('[1,2,3]') == '[1, 2, 3];'
assert py2js('{foo: 3, bar: 4}') == '{foo: 3, bar: 4};'
assert ' in ' not in py2js('for i in {1:2, 2:3}: pass')
# Test declaration of iteration variable
assert 'var i;' in py2js('for i in x: pass')
assert 'var i' in py2js('i=""\nfor i in x: pass')
assert 'var i' not in py2js('j=i=""\nfor i in x: pass')
# Test output for range
assert evalpy('for i in range(3):\n print(i)') == '0\n1\n2'
assert evalpy('for i in range(1,6,2):\n print(i)') == '1\n3\n5'
# Test explicit for-array iteration
code = py2js('a=[7,8]\nfor i in range(len(a)):\n print(a[i])')
assert ' in ' not in code and evaljs(code) == '7\n8'
# Test enumeration over arrays - should use actual for-loop
code = py2js('for k in [7, 8]:\n print(k)')
assert ' in ' not in code and evaljs(code) == '7\n8'
# Test enumeration over dicts
# Python cannot see its a dict, and uses a for-loop
code = py2js('d = {3:7, 4:8}\nfor k in d:\n print(k)')
assert ' in ' not in code and evaljs(code) == '3\n4'
code = py2js('d = {3:7, 4:8}\nfor k in d:\n print(d[k])')
assert ' in ' not in code and evaljs(code) == '7\n8'
# .keys()
code = py2js('d = {3:7, 4:8}\nfor k in d.keys():\n print(d[k])')
assert ' in ' in code and evaljs(code) == '7\n8'
# .values()
code = py2js('d = {3:7, 4:8}\nfor v in d.values():\n print(v)')
assert ' in ' in code and evaljs(code) == '7\n8'
# .items()
code = py2js('d = {3:7, 4:8}\nfor k,v in d.items():\n print(k)')
def test_ops(self):
# Test code
assert py2js('2+3') == '2 + 3;' # Binary
assert py2js('2/3') == '2 / 3;'
assert py2js('not 2') == '!2;' # Unary
assert py2js('-(2+3)') == '-(2 + 3);'
assert py2js('True and False') == 'true && false;' # Boolean
assert py2js('4 > 3') == '4 > 3;' # Comparisons
assert py2js('4 is 3') == '4 === 3;'
# No parentices around names, numbers and strings
assert py2js('foo + bar') == "foo + bar;"
assert py2js('_foo3 + _bar4') == "_foo3 + _bar4;"
assert py2js('3 + 4') == "3 + 4;"
assert py2js('"abc" + "def"') == "'abc' + 'def';"
assert py2js("'abc' + 'def'") == "'abc' + 'def';"
assert py2js("'abc' + \"'def\"") == "'abc' + \"'def\";"
# But they should be if it gets more complex
assert py2js('foo + bar == 3') == "(foo + bar) == 3;"
# Test outcome
assert evalpy('2+3') == '5' # Binary
assert evalpy('6/3') == '2'
assert evalpy('4//3') == '1'
assert evalpy('2**8') == '256'
assert evalpy('not True') == 'false' # Unary
assert evalpy('- 3') == '-3'
assert evalpy('True and False') == 'false' # Boolean
def test_assignments(self):
assert py2js('foo = 3') == 'var foo = 3;' # with var
assert py2js('foo.bar = 3') == 'foo.bar = 3;' # without var
code = py2js('foo = 3; bar = 4') # define both
assert code.count('var') == 2
code = py2js('foo = 3; foo = 4') # only define first time
assert code.count('var') == 1
code = py2js('foo = bar = 3') # multiple assignment
assert 'foo = bar = 3' in code
assert 'var foo, bar' in code
# self -> this
assert py2js('self') == 'this;'
assert py2js('self.foo') == 'this.foo;'
# Indexing
assert evalpy('a=[0,0]\na[0]=2\na[1]=3\na', False) == '[2,3]'
def test_ops(self):
# Test code
assert py2js('2+3') == '2 + 3;' # Binary
assert py2js('2/3') == '2 / 3;'
assert py2js('not 2') == '!2;' # Unary
assert py2js('-(2+3)') == '-(2 + 3);'
assert py2js('True and False') == 'true && false;' # Boolean
assert py2js('4 > 3') == '4 > 3;' # Comparisons
assert py2js('4 is 3') == '4 === 3;'
# No parentices around names, numbers and strings
assert py2js('foo + bar') == "foo + bar;"
assert py2js('_foo3 + _bar4') == "_foo3 + _bar4;"
assert py2js('3 + 4') == "3 + 4;"
assert py2js('"abc" + "def"') == "'abc' + 'def';"
assert py2js("'abc' + 'def'") == "'abc' + 'def';"
assert py2js("'abc' + \"'def\"") == "'abc' + \"'def\";"
# But they should be if it gets more complex
assert py2js('foo + bar == 3') == "(foo + bar) == 3;"
# Test outcome
assert evalpy('2+3') == '5' # Binary
assert evalpy('6/3') == '2'
assert evalpy('4//3') == '1'
assert evalpy('2**8') == '256'
assert evalpy('not True') == 'false' # Unary
assert evalpy('- 3') == '-3'
assert evalpy('True and False') == 'false' # Boolean
assert evalpy('True or False') == 'true'
def test_ops(self):
# Test code
assert py2js('2+3') == '2 + 3;' # Binary
assert py2js('2/3') == '2 / 3;'
assert py2js('not 2') == '!2;' # Unary
assert py2js('-(2+3)') == '-(2 + 3);'
assert py2js('True and False') == 'true && false;' # Boolean
assert py2js('4 > 3') == '4 > 3;' # Comparisons
assert py2js('4 is 3') == '4 === 3;'
# No parentices around names, numbers and strings
assert py2js('foo + bar') == "foo + bar;"
assert py2js('_foo3 + _bar4') == "_foo3 + _bar4;"
assert py2js('3 + 4') == "3 + 4;"
assert py2js('"abc" + "def"') == "'abc' + 'def';"
assert py2js("'abc' + 'def'") == "'abc' + 'def';"
assert py2js("'abc' + \"'def\"") == "'abc' + \"'def\";"
# But they should be if it gets more complex
assert py2js('foo + bar == 3') == "(foo + bar) == 3;"
# Test outcome
assert evalpy('2+3') == '5' # Binary
assert evalpy('6/3') == '2'
assert evalpy('4//3') == '1'
assert evalpy('2**8') == '256'
assert evalpy('not True') == 'false' # Unary
assert evalpy('- 3') == '-3'