if (!platformSupportsSamplingProfiler())
    throw new Error("Sampling profiler not supported");

startSamplingProfiler();

function assert(b) {
    if (!b)
        throw new Error("bad stack trace")
}

let nodePrototype = {
    makeChildIfNeeded: function(name) {
        if (!this.children[name])
            this.children[name] = makeNode(name);
        return this.children[name];
    }
};

function makeNode(name) {
    let node = Object.create(nodePrototype);
    node.name = name;
    node.children = {};
    return node
}

function updateCallingContextTree(root) {
    let stacktraces = samplingProfilerStackTraces();
    for (let stackTrace of stacktraces) {
        let node = root;
        for (let i = stackTrace.length; i--; ) {
            let functionName = stackTrace[i];
            node = node.makeChildIfNeeded(functionName);
        }
    }
}

const VERBOSE = false;

function doesTreeHaveStackTrace(tree, stackTraceOrString, isRunFromRunTest = true) {
    if (typeof stackTraceOrString === 'string') {
        // Let's ensure that this signature exists in the stack trace.
        function check(node) {
            for (let name of Object.keys(node.children)) {
                if (name === stackTraceOrString)
                    return true;
                else {
                    if (check(node.children[name]))
                        return true;
                }
            }
            return false;
        }
        if (!check(tree)) {
            if (VERBOSE) {
                print("failing");
                print(JSON.stringify(tree));
            }
            return false;
        }
        return true;
    }

    // stack trace should be top-down array with the deepest
    // call frame at index 0.
    let stackTrace = null;
    if (isRunFromRunTest)
        stackTrace = [...stackTraceOrString, "runTest", "(program)"];
    else
        stackTrace = [...stackTraceOrString];
    
    let node = tree;
    for (let i = stackTrace.length; i--; ) {
        node = node.children[stackTrace[i]];
        if (!node) {
            if (VERBOSE) {
                print("failing on " + i + " : " + stackTrace[i]);
                print(JSON.stringify(tree));
            }
            return false;
        }
    }
    return true;
}

function makeTree() {
    let root = makeNode("<root>");
    updateCallingContextTree(root);
    return root;
}

// This test suite assumes that "runTest" is being called
// from the global scope.
function runTest(func, stackTraceOrString) {
    const timeToFail = 50000;
    let startTime = Date.now();
    let root = makeNode("<root>");
    do {
        for (let i = 0; i < 100; i++) {
            for (let i = 0; i < 10; i++) {
                func();
            }
            updateCallingContextTree(root);
            if (doesTreeHaveStackTrace(root, stackTraceOrString)) {
                if (VERBOSE)
                    print(`Time to finish: ${Date.now() - startTime}`);
                return;
            }
        }
    } while (Date.now() - startTime < timeToFail);
    print(JSON.stringify(root, undefined, 2));
    doesTreeHaveStackTrace(root, stackTrace, true, true);
    throw new Error("Bad stack trace");
}

function dumpTree(tree) {
    print(JSON.stringify(tree, undefined, 2));
}
