<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FErutuon%2Ftestcases</id>
	<title>Module:Sandbox/Erutuon/testcases - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FErutuon%2Ftestcases"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Erutuon/testcases&amp;action=history"/>
	<updated>2026-05-24T15:24:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Erutuon/testcases&amp;diff=145403&amp;oldid=prev</id>
		<title>imported&gt;Erutuon: Module:Table → Module:TableTools</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Erutuon/testcases&amp;diff=145403&amp;oldid=prev"/>
		<updated>2019-03-04T21:32:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;a href=&quot;/index.php?title=Module:Table&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:Table (page does not exist)&quot;&gt;Module:Table&lt;/a&gt; → &lt;a href=&quot;/research/Module:TableTools&quot; title=&quot;Module:TableTools&quot;&gt;Module:TableTools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = require &amp;quot;Module:UnitTests&amp;quot;&lt;br /&gt;
local parse_IETF = require &amp;quot;Module:Sandbox/Erutuon&amp;quot;.parse_IETF&lt;br /&gt;
local fun = require &amp;quot;Module:Fun&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local show = {&lt;br /&gt;
	language = function (subtags, key)&lt;br /&gt;
		if not subtags[key] then return nil end&lt;br /&gt;
		return (&amp;quot;%s: &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;):format(key, subtags[key] or &amp;#039;&amp;#039;)&lt;br /&gt;
	end,&lt;br /&gt;
	variant = function (subtags, key)&lt;br /&gt;
		if not subtags[key] then return nil end&lt;br /&gt;
		return (&amp;quot;%s: &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;):format(&lt;br /&gt;
			key,&lt;br /&gt;
			type(subtags[key]) == &amp;quot;table&amp;quot; and table.concat(subtags[key], &amp;quot;, &amp;quot;)&lt;br /&gt;
				or subtags[key] or &amp;#039;&amp;#039;)&lt;br /&gt;
	end,&lt;br /&gt;
	error = function (subtags, key)&lt;br /&gt;
		if not subtags.error then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return (&amp;quot;error: %s at &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;)&lt;br /&gt;
			:format(subtags.error, subtags.invalid or &amp;quot;???&amp;quot;)&lt;br /&gt;
	end,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
show.script = show.language&lt;br /&gt;
show.region = show.language&lt;br /&gt;
show.private_use = show.variant&lt;br /&gt;
&lt;br /&gt;
local items = { &amp;quot;language&amp;quot;, &amp;quot;script&amp;quot;, &amp;quot;region&amp;quot;, &amp;quot;variant&amp;quot;, &amp;quot;private_use&amp;quot;,&lt;br /&gt;
	&amp;quot;error&amp;quot; } -- &amp;quot;invalid&amp;quot; is handled together with &amp;quot;error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
local mt = {}&lt;br /&gt;
mt.__index = table&lt;br /&gt;
local function show_parsed_subtags(parsed_subtags)&lt;br /&gt;
	if not parsed_subtags then return &amp;#039;nil&amp;#039; end&lt;br /&gt;
	&lt;br /&gt;
	local result = setmetatable({}, mt)&lt;br /&gt;
	&lt;br /&gt;
	for _, key in ipairs(items) do&lt;br /&gt;
		result:insert(show[key](parsed_subtags, key))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return result:concat(&amp;quot;; &amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_parse_IETF()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{ &amp;quot;ru&amp;quot;, { language = &amp;quot;ru&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;ru-Latn&amp;quot;, { language = &amp;quot;ru&amp;quot;, script = &amp;quot;Latn&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;fr-CA&amp;quot;, { language = &amp;quot;fr&amp;quot;, region = &amp;quot;CA&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;ru-petr1708&amp;quot;, { language = &amp;quot;ru&amp;quot;, variant = &amp;quot;petr1708&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;zh-Latn-pinyin&amp;quot;, { language = &amp;quot;zh&amp;quot;, script = &amp;quot;Latn&amp;quot;, variant = &amp;quot;pinyin&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;sl-rozaj-biske&amp;quot;, { language = &amp;quot;sl&amp;quot;, variant = { &amp;quot;rozaj&amp;quot;, &amp;quot;biske&amp;quot; } } },&lt;br /&gt;
		{ &amp;quot;sl-rozaj-biske-1994&amp;quot;, { language = &amp;quot;sl&amp;quot;, variant = { &amp;quot;rozaj&amp;quot;, &amp;quot;biske&amp;quot;, &amp;quot;1994&amp;quot; } } },&lt;br /&gt;
		{ &amp;quot;en-CA-newfound&amp;quot;, { language = &amp;quot;en&amp;quot;, region = &amp;quot;CA&amp;quot;, variant = &amp;quot;newfound&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;ine-x-proto&amp;quot;, { language = &amp;quot;ine&amp;quot;, private_use = &amp;quot;proto&amp;quot; } },&lt;br /&gt;
		-- Could be used to indicate the PIE transcription system used by Pokorny?&lt;br /&gt;
		{ &amp;quot;ine-x-proto-pokorny&amp;quot;, { language = &amp;quot;ine&amp;quot;, private_use = { &amp;quot;proto&amp;quot;, &amp;quot;pokorny&amp;quot; } } },&lt;br /&gt;
		{ &amp;quot;x-fake-private-use&amp;quot;, { private_use = { &amp;quot;fake&amp;quot;, &amp;quot;private&amp;quot;, &amp;quot;use&amp;quot; } } },&lt;br /&gt;
		&amp;quot;errors&amp;quot;,&lt;br /&gt;
		{ &amp;quot;ine-!!!&amp;quot;, { error = &amp;quot;invalid characters&amp;quot;, invalid = &amp;quot;!!!&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;pâté&amp;quot;, { error = &amp;quot;invalid characters&amp;quot;, invalid = &amp;quot;pâté&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;Latn&amp;quot;, { error = &amp;quot;no language subtag&amp;quot;, invalid = &amp;quot;Latn&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;ru-Latn-Cyrl&amp;quot;, { language = &amp;quot;ru&amp;quot;, script = &amp;quot;Latn&amp;quot;, error = &amp;quot;invalid subtag&amp;quot;, invalid = &amp;quot;Cyrl&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;blahblahblah&amp;quot;, { error = &amp;quot;no language subtag&amp;quot;, invalid = &amp;quot;blahblahblah&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;ru-blahblahblah&amp;quot;, { language = &amp;quot;ru&amp;quot;, error = &amp;quot;invalid subtag&amp;quot;, invalid = &amp;quot;blahblahblah&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;ru-Latn-blahblahblah&amp;quot;,&lt;br /&gt;
			{ language = &amp;quot;ru&amp;quot;, script = &amp;quot;Latn&amp;quot;, error = &amp;quot;invalid subtag&amp;quot;, invalid = &amp;quot;blahblahblah&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;ru-x-blahblahblah&amp;quot;,&lt;br /&gt;
			{ language = &amp;quot;ru&amp;quot;, error = &amp;quot;length of private-use subtag out of range&amp;quot;, invalid = &amp;quot;x-blahblahblah&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;ru-x&amp;quot;, { language = &amp;quot;ru&amp;quot;, error = &amp;quot;empty private-use subtag&amp;quot;, invalid = &amp;quot;x&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;blahblah-Latn&amp;quot;, { error = &amp;quot;no language subtag&amp;quot;, invalid = &amp;quot;blahblah-Latn&amp;quot; } },&lt;br /&gt;
		{ &amp;quot;&amp;quot;, nil },&lt;br /&gt;
		-- { mw.log, nil },&lt;br /&gt;
		-- { nil, nil },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local index = fun.indexOf(&amp;quot;errors&amp;quot;, examples)&lt;br /&gt;
	table.insert(examples, index, &amp;quot;case-insensitivity&amp;quot;)&lt;br /&gt;
	for i = 1, index - 1 do -- Insert testcases for capitalized versions of the valid tags.&lt;br /&gt;
		local upper_example = mw.clone(examples[i])&lt;br /&gt;
		upper_example[1] = upper_example[1]:upper()&lt;br /&gt;
		table.insert(examples, index + i, upper_example)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(&lt;br /&gt;
		examples,&lt;br /&gt;
		function (self, IETF_code, expected)&lt;br /&gt;
			self:equals(&lt;br /&gt;
				(&amp;#039;&amp;lt;code style=&amp;quot;white-space: nowrap;&amp;quot;&amp;gt;%s&amp;lt;/code&amp;gt;&amp;#039;):format(IETF_code),&lt;br /&gt;
				show_parsed_subtags(parse_IETF(IETF_code)),&lt;br /&gt;
				show_parsed_subtags(expected))&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Change function names into more readable headers for the testcases tables.&lt;br /&gt;
for k, v in require &amp;quot;Module:TableTools&amp;quot;.sortedPairs(p) do&lt;br /&gt;
	if type(k) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		local new_k = k:gsub(&amp;quot;^test_(.+)$&amp;quot;, &amp;quot;testcases for &amp;lt;code&amp;gt;%1&amp;lt;/code&amp;gt;&amp;quot;)&lt;br /&gt;
		if new_k ~= k then&lt;br /&gt;
			p[k] = nil&lt;br /&gt;
			p[new_k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Erutuon</name></author>
	</entry>
</feed>