function TestDrainTraceLoggerInvariants(obj) {
    var scripts = 0;
    var stops = 0;
    for (var i = 0; i < objs.length; i++) {
        if (objs[i].logType == "Script") {
            scripts++;
            assertEq("fileName" in objs[i], true);
            assertEq("lineNumber" in objs[i], true);
            assertEq("columnNumber" in objs[i], true);
        } else if (objs[i].logType == "Stop") {
            stops++;
        } else {
            assertEq(true, false);
        }
    }
    assertEq(scripts, stops + 1);
    // "+ 1" because we get a start for drainTraceLogger.js:1, but not the stop.
}

function GetMaxScriptDepth(obj) {
    var max_depth = 0;
    var depth = 0;
    for (var i = 0; i < objs.length; i++) {
        if (objs[i].logType == "Stop")
            depth--;
        else {
            depth++;
            if (depth > max_depth)
                max_depth = depth;
        }
    }
    return max_depth;
}

function foo1() {
    foo2();
}
function foo2() {

}

var du = new Debugger();
if (typeof du.drainTraceLoggerScriptCalls == "function") {
    // Test normal setup.
    du = new Debugger();
    du.setupTraceLoggerScriptCalls();

    du.startTraceLogger();
    du.endTraceLogger();

    var objs = du.drainTraceLoggerScriptCalls();
    TestDrainTraceLoggerInvariants(objs);

    // Test basic script.
    for (var i=0; i<20; i++)
        foo1();

    du = new Debugger();
    du.setupTraceLoggerScriptCalls();

    du.startTraceLogger();
    foo1();
    du.endTraceLogger();

    var objs = du.drainTraceLoggerScriptCalls();
    TestDrainTraceLoggerInvariants(objs);
    assertEq(3, GetMaxScriptDepth(objs), "drainTraceLogger.js:0 + foo1 + foo2");
    assertEq(5, objs.length, "drainTraceLogger.js:0 + foo1 + foo2 + stop + stop");

    // Test basic script.
    for (var i=0; i<20; i++)
        foo1();

    du = new Debugger();
    du.setupTraceLoggerScriptCalls();

    du.startTraceLogger();
    for (var i=0; i<100; i++) {
        foo1();
    }
    du.endTraceLogger();

    var objs = du.drainTraceLoggerScriptCalls();
    TestDrainTraceLoggerInvariants(objs);
    assertEq(3, GetMaxScriptDepth(objs), "drainTraceLogger.js:0 + foo1 + foo2");
    assertEq(4*100 + 1, objs.length);
    assertEq(1 + 4*100, objs.length, "drainTraceLogger.js:0 + 4 * ( foo1 + foo2 + stop + stop )");
}