Module:TableTools/testcases
Appearance
![]() | This is the test cases page for the module Module:TableTools. Results of the test cases. |
-- Unit tests for [[Module:TableTools]]. Click talk page to run tests.
local tt = require('Module:TableTools') -- the module to be tested
local ScribuntoUnit = require('Module:ScribuntoUnit')
local suite = ScribuntoUnit:new()
------------------------------------------------------------------------
-- Sparse array variables
------------------------------------------------------------------------
local sparseArray = {1, nil, 2, nil, 3, nil, [math.huge] = math.huge, foo = 'bar', [1.5] = 1.5, ['4'] = 'four_string'}
local sparseArrayConcatenated = '123'
local numKeysConcatenated = '135'
------------------------------------------------------------------------
-- Helper functions
------------------------------------------------------------------------
function suite.concatIpairs(t)
local ret = ''
for i, v in ipairs(t) do
ret = ret .. tostring(v)
end
return ret
end
function suite.isNan(v)
if type(v) == 'number' and tostring(v) == '-nan' then
return true
else
return false
end
end
function suite.arraysHaveSameValues(t1, t2)
-- Checks whether two arrays contain the same values, not necessarily in the same order.
-- Returns true if so, and false if not. Values that occur more than once will cause
-- unexpected behaviour.
if #t1 ~= #t2 then
return false
end
for i1, v1 in ipairs(t1) do
local isMatch = false
for i2, v2 in ipairs(t2) do
if v1 == v2 or suite.isNan(v1) and suite.isNan(v2) then
isMatch = true
end
end
if not isMatch then
return false
end
end
return true
end
------------------------------------------------------------------------
-- Test isPositiveInteger
------------------------------------------------------------------------
function suite:testIsPositiveInteger()
self:assertTrue(tt.isPositiveInteger(1))
self:assertTrue(tt.isPositiveInteger(2))
self:assertTrue(tt.isPositiveInteger(2323874623))
self:assertFalse(tt.isPositiveInteger(0))
self:assertFalse(tt.isPositiveInteger(-1))
self:assertFalse(tt.isPositiveInteger(0.5))
self:assertFalse(tt.isPositiveInteger(1.5))
self:assertFalse(tt.isPositiveInteger('1'))
self:assertFalse(tt.isPositiveInteger(math.huge))
self:assertFalse(tt.isPositiveInteger('foo'))
end
------------------------------------------------------------------------
-- Union and intersection variables
------------------------------------------------------------------------
local nums1 = {1, 3, 4, 5, foo = 7}
local nums2 = {2, bar = 3, 5, 6}
local nums3 = {2, 3, 5, 8}
local numsUnion = {1, 2, 3, 4, 5, 6, 7, 8}
local numsIntersection = {3, 5}
local strings1 = {'foo', 'bar', 'baz'}
local strings2 = {'eggs', 'sausage', 'spam', 'bar', 'baz'}
local stringsUnion = {'foo', 'eggs', 'sausage', 'spam', 'bar', 'baz'}
local stringsIntersection = {'bar', 'baz'}
local mixed1 = {1, 3, 4, 5, foo = 7, 'foo', 'bar', 'baz'}
local mixed2 = {2, bar = 3, 5, 6, 'eggs', 'sausage', 'spam', 'bar', 'baz'}
local mixedUnion = {1, 2, 3, 4, 5, 6, 7, 'foo', 'bar', 'baz', 'eggs', 'sausage', 'spam'}
local mixedIntersection = {3, 5, 'bar', 'baz'}
local nans1 = {1, 3, 0/0, 2}
local nans2 = {5, 2, 3, 0/0, 6}
local nansUnion = {1, 2, 3, 5, 6, 0/0}
local nansIntersection = {2, 3, 0/0}
------------------------------------------------------------------------
-- Test union
------------------------------------------------------------------------
function suite:testunion()
local numsUnionResult = tt.union(nums1, nums2, nums3)
self:assertTrue(suite.arraysHaveSameValues(numsUnion, numsUnionResult))
local stringsUnionResult = tt.union(strings1, strings2)
self:assertTrue(suite.arraysHaveSameValues(stringsUnion, stringsUnionResult))
local mixedUnionResult = tt.union(mixed1, mixed2)
self:assertTrue(suite.arraysHaveSameValues(mixedUnion, mixedUnionResult))
local nansUnionResult = tt.union(nans1, nans2)
self:assertTrue(suite.arraysHaveSameValues(nansUnion, nansUnionResult))
end
------------------------------------------------------------------------
-- Test intersection
------------------------------------------------------------------------
function suite:testintersection()
local numsIntersectionResult = tt.intersection(nums1, nums2, nums3)
self:assertTrue(suite.arraysHaveSameValues(numsIntersection, numsIntersectionResult))
local stringsIntersectionResult = tt.intersection(strings1, strings2)
self:assertTrue(suite.arraysHaveSameValues(stringsIntersection, stringsIntersectionResult))
local mixedIntersectionResult = tt.intersection(mixed1, mixed2)
self:assertTrue(suite.arraysHaveSameValues(mixedIntersection, mixedIntersectionResult))
local nansIntersectionResult = tt.intersection(nans1, nans2)
self:assertTrue(suite.arraysHaveSameValues(nansIntersection, nansIntersectionResult))
end
------------------------------------------------------------------------
-- Test numKeys
------------------------------------------------------------------------
function suite:testnumKeys()
local numKeys = tt.numKeys(sparseArray)
self:assertEquals(numKeysConcatenated, suite.concatIpairs(numKeys))
end
------------------------------------------------------------------------
-- Test affixNums
------------------------------------------------------------------------
local affixArray = {1, a0 = 'a0', a001 = 'a001', a1 = 'a1', b2 = 'b2', a3 = 'a3', c4d = 'c4d', b5 = 'b5', B6 = 'B6', f7 = 'f7', c8d = 'c8d', a9 = nil, a10 = 'a10', [11] = 11}
local aNumsConcatenated = '1310'
local aValsConcatenated = 'a1a3a10'
local bNumsConcatenated = '25'
local bValsConcatenated = 'b2b5'
local cdNumsConcatenated = '48'
local cdValsConcatenated = 'c4dc8d'
function suite.concatAffixVals(t, nums, prefix, suffix)
local ret = ''
for i, num in ipairs(nums) do
local key = (prefix or '') .. tostring(num) .. (suffix or '')
ret = ret .. tostring(t[key])
end
return ret
end
function suite:testaffixNums()
local aNums = tt.affixNums(affixArray, 'a')
local bNums = tt.affixNums(affixArray, 'b')
local cdNums = tt.affixNums(affixArray, 'c', 'd')
self:assertEquals(aNumsConcatenated, suite.concatIpairs(aNums))
self:assertEquals(aValsConcatenated, suite.concatAffixVals(affixArray, aNums, 'a'))
self:assertEquals(bNumsConcatenated, suite.concatIpairs(bNums))
self:assertEquals(bValsConcatenated, suite.concatAffixVals(affixArray, bNums, 'b'))
self:assertEquals(cdNumsConcatenated, suite.concatIpairs(cdNums))
self:assertEquals(cdValsConcatenated, suite.concatAffixVals(affixArray, cdNums, 'c', 'd'))
end
------------------------------------------------------------------------
-- Test sparse array functions
------------------------------------------------------------------------
function suite:testCompressSparseArray()
local compressedArray = tt.compressSparseArray(sparseArray)
self:assertEquals(sparseArrayConcatenated, suite.concatIpairs(compressedArray))
end
function suite:testSparseIpairs()
local arrayText = ''
for i, v in tt.sparseIpairs(sparseArray) do
arrayText = arrayText .. tostring(v)
end
self:assertEquals(sparseArrayConcatenated, arrayText)
end
return suite