<html>
<head>
<script src="../http/tests/inspector/inspector-test.js"></script>
<script type="text/javascript">

var test = function()
{
    InspectorTest.runTestSuite([
        function testMap(next)
        {
            function dumpMap(map, key1, key2)
            {
                InspectorTest.addResult("    key1 : " + map.get(key1));
                InspectorTest.addResult("    key2 : " + map.get(key2));
                InspectorTest.addResult("    size : " + map.size());
            }

            function dumpMaps(map1, map2, key1, key2)
            {
                InspectorTest.addResult("Dumping maps:");
                InspectorTest.addResult("  First map:");
                dumpMap(map1, key1, key2)
                InspectorTest.addResult("  Second map:");
                dumpMap(map2, key1, key2)
                InspectorTest.addResult("");
            }

            var key1 = {};
            var key2 = {};
            var value1 = 1;
            var value2 = 2;
            var map1 = new Map();
            var map2 = new Map();

            dumpMaps(map1, map2, key1, key2);

            map1.put(key1, value2);
            dumpMaps(map1, map2, key1, key2);

            map1.put(key1, value1);
            dumpMaps(map1, map2, key1, key2);

            map2.put(key1, value1);
            dumpMaps(map1, map2, key1, key2);

            map2.put(key1, value2);
            dumpMaps(map1, map2, key1, key2);

            map1.put(key2, value2);
            dumpMaps(map1, map2, key1, key2);

            map2.put(key2, value1);
            dumpMaps(map1, map2, key1, key2);

            map1.remove(key2);
            dumpMaps(map1, map2, key1, key2);

            map2.remove(key2);
            dumpMaps(map1, map2, key1, key2);

            map2.remove(key2);
            dumpMaps(map1, map2, key1, key2);

            map1.remove(key1);
            dumpMaps(map1, map2, key1, key2);

            map2.remove(key1);
            dumpMaps(map1, map2, key1, key2);
            next();
        },

        function testSet(next)
        {
            function dumpSet(set, key1, key2)
            {
                InspectorTest.addResult("    key1 : " + set.hasItem(key1));
                InspectorTest.addResult("    key2 : " + set.hasItem(key2));
                InspectorTest.addResult("    size : " + set.size());
            }

            function dumpSets(set1, set2, key1, key2)
            {
                InspectorTest.addResult("Dumping sets:");
                InspectorTest.addResult("  First set:");
                dumpSet(set1, key1, key2)
                InspectorTest.addResult("  Second set:");
                dumpSet(set2, key1, key2)
                InspectorTest.addResult("");
            }

            var key1 = {};
            var key2 = {};
            var set1 = new Set();
            var set2 = new Set();

            dumpSets(set1, set2, key1, key2);

            set1.add(key1);
            dumpSets(set1, set2, key1, key2);

            set1.add(key1);
            dumpSets(set1, set2, key1, key2);

            set2.add(key1);
            dumpSets(set1, set2, key1, key2);

            set2.add(key1);
            dumpSets(set1, set2, key1, key2);

            set1.add(key2);
            dumpSets(set1, set2, key1, key2);

            set2.add(key2);
            dumpSets(set1, set2, key1, key2);

            set1.remove(key2);
            dumpSets(set1, set2, key1, key2);

            set2.remove(key2);
            dumpSets(set1, set2, key1, key2);

            set2.remove(key2);
            dumpSets(set1, set2, key1, key2);

            set1.remove(key1);
            dumpSets(set1, set2, key1, key2);

            set2.remove(key1);
            dumpSets(set1, set2, key1, key2);
            next();
        },

        function testStringMap(next)
        {
            function dumpStringMap(map)
            {
                InspectorTest.addResult("Dumping map:");
                var keys = map.keys();
                var values = map.values();
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    var value = map.get(key);
                    var indexOf = values.indexOf(value);
                    InspectorTest.assertTrue(indexOf !== -1, "value not found in values");
                    values.splice(indexOf, 1);
                    InspectorTest.addResult("    " + key + " => " + value);
                }
                InspectorTest.addResult("    size: " + map.size());
                InspectorTest.assertTrue(!values.length, "values is not empty after deleting value for each key: [" + values + "]");
            }

            var keys = ["foo", "bar", "hasOwnProperty", "__proto__", "constructor", "0"]
            var value1 = 1;
            var value2 = 2;
            var map = new StringMap();

            dumpStringMap(map);

            for (var i = 0; i < keys.length; ++i) {
                map.put(keys[i], i+1);
                dumpStringMap(map);
            }

            for (var i = 0; i < keys.length; ++i) {
                map.put(keys[i], 42);
                dumpStringMap(map);
            }

            for (var i = keys.length - 1; i >= 0; --i) {
                map.remove(keys[i]);
                dumpStringMap(map);
            }

            for (var i = keys.length - 1; i >= 0; --i) {
                map.remove(keys[i]);
                dumpStringMap(map);
            }
            next();
        },
    ]);
}

</script>
</head>
<body onload="runTest()">
<p>Tests Map class.</p>
<a href="https://bugs.webkit.org/show_bug.cgi?id=74084">Bug 74084</a>
</body>
</html>
