<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
</head>
<body>
<script>
// This test mostly comes from fast/dom/HTMLElement/script-tests/class-list.js
description('Tests the htmlFor attribute and its properties.');

var container = document.createElement('div');
document.body.appendChild(container);

var element;

function createElement(tokenList)
{
    container.innerHTML = '<output for="' + tokenList + '"></output>';
    element = container.lastChild;
}

debug('- Tests from http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/');

// HTMLOutputElement::htmlFor setter is forwarding assignment to DOMTokenList.value attribute.
createElement('x');
shouldBeEqualToString('element.htmlFor.value', 'x');
shouldBeEqualToString('String(element.htmlFor)', 'x');
element.htmlFor = 'y';
shouldBeEqualToString('element.htmlFor.value', 'y');
shouldBeEqualToString('String(element.htmlFor)', 'y');

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/001.htm
createElement('');
shouldEvaluateTo('element.htmlFor.length', 0);

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/002.htm
createElement('x');
shouldEvaluateTo('element.htmlFor.length', 1);

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/003.htm
createElement('x x');
shouldEvaluateTo('element.htmlFor.length', 2);

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/004.htm
createElement('x y');
shouldEvaluateTo('element.htmlFor.length', 2);

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/005.htm
createElement('');
element.htmlFor.add('x');
shouldBeEqualToString('element.htmlFor.toString()', 'x');

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/006.htm
createElement('x');
element.htmlFor.add('x');
shouldBeEqualToString('element.htmlFor.toString()', 'x');

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/007.htm
createElement('x  x');
element.htmlFor.add('x');
shouldBeEqualToString('element.htmlFor.toString()', 'x  x');

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/008.htm
createElement('y');
element.htmlFor.add('x');
shouldBeEqualToString('element.htmlFor.toString()', 'y x');

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/009.htm
createElement('');
element.htmlFor.remove('x');
shouldBeEqualToString('element.htmlFor.toString()', '');

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/010.htm
createElement('x');
element.htmlFor.remove('x');
shouldBeEqualToString('element.htmlFor.toString()', '');

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/011.htm
createElement(' y x  y ');
element.htmlFor.remove('x');
shouldBeEqualToString('element.htmlFor.toString()', 'y y');

// http://simon.html5.org/test/html/dom/reflecting/DOMTokenList/getting/012.htm
createElement(' x y  x ');
element.htmlFor.remove('x');
shouldBeEqualToString('element.htmlFor.toString()', 'y');


debug('- Ensure that we can handle empty form attribute correctly');
element = document.createElement('output');
var list = element.htmlFor;
list.toggle('x');
shouldBeEqualToString('list.value', 'x');

list.toggle('x');
shouldBeEqualToString('list.value', '');

element = document.createElement('output');
shouldBeFalse('element.htmlFor.contains(\'x\')');
shouldBeUndefined('element.htmlFor[1]');
element.htmlFor.remove('x');
element.htmlFor.add('x')
shouldBeTrue('element.htmlFor.contains(\'x\')');
shouldBeUndefined('element.htmlFor[1]');

debug('- Testing add in presence of trailing white spaces.');

createElement('x ');
element.htmlFor.add('y');
shouldBeEqualToString('element.htmlFor.toString()', 'x y');

createElement('x\t');
element.htmlFor.add('y');
shouldBeEqualToString('element.htmlFor.toString()', 'x\ty');

createElement(' ');
element.htmlFor.add('y');
shouldBeEqualToString('element.htmlFor.toString()', ' y');


debug('- Test invalid tokens');

// Testing exception due to invalid token

// shouldThrow from js-test.js is not sufficient.
function shouldThrowDOMException(f, ec)
{
    try {
        f();
        testFailed('Expected an exception');
    } catch (ex) {
        if (!(ex instanceof DOMException)) {
            testFailed('Exception is not an instance of DOMException, found: ' +
                       Object.toString.call(ex));
            return;
        }
        if (ec !== ex.code) {
            testFailed('Wrong exception code: ' + ex.code);
            return;
        }
    }
    var formattedFunction = String(f).replace(/^function.+\{\s*/m, '').
        replace(/;?\s+\}/m, '');
    testPassed(formattedFunction + ' threw expected DOMException with code ' + ec);
}

