/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
const { BiMap } = ChromeUtils.importESModule(
"chrome://remote/content/shared/BiMap.sys.mjs"
);
add_task(
function test_BiMap_constructor() {
const bimap =
new BiMap();
ok(bimap,
"BiMap instance created");
});
add_task(
function test_BiMap_clear() {
const bimap =
new BiMap();
const obj1 = { foo:
"bar" };
const obj2 = { baz:
"qux" };
const id1 = bimap.getOrInsert(obj1);
const id2 = bimap.getOrInsert(obj2);
ok(bimap.hasId(id1),
"First id exists before clear");
ok(bimap.hasId(id2),
"Second id exists before clear");
bimap.clear();
ok(!bimap.hasId(id1),
"First id removed after clear");
ok(!bimap.hasId(id2),
"Second id removed after clear");
ok(!bimap.hasObject(obj1),
"First object removed after clear");
ok(!bimap.hasObject(obj2),
"Second object removed after clear");
});
add_task(
function test_BiMap_getOrInsert() {
const bimap =
new BiMap();
const obj = { foo:
"bar" };
const regExpUUID =
new RegExp(
/^[a-f|
0-
9]{
8}-[a-f|
0-
9]{
4}-[a-f|
0-
9]{
4}-[a-f|
0-
9]{
4}-[a-f|
0-
9]{
12}$/g
);
const id = bimap.getOrInsert(obj);
ok(regExpUUID.test(id),
"Returned a valid UUID");
equal(bimap.getId(obj), id,
"Object is mapped to the id");
equal(bimap.getObject(id), obj,
"Id is mapped to the object");
});
add_task(
function test_BiMap_multipleMappings() {
const bimap =
new BiMap();
const obj1 = { name:
"first" };
const obj2 = { name:
"second" };
const obj3 = { name:
"third" };
const id1 = bimap.getOrInsert(obj1);
const id2 = bimap.getOrInsert(obj2);
const id3 = bimap.getOrInsert(obj3);
equal(bimap.getId(obj1), id1,
"First mapping correct");
equal(bimap.getId(obj2), id2,
"Second mapping correct");
equal(bimap.getId(obj3), id3,
"Third mapping correct");
equal(bimap.getObject(id1), obj1,
"First reverse mapping correct");
equal(bimap.getObject(id2), obj2,
"Second reverse mapping correct");
equal(bimap.getObject(id3), obj3,
"Third reverse mapping correct");
});
add_task(
function test_BiMap_getId() {
const bimap =
new BiMap();
const obj = { foo:
"bar" };
equal(bimap.getId(obj), undefined,
"Returns undefined for unknown object");
const id = bimap.getOrInsert(obj);
equal(bimap.getId(obj), id,
"Retrieved correct id for object");
});
add_task(
function test_BiMap_getObject() {
const bimap =
new BiMap();
const obj = { foo:
"bar" };
equal(
bimap.getObject(
"unknown-id"),
undefined,
"Returns undefined for unknown id"
);
const id = bimap.getOrInsert(obj);
equal(bimap.getObject(id), obj,
"Retrieved correct object for id");
});
add_task(
function test_BiMap_hasId() {
const bimap =
new BiMap();
const obj = { foo:
"bar" };
const id = bimap.getOrInsert(obj);
ok(!bimap.hasId(
"unknown-id"),
"Returns false for unknown id");
ok(bimap.hasId(id),
"Returns true for existing id");
});
add_task(
function test_BiMap_hasObject() {
const bimap =
new BiMap();
const obj = { foo:
"bar" };
const otherObj = { baz:
"qux" };
ok(!bimap.hasObject(otherObj),
"Returns false for non-existing object");
bimap.getOrInsert(obj);
ok(bimap.hasObject(obj),
"Returns true for existing object");
});
add_task(
function test_BiMap_deleteById() {
const bimap =
new BiMap();
const obj = { foo:
"bar" };
const id = bimap.getOrInsert(obj);
ok(bimap.hasId(id),
"Id exists before deletion");
ok(bimap.hasObject(obj),
"Object exists before deletion");
// Deleting non-existing id should not affect existing mappings.
bimap.deleteById(
"unknown-id");
ok(bimap.hasId(id),
"Existing id still present");
ok(bimap.hasObject(obj),
"Existing object still present");
// Delete existing id.
bimap.deleteById(id);
ok(!bimap.hasId(id),
"Id removed after deletion");
ok(!bimap.hasObject(obj),
"Object removed after deletion");
equal(bimap.getId(obj), undefined,
"Object no longer maps to id");
equal(bimap.getObject(id), undefined,
"Id no longer maps to object");
});
add_task(
function test_BiMap_deleteByObject() {
const bimap =
new BiMap();
const obj = { foo:
"bar" };
const otherObj = { baz:
"qux" };
const id = bimap.getOrInsert(obj);
ok(bimap.hasId(id),
"Id exists before deletion");
ok(bimap.hasObject(obj),
"Object exists before deletion");
// Deleting non-existing object should not affect existing mappings.
bimap.deleteByObject(otherObj);
ok(bimap.hasId(id),
"Existing id still present");
ok(bimap.hasObject(obj),
"Existing object still present");
// Delete existing object.
bimap.deleteByObject(obj);
ok(!bimap.hasId(id),
"Id removed after deletion");
ok(!bimap.hasObject(obj),
"Object removed after deletion");
equal(bimap.getId(obj), undefined,
"Object no longer maps to id");
equal(bimap.getObject(id), undefined,
"Id no longer maps to object");
});