<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>functionality test of window.performance.measure</title>
<link rel="author" title="Intel" href="http://www.intel.com/" />
<link rel="help" href="http://www.w3.org/TR/user-timing/#extensions-performance-interface"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/performance-timeline-utils.js"></script>
<script src="resources/webperftestharness.js"></script>
<script src="resources/webperftestharnessextension.js"></script>
<script>
setup({ explicit_done: true });

function onload_test()
{
    const context = new PerformanceContext(window.performance);
    const entrylist_checker = new performance_entrylist_checker('measure');
    const measure_names = measures.map(function(x) {return x[0];});

    test_equals(context.getEntriesByType('measure').length, 0, 'There should be ' + 0 + ' entries returned.');

    mark_names.forEach(function(name) {
        context.mark(name);
    });
    measures.forEach(context.initialMeasures, context);

    let measure_entrylist = context.getEntriesByType('measure');
    entrylist_checker.entrylist_check(measure_entrylist, measures.length, measure_names,
        'Checking all entries.');

    for (let i = 0; i < measure_entrylist.length; ++i)
    {
        const measure_entrylist_by_name = context.getEntriesByName(measure_entrylist[i].name, 'measure');
        entrylist_checker.entrylist_check(measure_entrylist_by_name, 1, measure_names,
            'First loop: checking entry of name "' + measure_entrylist[i].name + '".');
    }

    // Following cases test for scenarios that measure names are tied for two times
    mark_names.forEach(function(name) {
        context.mark(name);
    });
    measures.forEach(context.initialMeasures, context);

    measure_entrylist = context.getEntriesByType('measure');
    entrylist_checker.entrylist_check(measure_entrylist, measures.length * 2, measure_names,
        'Checking all doubly measured entries.');

    for (let i = 0; i < measure_entrylist.length; ++i)
    {
        const measure_entrylist_by_name = context.getEntriesByName(measure_entrylist[i].name, 'measure');
        entrylist_checker.entrylist_check(measure_entrylist_by_name, 2, measure_names,
            'Second loop step ' + i + ': checking entry of name "' + measure_entrylist[i].name + '".');
    }

    done();
}
</script>
</head>
<body onload=onload_test()>
    <h1>Description</h1>
    <p>This test validates functionality of the interface window.performance.measure.</p>
    <div id="log"></div>
</body>
</html>
