<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}

var john = new Person("John", "Smith");
var jane = new Person("Jane", "Doe");
var emily = new Person("Emily", "Jones");
var manyProperties = {one:1, two:2, three:3, four:4, five:5, six:6};

function test()
{
    var currentStepIndex = 0;
    var steps = [
        "console.table([])", // Empty.
        "console.table(['apple', 'orange', 'banana'])", // Index (array index), Value
        "console.table({firstName: 'John', lastName: 'Smith'})", // Index (property name), Value (property value)
        "console.table({f: function(){}, x: 10})", // Index (property name), Value (property value)
        "console.table([['John', 'Smith'], ['Jane', 'Doe'], ['Emily', 'Jones']])", // Index, 0, 1
        "console.table([john, jane, emily])", // Index, firstName, lastName
        "console.table([john, jane, emily], ['firstName'])", // Index, firstName (at least).
        `console.table([manyProperties, manyProperties], ['five', 'six'])`, // Index, five, size (at least)
    ];

    function remoteObjectJSONFilter(key, value)
    {
        if (key === "_target" || key === "_listeners")
            return undefined;
        if (key === "_objectId" || key === "_stackTrace")
            return "<filtered>";
        return value;
    }

    WI.logManager.addEventListener(WI.LogManager.Event.MessageAdded, function(event) {
        var message = event.data.message;
        InspectorTest.assert(message instanceof WI.ConsoleMessage);
        InspectorTest.log("\nSTEP: " + steps[currentStepIndex]);
        InspectorTest.log(JSON.stringify(message, remoteObjectJSONFilter, "  "));

        if (++currentStepIndex >= steps.length)
            InspectorTest.completeTest();
    });

    for (var step of steps)
        WI.runtimeManager.evaluateInInspectedWindow(step, {objectGroup: "test", doNotPauseOnExceptionsAndMuteConsole: true, generatePreview: true}, function(){});
}
</script>
</head>
<body onload="runTest()">
</body>
</html>
