<!DOCTYPE html>
<html>
<body>
<div id='sandbox'></div>
<div id="console"></div>
<script src="../resources/magnitude-perf.js"></script>
<script>

if (window.testRunner)
    testRunner.dumpAsText();

var list;
var stack;
var sandbox = document.getElementById('sandbox');

// Check that long sequences of combined selectors has linear performance (per styled element)

function setupList(magnitude)
{
    if (sandbox.firstChild)
        sandbox.removeChild(sandbox.firstChild);
    list = document.createElement('ul');

    for (var i = 0; i < magnitude; ++i) {
        var li = document.createElement('li');
        li.setAttribute('id','unique'+i); // add unique id ensure the styles are not auto-shared
        list.appendChild(li);
    }
    sandbox.appendChild(list);
}

function setupStack(magnitude)
{
    if (sandbox.firstChild)
        sandbox.removeChild(sandbox.firstChild);
    stack = document.createElement('div');
    var cur = stack;

    for (var i = 0; i < magnitude; ++i) {
        var div = document.createElement('div');
        div.setAttribute('id','unique'+i);
        cur.appendChild(div);
        cur = div;
    }
    sandbox.appendChild(stack);
}

function testListStyling(magnitude)
{
    document.querySelectorAll("la ~ li ~ li");
}

function testStackStyling(magnitude)
{
    document.querySelectorAll("dav div div");
}

Magnitude.description('Tests styling multiple combinators have linear performance');
Magnitude.run(setupStack, testStackStyling, Magnitude.LINEAR);
sandbox.removeChild(sandbox.firstChild);
Magnitude.run(setupList, testListStyling, Magnitude.LINEAR);
sandbox.removeChild(sandbox.firstChild);
</script>
</body>
</html>
