<!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(context.mark, context);
    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(context.mark, context);
    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>
