summaryrefslogtreecommitdiff
path: root/test/test_jsinterp.py
blob: acdabffb1f84cb8ab090286c146ba0dad41357ef (plain)
    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     def test_call(self):
  108         jsi = JSInterpreter('''
  109         function x() { return 2; }
  110         function y(a) { return x() + a; }
  111         function z() { return y(3); }
  112         ''')
  113         self.assertEqual(jsi.call_function('z'), 5)
  114 
  115     def test_for_loop(self):
  116         # function x() { a=0; for (i=0; i-10; i++) {a++} a }
  117         jsi = JSInterpreter('''
  118         function x() { a=0; for (i=0; i-10; i = i + 1) {a++} a }
  119         ''')
  120         self.assertEqual(jsi.call_function('x'), 10)
  121 
  122     def test_switch(self):
  123         jsi = JSInterpreter('''
  124         function x(f) { switch(f){
  125             case 1:f+=1;
  126             case 2:f+=2;
  127             case 3:f+=3;break;
  128             case 4:f+=4;
  129             default:f=0;
  130         } return f }
  131         ''')
  132         self.assertEqual(jsi.call_function('x', 1), 7)
  133         self.assertEqual(jsi.call_function('x', 3), 6)
  134         self.assertEqual(jsi.call_function('x', 5), 0)
  135 
  136     def test_switch_default(self):
  137         jsi = JSInterpreter('''
  138         function x(f) { switch(f){
  139             case 2: f+=2;
  140             default: f-=1;
  141             case 5:
  142             case 6: f+=6;
  143             case 0: break;
  144             case 1: f+=1;
  145         } return f }
  146         ''')
  147         self.assertEqual(jsi.call_function('x', 1), 2)
  148         self.assertEqual(jsi.call_function('x', 5), 11)
  149         self.assertEqual(jsi.call_function('x', 9), 14)
  150 
  151     def test_try(self):
  152         jsi = JSInterpreter('''
  153         function x() { try{return 10} catch(e){return 5} }
  154         ''')
  155         self.assertEqual(jsi.call_function('x'), 10)
  156 
  157     def test_for_loop_continue(self):
  158         jsi = JSInterpreter('''
  159         function x() { a=0; for (i=0; i-10; i++) { continue; a++ } a }
  160         ''')
  161         self.assertEqual(jsi.call_function('x'), 0)
  162 
  163     def test_for_loop_break(self):
  164         jsi = JSInterpreter('''
  165         function x() { a=0; for (i=0; i-10; i++) { break; a++ } a }
  166         ''')
  167         self.assertEqual(jsi.call_function('x'), 0)
  168 
  169     def test_literal_list(self):
  170         jsi = JSInterpreter('''
  171         function x() { [1, 2, "asdf", [5, 6, 7]][3] }
  172         ''')
  173         self.assertEqual(jsi.call_function('x'), [5, 6, 7])
  174 
  175     def test_comma(self):
  176         jsi = JSInterpreter('''
  177         function x() { a=5; a -= 1, a+=3; return a }
  178         ''')
  179         self.assertEqual(jsi.call_function('x'), 7)
  180 
  181 
  182 if __name__ == '__main__':
  183     unittest.main()

Generated by cgit