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

var test = function()
{
    function dumpMaps(map1, map2, key1, key2)
    {
        InspectorTest.addResult("Dumping maps:");
        InspectorTest.addResult("  First map:");
        InspectorTest.addResult("    key1 : " + map1.get(key1));
        InspectorTest.addResult("    key2 : " + map1.get(key2));
        InspectorTest.addResult("    size : " + map1.size());
        InspectorTest.addResult("  Second map:");
        InspectorTest.addResult("    key1 : " + map2.get(key1));
        InspectorTest.addResult("    key2 : " + map2.get(key2));
        InspectorTest.addResult("    size : " + map2.size());
        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);

    InspectorTest.completeTest();
}

</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>
