github.com/xmx/lua@v0.0.0-20230324063450-8a298e091302/_lua5.1-tests/locals.lua (about) 1 print('testing local variables plus some extra stuff') 2 3 do 4 local i = 10 5 do local i = 100; assert(i==100) end 6 do local i = 1000; assert(i==1000) end 7 assert(i == 10) 8 if i ~= 10 then 9 local i = 20 10 else 11 local i = 30 12 assert(i == 30) 13 end 14 end 15 16 17 18 f = nil 19 20 local f 21 x = 1 22 23 a = nil 24 loadstring('local a = {}')() 25 assert(type(a) ~= 'table') 26 27 function f (a) 28 local _1, _2, _3, _4, _5 29 local _6, _7, _8, _9, _10 30 local x = 3 31 local b = a 32 local c,d = a,b 33 if (d == b) then 34 local x = 'q' 35 x = b 36 assert(x == 2) 37 else 38 assert(nil) 39 end 40 assert(x == 3) 41 local f = 10 42 end 43 44 local b=10 45 local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3 46 47 48 assert(x == 1) 49 50 f(2) 51 assert(type(f) == 'function') 52 53 54 -- testing globals ;-) 55 do 56 local f = {} 57 local _G = _G 58 for i=1,10 do f[i] = function (x) A=A+1; return A, _G.getfenv(x) end end 59 A=10; assert(f[1]() == 11) 60 for i=1,10 do assert(setfenv(f[i], {A=i}) == f[i]) end 61 assert(f[3]() == 4 and A == 11) 62 local a,b = f[8](1) 63 assert(b.A == 9) 64 a,b = f[8](0) 65 assert(b.A == 11) -- `real' global 66 local g 67 local function f () assert(setfenv(2, {a='10'}) == g) end 68 g = function () f(); _G.assert(_G.getfenv(1).a == '10') end 69 g(); assert(getfenv(g).a == '10') 70 end 71 72 -- test for global table of loaded chunks 73 local function foo (s) 74 return loadstring(s) 75 end 76 77 assert(getfenv(foo("")) == _G) 78 local a = {loadstring = loadstring} 79 setfenv(foo, a) 80 assert(getfenv(foo("")) == _G) 81 setfenv(0, a) -- change global environment 82 assert(getfenv(foo("")) == a) 83 setfenv(0, _G) 84 85 86 -- testing limits for special instructions 87 88 local a 89 local p = 4 90 for i=2,31 do 91 for j=-3,3 do 92 assert(loadstring(string.format([[local a=%s;a=a+ 93 %s; 94 assert(a 95 ==2^%s)]], j, p-j, i))) () 96 assert(loadstring(string.format([[local a=%s; 97 a=a-%s; 98 assert(a==-2^%s)]], -j, p-j, i))) () 99 assert(loadstring(string.format([[local a,b=0,%s; 100 a=b-%s; 101 assert(a==-2^%s)]], -j, p-j, i))) () 102 end 103 p =2*p 104 end 105 106 print'+' 107 108 109 if rawget(_G, "querytab") then 110 -- testing clearing of dead elements from tables 111 collectgarbage("stop") -- stop GC 112 local a = {[{}] = 4, [3] = 0, alo = 1, 113 a1234567890123456789012345678901234567890 = 10} 114 115 local t = querytab(a) 116 117 for k,_ in pairs(a) do a[k] = nil end 118 collectgarbage() -- restore GC and collect dead fiels in `a' 119 for i=0,t-1 do 120 local k = querytab(a, i) 121 assert(k == nil or type(k) == 'number' or k == 'alo') 122 end 123 end 124 125 print('OK') 126 127 return 5,f