diff options
| author | dirkf <fieldhouse@gmx.net> | 2022-08-14 18:45:45 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-14 18:45:45 +0100 | 
| commit | d231b56717c73ee597d2e077d11b69ed48a1b02d (patch) | |
| tree | d38a1b2f948b150c253ba91cc8568b6225fa29fd /test/test_jsinterp.py | |
| parent | e6a836d54ca1d3cd02f3ee45ef707a46f23e8291 (diff) | |
[jsinterp] Overhaul JSInterp to handle new YT players 4c3f79c5, 324f67b9 (#31170)
* back-port from yt-dlp 8f53dc44a0cc1c2d98c35740b9293462c080f5d0, thanks pukkandan
* also support void, improve <</>> precedence, improve expressions in comma-list
* add more tests
Diffstat (limited to 'test/test_jsinterp.py')
| -rw-r--r-- | test/test_jsinterp.py | 49 | 
1 files changed, 43 insertions, 6 deletions
| diff --git a/test/test_jsinterp.py b/test/test_jsinterp.py index acdabffb1..c6c931743 100644 --- a/test/test_jsinterp.py +++ b/test/test_jsinterp.py @@ -19,6 +19,9 @@ class TestJSInterpreter(unittest.TestCase):          jsi = JSInterpreter('function x3(){return 42;}')          self.assertEqual(jsi.call_function('x3'), 42) +        jsi = JSInterpreter('function x3(){42}') +        self.assertEqual(jsi.call_function('x3'), None) +          jsi = JSInterpreter('var x5 = function(){return 42;}')          self.assertEqual(jsi.call_function('x5'), 42) @@ -51,8 +54,11 @@ class TestJSInterpreter(unittest.TestCase):          jsi = JSInterpreter('function f(){return 11 >> 2;}')          self.assertEqual(jsi.call_function('f'), 2) +        jsi = JSInterpreter('function f(){return []? 2+3: 4;}') +        self.assertEqual(jsi.call_function('f'), 5) +      def test_array_access(self): -        jsi = JSInterpreter('function f(){var x = [1,2,3]; x[0] = 4; x[0] = 5; x[2] = 7; return x;}') +        jsi = JSInterpreter('function f(){var x = [1,2,3]; x[0] = 4; x[0] = 5; x[2.0] = 7; return x;}')          self.assertEqual(jsi.call_function('f'), [5, 2, 7])      def test_parens(self): @@ -62,6 +68,10 @@ class TestJSInterpreter(unittest.TestCase):          jsi = JSInterpreter('function f(){return (1 + 2) * 3;}')          self.assertEqual(jsi.call_function('f'), 9) +    def test_quotes(self): +        jsi = JSInterpreter(r'function f(){return "a\"\\("}') +        self.assertEqual(jsi.call_function('f'), r'a"\(') +      def test_assignments(self):          jsi = JSInterpreter('function f(){var x = 20; x = 30 + 1; return x;}')          self.assertEqual(jsi.call_function('f'), 31) @@ -104,18 +114,29 @@ class TestJSInterpreter(unittest.TestCase):          }''')          self.assertEqual(jsi.call_function('x'), [20, 20, 30, 40, 50]) +    def test_builtins(self): +        jsi = JSInterpreter(''' +        function x() { return new Date('Wednesday 31 December 1969 18:01:26 MDT') - 0; } +        ''') +        self.assertEqual(jsi.call_function('x'), 86000) +        jsi = JSInterpreter(''' +        function x(dt) { return new Date(dt) - 0; } +        ''') +        self.assertEqual(jsi.call_function('x', 'Wednesday 31 December 1969 18:01:26 MDT'), 86000) +      def test_call(self):          jsi = JSInterpreter('''          function x() { return 2; } -        function y(a) { return x() + a; } +        function y(a) { return x() + (a?a:0); }          function z() { return y(3); }          ''')          self.assertEqual(jsi.call_function('z'), 5) +        self.assertEqual(jsi.call_function('y'), 2)      def test_for_loop(self):          # function x() { a=0; for (i=0; i-10; i++) {a++} a }          jsi = JSInterpreter(''' -        function x() { a=0; for (i=0; i-10; i = i + 1) {a++} a } +        function x() { a=0; for (i=0; i-10; i++) {a++} return a }          ''')          self.assertEqual(jsi.call_function('x'), 10) @@ -156,19 +177,19 @@ class TestJSInterpreter(unittest.TestCase):      def test_for_loop_continue(self):          jsi = JSInterpreter(''' -        function x() { a=0; for (i=0; i-10; i++) { continue; a++ } a } +        function x() { a=0; for (i=0; i-10; i++) { continue; a++ } return a }          ''')          self.assertEqual(jsi.call_function('x'), 0)      def test_for_loop_break(self):          jsi = JSInterpreter(''' -        function x() { a=0; for (i=0; i-10; i++) { break; a++ } a } +        function x() { a=0; for (i=0; i-10; i++) { break; a++ } return a }          ''')          self.assertEqual(jsi.call_function('x'), 0)      def test_literal_list(self):          jsi = JSInterpreter(''' -        function x() { [1, 2, "asdf", [5, 6, 7]][3] } +        function x() { return [1, 2, "asdf", [5, 6, 7]][3] }          ''')          self.assertEqual(jsi.call_function('x'), [5, 6, 7]) @@ -177,6 +198,22 @@ class TestJSInterpreter(unittest.TestCase):          function x() { a=5; a -= 1, a+=3; return a }          ''')          self.assertEqual(jsi.call_function('x'), 7) +        jsi = JSInterpreter(''' +        function x() { a=5; return (a -= 1, a+=3, a); } +        ''') +        self.assertEqual(jsi.call_function('x'), 7) + +    def test_void(self): +        jsi = JSInterpreter(''' +        function x() { return void 42; } +        ''') +        self.assertEqual(jsi.call_function('x'), None) + +    def test_return_function(self): +        jsi = JSInterpreter(''' +        function x() { return [1, function(){return 1}][1] } +        ''') +        self.assertEqual(jsi.call_function('x')([]), 1)  if __name__ == '__main__': | 
