Comparison

tests/test.lua @ 7108:bb8a38c68191

tests: Use util.envload to load chunks (fixes #608)
author Kim Alvefur <zash@zash.se>
date Thu, 28 Jan 2016 14:45:44 +0100
parent 7073:31fa6770019c
child 7172:32b74ad54432
comparison
equal deleted inserted replaced
7106:74798480b52e 7108:bb8a38c68191
40 40
41 local _realG = _G; 41 local _realG = _G;
42 42
43 require "util.import" 43 require "util.import"
44 44
45 local envloadfile = require "util.envload".envloadfile;
46
45 local env_mt = { __index = function (t,k) return rawget(_realG, k) or print("WARNING: Attempt to access nil global '"..tostring(k).."'"); end }; 47 local env_mt = { __index = function (t,k) return rawget(_realG, k) or print("WARNING: Attempt to access nil global '"..tostring(k).."'"); end };
46 function testlib_new_env(t) 48 function testlib_new_env(t)
47 return setmetatable(t or {}, env_mt); 49 return setmetatable(t or {}, env_mt);
48 end 50 end
49 51
77 79
78 function dosingletest(testname, fname) 80 function dosingletest(testname, fname)
79 local tests = setmetatable({}, { __index = _realG }); 81 local tests = setmetatable({}, { __index = _realG });
80 tests.__unit = testname; 82 tests.__unit = testname;
81 tests.__test = fname; 83 tests.__test = fname;
82 local chunk, err = loadfile(testname); 84 local chunk, err = envloadfile(testname, tests);
83 if not chunk then 85 if not chunk then
84 print("WARNING: ", "Failed to load tests for "..testname, err); 86 print("WARNING: ", "Failed to load tests for "..testname, err);
85 return; 87 return;
86 end 88 end
87 89
88 setfenv(chunk, tests);
89 local success, err = pcall(chunk); 90 local success, err = pcall(chunk);
90 if not success then 91 if not success then
91 print("WARNING: ", "Failed to initialise tests for "..testname, err); 92 print("WARNING: ", "Failed to initialise tests for "..testname, err);
92 return; 93 return;
93 end 94 end
117 function dotest(unitname) 118 function dotest(unitname)
118 local _fakeG = setmetatable({}, {__index = _realG}); 119 local _fakeG = setmetatable({}, {__index = _realG});
119 _fakeG._G = _fakeG; 120 _fakeG._G = _fakeG;
120 local tests = setmetatable({}, { __index = _fakeG }); 121 local tests = setmetatable({}, { __index = _fakeG });
121 tests.__unit = unitname; 122 tests.__unit = unitname;
122 local chunk, err = loadfile("test_"..unitname:gsub("%.", "_")..".lua"); 123 local chunk, err = envloadfile("test_"..unitname:gsub("%.", "_")..".lua", tests);
123 if not chunk then 124 if not chunk then
124 print("WARNING: ", "Failed to load tests for "..unitname, err); 125 print("WARNING: ", "Failed to load tests for "..unitname, err);
125 return; 126 return;
126 end 127 end
127 128
128 setfenv(chunk, tests);
129 local success, err = pcall(chunk); 129 local success, err = pcall(chunk);
130 if not success then 130 if not success then
131 print("WARNING: ", "Failed to initialise tests for "..unitname, err); 131 print("WARNING: ", "Failed to initialise tests for "..unitname, err);
132 return; 132 return;
133 end 133 end
134 if tests.env then setmetatable(tests.env, { __index = _realG }); end 134 if tests.env then setmetatable(tests.env, { __index = _realG }); end
135 local unit = setmetatable({}, { __index = setmetatable({ _G = tests.env or _fakeG }, { __index = tests.env or _fakeG }) }); 135 local unit = setmetatable({}, { __index = setmetatable({ _G = tests.env or _fakeG }, { __index = tests.env or _fakeG }) });
136 local fn = "../"..unitname:gsub("%.", "/")..".lua"; 136 local fn = "../"..unitname:gsub("%.", "/")..".lua";
137 local chunk, err = loadfile(fn); 137 local chunk, err = envloadfile(fn, unit);
138 if not chunk then 138 if not chunk then
139 print("WARNING: ", "Failed to load module: "..unitname, err); 139 print("WARNING: ", "Failed to load module: "..unitname, err);
140 return; 140 return;
141 end 141 end
142 142
143 local oldmodule, old_M = _fakeG.module, _fakeG._M; 143 local oldmodule, old_M = _fakeG.module, _fakeG._M;
144 _fakeG.module = function () 144 _fakeG.module = function ()
145 setmetatable(unit, nil); 145 setmetatable(unit, nil);
146 unit._M = unit; 146 unit._M = unit;
147 end 147 end
148 setfenv(chunk, unit);
149 local success, ret = pcall(chunk); 148 local success, ret = pcall(chunk);
150 _fakeG.module, _fakeG._M = oldmodule, old_M; 149 _fakeG.module, _fakeG._M = oldmodule, old_M;
151 if not success then 150 if not success then
152 print("WARNING: ", "Failed to initialise module: "..unitname, ret); 151 print("WARNING: ", "Failed to initialise module: "..unitname, ret);
153 return; 152 return;