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