createElement('x');
shouldNotThrow('element.htmlFor.contains("")');

createElement('x y');
shouldNotThrow('element.htmlFor.contains("x y")');

createElement('');
shouldThrowDOMException(function() {
    element.htmlFor.add('');
}, DOMException.SYNTAX_ERR);

createElement('');
shouldThrowDOMException(function() {
    element.htmlFor.add('x y');
}, DOMException.INVALID_CHARACTER_ERR);

createElement('');
shouldThrowDOMException(function() {
    element.htmlFor.remove('');
}, DOMException.SYNTAX_ERR);

createElement('');
shouldThrowDOMException(function() {
    element.htmlFor.remove('x y');
}, DOMException.INVALID_CHARACTER_ERR);

createElement('');
shouldThrowDOMException(function() {
    element.htmlFor.toggle('');
}, DOMException.SYNTAX_ERR);

createElement('x y');
shouldThrowDOMException(function() {
    element.htmlFor.toggle('x y');
}, DOMException.INVALID_CHARACTER_ERR);


debug('- Indexing');

createElement('x');
shouldBeEqualToString('element.htmlFor[0]', 'x');
shouldBeEqualToString('element.htmlFor.item(0)', 'x');

createElement('x x');
shouldBeEqualToString('element.htmlFor[1]', 'x');
shouldBeEqualToString('element.htmlFor.item(1)', 'x');

createElement('x y');
shouldBeEqualToString('element.htmlFor[1]', 'y');
shouldBeEqualToString('element.htmlFor.item(1)', 'y');

createElement('');
shouldBeUndefined('element.htmlFor[0]');
shouldBeNull('element.htmlFor.item(0)');

createElement('x y z');
shouldBeUndefined('element.htmlFor[4]');
shouldBeNull('element.htmlFor.item(4)');
shouldBeUndefined('element.htmlFor[-1]');  // Not a valid index so should not trigger item().
shouldBeNull('element.htmlFor.item(-1)');

debug('- Test case since DOMTokenList is case sensitive');

createElement('x');
shouldBeTrue('element.htmlFor.contains(\'x\')');
shouldBeFalse('element.htmlFor.contains(\'X\')');
shouldBeEqualToString('element.htmlFor[0]', 'x');

createElement('X');
shouldBeTrue('element.htmlFor.contains(\'X\')');
shouldBeFalse('element.htmlFor.contains(\'x\')');
shouldBeEqualToString('element.htmlFor[0]', 'X');


debug('- Testing whitespace');
// U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), U+000A LINE FEED (LF),
// U+000C FORM FEED (FF), and U+000D CARRIAGE RETURN (CR)

createElement('x\u0020y');
shouldEvaluateTo('element.htmlFor.length', 2);

createElement('x\u0009y');
shouldEvaluateTo('element.htmlFor.length', 2);

createElement('x\u000Ay');
shouldEvaluateTo('element.htmlFor.length', 2);

createElement('x\u000Cy');
shouldEvaluateTo('element.htmlFor.length', 2);

createElement('x\u000Dy');
shouldEvaluateTo('element.htmlFor.length', 2);


debug('- DOMTokenList presence and type');


// Safari returns object
// Firefox returns object
// IE8 returns object
// Chrome returns function
// assertEquals('object', typeof DOMTokenList);
shouldBeTrue('\'undefined\' != typeof DOMTokenList');

shouldBeEqualToString('typeof DOMTokenList.prototype', 'object');

createElement('x');
shouldBeEqualToString('typeof element.htmlFor', 'object');

shouldEvaluateTo('element.htmlFor.constructor', 'DOMTokenList');

shouldBeTrue('element.htmlFor === element.htmlFor');
</script>
</body>
</html>
