You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.4 KiB

  1. #!/usr/bin/env python
  2. from __future__ import unicode_literals
  3. # Allow direct execution
  4. import os
  5. import sys
  6. import unittest
  7. sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  8. from youtube_dl.jsinterp import JSInterpreter
  9. class TestJSInterpreter(unittest.TestCase):
  10. def test_basic(self):
  11. jsi = JSInterpreter('function x(){;}')
  12. self.assertEqual(jsi.call_function('x'), None)
  13. jsi = JSInterpreter('function x3(){return 42;}')
  14. self.assertEqual(jsi.call_function('x3'), 42)
  15. def test_calc(self):
  16. jsi = JSInterpreter('function x4(a){return 2*a+1;}')
  17. self.assertEqual(jsi.call_function('x4', 3), 7)
  18. def test_empty_return(self):
  19. jsi = JSInterpreter('function f(){return; y()}')
  20. self.assertEqual(jsi.call_function('f'), None)
  21. def test_morespace(self):
  22. jsi = JSInterpreter('function x (a) { return 2 * a + 1 ; }')
  23. self.assertEqual(jsi.call_function('x', 3), 7)
  24. jsi = JSInterpreter('function f () { x = 2 ; return x; }')
  25. self.assertEqual(jsi.call_function('f'), 2)
  26. def test_strange_chars(self):
  27. jsi = JSInterpreter('function $_xY1 ($_axY1) { var $_axY2 = $_axY1 + 1; return $_axY2; }')
  28. self.assertEqual(jsi.call_function('$_xY1', 20), 21)
  29. def test_operators(self):
  30. jsi = JSInterpreter('function f(){return 1 << 5;}')
  31. self.assertEqual(jsi.call_function('f'), 32)
  32. jsi = JSInterpreter('function f(){return 19 & 21;}')
  33. self.assertEqual(jsi.call_function('f'), 17)
  34. jsi = JSInterpreter('function f(){return 11 >> 2;}')
  35. self.assertEqual(jsi.call_function('f'), 2)
  36. def test_array_access(self):
  37. jsi = JSInterpreter('function f(){var x = [1,2,3]; x[0] = 4; x[0] = 5; x[2] = 7; return x;}')
  38. self.assertEqual(jsi.call_function('f'), [5, 2, 7])
  39. def test_parens(self):
  40. jsi = JSInterpreter('function f(){return (1) + (2) * ((( (( (((((3)))))) )) ));}')
  41. self.assertEqual(jsi.call_function('f'), 7)
  42. jsi = JSInterpreter('function f(){return (1 + 2) * 3;}')
  43. self.assertEqual(jsi.call_function('f'), 9)
  44. def test_assignments(self):
  45. jsi = JSInterpreter('function f(){var x = 20; x = 30 + 1; return x;}')
  46. self.assertEqual(jsi.call_function('f'), 31)
  47. jsi = JSInterpreter('function f(){var x = 20; x += 30 + 1; return x;}')
  48. self.assertEqual(jsi.call_function('f'), 51)
  49. jsi = JSInterpreter('function f(){var x = 20; x -= 30 + 1; return x;}')
  50. self.assertEqual(jsi.call_function('f'), -11)
  51. def test_comments(self):
  52. 'Skipping: Not yet fully implemented'
  53. return
  54. jsi = JSInterpreter('''
  55. function x() {
  56. var x = /* 1 + */ 2;
  57. var y = /* 30
  58. * 40 */ 50;
  59. return x + y;
  60. }
  61. ''')
  62. self.assertEqual(jsi.call_function('x'), 52)
  63. jsi = JSInterpreter('''
  64. function f() {
  65. var x = "/*";
  66. var y = 1 /* comment */ + 2;
  67. return y;
  68. }
  69. ''')
  70. self.assertEqual(jsi.call_function('f'), 3)
  71. def test_precedence(self):
  72. jsi = JSInterpreter('''
  73. function x() {
  74. var a = [10, 20, 30, 40, 50];
  75. var b = 6;
  76. a[0]=a[b%a.length];
  77. return a;
  78. }''')
  79. self.assertEqual(jsi.call_function('x'), [20, 20, 30, 40, 50])
  80. if __name__ == '__main__':
  81. unittest.main()