Jump to content

Module:Repr/testcases: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
add test for the functionRepr function
use invocationRepr instead of functionRepr to make it clearer what the function is representing
Line 415: Line 415:


--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- functionRepr tests
-- invocationRepr tests
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------


local functionReprTestData = {
local invocationReprTestData = {
{
{
testName = "testFunctionRepr_nameOnly",
testName = "testInvocationRepr_nameOnly",
args = {
args = {
funcName = "foo.bar",
funcName = "foo.bar",
Line 430: Line 430:
}
}


for _, testData in ipairs(functionReprTestData) do
for _, testData in ipairs(invocationReprTestData) do
suite[testData.testName] = function(self)
suite[testData.testName] = function(self)
local result = mRepr.functionRepr(testData.args)
local result = mRepr.invocationRepr(testData.args)
self:assertEquals(testData.expected, result)
self:assertEquals(testData.expected, result)
end
end

Revision as of 04:13, 23 February 2021

-- Load necessary modules
local mRepr = require('Module:Repr')
local ScribuntoUnit = require('Module:ScribuntoUnit')

-- Initialise test suite
local suite = ScribuntoUnit:new()

--------------------------------------------------------------------------------
-- isLuaIdentifier tests
--------------------------------------------------------------------------------

local isLuaIdentifierTestData = {
	{
		testName = "testIsLuaIdentifier_containingLowerCaseCharacters_isTrue",
		value = "foo",
		expected = true,
	},
	{
		testName = "testIsLuaIdentifier_containingUpperCaseCharacters_isTrue",
		value = "FOO",
		expected = true,
	},
	{
		testName = "testIsLuaIdentifier_containingDigitsAfterFirstPosition_isTrue",
		value = "test1",
		expected = true,
	},
	{
		testName = "testIsLuaIdentifier_containingUnderscores_isTrue",
		value = "foo_bar",
		expected = true,
	},
	{
		testName = "testIsLuaIdentifier_nonString_isFalse",
		value = 6,
		expected = false,
	},
	{
		testName = "testIsLuaIdentifier_emptyString_isFalse",
		value = "",
		expected = false,
	},
	{
		testName = "testIsLuaIdentifier_startingWithNumber_isFalse",
		value = "1foo",
		expected = false,
	},
	{
		testName = "testIsLuaIdentifier_containingMultibyteCharacter_isFalse",
		value = "föo",
		expected = false,
	},
	{
		testName = "testIsLuaIdentifier_containingPeriod_isFalse",
		value = "a1.2",
		expected = false,
	},
	{
		testName = "testIsLuaIdentifier_containingHyphen_isFalse",
		value = "foo-bar",
		expected = false,
	},
}

for _, testData in ipairs(isLuaIdentifierTestData) do
	suite[testData.testName] = function(self)
		local result = mRepr.isLuaIdentifier(testData.value)
		self:assertEquals(testData.expected, result)
	end
end

local luaKeywords = {
	"and",
	"break",
	"do",
	"else",
	"elseif",
	"end",
	"false",
	"for",
	"function",
	"if",
	"in",
	"local",
	"nil",
	"not",
	"or",
	"repeat",
	"return",
	"then",
	"true",
	"until",
	"while",
}

for _, keyword in ipairs(luaKeywords) do
	suite["testIsLuaIdentifier_keyword_" .. keyword .. '_isFalse'] = function(self)
		self:assertFalse(mRepr.isLuaIdentifier(keyword))
	end
end

--------------------------------------------------------------------------------
-- repr tests
--------------------------------------------------------------------------------

local TABLE_WITH_IDENTIFIER_KEYS = {e = "eee", c = "ccc", a = "aaa", d = "ddd", b = "bbb"}
local TABLE_WITH_IDENTIFIER_KEYS_SORTED_REPR = '{a = "aaa", b = "bbb", c = "ccc", d = "ddd", e = "eee"}'

local CYCLIC_SEQUENCE = {1, 2, 3}
table.insert(CYCLIC_SEQUENCE, CYCLIC_SEQUENCE)
local CYCLIC_SEQUENCE_REPR = '{1, 2, 3, {CYCLIC}}'

local CYCLIC_TABLE = {a = "aaa"}
CYCLIC_TABLE.b= CYCLIC_TABLE
local CYCLIC_TABLE_REPR = '{a = "aaa", b = {CYCLIC}}'

local CYCLIC_TABLE_PAIR = {a = "aaa", b = {c = "ccc"}}
CYCLIC_TABLE_PAIR.b.d = CYCLIC_TABLE_PAIR
local CYCLIC_TABLE_PAIR_REPR = '{a = "aaa", b = {c = "ccc", d = {CYCLIC}}}'

local SUBTABLE = {foo = "bar"}
local TABLE_WITH_SHARED_SUBTABLES = {a = SUBTABLE, b = SUBTABLE}
local TABLE_WITH_SHARED_SUBTABLES_REPR = '{a = {foo = "bar"}, b = {foo = "bar"}}'

local TOSTRING_METAMETHOD_TABLE_REPR = '<my table>'
local TOSTRING_METATABLE = 	{
	__tostring = function (t)
		return TOSTRING_METAMETHOD_TABLE_REPR
	end	
}
local TOSTRING_METAMETHOD_TABLE = setmetatable({}, TOSTRING_METATABLE)
local TOSTRING_METATABLE_REPR = '{__tostring = <function>}'

local NESTED_TABLE = {a = "aaa", b = {c = "ccc"}}

local reprTestData = {
	{
		testName = "testRepr_nil",
		args = {nil, {}},
		expected = 'nil',
	},
	{
		testName = "testRepr_true",
		args = {true, {}},
		expected = 'true',
	},
	{
		testName = "testRepr_false",
		args = {false, {}},
		expected = 'false',
	},
	{
		testName = "testRepr_integer",
		args = {7, {}},
		expected = '7',
	},
	{
		testName = "testRepr_float",
		args = {3.14159, {}},
		expected = '3.14159',
	},
	{
		testName = "testRepr_largeInt",
		args = {12345678901234567890, {}},
		expected = '1.2345678901235e+19',
	},
	{
		testName = "testRepr_positiveInfinity",
		args = {math.huge, {}},
		expected = 'math.huge',
	},
	{
		testName = "testRepr_negativeInfinity",
		args = {-math.huge, {}},
		expected = '-math.huge',
	},
	{
		testName = "testRepr_NaN",
		args = {0/0, {}},
		expected = '-nan',
	},
	{
		testName = "testRepr_emptyString",
		args = {"", {}},
		expected = '""',
	},
	{
		testName = "testRepr_normalString",
		args = {"foo", {}},
		expected = '"foo"',
	},
	{
		testName = "testRepr_stringWithQuotes",
		args = {'"foo"', {}},
		expected = '"\\"foo\\""',
	},
	{
		testName = "testRepr_stringWithNewline",
		args = {'foo\nbar', {}},
		expected = '"foo\\nbar"',
	},
	{
		testName = "testRepr_emptyTable",
		args = {{}, {}},
		expected = '{}',
	},
	{
		testName = "testRepr_sequenceWithSimpleValues",
		args = {{1, "foo", true}, {}},
		expected = '{1, "foo", true}',
	},
	{
		testName = "testRepr_sequenceWithSimpleValues",
		args = {{1, "foo", true}, {}},
		expected = '{1, "foo", true}',
	},
	{
		testName = "testRepr_sparseSequence",
		args = {{1, nil, 3, nil, 5}, {}},
		expected = '{1, nil, 3, nil, 5}',
	},
	{
		testName = "testRepr_tableWithZeroKey",
		args = {{[0] = 0}, {}},
		expected = '{[0] = 0}',
	},
	{
		testName = "testRepr_tableWithNegativeIntegerKey",
		args = {{[-1] = -1}, {}},
		expected = '{[-1] = -1}',
	},
	{
		testName = "testRepr_tableWithFloatKeys",
		args = {{[3.14159] = "pi"}, {}},
		expected = '{[3.14159] = "pi"}',
	},
	{
		testName = "testRepr_tableWithHugeKey",
		args = {{[math.huge] = "huge"}, {}},
		expected = '{[math.huge] = "huge"}',
	},
	{
		testName = "testRepr_tableWithEmptyStringKey",
		args = {{[""] = "empty"}, {}},
		expected = '{[""] = "empty"}',
	},
	{
		testName = "testRepr_tableWithIdentifierKeys",
		args = {{a = "b", c = "d"}, {}},
		expected = '{a = "b", c = "d"}',
	},
	{
		testName = "testRepr_tableWithStringKeysStartingWithNumbers",
		args = {{["1foo"] = "foo", ["2bar"] = "bar"}, {}},
		expected = '{["1foo"] = "foo", ["2bar"] = "bar"}',
	},
	{
		testName = "testRepr_tableWithStringKeysContainingMultibyteCharacters",
		args = {{["föo"] = "bâr"}, {}},
		expected = '{["föo"] = "bâr"}',
	},
	{
		testName = "testRepr_tableWithLuaKeywordKey",
		args = {{["break"] = "break"}, {}},
		expected = '{["break"] = "break"}',
	},
	{
		testName = "testRepr_tableWithBooleanKey",
		args = {{[true] = "the truth"}, {}},
		expected = '{[true] = "the truth"}',
	},
	{
		testName = "testRepr_tableWithEmptyTableKey",
		args = {{[{}] = "a table"}, {}},
		expected = '{[{}] = "a table"}',
	},
	{
		testName = "testRepr_nestedSequence",
		args = {{1, 2, {3, 4, {5}}}, {}},
		expected = '{1, 2, {3, 4, {5}}}',
	},
	{
		testName = "testRepr_nestedTableWithIdentifierKeys",
		args = {{a = {b = {c = "d"}}}, {}},
		expected = '{a = {b = {c = "d"}}}',
	},
	{
		testName = "testRepr_tableWithNestedTableKey",
		args = {{[{a = {b = "b"}}] = "value"}, {}},
		expected = '{[{a = {b = "b"}}] = "value"}',
	},
	{
		testName = "testRepr_sequenceKey",
		args = {{[{1, 2, 3}] = 6}, {}},
		expected = '{[{1, 2, 3}] = 6}',
	},
	{
		testName = "testRepr_cyclicSequence",
		args = {CYCLIC_SEQUENCE, {}},
		expected = CYCLIC_SEQUENCE_REPR,
	},
	{
		testName = "testRepr_cyclicTable",
		args = {CYCLIC_TABLE, {}},
		expected = CYCLIC_TABLE_REPR,
	},
	{
		testName = "testRepr_cyclicTablePair",
		args = {CYCLIC_TABLE_PAIR, {}},
		expected = CYCLIC_TABLE_PAIR_REPR,
	},
	{
		testName = "testRepr_tableWithSharedSubtables",
		args = {TABLE_WITH_SHARED_SUBTABLES, {}},
		expected = TABLE_WITH_SHARED_SUBTABLES_REPR,
	},
	{
		testName = "testRepr_tableWithToStringMethod",
		args = {TOSTRING_METATABLE, {}},
		expected = TOSTRING_METATABLE_REPR,
	},
	{
		testName = "testRepr_tableWithToStringMetamethod",
		args = {TOSTRING_METAMETHOD_TABLE, {}},
		expected = TOSTRING_METAMETHOD_TABLE_REPR,
	},
	{
		testName = "testRepr_function",
		args = {function () end, {}},
		expected = '<function>',
	},
	{
		testName = "testRepr_tableKeySorting_withExplicitSetting",
		args = {TABLE_WITH_IDENTIFIER_KEYS, {sortKeys=true}},
		expected = TABLE_WITH_IDENTIFIER_KEYS_SORTED_REPR,
	},
	{
		testName = "testRepr_tableKeySorting_withDefaultSetting",
		args = {TABLE_WITH_IDENTIFIER_KEYS},
		expected = TABLE_WITH_IDENTIFIER_KEYS_SORTED_REPR,
	},
	{
		testName = "testRepr_tableKeySorting_withInheritedSetting",
		args = {TABLE_WITH_IDENTIFIER_KEYS, {}},
		expected = TABLE_WITH_IDENTIFIER_KEYS_SORTED_REPR,
	},
	{
		testName = "testRepr_prettyPrint_withDefaultSettings",
		args = {NESTED_TABLE, {pretty = true}},
		expected = [[
{
	a = "aaa",
	b = {
		c = "ccc"
	}
}]],
	},
	{
		testName = "testRepr_prettyPrint_withDefaultSpaces",
		args = {NESTED_TABLE, {pretty = true, tabs = false}},
		expected = [[
{
    a = "aaa",
    b = {
        c = "ccc"
    }
}]],
	},
	{
		testName = "testRepr_prettyPrint_withTwoSpaces",
		args = {NESTED_TABLE, {pretty = true, spaces = 2, tabs = false}},
		expected = [[
{
  a = "aaa",
  b = {
    c = "ccc"
  }
}]],
	},
	{
		testName = "testRepr_prettyPrint_withSemicolons",
		args = {NESTED_TABLE, {pretty = true, semicolons = true}},
		expected = [[
{
	a = "aaa";
	b = {
		c = "ccc"
	}
}]],
	},
	{
		testName = "testRepr_prettyPrint_withNestedTableKey",
		args = {{[{a = "aaa", b = "bbb"}] = "ccc"}, {pretty = true}},
		expected = [[
{
	[{
		a = "aaa",
		b = "bbb"
	}] = "ccc"
}]],
	},
	{
		testName = "testRepr_nestedTable_withSemicolons",
		args = {NESTED_TABLE, {semicolons = true}},
		expected = '{a = "aaa"; b = {c = "ccc"}}',
	},
}

for _, testData in ipairs(reprTestData) do
	suite[testData.testName] = function(self)
		local result = mRepr.repr(unpack(testData.args))
		self:assertEquals(testData.expected, result)
	end
end

--------------------------------------------------------------------------------
-- invocationRepr tests
--------------------------------------------------------------------------------

local invocationReprTestData = {
	{
		testName = "testInvocationRepr_nameOnly",
		args = {
			funcName = "foo.bar",
			args = {},
			options = {},
		},
		expected = "foo.bar()",
	}
}

for _, testData in ipairs(invocationReprTestData) do
	suite[testData.testName] = function(self)
		local result = mRepr.invocationRepr(testData.args)
		self:assertEquals(testData.expected, result)
	end
end


return suite