[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