<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<style>
#tests_container {
font-size: 20px;
line-height: 1;
font-family: monospace;
width: 2ch;
}
inline-block {
display: inline-block;
width: 1ch;
height: .6em;
background: pink;
}
</style>
<body>
<pre id="console"></pre>
<div id="tests_container"></div>
<script>
let tests_container = document.getElementById('tests_container');
let log_container = document.getElementById('console');
class LineBreakTest {
constructor(name, innerHTML) {
this.name = name;
let element = document.createElement('div');
element.innerHTML = innerHTML;
tests_container.appendChild(element);
this.element = element;
}
setWidth(width) {
this.element.style.width = `${width - 1}px`;
}
line_count() {
let height = this.element.offsetHeight;
console.assert(height === 20 || height === 40);
return Math.round(height / 20);
}
}
function run() {
// Collects code points to test.
let code_points = [];
for (let code_point = 0x21; code_point <= 0x7E; code_point++)
code_points.push(code_point);
code_points.push(0xA0); // NBSP
code_points.push(0x56FD); // CJK UNIFIED IDEOGRAPH-56FD 国
let tests = [];
for (let code_point of code_points) {
let name = code_point.toString(16).toUpperCase();
let str = String.fromCodePoint(code_point);
tests.push(new LineBreakTest(`Before U+${name}`, '<inline-block></inline-block>' + str));
tests.push(new LineBreakTest(`After U+${name}`, str + '<inline-block></inline-block>'));
}
// Shrink by 1px so that the line does not fit.
for (let t of tests) {
console.assert(t.line_count() === 1);
t.width = t.element.offsetWidth;
}
for (let t of tests)
t.setWidth(t.width - 1);
// Collect results.
let logs = [];
let no_break_count = 0;
for (let t of tests) {
if (t.line_count() === 1) {
++no_break_count;
logs.push(`No break ${t.name}`);
}
}
logs.push(`${no_break_count} unbreakable combinations found`);
log_container.textContent = logs.join('\n');
assert_equals(no_break_count, 0);
}
test(run);
</script>
</body>