Add "arguments" deserialization tests for "script.callFunction" (#34830)
* Add deserialization tests
* Use `recursive_compare` to assert result
Co-authored-by: Maksim Sadym <sadym@google.com>
diff --git a/webdriver/tests/bidi/script/call_function/arguments.py b/webdriver/tests/bidi/script/call_function/arguments.py
new file mode 100644
index 0000000..f1e8323
--- /dev/null
+++ b/webdriver/tests/bidi/script/call_function/arguments.py
@@ -0,0 +1,117 @@
+import pytest
+
+from webdriver.bidi.modules.script import ContextTarget
+from ... import recursive_compare
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize(
+ "argument, expected",
+ [
+ ({"type": "undefined"}, "undefined"),
+ ({"type": "null"}, "null"),
+ ({"type": "string", "value": "foobar"}, "'foobar'"),
+ ({"type": "string", "value": "2"}, "'2'"),
+ ({"type": "number", "value": "-0"}, "-0"),
+ ({"type": "number", "value": "Infinity"}, "Infinity"),
+ ({"type": "number", "value": "-Infinity"}, "-Infinity"),
+ ({"type": "number", "value": 3}, "3"),
+ ({"type": "number", "value": 1.4}, "1.4"),
+ ({"type": "boolean", "value": True}, "true"),
+ ({"type": "boolean", "value": False}, "false"),
+ ({"type": "bigint", "value": "42"}, "42n"),
+ ],
+)
+async def test_primitive_values(bidi_session, top_context, argument, expected):
+ result = await bidi_session.script.call_function(
+ function_declaration=
+ f"""(arg) => {{
+ if(arg!=={expected})
+ throw Error("Argument should be {expected}, but was "+arg);
+ return arg;
+ }}""",
+ arguments=[argument],
+ await_promise=False,
+ target=ContextTarget(top_context["context"]),
+ )
+
+ recursive_compare(argument, result)
+
+
+@pytest.mark.asyncio
+async def test_nan(bidi_session, top_context):
+ nan_remote_value = {"type": "number", "value": "NaN"}
+ result = await bidi_session.script.call_function(
+ function_declaration=
+ f"""(arg) => {{
+ if(!isNaN(arg))
+ throw Error("Argument should be 'NaN', but was "+arg);
+ return arg;
+ }}""",
+ arguments=[nan_remote_value],
+ await_promise=False,
+ target=ContextTarget(top_context["context"]),
+ )
+
+ recursive_compare(nan_remote_value, result)
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize(
+ "argument, expected_type",
+ [
+ ({
+ "type": "array",
+ "value": [
+ {"type": "string", "value": "foobar"},
+ ],
+ },
+ "Array"
+ ),
+ ({"type": "date", "value": "2022-05-31T13:47:29.000Z"},
+ "Date"
+ ),
+ ({
+ "type": "map",
+ "value": [
+ ["foobar", {"type": "string", "value": "foobar"}],
+ ],
+ },
+ "Map"
+ ),
+ ({
+ "type": "object",
+ "value": [
+ ["foobar", {"type": "string", "value": "foobar"}],
+ ],
+ },
+ "Object"
+ ),
+ ({"type": "regexp", "value": {"pattern": "foo", "flags": "g"}},
+ "RegExp"
+ ),
+ ({
+ "type": "set",
+ "value": [
+ {"type": "string", "value": "foobar"},
+ ],
+ },
+ "Set"
+ )
+ ],
+)
+async def test_local_values(bidi_session, top_context, argument, expected_type):
+ result = await bidi_session.script.call_function(
+ function_declaration=
+ f"""(arg) => {{
+ if(! (arg instanceof {expected_type}))
+ throw Error("Argument type should be {expected_type}, but was "+
+ Object.prototype.toString.call(arg));
+ return arg;
+ }}""",
+ arguments=[argument],
+ await_promise=False,
+ target=ContextTarget(top_context["context"]),
+ )
+
+ recursive_compare(argument, result)