1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
--
-- tests/testfx.lua
-- Automated test framework for Premake.
-- Copyright (c) 2008 Jason Perkins and the Premake project
--
--
-- Define a namespace for the testing functions
--
test = { }
--
--
--
-- Assertion functions
--
function test.capture(expected)
local actual = io.endcapture()
local ait = actual:gfind("(.-)" .. io.eol)
local eit = expected:gfind("(.-)\n")
local linenum = 1
local atxt = ait()
local etxt = eit()
while etxt do
if (etxt ~= atxt) then
test.fail("(%d) expected:\n%s\n...but was:\n%s", linenum, etxt, atxt)
end
linenum = linenum + 1
atxt = ait()
etxt = eit()
end
end
function test.contains(value, expected)
if not table.contains(value, expected) then
test.fail("expected value %s not found", expected)
end
end
function test.fail(format, ...)
-- convert nils into something more usefuls
for i = 1, arg.n do
if (arg[i] == nil) then
arg[i] = "(nil)"
elseif (type(arg[i]) == "table") then
arg[i] = "{" .. table.concat(arg[i], ", ") .. "}"
end
end
error(string.format(format, unpack(arg)), 3)
end
function test.filecontains(expected, fn)
local f = io.open(fn)
local actual = f:read("*a")
f:close()
if (expected ~= actual) then
test.fail("expected %s but was %s", expected, actual)
end
end
function test.isequal(expected, actual)
if (type(expected) == "table") then
for k,v in pairs(expected) do
if (expected[k] ~= actual[k]) then
test.fail("expected %s but was %s", expected, actual)
end
end
else
if (expected ~= actual) then
test.fail("expected %s but was %s", expected, actual)
end
end
end
function test.isfalse(value)
if (value) then
test.fail("expected false but was true")
end
end
function test.isnil(value)
if (value ~= nil) then
test.fail("expected nil but was " .. tostring(value))
end
end
function test.istrue(value)
if (not value) then
test.fail("expected true but was false")
end
end
function test.success(fn, ...)
local ok, err = pcall(fn, unpack(arg))
if not ok then
test.fail("call failed: " .. err)
end
end
--
-- Define a collection for the test suites
--
T = { }
--
-- Test execution function
--
function test.runall()
local numpassed = 0
local numfailed = 0
-- HACK: reset the important global state. I'd love to find a
-- way to do this automatically; maybe later.
local function resetglobals()
_ACTION = "test"
_ARGS = { }
_OPTIONS = { }
_SOLUTIONS = { }
end
for suitename,suitetests in pairs(T) do
for testname, testfunc in pairs(suitetests) do
local setup = suitetests.setup
local teardown = suitetests.teardown
local ok = true
resetglobals()
if (setup) then
ok, err = pcall(setup)
end
if (ok) then
ok, err = pcall(testfunc)
end
if (ok and teardown) then
ok, err = pcall(teardown)
end
if (not ok) then
print(string.format("%s.%s: %s", suitename, testname, err))
numfailed = numfailed + 1
else
numpassed = numpassed + 1
end
end
end
return numpassed, numfailed
end
|