<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let suite = InspectorTest.createSyncSuite("Set");

    suite.addTestCase({
        name: "Set.prototype.pushAll",
        test() {
            function test(iterable) {
                let set = new Set([1, 2]);

                function stringify(object)
                {
                    let string = JSON.stringify(Array.from(object), function(key, value) {
                        if (value instanceof Node)
                            return "<" + value.localName + ">";
                        return value;
                    });
                    return string.replace(/"(<[^>]*>)"/g, "$1");
                }

                let before = stringify(set);
                set.addAll(iterable);
                let after = stringify(set);

                InspectorTest.log(before + " => " + after);
            }

            InspectorTest.log("Array:");
            test(["a1", "a2"]);

            InspectorTest.newline();

            InspectorTest.log("Set:");
            const set = new Set(["s1", "s2"]);
            test(set);
            test(set.entries());
            test(set.keys());
            test(set.values());

            InspectorTest.newline();

            InspectorTest.log("Map:");
            const map = new Map([["m1k", "m1v"], ["m2k", "m2v"]]);
            test(map);
            test(map.entries());
            test(map.keys());
            test(map.values());

            InspectorTest.newline();

            InspectorTest.log("Object:");
            const object = {
                o1k: "o1v",
                o2k: "o2v",
            };
            test(Object.entries(object));
            test(Object.keys(object));
            test(Object.values(object));

            InspectorTest.newline();

            InspectorTest.log("Generator:");
            function* generator() {
                yield "g1";
                yield "g2";
            }
            test(generator());

            InspectorTest.newline();

            InspectorTest.log("Node:");
            const node = document.createElement("div");
            node.appendChild(document.createElement("n1"));
            node.appendChild(document.createElement("n2"));
            test(node.children);
            test(node.querySelectorAll("*"));

            InspectorTest.newline();

            InspectorTest.log("Object (doesn't have [Symbol.iterator]):");
            InspectorTest.expectException(() => {
                test(object);
            });
        },
    });

    suite.addTestCase({
        name: "Set.prototype.take",
        test() {
            const key = "key";

            let set = new Set;
            set.add(key);
            InspectorTest.expectTrue(set.take(key), "Set can take `key`.");
            InspectorTest.expectFalse(set.has(key), "Set no longer has `key`.");
            InspectorTest.expectFalse(set.take(key), "Set can NOT take `key`.");
            InspectorTest.expectFalse(set.take("DNE"), "Set can NOT take `DNE`, as it does NOT exist.");
        }
    });

    suite.addTestCase({
        name: "Set.prototype.intersects",
        test() {
            function testTrue(a, b, message) {
                InspectorTest.expectThat((new Set(a)).intersects(new Set(b)), message);
            }

            function testFalse(a, b, message) {
                InspectorTest.expectFalse((new Set(a)).intersects(new Set(b)), message);
            }

            const object1 = {a: 1};
            const object2 = {b: 2};
            const object3 = {c: 3};

            testFalse([], [], "an empty set should not intersect another empty set.");
            testFalse([1, "a", object1], [], "a non-empty set should not intersect an empty set.");
            testTrue([1, "a", object1], [1, "a", object1], "a set should intersect another set with the same values.");
            testFalse([1, "a", object1], [2, "b", object2], "a set should not intersect another set with different values.");
            testTrue([1, "a", object1], [1, 3, "a", "c", object1, object3], "a set should intersect another set with same and additional values.");
            testTrue([1, 2, "a", "b", object1, object2], [1, 3, "a", "c", object1, object3], "a set should intersect another set with same and different values.");
        }
    });

    suite.addTestCase({
        name: "Set.prototype.isSubsetOf",
        test() {
            function testTrue(a, b, message) {
                InspectorTest.expectThat((new Set(a)).isSubsetOf(new Set(b)), message);
            }

            function testFalse(a, b, message) {
                InspectorTest.expectFalse((new Set(a)).isSubsetOf(new Set(b)), message);
            }

            const object1 = {a: 1};
            const object2 = {b: 2};
            const object3 = {c: 3};

            testTrue([], [], "an empty set should be a subset of another empty set.");
            testTrue([], [2, "b", object2], "an empty set should be a subset of a non-empty set.");
            testTrue([1, "a", object1], [1, "a", object1], "a set should be a subset of another set with the same values.");
            testFalse([1, "a", object1], [2, "b", object2], "a set should not be a subset of another set with different values.");
            testTrue([1, "a", object1], [1, 3, "a", "c", object1, object3], "a set should be a subset of another set with same and additional values.");
            testFalse([1, 2, "a", "b", object1, object2], [1, 3, "a", "c", object1, object3], "a set should not be a subset of another set with same and different values.");
        }
    });

    suite.addTestCase({
        name: "Set.prototype.equals",
        test() {
            function testTrue(a, b, message) {
                InspectorTest.expectThat((new Set(a)).equals(new Set(b)), message);
            }

            function testFalse(a, b, message) {
                InspectorTest.expectFalse((new Set(a)).equals(new Set(b)), message);
            }

            const object1 = {a: 1};
            const object2 = {b: 2};
            const object3 = {c: 3};

            testTrue([], [], "an empty set should be equal to another empty set.");
            testTrue([1, "a", object1], [1, "a", object1], "a set should be equal to another set with the same values.");
            testTrue([1, "a", object1], [object1, 1, "a"], "a set should be equal to another set with the same values in a different order.");
            testFalse([1, "a", object1], [2, "b", object2], "a set should not be a equal to another set with different values.");
            testFalse([1, 2, "a", "b", object1, object2], [1, 3, "a", "c", object1, object3], "a set should not be equal to another set with same and different values.");
        }
    });

    suite.addTestCase({
        name: "Set.prototype.difference",
        test() {
            function testDifference({aValues, bValues, expectedDifference}) {
                let a = new Set(aValues);
                let b = new Set(bValues);

                InspectorTest.log(`Given a Set with values [${aValues}], and another Set with values [${bValues}]:`);

                let difference = a.difference(b);
                InspectorTest.expectThat(difference.equals(new Set(expectedDifference)), `Set difference should be [${expectedDifference}].`);
                InspectorTest.log("");
            }

            testDifference({
                aValues: [],
                bValues: [],
                expectedDifference: [],
            });

            testDifference({
                aValues: [1, 2, 3],
                bValues: [],
                expectedDifference: [1, 2, 3],
            });

            testDifference({
                aValues: [],
                bValues: [1, 2, 3],
                expectedDifference: [],
            });

            testDifference({
                aValues: [1, 2, 3],
                bValues: [2, 3, 4],
                expectedDifference: [1],
            });
        }
    });

    suite.addTestCase({
        name: "Set.prototype.firstValue",
        test() {
            function testFirstValue(values) {
                let expected = values[0];
                InspectorTest.expectEqual(new Set(values).firstValue, expected, `Set with values [${values}] should have firstValue equal to ${expected}.`);
            }

            testFirstValue([]);
            testFirstValue([1, 2, 3]);
        }
    });

    suite.addTestCase({
        name: "Set.prototype.lastValue",
        test() {
            function testLastValue(values) {
                let expected = values.lastValue;
                InspectorTest.expectEqual(new Set(values).lastValue, expected, `Set with values [${values}] should have lastValue equal to ${expected}.`);
            }

            testLastValue([]);
            testLastValue([1, 2, 3]);
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onLoad="runTest()">
</body>
</html>
