[wdspec] Add tests for internal ids.
Depends on D157634
Differential Revision: https://phabricator.services.mozilla.com/D157813
bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1770754
gecko-commit: 1fa586b566a71e5c8a099739330a294e664eab92
gecko-reviewers: webdriver-reviewers, jdescottes, whimboo
diff --git a/webdriver/tests/bidi/script/call_function/internal_id.py b/webdriver/tests/bidi/script/call_function/internal_id.py
new file mode 100644
index 0000000..5620842
--- /dev/null
+++ b/webdriver/tests/bidi/script/call_function/internal_id.py
@@ -0,0 +1,67 @@
+import pytest
+
+from ... import recursive_compare, any_string
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize(
+ "return_structure, result_type",
+ [
+ ("[data, data]", "array"),
+ ("new Map([['foo', data],['bar', data]])", "map"),
+ ("({ 'foo': data, 'bar': data })", "object"),
+ ],
+)
+@pytest.mark.parametrize(
+ "expression, type",
+ [
+ ("[1]", "array"),
+ ("new Map([[true, false]])", "map"),
+ ("new Set(['baz'])", "set"),
+ ("{ baz: 'qux' }", "object"),
+ ],
+)
+async def test_remote_values_with_internal_id(
+ call_function, return_structure, result_type, expression, type
+):
+ result = await call_function(
+ f"() => {{ const data = {expression}; return {return_structure}; }}"
+ )
+ result_value = result["value"]
+
+ assert len(result_value) == 2
+
+ if result_type == "array":
+ value = [
+ {"type": type, "internalId": any_string},
+ {"type": type, "internalId": any_string},
+ ]
+ internalId1 = result_value[0]["internalId"]
+ internalId2 = result_value[1]["internalId"]
+ else:
+ value = [
+ ["foo", {"type": type, "internalId": any_string}],
+ ["bar", {"type": type, "internalId": any_string}],
+ ]
+ internalId1 = result_value[0][1]["internalId"]
+ internalId2 = result_value[1][1]["internalId"]
+
+ # Make sure that the same duplicated objects have the same internal ids
+ assert internalId1 == internalId2
+
+ recursive_compare(value, result_value)
+
+
+@pytest.mark.asyncio
+async def test_different_remote_values_have_unique_internal_ids(call_function):
+ result = await call_function(
+ "() => { const obj1 = [1]; const obj2 = {'foo': 'bar'}; return [obj1, obj2, obj1, obj2]; }"
+ )
+
+ assert len(result["value"]) == 4
+
+ internalId1 = result["value"][0]["internalId"]
+ internalId2 = result["value"][1]["internalId"]
+
+ # Make sure that different duplicated objects have different internal ids
+ assert internalId1 != internalId2
diff --git a/webdriver/tests/bidi/script/evaluate/internal_id.py b/webdriver/tests/bidi/script/evaluate/internal_id.py
new file mode 100644
index 0000000..98742ef
--- /dev/null
+++ b/webdriver/tests/bidi/script/evaluate/internal_id.py
@@ -0,0 +1,65 @@
+import pytest
+
+from ... import recursive_compare, any_string
+
+
+@pytest.mark.asyncio
+@pytest.mark.parametrize(
+ "return_structure, result_type",
+ [
+ ("[data, data]", "array"),
+ ("new Map([['foo', data],['bar', data]])", "map"),
+ ("({ 'foo': data, 'bar': data })", "object"),
+ ],
+)
+@pytest.mark.parametrize(
+ "expression, type",
+ [
+ ("[1]", "array"),
+ ("new Map([[true, false]])", "map"),
+ ("new Set(['baz'])", "set"),
+ ("{ baz: 'qux' }", "object"),
+ ],
+)
+async def test_remote_values_with_internal_id(
+ evaluate, return_structure, result_type, expression, type
+):
+ result = await evaluate(f"{{const data = {expression}; {return_structure}}}")
+ result_value = result["value"]
+
+ assert len(result_value) == 2
+
+ if result_type == "array":
+ value = [
+ {"type": type, "internalId": any_string},
+ {"type": type, "internalId": any_string},
+ ]
+ internalId1 = result_value[0]["internalId"]
+ internalId2 = result_value[1]["internalId"]
+ else:
+ value = [
+ ["foo", {"type": type, "internalId": any_string}],
+ ["bar", {"type": type, "internalId": any_string}],
+ ]
+ internalId1 = result_value[0][1]["internalId"]
+ internalId2 = result_value[1][1]["internalId"]
+
+ # Make sure that the same duplicated objects have the same internal ids
+ assert internalId1 == internalId2
+
+ recursive_compare(value, result_value)
+
+
+@pytest.mark.asyncio
+async def test_different_remote_values_have_unique_internal_ids(evaluate):
+ result = await evaluate(
+ "{const obj1 = [1]; const obj2 = {'foo': 'bar'}; [obj1, obj2, obj1, obj2]}"
+ )
+
+ assert len(result["value"]) == 4
+
+ internalId1 = result["value"][0]["internalId"]
+ internalId2 = result["value"][1]["internalId"]
+
+ # Make sure that different duplicated objects have different internal ids
+ assert internalId1 != internalId2