浏览代码

[JSInterp] Improve tests
* from yt-dlp/yt-dlp#12313
* also fix d7c2708

dirkf 5 月之前
父节点
当前提交
420d53387c
共有 2 个文件被更改,包括 20 次插入4 次删除
  1. 18 3
      test/test_jsinterp.py
  2. 2 1
      youtube_dl/jsinterp.py

+ 18 - 3
test/test_jsinterp.py

@@ -212,9 +212,16 @@ class TestJSInterpreter(unittest.TestCase):
         # undefined
         self._test(jsi, NaN, args=[JS_Undefined])
         # y,m,d, ... - may fail with older dates lacking DST data
-        jsi = JSInterpreter('function f() { return new Date(%s); }'
-                            % ('2024, 5, 29, 2, 52, 12, 42',))
-        self._test(jsi, 1719625932042)
+        jsi = JSInterpreter(
+            'function f() { return new Date(%s); }'
+            % ('2024, 5, 29, 2, 52, 12, 42',))
+        self._test(jsi, (
+            1719625932042                           # UK value
+            + (
+                + 3600                              # back to GMT
+                + (time.altzone if time.daylight    # host's DST
+                   else time.timezone)
+            ) * 1000))
         # no arg
         self.assertAlmostEqual(JSInterpreter(
             'function f() { return new Date() - 0; }').call_function('f'),
@@ -485,6 +492,14 @@ class TestJSInterpreter(unittest.TestCase):
         self._test('function f(){return NaN << 42}', 0)
         self._test('function f(){return "21.9" << 1}', 42)
         self._test('function f(){return 21 << 4294967297}', 42)
+        self._test('function f(){return true << "5";}', 32)
+        self._test('function f(){return true << true;}', 2)
+        self._test('function f(){return "19" & "21.9";}', 17)
+        self._test('function f(){return "19" & false;}', 0)
+        self._test('function f(){return "11.0" >> "2.1";}', 2)
+        self._test('function f(){return 5 ^ 9;}', 12)
+        self._test('function f(){return 0.0 << NaN}', 0)
+        self._test('function f(){return null << undefined}', 0)
 
     def test_negative(self):
         self._test('function f(){return 2    *    -2.0    ;}', -4)

+ 2 - 1
youtube_dl/jsinterp.py

@@ -154,6 +154,7 @@ def _js_to_primitive(v):
     )
 
 
+# more exact: yt-dlp/yt-dlp#12110
 def _js_toString(v):
     return (
         'undefined' if v is JS_Undefined
@@ -162,7 +163,7 @@ def _js_toString(v):
         else 'null' if v is None
         # bool <= int: do this first
         else ('false', 'true')[v] if isinstance(v, bool)
-        else '{0:.7f}'.format(v).rstrip('.0') if isinstance(v, compat_numeric_types)
+        else re.sub(r'(?<=\d)\.?0*$', '', '{0:.7f}'.format(v)) if isinstance(v, compat_numeric_types)
         else _js_to_primitive(v))