<!DOCTYPE HTML>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description('Test for .text for OPTION element');

// See http://www.whatwg.org/specs/web-apps/current-work/multipage/common-microsyntaxes.html#space-character
var HTMLSpaces = [
    String.fromCharCode(0x20),
    String.fromCharCode(0x09),
    String.fromCharCode(0x0A),
    String.fromCharCode(0x0C),
    String.fromCharCode(0x0D)
];

// Unicode white spaces which are not handled as white space
// when removing spaces on option element.
// These are taken from Unicode PropList.txt
var nonHTMLSpaces = [
    String.fromCharCode(0x0B),
    String.fromCharCode(0x85),
    String.fromCharCode(0xA0),
    String.fromCharCode(0x1680),
    String.fromCharCode(0x180E),
    String.fromCharCode(0x2000),
    String.fromCharCode(0x2001),
    String.fromCharCode(0x2002),
    String.fromCharCode(0x2003),
    String.fromCharCode(0x2004),
    String.fromCharCode(0x2005),
    String.fromCharCode(0x2006),
    String.fromCharCode(0x2007),
    String.fromCharCode(0x2008),
    String.fromCharCode(0x2009),
    String.fromCharCode(0x200A),
    String.fromCharCode(0x2028),
    String.fromCharCode(0x2029),
    String.fromCharCode(0x202F),
    String.fromCharCode(0x205F),
    String.fromCharCode(0x3000)
];

var parent = document.createElement('div');
document.body.appendChild(parent);
parent.innerHTML = '<select><option id=option></option></select>';

var option = document.getElementById('option');

var expected;

debug('Insert one HTMLspace before/after/between the text');
for (var i = 0; i < HTMLSpaces.length; ++i) {
    option.text = HTMLSpaces[i] + 'text' + HTMLSpaces[i] + 'text' + HTMLSpaces[i];
    expected = 'text text';
    shouldBe('option.text', 'expected');
}
debug('');

debug('Insert multiple HTMLspaces before/after/between the text');
for (var i = 0; i < HTMLSpaces.length; ++i) {
    for (var j = 0; j < HTMLSpaces.length; ++j) {
        option.text = HTMLSpaces[i] + HTMLSpaces[j] + 'text' + HTMLSpaces[i] + HTMLSpaces[j] + 'text' + HTMLSpaces[i] + HTMLSpaces[j];
        expected = 'text text';
        shouldBe('option.text', 'expected');
    }
}
debug('');

debug('');

debug('Insert one nonHTMLspace before/after/between the text');
for (var i = 0; i < nonHTMLSpaces.length; ++i) {
    option.text = nonHTMLSpaces[i] + 'text' + nonHTMLSpaces[i] + 'text' + nonHTMLSpaces[i];
    expected = nonHTMLSpaces[i] + 'text' + nonHTMLSpaces[i] + 'text' + nonHTMLSpaces[i];
    shouldBe('option.text', 'expected');
}
debug('');

debug('Insert multiple nonHTMLspaces before/after/between the text');
for (var i = 0; i < nonHTMLSpaces.length; ++i) {
    for (var j = 0; j < nonHTMLSpaces.length; ++j) {
        option.text = nonHTMLSpaces[i] + nonHTMLSpaces[j] + 'text' + nonHTMLSpaces[i] + nonHTMLSpaces[j] + 'text' + nonHTMLSpaces[i] + nonHTMLSpaces[j];
        expected = nonHTMLSpaces[i] + nonHTMLSpaces[j] + 'text' + nonHTMLSpaces[i] + nonHTMLSpaces[j] + 'text' + nonHTMLSpaces[i] + nonHTMLSpaces[j];
        shouldBe('option.text', 'expected');
    }
}
debug('');
</script>

<script src="../../resources/js-test-post.js"></script>
</body>
</html>
