Module:User:Erutuon/grapheme cluster break/testcases
Appearance
- The following documentation is located at Module:User:Erutuon/grapheme cluster break/testcases/documentation. [edit]
- Useful links: root page • root page’s subpages • links • transclusions • tested module • sandbox
successes: 834; failures: 0
local test_content = mw.title.new("User:Erutuon/GraphemeBreakTest.txt"):getContent()
local char = mw.ustring.char
local function parse_tests(path)
local tests = {}
for line in test_content:gmatch("[^\n]+") do
local test_text, comment = line:match "^([^#]*)#?([^#]*)"
if not line:find "<" and test_text and #test_text > 0 then -- not a comment line
local breaks = {}
local breaks_i = 0
local printed_characters = ""
for item in test_text:gmatch "%S+" do
if item == "÷" or item == "×" then
breaks_i = breaks_i + 1
breaks[breaks_i] = item == "÷"
else
local codepoint = assert(tonumber(item, 16), line)
printed_characters = printed_characters .. char(codepoint)
end
end
local rules = {}
for item in comment:gmatch "%S+" do
local rule = item:match "^%[([^%]]+)%]$"
if rule then
table.insert(rules, rule)
end
end
table.insert(tests, { breaks = breaks, printed_characters = printed_characters, text = line, rules = rules })
end
end
return tests
end
local function run_tests()
local tests = parse_tests(grapheme_break_test_txt_path)
local output = require "Module:array"()
local successes = 0
local failures = 0
for i, test in ipairs(tests) do
local should_break = require "Module:User:Erutuon/grapheme cluster break" ()
local breaks = {}
local last_codepoint
local i = 0
local codepoints = {}
for codepoint in mw.ustring.gcodepoint(test.printed_characters) do
i = i + 1
codepoints[i] = codepoint
if last_codepoint and should_break(last_codepoint, codepoint) then
table.insert(breaks, true)
else
table.insert(breaks, i == 1)
end
last_codepoint = codepoint
end
local printed_text = false
for i, expected in ipairs(test.breaks) do
if breaks[i] ~= nil and breaks[i] ~= expected then
if not printed_text then
output:insert(test.printed_characters .. "\n")
output:insert(test.text .. "\n")
printed_text = true
end
output:insert(table.concat({"rule broken = ", test.rules[i], "; expected = ", test.breaks[i] and "break" or "no break",
"; actual = ", breaks[i] and "break" or "no break", "; code points = ",
("U+%04X U+%04X"):format(codepoints[i - 1], codepoints[i]), "\n"}))
end
end
if printed_text then
output:insert "\n"
failures = failures + 1
else
successes = successes + 1
end
end
return "<pre>successes: " .. successes .. "; failures: " .. failures .. "\n\n" .. output:concat() .. "</pre>"
end
return { run_tests = run_tests }