@@ -0,0 +1,527 @@
1+-- $Id: testes/attrib.lua $
2+-- See Copyright Notice in file all.lua
4+print "testing require"
6+assert(require"string" == string)
7+assert(require"math" == math)
8+assert(require"table" == table)
9+assert(require"io" == io)
10+assert(require"os" == os)
11+assert(require"coroutine" == coroutine)
13+assert(type(package.path) == "string")
14+assert(type(package.cpath) == "string")
15+assert(type(package.loaded) == "table")
16+assert(type(package.preload) == "table")
18+assert(type(package.config) == "string")
19+print("package config: "..string.gsub(package.config, "\n", "|"))
22+ -- create a path with 'max' templates,
23+ -- each with 1-10 repetitions of '?'
24+ local max = _soft and 100 or 2000
26+ for i = 1,max do t[i] = string.rep("?", i%10 + 1) end
27+ t[#t + 1] = ";" -- empty template
28+ local path = table.concat(t, ";")
29+ -- use that path in a search
30+ local s, err = package.searchpath("xuxu", path)
31+ -- search fails; check that message has an occurrence of
32+ -- '??????????' with ? replaced by xuxu and at least 'max' lines
34+ string.find(err, string.rep("xuxu", 10)) and
35+ #string.gsub(err, "[^\n]", "") >= max)
36+ -- path with one very long template
37+ local path = string.rep("?", max)
38+ local s, err = package.searchpath("xuxu", path)
39+ assert(not s and string.find(err, string.rep('xuxu', max)))
43+ local oldpath = package.path
45+ local s, err = pcall(require, "no-such-file")
46+ assert(not s and string.find(err, "package.path"))
47+ package.path = oldpath
51+do print"testing 'require' message"
52+ local oldpath = package.path
53+ local oldcpath = package.cpath
55+ package.path = "?.lua;?/?"
56+ package.cpath = "?.so;?/init"
58+ local st, msg = pcall(require, 'XXX')
60+ local expected = [[module 'XXX' not found:
61+ no field package.preload['XXX']
67+ assert(msg == expected)
69+ package.path = oldpath
70+ package.cpath = oldcpath
76+-- The next tests for 'require' assume some specific directories and
81+local dirsep = string.match(package.config, "^([^\n]+)\n")
83+-- auxiliary directory with C modules and temporary files
84+local DIR = "libs" .. dirsep
86+-- prepend DIR to a name and correct directory separators
88+ local x = string.gsub(x, "/", dirsep)
92+-- prepend DIR and pospend proper C lib. extension to a name
94+ local ext = (dirsep == '\\') and ".dll" or ".so"
99+local function createfiles (files, preextras, posextras)
100+ for n,c in pairs(files) do
102+ io.write(string.format(preextras, n))
104+ io.write(string.format(posextras, n))
105+ io.close(io.output())
109+local function removefiles (files)
110+ for n in pairs(files) do
116+ ["names.lua"] = "do return {...} end\n",
117+ ["err.lua"] = "B = 15; a = a + 1;",
118+ ["synerr.lua"] = "B =",
120+ ["B.lua"] = "assert(...=='B');require 'A'",
125+ ["C.lua"] = "package.loaded[...] = 25; require'C'",
134+createfiles(files, "", extras)
136+-- testing explicit "dir" separator in 'searchpath'
137+assert(package.searchpath("C.lua", D"?", "", "") == D"C.lua")
138+assert(package.searchpath("C.lua", D"?", ".", ".") == D"C.lua")
139+assert(package.searchpath("--x-", D"?", "-", "X") == D"XXxX")
140+assert(package.searchpath("---xX", D"?", "---", "XX") == D"XXxX")
141+assert(package.searchpath(D"C.lua", "?", dirsep) == D"C.lua")
142+assert(package.searchpath(".\\C.lua", D"?", "\\") == D"./C.lua")
144+local oldpath = package.path
146+package.path = string.gsub("D/?.lua;D/?.lc;D/?;D/??x?;D/L", "D/", DIR)
148+local try = function (p, n, r, ext)
150+ local rr, x = require(p)
152+ assert(REQUIRED == p)
157+local a = require"names"
158+assert(a[1] == "names" and a[2] == D"names.lua")
160+local st, msg = pcall(require, "err")
161+assert(not st and string.find(msg, "arithmetic") and B == 15)
162+st, msg = pcall(require, "synerr")
163+assert(not st and string.find(msg, "error loading module"))
165+assert(package.searchpath("C", package.path) == D"C.lua")
166+assert(require"C" == 25)
167+assert(require"C" == 25)
169+try('B', 'B.lua', true, "libs/B.lua")
170+assert(package.loaded.B)
171+assert(require"B" == true)
172+assert(package.loaded.A)
173+assert(require"C" == 25)
174+package.loaded.A = nil
175+try('B', nil, true, nil) -- should not reload package
176+try('A', 'A.lua', true, "libs/A.lua")
177+package.loaded.A = nil
180+try('A', 'A.lc', AA, "libs/A.lc") -- now must find second option
181+assert(package.searchpath("A", package.path) == D"A.lc")
182+assert(require("A") == AA)
184+try('K', 'L', false, "libs/L") -- default option
185+try('K', 'L', false, "libs/L") -- default option (should reload it)
186+assert(rawget(_G, "_REQUIREDNAME") == nil)
189+try("X", "XXxX", AA, "libs/XXxX")
193+NAME, REQUIRED, AA, B = nil
196+-- testing require of sub-packages
200+package.path = string.gsub("D/?.lua;D/?/init.lua", "D/", DIR)
203+ ["P1/init.lua"] = "AA = 10",
204+ ["P1/xuxu.lua"] = "AA = 20",
207+createfiles(files, "_ENV = {}\n", "\nreturn _ENV\n")
210+local m, ext = assert(require"P1")
211+assert(ext == "libs/P1/init.lua")
212+assert(AA == 0 and m.AA == 10)
213+assert(require"P1" == m)
214+assert(require"P1" == m)
216+assert(package.searchpath("P1.xuxu", package.path) == D"P1/xuxu.lua")
217+m.xuxu, ext = assert(require"P1.xuxu")
218+assert(AA == 0 and m.xuxu.AA == 20)
219+assert(ext == "libs/P1/xuxu.lua")
220+assert(require"P1.xuxu" == m.xuxu)
221+assert(require"P1.xuxu" == m.xuxu)
222+assert(require"P1" == m and m.AA == 10)
229+assert(not pcall(require, "file_does_not_exist"))
230+package.path = "??\0?"
231+assert(not pcall(require, "file_does_not_exist1"))
233+package.path = oldpath
235+-- check 'require' error message
236+local fname = "file_does_not_exist2"
237+local m, err = pcall(require, fname)
238+for t in string.gmatch(package.path..";"..package.cpath, "[^;]+") do
239+ t = string.gsub(t, "?", fname)
240+ assert(string.find(err, t, 1, true))
243+do -- testing 'package.searchers' not being a table
244+ local searchers = package.searchers
245+ package.searchers = 3
246+ local st, msg = pcall(require, 'a')
247+ assert(not st and string.find(msg, "must be a table"))
248+ package.searchers = searchers
251+local function import(...)
254+ for i=1, #f do m[f[i]] = _G[f[i]] end
258+-- cannot change environment of a C function
259+assert(not pcall(module, 'XUXU'))
263+-- testing require of C libraries
266+local p = "" -- On Mac OS X, redefine this to "_"
268+-- check whether loadlib works in this system
269+local st, err, when = package.loadlib(DC"lib1", "*")
271+ local f, err, when = package.loadlib("donotexist", p.."xuxu")
272+ assert(not f and type(err) == "string" and when == "absent")
273+ ;(Message or print)('\n >>> cannot load dynamic library <<<\n')
276+ -- tests for loadlib
277+ local f = assert(package.loadlib(DC"lib1", p.."onefunction"))
278+ local a, b = f(15, 25)
279+ assert(a == 25 and b == 15)
281+ f = assert(package.loadlib(DC"lib1", p.."anotherfunc"))
282+ assert(f(10, 20) == "10%20\n")
284+ -- check error messages
285+ local f, err, when = package.loadlib(DC"lib1", p.."xuxu")
286+ assert(not f and type(err) == "string" and when == "init")
287+ f, err, when = package.loadlib("donotexist", p.."xuxu")
288+ assert(not f and type(err) == "string" and when == "open")
290+ -- symbols from 'lib1' must be visible to other libraries
291+ f = assert(package.loadlib(DC"lib11", p.."luaopen_lib11"))
292+ assert(f() == "exported")
294+ -- test C modules with prefixes in names
295+ package.cpath = DC"?"
296+ local lib2, ext = require"lib2-v2"
297+ assert(string.find(ext, "libs/lib2-v2", 1, true))
298+ -- check correct access to global environment and correct
300+ assert(_ENV.x == "lib2-v2" and _ENV.y == DC"lib2-v2")
301+ assert(lib2.id("x") == true) -- a different "id" implementation
303+ -- test C submodules
304+ local fs, ext = require"lib1.sub"
305+ assert(_ENV.x == "lib1.sub" and _ENV.y == DC"lib1")
306+ assert(string.find(ext, "libs/lib1", 1, true))
307+ assert(fs.id(45) == 45)
308+ _ENV.x, _ENV.y = nil
319+ p.preload.pl = function (...)
321+ function xuxu (x) return x+20 end
325+ local pl, ext = require"pl"
326+ assert(require"pl" == pl)
327+ assert(pl.xuxu(10) == 30)
328+ assert(pl[1] == "pl" and pl[2] == ":preload:" and ext == ":preload:")
331+ assert(type(package.path) == "string")
338+print("testing assignments, logical operators, and constructors")
343+assert(a==1 and b==5)
345+local function f() return 10, 11, 12 end
346+a.x, b, a[1] = 1, 2, f()
347+assert(a.x==1 and b==2 and a[1]==10)
348+a[f()], b, a[f()+3] = f(), a, 'x'
349+assert(a[10] == 10 and b == a and a[13] == 'x')
352+ local f = function (n) local x = {}; for i=1,n do x[i]=i end;
353+ return table.unpack(x) end;
356+ assert(a == 0 and b == 1)
358+ assert(a == 0 and b == 1)
360+ assert(a==0 and b==5 and c==1)
362+ assert(a==0 and b==5 and c==nil)
365+local a, b, c, d = 1 and nil, 1 or nil, (1 and (nil or 1)), 6
366+assert(not a and b and c and d==6)
370+assert(a==10 and b==11 and c==12 and d==nil)
371+a,b = f(), 1, 2, 3, f()
372+assert(a==10 and b==1)
374+assert(a<b == false and a>b == true)
375+assert((10 and 2) == 2)
376+assert((10 or 2) == 10)
377+assert((10 or assert(nil)) == 10)
378+assert(not (nil and assert(nil)))
379+assert((nil or "alo") == "alo")
380+assert((nil and 10) == nil)
381+assert((false and 10) == false)
382+assert((true or 10) == true)
383+assert((false or 10) == 10)
386+assert(not nil == true)
387+assert(not not nil == false)
388+assert(not not 1 == true)
389+assert(not not a == true)
390+assert(not not (6 or nil) == true)
391+assert(not not (nil and 56) == false)
392+assert(not not (nil and true) == false)
393+assert(not 10 == false)
394+assert(not {} == false)
395+assert(not 0.5 == false)
396+assert(not "x" == false)
404+assert(a[1<2] == 20 and a[1>2] == 10)
406+function f(a) return a end
409+for i=3000,-3000,-1 do a[i + 0.0] = i; end
410+a[10e30] = "alo"; a[true] = 10; a[false] = 20
411+assert(a[10e30] == 'alo' and a[not 1] == 20 and a[10<20] == 10)
412+for i=3000,-3000,-1 do assert(a[i] == i); end
416+assert(a[a][a][a][a][print] == assert)
417+a[print](a[a[f]] == a[print])
418+assert(not pcall(function () local a = {}; a[nil] = 10 end))
419+assert(not pcall(function () local a = {[nil] = 10} end))
420+assert(a[nil] == undef)
424+a = {10,9,8,7,6,5,4,3,2; [-3]='a', [f]=print, a='a', b='ab'}
425+a, a.x, a.y = a, a[-3]
426+assert(a[1]==10 and a[-3]==a.a and a[f]==print and a.x=='a' and not a.y)
427+a[1], f(a)[2], b, c = {['alo']=assert}, 10, a[1], a[f], 6, 10, 23, f(a), 2
428+a[1].alo(a[2]==10 and b==10 and c==print)
430+a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 = 10
431+local function foo ()
432+ return a.aVeryLongName012345678901234567890123456789012345678901234567890123456789
434+assert(foo() == 10 and
435+a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 ==
441+ local function foo ()
442+ local _ENV <const> = 11
445+ local st, msg = pcall(foo)
446+ assert(not st and string.find(msg, "number"))
450+-- test of large float/integer indices
452+-- compute maximum integer where all bits fit in a float
453+local maxint = math.maxinteger
455+-- trim (if needed) to fit in a float
456+while maxint ~= (maxint + 0.0) or (maxint - 1) ~= (maxint - 1.0) do
457+ maxint = maxint // 2
460+local maxintF = maxint + 0.0 -- float version
462+assert(maxintF == maxint and math.type(maxintF) == "float" and
465+-- floats and integers must index the same places
466+a[maxintF] = 10; a[maxintF - 1.0] = 11;
467+a[-maxintF] = 12; a[-maxintF + 1.0] = 13;
469+assert(a[maxint] == 10 and a[maxint - 1] == 11 and
470+ a[-maxint] == 12 and a[-maxint + 1] == 13)
475+assert(a[maxintF] == 20 and a[maxintF - 1.0] == 11 and
476+ a[-maxintF] == 22 and a[-maxintF + 1.0] == 13)
481+-- test conflicts in multiple assignment
484+ a = {'a', 'b'}; i=1; j=2; b=a
485+ i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i
486+ assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and
489+ local function foo () -- assigining to upvalues
490+ b, a.x, a = a, 10, 20
493+ assert(a == 20 and b.x == 10)
496+-- repeat test with upvalues
499+ a = {'a', 'b'}; i=1; j=2; b=a
500+ local function foo ()
501+ i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i
504+ assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and
507+ (function (a) t[a], a = 10, 20 end)(1);
512+local function foo ()
516+ a, b = 3, 14 -- local and upvalue have same index
522+assert(a == 3 and b == 14)