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

    suite.addTestCase({
        name: "Instantiating Multimap",
        test(resolve, reject) {
            let multimap = new ListMultimap;

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Adding unique keys and values",
        test(resolve, reject) {
            let multimap = new ListMultimap;

            multimap.add("zero", "one");
            multimap.add("two", "three");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Adding repeating keys and unique values",
        test(resolve, reject) {
            let multimap = new ListMultimap;

            multimap.add("zero", "one");
            multimap.add("zero", "two");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Adding unique keys and repeating values",
        test(resolve, reject) {
            let multimap = new ListMultimap;

            multimap.add("zero", "one");
            multimap.add("two", "one");
            multimap.add("three", "one");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Adding repeating keys and values",
        test(resolve, reject) {
            let multimap = new ListMultimap;

            multimap.add("zero", "one");
            multimap.add("two", "one");
            multimap.add("zero", "one");
            multimap.add("zero", "three");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Deleting existing keys and values",
        test(resolve, reject) {
            let multimap = new ListMultimap;

            multimap.add(0, 1);
            multimap.add(2, 3);
            multimap.add(2, 3);

            InspectorTest.expectThat(multimap.delete(0, 1), "The key and the value were successfully deleted.");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            InspectorTest.expectThat(multimap.delete(2, 3), "The key and the value were successfully deleted.");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Deleting non-existing keys and non-existing values",
        test(resolve, reject) {
            let multimap = new ListMultimap;

            multimap.add(0, 1);
            multimap.add(2, 3);
            multimap.add(4, 4);

            InspectorTest.expectThat(!multimap.delete(0, 3), "Nothing was removed.");
            InspectorTest.expectThat(!multimap.delete(2, 1), "Nothing was removed.");
            InspectorTest.expectThat(!multimap.delete(3, 0), "Nothing was removed.");
            InspectorTest.expectThat(!multimap.delete(4, 3), "Nothing was removed.");
            InspectorTest.expectThat(!multimap.delete(0, 4), "Nothing was removed.");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Deleting values for given key",
        test(resolve, reject) {
            let multimap = new ListMultimap;

            multimap.add("opossum", "badger");
            multimap.add("opossum", "raccoon");
            multimap.add("raccoon", "opossum");

            InspectorTest.expectThat(!multimap.deleteAll("badger"), "Nothing was removed.");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            InspectorTest.expectThat(multimap.deleteAll("opossum"), "Values were removed.");

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Deleting all keys and values",
        test(resolve, reject) {
            let multimap = new ListMultimap;
            multimap.add("badger", "raccoon");
            multimap.clear();

            InspectorTest.log(multimap.size);
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.addTestCase({
        name: "Iterating using forEach method",
        test(resolve, reject) {
            let multimap = new ListMultimap;
            multimap.add("Platypus", "Sugar glider");
            multimap.add("Quoll", "Wallaby");

            let list = [];
            multimap.forEach(function(pair) {
                list.push(pair);
            });
            InspectorTest.log(multimap);

            resolve();
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Testing all methods of ListMultimap.</p>
</body>
</html>
