<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.stiles.casa/index.php?action=history&amp;feed=atom&amp;title=Module%3AUnicode_data%2Ftestcases</id>
	<title>Module:Unicode data/testcases - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stiles.casa/index.php?action=history&amp;feed=atom&amp;title=Module%3AUnicode_data%2Ftestcases"/>
	<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:Unicode_data/testcases&amp;action=history"/>
	<updated>2026-04-07T15:05:14Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://wiki.stiles.casa/index.php?title=Module:Unicode_data/testcases&amp;diff=7839&amp;oldid=prev</id>
		<title>imported&gt;DePiep: test {  0x30000, &quot;CJK Unified Ideographs Extension G&quot;}, (version 13, 14)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:Unicode_data/testcases&amp;diff=7839&amp;oldid=prev"/>
		<updated>2022-06-01T05:34:51Z</updated>

		<summary type="html">&lt;p&gt;test {  0x30000, &amp;quot;CJK Unified Ideographs Extension G&amp;quot;}, (version 13, 14)&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 Unicode_data = require(mw.title.getCurrentTitle().subpageText == &amp;quot;sandbox&amp;quot;&lt;br /&gt;
	and &amp;quot;Module:Unicode data/sandbox&amp;quot; or &amp;quot;Module:Unicode data&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local U = mw.ustring.char&lt;br /&gt;
local get_codepoint = mw.ustring.codepoint&lt;br /&gt;
local function show(codepoint)&lt;br /&gt;
	if Unicode_data.is_printable(codepoint) then&lt;br /&gt;
		local printed_codepoint = U(codepoint)&lt;br /&gt;
		if mw.ustring.toNFC(printed_codepoint) ~= printed_codepoint then&lt;br /&gt;
			printed_codepoint = (&amp;quot;&amp;amp;#x%X;&amp;quot;):format(codepoint)&lt;br /&gt;
		end&lt;br /&gt;
		if Unicode_data.is_combining(codepoint) then&lt;br /&gt;
			printed_codepoint = &amp;quot;◌&amp;quot; .. printed_codepoint&lt;br /&gt;
		end&lt;br /&gt;
		return (&amp;quot;U+%04X: %s&amp;quot;):format(codepoint, printed_codepoint)&lt;br /&gt;
	else&lt;br /&gt;
		return (&amp;quot;U+%04X&amp;quot;):format(codepoint)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function show_codepoint_and_name(codepoint)&lt;br /&gt;
	return (&amp;quot;%s (%s)&amp;quot;):format(show(codepoint),&lt;br /&gt;
		Unicode_data.lookup_name(codepoint))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_lookup_name()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{   0x0000, &amp;quot;&amp;lt;control-0000&amp;gt;&amp;quot; },&lt;br /&gt;
		{   0x007F, &amp;quot;&amp;lt;control-007F&amp;gt;&amp;quot; },&lt;br /&gt;
		{   0x00C1, &amp;quot;LATIN CAPITAL LETTER A WITH ACUTE&amp;quot; },&lt;br /&gt;
		{   0x0300, &amp;quot;COMBINING GRAVE ACCENT&amp;quot; },&lt;br /&gt;
		{   0x0378, &amp;quot;&amp;lt;reserved-0378&amp;gt;&amp;quot; },&lt;br /&gt;
		{   0x1B44, &amp;quot;BALINESE ADEG ADEG&amp;quot; },&lt;br /&gt;
		{   0x1F71, &amp;quot;GREEK SMALL LETTER ALPHA WITH OXIA&amp;quot; },&lt;br /&gt;
		{   0x3555, &amp;quot;CJK UNIFIED IDEOGRAPH-3555&amp;quot; },&lt;br /&gt;
		{   0xAC01, &amp;quot;HANGUL SYLLABLE GAG&amp;quot; },&lt;br /&gt;
		{   0xD5FF, &amp;quot;HANGUL SYLLABLE HEH&amp;quot; },&lt;br /&gt;
		{   0xDC00, &amp;quot;&amp;lt;surrogate-DC00&amp;gt;&amp;quot;, },&lt;br /&gt;
		{   0xEEEE, &amp;quot;&amp;lt;private-use-EEEE&amp;gt;&amp;quot; },&lt;br /&gt;
		{   0xFDD1, &amp;quot;&amp;lt;noncharacter-FDD1&amp;gt;&amp;quot;, },&lt;br /&gt;
		{   0xFFFD, &amp;quot;REPLACEMENT CHARACTER&amp;quot; },&lt;br /&gt;
		{   0xFFFF, &amp;quot;&amp;lt;noncharacter-FFFF&amp;gt;&amp;quot; },&lt;br /&gt;
		{  0x1F4A9, &amp;quot;PILE OF POO&amp;quot; },&lt;br /&gt;
		{  0xE0000, &amp;quot;&amp;lt;reserved-E0000&amp;gt;&amp;quot; },&lt;br /&gt;
		{  0xF0F0F, &amp;quot;&amp;lt;private-use-F0F0F&amp;gt;&amp;quot; },&lt;br /&gt;
		{ 0x10FFFF, &amp;quot;&amp;lt;noncharacter-10FFFF&amp;gt;&amp;quot; },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(examples,&lt;br /&gt;
		function (self, codepoint, name)&lt;br /&gt;
			self:equals(show(codepoint),&lt;br /&gt;
				Unicode_data.lookup_name(codepoint), name)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_lookup_age()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{   0x0061, &amp;quot;1.1&amp;quot; },&lt;br /&gt;
		{   0x0378, &amp;quot;NA&amp;quot; },&lt;br /&gt;
		{   0x1B44, &amp;quot;5.0&amp;quot; },&lt;br /&gt;
		{   0x3555, &amp;quot;3.0&amp;quot; },&lt;br /&gt;
		{   0xAC01, &amp;quot;2.0&amp;quot; },&lt;br /&gt;
		{   0xDC00, &amp;quot;2.0&amp;quot;, },&lt;br /&gt;
		{   0xEEEE, &amp;quot;1.1&amp;quot; },&lt;br /&gt;
		{   0xFDD1, &amp;quot;3.1&amp;quot;, },&lt;br /&gt;
		{  0x1F4A9, &amp;quot;6.0&amp;quot; },&lt;br /&gt;
		{  0xE0000, &amp;quot;NA&amp;quot; },&lt;br /&gt;
		{  0xF0F0F, &amp;quot;2.0&amp;quot; },&lt;br /&gt;
		{ 0x10FFFF, &amp;quot;2.0&amp;quot; },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(examples,&lt;br /&gt;
		function (self, codepoint, age)&lt;br /&gt;
			-- Remove pcall when this function is added to [[Module:Unicode data]].&lt;br /&gt;
			pcall(function ()&lt;br /&gt;
				self:equals(show(codepoint),&lt;br /&gt;
					Unicode_data.lookup_age(codepoint), age)&lt;br /&gt;
			end)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_is_combining()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{ 0x0300, true },&lt;br /&gt;
		{ 0x0060, false },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(examples,&lt;br /&gt;
		function (self, codepoint, expected)&lt;br /&gt;
			self:equals(&lt;br /&gt;
				show_codepoint_and_name(codepoint),&lt;br /&gt;
				Unicode_data.is_combining(codepoint),&lt;br /&gt;
				expected)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_is_default_ignorable()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{ 0x0061, false },&lt;br /&gt;
		{ 0x00AD, true },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(examples,&lt;br /&gt;
		function (self, codepoint, expected)&lt;br /&gt;
			-- Remove pcall when this function is added to [[Module:Unicode data]].&lt;br /&gt;
			pcall(function ()&lt;br /&gt;
				self:equals(&lt;br /&gt;
					show_codepoint_and_name(codepoint),&lt;br /&gt;
					Unicode_data.is_default_ignorable(codepoint),&lt;br /&gt;
					expected)&lt;br /&gt;
			end)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_lookup_script()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{ 0x0061, &amp;quot;Latn&amp;quot; },&lt;br /&gt;
		{ 0x002F, &amp;quot;Zyyy&amp;quot; },&lt;br /&gt;
		{ 0x0300, &amp;quot;Zinh&amp;quot; },&lt;br /&gt;
		{ 0x0378, &amp;quot;Zzzz&amp;quot; },&lt;br /&gt;
		{ 0x0398, &amp;quot;Grek&amp;quot; },&lt;br /&gt;
		{ 0x03E2, &amp;quot;Copt&amp;quot; },&lt;br /&gt;
		{ 0x2014, &amp;quot;Zyyy&amp;quot; },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(examples,&lt;br /&gt;
		function (self, codepoint, expected)&lt;br /&gt;
			self:equals(&lt;br /&gt;
				show_codepoint_and_name(codepoint),&lt;br /&gt;
				Unicode_data.lookup_script(codepoint),&lt;br /&gt;
				expected)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_lookup_category()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{ get_codepoint &amp;quot;\t&amp;quot;, &amp;quot;Cc&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot; &amp;quot;,  &amp;quot;Zs&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;[&amp;quot;,  &amp;quot;Ps&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;]&amp;quot;,  &amp;quot;Pe&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;^&amp;quot;,  &amp;quot;Sk&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;A&amp;quot;,  &amp;quot;Lu&amp;quot; },&lt;br /&gt;
		{ 0x00AD,             &amp;quot;Cf&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;¾&amp;quot;,  &amp;quot;No&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;«&amp;quot;,  &amp;quot;Pi&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;»&amp;quot;,  &amp;quot;Pf&amp;quot; },&lt;br /&gt;
		{ 0x0300,             &amp;quot;Mn&amp;quot; },&lt;br /&gt;
		{ 0x0488,             &amp;quot;Me&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;٣&amp;quot;,  &amp;quot;Nd&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;子&amp;quot;, &amp;quot;Lo&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;ᾮ&amp;quot;,  &amp;quot;Lt&amp;quot; },&lt;br /&gt;
		{ 0x1B44,             &amp;quot;Mc&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;∈&amp;quot;,  &amp;quot;Sm&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;‿&amp;quot;,  &amp;quot;Pc&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;↹&amp;quot;,  &amp;quot;So&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;⸗&amp;quot;,  &amp;quot;Pd&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;Ⅷ&amp;quot;, &amp;quot;Nl&amp;quot; },&lt;br /&gt;
		{ 0x2028,              &amp;quot;Zl&amp;quot; },&lt;br /&gt;
		{ 0x2029,              &amp;quot;Zp&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;ゞ&amp;quot;,  &amp;quot;Lm&amp;quot; },&lt;br /&gt;
		{ 0xD800,              &amp;quot;Cs&amp;quot; },&lt;br /&gt;
		{ get_codepoint &amp;quot;￡&amp;quot;,  &amp;quot;Sc&amp;quot; },&lt;br /&gt;
		{ 0xFFFF,              &amp;quot;Cn&amp;quot; },&lt;br /&gt;
		{ 0x100000,            &amp;quot;Co&amp;quot; },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(examples,&lt;br /&gt;
		function (self, codepoint, expected)&lt;br /&gt;
			self:equals(&lt;br /&gt;
				show_codepoint_and_name(codepoint),&lt;br /&gt;
				Unicode_data.lookup_category(codepoint),&lt;br /&gt;
				expected)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local fun = require &amp;quot;Module:Fun&amp;quot;&lt;br /&gt;
local m_table = require &amp;quot;Module:TableTools&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local script_to_count_mt = {&lt;br /&gt;
	__index = function (self, key)&lt;br /&gt;
		self[key] = 0&lt;br /&gt;
		return 0&lt;br /&gt;
	end,&lt;br /&gt;
	__call = function (self, ...)&lt;br /&gt;
		return setmetatable({}, self)&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
setmetatable(script_to_count_mt, script_to_count_mt)&lt;br /&gt;
&lt;br /&gt;
local script_counts = setmetatable({}, {&lt;br /&gt;
	__index = function (self, str)&lt;br /&gt;
		if type(str) ~= &amp;quot;string&amp;quot; then return nil end&lt;br /&gt;
		&lt;br /&gt;
		local script_to_count = script_to_count_mt()&lt;br /&gt;
		&lt;br /&gt;
		for codepoint in mw.ustring.gcodepoint(str) do&lt;br /&gt;
			local script = Unicode_data.lookup_script(codepoint)&lt;br /&gt;
			script_to_count[script] = script_to_count[script] + 1&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local printed = table.concat(&lt;br /&gt;
			fun.mapIter(&lt;br /&gt;
				function (count, script)&lt;br /&gt;
					return (&amp;quot;%s (%d)&amp;quot;):format(script, count)&lt;br /&gt;
				end,&lt;br /&gt;
				m_table.sortedPairs(&lt;br /&gt;
					script_to_count,&lt;br /&gt;
					function (script1, script2)&lt;br /&gt;
						return script_to_count[script1] &amp;gt; script_to_count[script2]&lt;br /&gt;
					end)),&lt;br /&gt;
			&amp;quot;, &amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		self[str] = printed&lt;br /&gt;
		&lt;br /&gt;
		return printed&lt;br /&gt;
	end,&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
local script_examples = {&lt;br /&gt;
	-- To demonstrate that &amp;quot;is_Latin&amp;quot; doesn&amp;#039;t treat a string of Zyyy and Zinh&lt;br /&gt;
	-- characters as Latn.&lt;br /&gt;
	&lt;br /&gt;
	-- This particular example only has characters below U+0340, so&lt;br /&gt;
	-- lookup_script doesn&amp;#039;t have to be called.&lt;br /&gt;
	{ &amp;quot;%!?́&amp;quot;, nil },&lt;br /&gt;
	{ &amp;quot;’ʼ“”†‡•‰′‽⁕&amp;quot;, nil },&lt;br /&gt;
	{ &amp;quot;col·legi&amp;quot;, &amp;quot;Latn&amp;quot; },&lt;br /&gt;
	&amp;quot;HTML character references&amp;quot;,&lt;br /&gt;
	{ &amp;quot;𐘀&amp;quot;, &amp;quot;Lina&amp;quot; },&lt;br /&gt;
	{ &amp;quot;&amp;amp;#x10600;&amp;quot;, &amp;quot;Lina&amp;quot; },&lt;br /&gt;
	{ &amp;quot;–&amp;quot;, nil },&lt;br /&gt;
	{ &amp;quot;&amp;amp;ndash;&amp;quot;, nil },&lt;br /&gt;
	-- Examples from [[Template talk:Lang#Italicisation of Halkomelem]]&lt;br /&gt;
	&amp;quot;Halkomelem&amp;quot;,&lt;br /&gt;
	{ &amp;quot;lá:yelhp&amp;quot;, &amp;quot;Latn&amp;quot; },&lt;br /&gt;
	{ &amp;quot;xʷməθkʷəy̓əm&amp;quot;, nil }, -- one Greek (Grek) character&lt;br /&gt;
	{ &amp;quot;hən̓q̓əmin̓əm̓&amp;quot;, &amp;quot;Latn&amp;quot; },&lt;br /&gt;
	&amp;quot;Quotes&amp;quot;,&lt;br /&gt;
	 -- [[s:it:Divina Commedia/Inferno/Canto I]]&lt;br /&gt;
	{&lt;br /&gt;
[[Tant’è amara che poco è più morte;&lt;br /&gt;
ma per trattar del ben ch’i’ vi trovai,&lt;br /&gt;
dirò de l’altre cose ch’i’ v’ ho scorte.]],&lt;br /&gt;
		&amp;quot;Latn&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
	},&lt;br /&gt;
	{   -- A blessing in Navajo:&lt;br /&gt;
		--[[User talk:Stephen G. Brown/text8]]&lt;br /&gt;
[[Díí Késhmish biyiʼ yáʼąąshdę́ę́ʼ ląʼígóó bee nikʼihojidlíi dooleeł. &lt;br /&gt;
Niheechʼínáánáháhígíí biyiʼ iłhodeezyéél, iłhózhǫ́, ayóóʼóʼóʼní&lt;br /&gt;
bee nikʼihojidlíi dooleeł. Tʼáá sahdiigiʼ átʼéego baa hózhǫ́ǫgo&lt;br /&gt;
nihił hanááhoolzhiizhígí biyiʼ tʼáá ałtsojįʼ iłhózhǫ́ nííʼ dooleeł.]],&lt;br /&gt;
		&amp;quot;Latn&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	{	-- The opening of the Iliad ([[s:el:Ιλιάς/Α]]), with macrons and&lt;br /&gt;
		-- breves added to mark the length of the monophthongs α, ι, υ: &lt;br /&gt;
[[Μῆνῐν ᾰ̓́ειδε, θεᾱ́, Πηληῐ̈ᾰ́δεω Ᾰ̓χῐλῆος&lt;br /&gt;
οὐλομένην, ἣ μῡρῐ́᾽ Ᾰ̓χαιοῖς ᾰ̓́λγε᾽ ἔθηκε,&lt;br /&gt;
πολλᾱ̀ς δ᾽ ῐ̓φθῑ́μους ψῡχᾱ̀ς Ἄῐ̈δῐ προῐ̈́ᾰψεν&lt;br /&gt;
ἡρώων, αὐτοὺς δὲ ἑλώρῐᾰ τεῦχε κῠ́νεσσιν&lt;br /&gt;
οἰωνοῖσῐ́ τε πᾶσῐ· Δῐὸς δ᾽ ἐτελείετο βουλή·]],&lt;br /&gt;
		&amp;quot;Grek&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	{ -- The Brothers Karamazov: [[w:ru:Братья Карамазовы (Достоевский)/Книга первая]]&lt;br /&gt;
[[Вот если вы не согласитесь с этим последним тезисом и&lt;br /&gt;
ответите: «Не так» или «не всегда так», то я, пожалуй, и&lt;br /&gt;
ободрюсь духом насчет значения героя моего Алексея&lt;br /&gt;
Федоровича. Ибо не только чудак «не всегда» частность и&lt;br /&gt;
обособление, а напротив, бывает так, что он-то, пожалуй,&lt;br /&gt;
и носит в себе иной раз сердцевину целого, а остальные&lt;br /&gt;
люди его эпохи — все, каким-нибудь наплывным  ветром,&lt;br /&gt;
на время почему-то от него оторвались…]],&lt;br /&gt;
		&amp;quot;Cyrl&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	{ -- Rig Veda: [[https://sa.wikisource.org/wiki/ऋग्वेदः_सूक्तं_१.१]]&lt;br /&gt;
[[ॐ अग्निमीळे पुरोहितं यज्ञस्य देवमृत्विजम् ।&lt;br /&gt;
होतारं रत्नधातमम् ॥१॥&lt;br /&gt;
अग्निः पूर्वेभिरृषिभिरीड्यो नूतनैरुत ।&lt;br /&gt;
स देवाँ एह वक्षति ॥२॥&lt;br /&gt;
अग्निना रयिमश्नवत् पोषमेव दिवेदिवे ।&lt;br /&gt;
यशसं वीरवत्तमम् ॥३॥&lt;br /&gt;
अग्ने यं यज्ञमध्वरं विश्वतः परिभूरसि ।&lt;br /&gt;
स इद्देवेषु गच्छति ॥४॥&lt;br /&gt;
अग्निर्होता कविक्रतुः सत्यश्चित्रश्रवस्तमः ।&lt;br /&gt;
देवो देवेभिरा गमत् ॥५॥&lt;br /&gt;
यदङ्ग दाशुषे त्वमग्ने भद्रं करिष्यसि ।&lt;br /&gt;
तवेत् तत् सत्यमङ्गिरः ॥६॥&lt;br /&gt;
उप त्वाग्ने दिवेदिवे दोषावस्तर्धिया वयम् ।&lt;br /&gt;
नमो भरन्त एमसि ॥७॥&lt;br /&gt;
राजन्तमध्वराणां गोपामृतस्य दीदिविम् ।&lt;br /&gt;
वर्धमानं स्वे दमे ॥८॥&lt;br /&gt;
स नः पितेव सूनवेऽग्ने सूपायनो भव ।&lt;br /&gt;
सचस्वा नः स्वस्तये ॥९॥]],&lt;br /&gt;
		&amp;quot;Deva&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local ends_in_punctuation = setmetatable({}, {&lt;br /&gt;
	__index = function (self, key)&lt;br /&gt;
		local val = mw.ustring.match(mw.ustring.sub(key, -1), &amp;quot;%p&amp;quot;) ~= nil&lt;br /&gt;
		self[key] = val&lt;br /&gt;
		return val&lt;br /&gt;
	end,&lt;br /&gt;
})&lt;br /&gt;
local function show_script_example(script_example)&lt;br /&gt;
	local separator = &amp;quot;: &amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- If last character is punctuation, place script counts on their own line&lt;br /&gt;
	-- Could use Unicode_data.lookup_category, but that is more memory-intensive.&lt;br /&gt;
	if ends_in_punctuation[script_example] then&lt;br /&gt;
		separator = &amp;quot;&amp;lt;br&amp;gt;&amp;amp;bull; &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return script_example:gsub(&amp;#039;\n&amp;#039;, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;) .. separator&lt;br /&gt;
		.. script_counts[script_example]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_get_best_script()&lt;br /&gt;
	self:iterate(script_examples,&lt;br /&gt;
		function (self, str, expected)&lt;br /&gt;
			self:equals(&lt;br /&gt;
				show_script_example(str),&lt;br /&gt;
				Unicode_data.get_best_script(str),&lt;br /&gt;
				expected)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_is_Latin()&lt;br /&gt;
	self:iterate(script_examples,&lt;br /&gt;
		function (self, str, best_script, is_Latin)&lt;br /&gt;
			self:equals(show_script_example(str), Unicode_data.is_Latin(str),&lt;br /&gt;
				is_Latin or best_script == &amp;quot;Latn&amp;quot;)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_lookup_block()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{   0x0064, &amp;quot;Basic Latin&amp;quot;                      },&lt;br /&gt;
		{   0x030B, &amp;quot;Combining Diacritical Marks&amp;quot;      },&lt;br /&gt;
		{   0x03A3, &amp;quot;Greek and Coptic&amp;quot;                 },&lt;br /&gt;
		{   0x0411, &amp;quot;Cyrillic&amp;quot;                         },&lt;br /&gt;
		{   0x10E6, &amp;quot;Georgian&amp;quot;                         },&lt;br /&gt;
		{   0x3175, &amp;quot;Hangul Compatibility Jamo&amp;quot;        },&lt;br /&gt;
		{   0xAC01, &amp;quot;Hangul Syllables&amp;quot;                 },&lt;br /&gt;
		{   0x4E0A, &amp;quot;CJK Unified Ideographs&amp;quot;           },&lt;br /&gt;
		{  0x1F608, &amp;quot;Emoticons&amp;quot;                        },&lt;br /&gt;
		{  0x30000, &amp;quot;CJK Unified Ideographs Extension G&amp;quot;},&lt;br /&gt;
		{ 0x10FFFF, &amp;quot;Supplementary Private Use Area-B&amp;quot; },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(examples,&lt;br /&gt;
		function (self, codepoint, block_name)&lt;br /&gt;
			self:equals(&lt;br /&gt;
				show(codepoint),&lt;br /&gt;
				Unicode_data.lookup_block(codepoint),&lt;br /&gt;
				block_name)&lt;br /&gt;
		end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p:test_is_rtl()&lt;br /&gt;
	local examples = {&lt;br /&gt;
		{ &amp;quot;أبو عبد الله محمد بن عبد الله اللواتي الطنجي بن بطوطة&amp;quot;, true }, -- Ibn Battuta&amp;#039;s full name&lt;br /&gt;
		{ &amp;quot;أدب القاضي Adab al-qādī&amp;quot;, false }, -- Example of incorrect input&lt;br /&gt;
		{ &amp;quot;ܛܘܼܒܲܝܗܘܿܢ ܠܐܲܝܠܹܝܢ ܕܲܕ݂ܟܹܝܢ ܒܠܸܒ̇ܗܘܿܢ܄ ܕܗܸܢ݂ܘܿܢ ܢܸܚܙܘܿܢ ܠܐܲܠܵܗܵܐ܂‬&amp;quot;, true }, -- Syriac, sixth beatitude (Matthew 5:8)&lt;br /&gt;
		{ &amp;quot;בְּרֵאשִׁית, בָּרָא אֱלֹהִים, אֵת הַשָּׁמַיִם, וְאֵת הָאָרֶץ.&amp;quot;, true }, -- Hebrew: Genesis 1:1&lt;br /&gt;
		{ &amp;quot;𞤀𞤣𞤤𞤢𞤥 𞤆𞤵𞤤𞤢𞤪&amp;quot;, true }, -- Adlam: name of alphabet&lt;br /&gt;
		{&lt;br /&gt;
			-- Avestan: Hymn to Haoma: Yasna 10.8 ([[wikt:𐬀𐬉𐬴𐬨𐬀]])&lt;br /&gt;
			&amp;quot;𐬬𐬍𐬯𐬞𐬈 ⸱ 𐬰𐬍 ⸱ 𐬀𐬥𐬌𐬌𐬉 ⸱ 𐬨𐬀𐬜𐬃𐬢𐬵𐬋 ⸱ 𐬀𐬉𐬴𐬨𐬀 ⸱ 𐬵𐬀𐬗𐬌𐬧𐬙𐬈 ⸱ 𐬑𐬭𐬎𐬎𐬍𐬨 ⸱ 𐬛𐬭𐬎𐬎𐬋 ⸱ 𐬁𐬀𐬝 ⸱ 𐬵𐬋 ⸱ 𐬫𐬋 ⸱ 𐬵𐬀𐬊𐬨𐬀𐬵𐬈 ⸱ 𐬨𐬀𐬜𐬋 ⸱ 𐬀𐬴𐬀 ⸱ 𐬵𐬀𐬗𐬀𐬌𐬙𐬈&amp;quot;,&lt;br /&gt;
			true&lt;br /&gt;
		},&lt;br /&gt;
		{ &amp;quot;ދިވެހި&amp;quot;, true }, -- the word dhivehi written in Thaana script&lt;br /&gt;
		{ &amp;quot;𐤀𐤓𐤍𐤟𐤆𐤐𐤏𐤋𐤟𐤀𐤕𐤁𐤏𐤋𐤟𐤁𐤍𐤀𐤇𐤓𐤌𐤟𐤌𐤋𐤊𐤂𐤁𐤋𐤟𐤋𐤀𐤇𐤓𐤌𐤟𐤀𐤁𐤄&amp;quot;, true }, -- Phoenician: Ahiram sarcophagus ([[wikt:𐤀𐤓𐤍]])&lt;br /&gt;
		{ &amp;quot;ࡌࡀࡍࡃࡀ ࡖࡄࡉࡉࡀ&amp;quot;, true }, -- Mandaic: manda ḏ&amp;#039;haije (&amp;quot;knowledge of life&amp;quot;; [[wikt:ࡌࡀࡍࡃࡀ ࡖࡄࡉࡉࡀ]])&lt;br /&gt;
		{ &amp;quot;ࠄࠟࠓࠂࠝࠓࠜࠉࠆࠜࠉࠌ&amp;quot;, true }, -- Samaritan Hebrew: īargerēzēm (&amp;quot;Mount Gerizim&amp;quot;; [[wikt:Mount Gerizim]])&lt;br /&gt;
		{ &amp;quot;%$!^&amp;amp;&amp;quot;, false },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	self:iterate(examples,&lt;br /&gt;
		function (self, str, expected)&lt;br /&gt;
			self:equals(str, Unicode_data.is_rtl(str), 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 m_table.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;DePiep</name></author>
	</entry>
</feed>