<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ATableTools%2Ftestcases</id>
	<title>Module:TableTools/testcases - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ATableTools%2Ftestcases"/>
	<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:TableTools/testcases&amp;action=history"/>
	<updated>2026-04-08T21:56:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://moasspedia.org/w/index.php?title=Module:TableTools/testcases&amp;diff=3454&amp;oldid=prev</id>
		<title>Wikipedia&gt;Uzume: add test cases where other types of NaN cause this to fail since it does not handle all types of NaN properly</title>
		<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:TableTools/testcases&amp;diff=3454&amp;oldid=prev"/>
		<updated>2021-12-17T15:01:26Z</updated>

		<summary type="html">&lt;p&gt;add test cases where other types of NaN cause this to fail since it does not handle all types of NaN properly&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Unit tests for [[Module:TableTools]]. Click talk page to run tests.&lt;br /&gt;
&lt;br /&gt;
local tt = require(&amp;#039;Module:TableTools/sandbox&amp;#039;) -- the module to be tested&lt;br /&gt;
local ScribuntoUnit = require(&amp;#039;Module:ScribuntoUnit&amp;#039;)&lt;br /&gt;
local suite = ScribuntoUnit:new()&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite.concatIpairs(t)&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	for i, v in ipairs(t) do&lt;br /&gt;
		ret = ret .. tostring(v)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
suite.isNan = tt.isNan&lt;br /&gt;
&lt;br /&gt;
function suite:assertErrorEquals(expected, func, ...)&lt;br /&gt;
	local success, msg = pcall(func, ...)&lt;br /&gt;
	self:assertEquals(expected, msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertTypeErrorEquals(argId, name, expectedType, actualType, func, ...)&lt;br /&gt;
	local expected = &amp;quot;bad argument #%d to &amp;#039;%s&amp;#039; (%s expected, got %s)&amp;quot;&lt;br /&gt;
	expected = expected:format(argId, name, expectedType, actualType)&lt;br /&gt;
	self:assertErrorEquals(expected, func, ...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test isPositiveInteger&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testIsPositiveInteger()&lt;br /&gt;
	self:assertTrue(tt.isPositiveInteger(1))&lt;br /&gt;
	self:assertTrue(tt.isPositiveInteger(2))&lt;br /&gt;
	self:assertTrue(tt.isPositiveInteger(2323874623))&lt;br /&gt;
	self:assertFalse(tt.isPositiveInteger(0))&lt;br /&gt;
	self:assertFalse(tt.isPositiveInteger(-1))&lt;br /&gt;
	self:assertFalse(tt.isPositiveInteger(0.5))&lt;br /&gt;
	self:assertFalse(tt.isPositiveInteger(1.5))&lt;br /&gt;
	self:assertFalse(tt.isPositiveInteger(&amp;#039;1&amp;#039;))&lt;br /&gt;
	self:assertFalse(tt.isPositiveInteger(math.huge))&lt;br /&gt;
	self:assertFalse(tt.isPositiveInteger(&amp;#039;foo&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test isNan&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testIsNan()&lt;br /&gt;
	self:assertTrue(tt.isNan(0/0))&lt;br /&gt;
	self:assertTrue(tt.isNan(-(0/0)))&lt;br /&gt;
	self:assertTrue(tt.isNan(math.huge * 0))&lt;br /&gt;
	self:assertTrue(tt.isNan(-math.huge * 0))&lt;br /&gt;
	self:assertTrue(tt.isNan(-1 * math.huge * 0))&lt;br /&gt;
	self:assertFalse(tt.isNan(0))&lt;br /&gt;
	self:assertFalse(tt.isNan(1))&lt;br /&gt;
	self:assertFalse(tt.isNan(6))&lt;br /&gt;
	self:assertFalse(tt.isNan(-100))&lt;br /&gt;
	self:assertFalse(tt.isNan(2^0.5))&lt;br /&gt;
	self:assertFalse(tt.isNan(99999999999999999999999999999999999999999999999))&lt;br /&gt;
	self:assertFalse(tt.isNan(math.pi))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test removeDuplicates&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testRemoveDuplicates()&lt;br /&gt;
	local dupes =     {1, 2, 2, 3, 3, 3, 4, 2, 0/0, 5, -(0/0), 5}&lt;br /&gt;
	-- Dupes removed: {1, 2,    3,       4,    NaN, 5, NaN}&lt;br /&gt;
	local removed = tt.removeDuplicates(dupes)&lt;br /&gt;
	self:assertEquals(7, #removed)&lt;br /&gt;
	self:assertEquals(1, removed[1])&lt;br /&gt;
	self:assertEquals(2, removed[2])&lt;br /&gt;
	self:assertEquals(3, removed[3])&lt;br /&gt;
	self:assertEquals(4, removed[4])&lt;br /&gt;
	self:assertTrue(suite.isNan(removed[5]))&lt;br /&gt;
	self:assertEquals(5, removed[6])&lt;br /&gt;
	self:assertTrue(suite.isNan(removed[7]))&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;removeDuplicates&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;number&amp;#039;, tt.removeDuplicates, 4)&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;removeDuplicates&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;nil&amp;#039;, tt.removeDuplicates)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Sparse array variables&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local sparseArray = {1, nil, 2, nil, 3, nil, [math.huge] = math.huge, foo = &amp;#039;bar&amp;#039;, [1.5] = 1.5, [&amp;#039;4&amp;#039;] = &amp;#039;four_string&amp;#039;}&lt;br /&gt;
local sparseArrayConcatenated = &amp;#039;123&amp;#039;&lt;br /&gt;
local numKeysConcatenated = &amp;#039;135&amp;#039;&lt;br /&gt;
local reverseSparseArrayConcatenated = &amp;#039;321&amp;#039;&lt;br /&gt;
local reverseNumKeysConcatenated = &amp;#039;531&amp;#039;&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test numKeys&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testnumKeys()&lt;br /&gt;
	local numKeys = tt.numKeys(sparseArray)&lt;br /&gt;
    self:assertEquals(numKeysConcatenated, suite.concatIpairs(numKeys))&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;numKeys&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;number&amp;#039;, tt.numKeys, 4)&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;numKeys&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;nil&amp;#039;, tt.numKeys)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test affixNums&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local affixArray = {1, a0 = &amp;#039;a0&amp;#039;, a001 = &amp;#039;a001&amp;#039;, a1 = &amp;#039;a1&amp;#039;, b2 = &amp;#039;b2&amp;#039;, a3 = &amp;#039;a3&amp;#039;, c4d = &amp;#039;c4d&amp;#039;, b5 = &amp;#039;b5&amp;#039;, B6 = &amp;#039;B6&amp;#039;, f7 = &amp;#039;f7&amp;#039;, c8d = &amp;#039;c8d&amp;#039;, a9 = nil, a10 = &amp;#039;a10&amp;#039;, [11] = 11, [&amp;#039;e-f12&amp;#039;] = &amp;#039;e-f12&amp;#039;}&lt;br /&gt;
local aNumsConcatenated = &amp;#039;1310&amp;#039;&lt;br /&gt;
local aValsConcatenated = &amp;#039;a1a3a10&amp;#039;&lt;br /&gt;
local bNumsConcatenated = &amp;#039;25&amp;#039;&lt;br /&gt;
local bValsConcatenated = &amp;#039;b2b5&amp;#039;&lt;br /&gt;
local cdNumsConcatenated = &amp;#039;48&amp;#039;&lt;br /&gt;
local cdValsConcatenated = &amp;#039;c4dc8d&amp;#039;&lt;br /&gt;
local efNumsConcatenated = &amp;#039;12&amp;#039;&lt;br /&gt;
local efValsConcatenated = &amp;#039;e-f12&amp;#039;&lt;br /&gt;
&lt;br /&gt;
function suite.concatAffixVals(t, nums, prefix, suffix)&lt;br /&gt;
	local ret = &amp;#039;&amp;#039;&lt;br /&gt;
	for i, num in ipairs(nums) do&lt;br /&gt;
		local key = (prefix or &amp;#039;&amp;#039;) .. tostring(num) .. (suffix or &amp;#039;&amp;#039;)&lt;br /&gt;
		ret = ret .. tostring(t[key])&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testaffixNums()&lt;br /&gt;
	local aNums = tt.affixNums(affixArray, &amp;#039;a&amp;#039;)&lt;br /&gt;
	local bNums = tt.affixNums(affixArray, &amp;#039;b&amp;#039;)&lt;br /&gt;
	local cdNums = tt.affixNums(affixArray, &amp;#039;c&amp;#039;, &amp;#039;d&amp;#039;)&lt;br /&gt;
	local efNums = tt.affixNums(affixArray, &amp;#039;e-f&amp;#039;) -- &amp;quot;-&amp;quot; is magic, so we need to escape it.&lt;br /&gt;
    self:assertEquals(aNumsConcatenated, suite.concatIpairs(aNums))&lt;br /&gt;
    self:assertEquals(aValsConcatenated, suite.concatAffixVals(affixArray, aNums, &amp;#039;a&amp;#039;))&lt;br /&gt;
    self:assertEquals(bNumsConcatenated, suite.concatIpairs(bNums))&lt;br /&gt;
    self:assertEquals(bValsConcatenated, suite.concatAffixVals(affixArray, bNums, &amp;#039;b&amp;#039;))&lt;br /&gt;
    self:assertEquals(cdNumsConcatenated, suite.concatIpairs(cdNums))&lt;br /&gt;
    self:assertEquals(cdValsConcatenated, suite.concatAffixVals(affixArray, cdNums, &amp;#039;c&amp;#039;, &amp;#039;d&amp;#039;))&lt;br /&gt;
    self:assertEquals(efNumsConcatenated, suite.concatIpairs(efNums))&lt;br /&gt;
    self:assertEquals(efValsConcatenated, suite.concatAffixVals(affixArray, efNums, &amp;#039;e-f&amp;#039;))&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;affixNums&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;number&amp;#039;, tt.affixNums, 4)&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;affixNums&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;nil&amp;#039;, tt.affixNums)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test numData&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testNumData()&lt;br /&gt;
	local t = {1, 2, [5] = 5, foo = &amp;quot;foo&amp;quot;, foo1 = &amp;quot;foo1&amp;quot;, bar1 = &amp;quot;bar1&amp;quot;, foo6 = &amp;quot;foo6&amp;quot;, bar6 = &amp;quot;bar6&amp;quot;}&lt;br /&gt;
	local uncompressed = tt.numData(t)&lt;br /&gt;
	local compressed = tt.numData(t, true)&lt;br /&gt;
&lt;br /&gt;
	-- Test uncompressed.&lt;br /&gt;
	self:assertEquals(1, uncompressed[1][1])&lt;br /&gt;
	self:assertEquals(2, uncompressed[2][1])&lt;br /&gt;
	self:assertEquals(5, uncompressed[5][1])&lt;br /&gt;
	self:assertEquals(&amp;quot;foo&amp;quot;, uncompressed.other.foo)&lt;br /&gt;
	self:assertEquals(&amp;quot;foo1&amp;quot;, uncompressed[1].foo)&lt;br /&gt;
	self:assertEquals(&amp;quot;bar1&amp;quot;, uncompressed[1].bar)&lt;br /&gt;
	self:assertEquals(&amp;quot;foo6&amp;quot;, uncompressed[6].foo)&lt;br /&gt;
	self:assertEquals(&amp;quot;bar6&amp;quot;, uncompressed[6].bar)&lt;br /&gt;
	self:assertEquals(nil, uncompressed[4])&lt;br /&gt;
&lt;br /&gt;
	-- Test compressed.&lt;br /&gt;
	self:assertEquals(1, compressed[1][1])&lt;br /&gt;
	self:assertEquals(2, compressed[2][1])&lt;br /&gt;
	self:assertEquals(5, compressed[3][1])&lt;br /&gt;
	self:assertEquals(&amp;quot;foo&amp;quot;, compressed.other.foo)&lt;br /&gt;
	self:assertEquals(&amp;quot;foo1&amp;quot;, compressed[1].foo)&lt;br /&gt;
	self:assertEquals(&amp;quot;bar1&amp;quot;, compressed[1].bar)&lt;br /&gt;
	self:assertEquals(&amp;quot;foo6&amp;quot;, compressed[4].foo)&lt;br /&gt;
	self:assertEquals(&amp;quot;bar6&amp;quot;, compressed[4].bar)&lt;br /&gt;
	self:assertEquals(nil, compressed[5])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test sparse array functions&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testCompressSparseArray()&lt;br /&gt;
	local compressedArray = tt.compressSparseArray(sparseArray)&lt;br /&gt;
    self:assertEquals(sparseArrayConcatenated, suite.concatIpairs(compressedArray))&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;compressSparseArray&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;number&amp;#039;, tt.compressSparseArray, 4)&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;compressSparseArray&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;nil&amp;#039;, tt.compressSparseArray)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSparseIpairs()&lt;br /&gt;
	local arrayText = &amp;#039;&amp;#039;&lt;br /&gt;
	for i, v in tt.sparseIpairs(sparseArray) do&lt;br /&gt;
		arrayText = arrayText .. tostring(v)&lt;br /&gt;
	end&lt;br /&gt;
	self:assertEquals(sparseArrayConcatenated, arrayText)&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;sparseIpairs&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;number&amp;#039;, tt.sparseIpairs, 4)&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;sparseIpairs&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;nil&amp;#039;, tt.sparseIpairs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test size function&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testSize()&lt;br /&gt;
	self:assertEquals(0, tt.size{})&lt;br /&gt;
	self:assertEquals(3, tt.size{foo = &amp;#039;foo&amp;#039;, bar = &amp;#039;bar&amp;#039;, baz = &amp;#039;baz&amp;#039;})&lt;br /&gt;
	self:assertEquals(1, tt.size{1})&lt;br /&gt;
	self:assertEquals(5, tt.size{foo = &amp;#039;foo&amp;#039;, bar = &amp;#039;bar&amp;#039;, baz = &amp;#039;baz&amp;#039;, 1, 2})&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;size&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;number&amp;#039;, tt.size, 4)&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;size&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;nil&amp;#039;, tt.size)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
-- Test binaryLength function&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testLengthOfEmptyTableIsZero()&lt;br /&gt;
	self:assertEquals(0, tt.length{})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLengthOfArray()&lt;br /&gt;
	local data = {&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;}&lt;br /&gt;
	self:assertEquals(6, tt.length(data))&lt;br /&gt;
	local meta = setmetatable({}, {__index = data})&lt;br /&gt;
	self:assertEquals(6, tt.length(meta))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLengthOfQuasiArrayWithPrefixes()&lt;br /&gt;
	local data = {key1 = &amp;quot;value1&amp;quot;, key2 = &amp;quot;value2&amp;quot;, key3 = &amp;quot;value3&amp;quot;}&lt;br /&gt;
	self:assertEquals(3, tt.length(data, &amp;quot;key&amp;quot;))&lt;br /&gt;
	local meta = setmetatable({}, {__index = data})&lt;br /&gt;
	self:assertEquals(3, tt.length(meta, &amp;quot;key&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLengthChecksForTypeErrors()&lt;br /&gt;
	self:assertTypeErrorEquals(1, &amp;#039;length&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;number&amp;#039;, tt.length, 1)&lt;br /&gt;
	self:assertTypeErrorEquals(2, &amp;#039;length&amp;#039;, &amp;#039;string&amp;#039;, &amp;#039;number&amp;#039;, tt.length, {}, 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return suite&lt;/div&gt;</summary>
		<author><name>Wikipedia&gt;Uzume</name></author>
	</entry>
</feed>