blob: f859448c3b5c549dcbc9c95ae4efc24dd7be9b52 [file] [log] [blame]
<html xmlns="http://www.w3.org/1999/xhtml" style="width: 100%; height: 100%;">
<body>
<p>The left edges of the black boxes below should line up with the
left edges of their containing orange or green boxes. In addition, all
the assertions below should pass.</p>
<div style="width: 800px; height: 200px;">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%">
<font>
<font-face font-family="xyzzy" units-per-em="100" ascent="100" descent="500">
</font-face>
<glyph unicode="BD" d="M0,0 h40 v-80 h-40 z" horiz-adv-x="80">
</glyph>
<glyph unicode="GG" d="M0,0 h20 v-60 h-20 z" horiz-adv-x="70">
</glyph>
<glyph unicode="BB" d="M0,0 h20 v-70 h-20 z" horiz-adv-x="70">
</glyph>
<glyph unicode="B" d="M0,0 h30 v-40 h-30 z" horiz-adv-x="60">
</glyph>
<glyph unicode="D" d="M0,0 h30 v-40 h-30 z" horiz-adv-x="100">
</glyph>
<glyph unicode="G" d="M0,0 h30 v-40 h-30 z" horiz-adv-x="30">
</glyph>
<glyph d="M0,0 h30 v-40 h-30 z" horiz-adv-x="200" id="sekrit">
</glyph>
</font>
<rect x="0" y="10" width="70" height="160" fill="orange"/>
<rect x="70" y="10" width="100" height="150" fill="green"/>
<rect x="170" y="10" width="70" height="140" fill="orange"/>
<rect x="240" y="10" width="70" height="130" fill="green"/>
<rect x="310" y="10" width="80" height="120" fill="orange"/>
<rect x="390" y="10" width="60" height="110" fill="green"/>
<text id="foo" y="10" font-family="xyzzy" font-size="100px" letter-spacing="0px" word-spacing="0px">GGDGGBBBD<altGlyph xlink:href="#sekrit">X</altGlyph></text>
</svg>
</div>
<pre id="console" />
<script>
<![CDATA[
function debug(msg)
{
var span = document.createElementNS("http://www.w3.org/1999/xhtml", "span");
document.getElementById("console").appendChild(span); // insert it first so XHTML knows the namespace
span.innerHTML = msg + '<br />';
}
function escapeHTML(text)
{
return text.replace(/&/g, "&amp;").replace(/</g, "&lt;");
}
function testPassed(msg)
{
debug('<span><span class="pass">PASS</span> ' + escapeHTML(msg) + '</span>');
}
function testFailed(msg)
{
debug('<span><span class="fail">FAIL</span> ' + escapeHTML(msg) + '</span>');
}
function areArraysEqual(_a, _b)
{
if (_a.length !== _b.length)
return false;
for (var i = 0; i < _a.length; i++)
if (_a[i] !== _b[i])
return false;
return true;
}
function isResultCorrect(_actual, _expected)
{
if (_actual === _expected)
return true;
if (typeof(_expected) == "number" && isNaN(_expected))
return typeof(_actual) == "number" && isNaN(_actual);
if (Object.prototype.toString.call(_expected) == Object.prototype.toString.call([]))
return areArraysEqual(_actual, _expected);
return false;
}
function shouldBe(_a, _b)
{
if (typeof _a != "string" || typeof _b != "string")
debug("WARN: shouldBe() expects string arguments");
var exception;
var _av;
try {
_av = eval(_a);
} catch (e) {
exception = e;
}
var _bv = eval(_b);
if (exception)
testFailed(_a + " should be " + _bv + ". Threw exception " + exception);
else if (isResultCorrect(_av, _bv))
testPassed(_a + " is " + _b);
else if (typeof(_av) == typeof(_bv))
testFailed(_a + " should be " + _bv + ". Was " + _av + ".");
else
testFailed(_a + " should be " + _bv + " (of type " + typeof _bv + "). Was " + _av + " (of type " + typeof _av + ").");
}
var t = document.getElementById("foo");
shouldBe("t.getStartPositionOfChar(0).x", '0');
shouldBe("t.getStartPositionOfChar(1).x", '0');
shouldBe("t.getStartPositionOfChar(2).x", '0 + 70');
shouldBe("t.getStartPositionOfChar(3).x", '0 + 70 + 100');
shouldBe("t.getStartPositionOfChar(4).x", '0 + 70 + 100');
shouldBe("t.getStartPositionOfChar(5).x", '0 + 70 + 100 + 70');
shouldBe("t.getStartPositionOfChar(6).x", '0 + 70 + 100 + 70');
shouldBe("t.getStartPositionOfChar(7).x", '0 + 70 + 100 + 70 + 70');
shouldBe("t.getStartPositionOfChar(8).x", '0 + 70 + 100 + 70 + 70');
shouldBe("t.getStartPositionOfChar(9).x", '0 + 70 + 100 + 70 + 70 + 80');
// The end positions of char n must map to the start position of char n-1.
shouldBe("t.getEndPositionOfChar(0).x", '70');
shouldBe("t.getEndPositionOfChar(1).x", '70');
shouldBe("t.getEndPositionOfChar(2).x", '70 + 100');
shouldBe("t.getEndPositionOfChar(3).x", '70 + 100 + 70');
shouldBe("t.getEndPositionOfChar(4).x", '70 + 100 + 70');
shouldBe("t.getEndPositionOfChar(5).x", '70 + 100 + 70 + 70');
shouldBe("t.getEndPositionOfChar(6).x", '70 + 100 + 70 + 70');
shouldBe("t.getEndPositionOfChar(7).x", '70 + 100 + 70 + 70 + 80');
shouldBe("t.getEndPositionOfChar(8).x", '70 + 100 + 70 + 70 + 80');
shouldBe("t.getEndPositionOfChar(9).x", '70 + 100 + 70 + 70 + 80 + 200');
]]>
</script>
</body>
</html>