aboutsummaryrefslogtreecommitdiff
path: root/testes/api.lua
diff options
context:
space:
mode:
Diffstat (limited to 'testes/api.lua')
-rw-r--r--testes/api.lua243
1 files changed, 0 insertions, 243 deletions
diff --git a/testes/api.lua b/testes/api.lua
index 21f703fd..ee2de98b 100644
--- a/testes/api.lua
+++ b/testes/api.lua
@@ -11,9 +11,6 @@ local debug = require "debug"
11local pack = table.pack 11local pack = table.pack
12 12
13 13
14-- standard error message for memory errors
15local MEMERRMSG = "not enough memory"
16
17local function tcheck (t1, t2) 14local function tcheck (t1, t2)
18 assert(t1.n == (t2.n or #t2) + 1) 15 assert(t1.n == (t2.n or #t2) + 1)
19 for i = 2, t1.n do assert(t1[i] == t2[i - 1]) end 16 for i = 2, t1.n do assert(t1[i] == t2[i - 1]) end
@@ -432,11 +429,6 @@ do
432 "bad argument #4 (string expected, got no value)") 429 "bad argument #4 (string expected, got no value)")
433 430
434 431
435 -- memory error
436 T.totalmem(T.totalmem()+10000) -- set low memory limit (+10k)
437 assert(T.checkpanic("newuserdata 20000") == MEMERRMSG)
438 T.totalmem(0) -- restore high limit
439
440 -- memory error + thread status 432 -- memory error + thread status
441 local x = T.checkpanic( 433 local x = T.checkpanic(
442 [[ alloccount 0 # force a memory error in next line 434 [[ alloccount 0 # force a memory error in next line
@@ -1306,241 +1298,6 @@ do
1306end 1298end
1307 1299
1308 1300
1309--[[
1310** {==================================================================
1311** Testing memory limits
1312** ===================================================================
1313--]]
1314
1315print("memory-allocation errors")
1316
1317checkerr("block too big", T.newuserdata, math.maxinteger)
1318collectgarbage()
1319local f = load"local a={}; for i=1,100000 do a[i]=i end"
1320T.alloccount(10)
1321checkerr(MEMERRMSG, f)
1322T.alloccount() -- remove limit
1323
1324
1325-- test memory errors; increase limit for maximum memory by steps,
1326-- o that we get memory errors in all allocations of a given
1327-- task, until there is enough memory to complete the task without
1328-- errors.
1329local function testbytes (s, f)
1330 collectgarbage()
1331 local M = T.totalmem()
1332 local oldM = M
1333 local a,b = nil
1334 while true do
1335 collectgarbage(); collectgarbage()
1336 T.totalmem(M)
1337 a, b = T.testC("pcall 0 1 0; pushstatus; return 2", f)
1338 T.totalmem(0) -- remove limit
1339 if a and b == "OK" then break end -- stop when no more errors
1340 if b ~= "OK" and b ~= MEMERRMSG then -- not a memory error?
1341 error(a, 0) -- propagate it
1342 end
1343 M = M + 7 -- increase memory limit
1344 end
1345 print(string.format("minimum memory for %s: %d bytes", s, M - oldM))
1346 return a
1347end
1348
1349-- test memory errors; increase limit for number of allocations one
1350-- by one, so that we get memory errors in all allocations of a given
1351-- task, until there is enough allocations to complete the task without
1352-- errors.
1353
1354local function testalloc (s, f)
1355 collectgarbage()
1356 local M = 0
1357 local a,b = nil
1358 while true do
1359 collectgarbage(); collectgarbage()
1360 T.alloccount(M)
1361 a, b = T.testC("pcall 0 1 0; pushstatus; return 2", f)
1362 T.alloccount() -- remove limit
1363 if a and b == "OK" then break end -- stop when no more errors
1364 if b ~= "OK" and b ~= MEMERRMSG then -- not a memory error?
1365 error(a, 0) -- propagate it
1366 end
1367 M = M + 1 -- increase allocation limit
1368 end
1369 print(string.format("minimum allocations for %s: %d allocations", s, M))
1370 return a
1371end
1372
1373
1374local function testamem (s, f)
1375 testalloc(s, f)
1376 return testbytes(s, f)
1377end
1378
1379
1380-- doing nothing
1381b = testamem("doing nothing", function () return 10 end)
1382assert(b == 10)
1383
1384-- testing memory errors when creating a new state
1385
1386testamem("state creation", function ()
1387 local st = T.newstate()
1388 if st then T.closestate(st) end -- close new state
1389 return st
1390end)
1391
1392testamem("empty-table creation", function ()
1393 return {}
1394end)
1395
1396testamem("string creation", function ()
1397 return "XXX" .. "YYY"
1398end)
1399
1400testamem("coroutine creation", function()
1401 return coroutine.create(print)
1402end)
1403
1404
1405-- testing to-be-closed variables
1406testamem("to-be-closed variables", function()
1407 local flag
1408 do
1409 local x <close> =
1410 setmetatable({}, {__close = function () flag = true end})
1411 flag = false
1412 local x = {}
1413 end
1414 return flag
1415end)
1416
1417
1418-- testing threads
1419
1420-- get main thread from registry
1421local mt = T.testC("rawgeti R !M; return 1")
1422assert(type(mt) == "thread" and coroutine.running() == mt)
1423
1424
1425
1426local function expand (n,s)
1427 if n==0 then return "" end
1428 local e = string.rep("=", n)
1429 return string.format("T.doonnewstack([%s[ %s;\n collectgarbage(); %s]%s])\n",
1430 e, s, expand(n-1,s), e)
1431end
1432
1433G=0; collectgarbage(); a =collectgarbage("count")
1434load(expand(20,"G=G+1"))()
1435assert(G==20); collectgarbage(); -- assert(gcinfo() <= a+1)
1436G = nil
1437
1438testamem("running code on new thread", function ()
1439 return T.doonnewstack("local x=1") == 0 -- try to create thread
1440end)
1441
1442
1443-- testing memory x compiler
1444
1445testamem("loadstring", function ()
1446 return load("x=1") -- try to do load a string
1447end)
1448
1449
1450local testprog = [[
1451local function foo () return end
1452local t = {"x"}
1453AA = "aaa"
1454for i = 1, #t do AA = AA .. t[i] end
1455return true
1456]]
1457
1458-- testing memory x dofile
1459_G.AA = nil
1460local t =os.tmpname()
1461local f = assert(io.open(t, "w"))
1462f:write(testprog)
1463f:close()
1464testamem("dofile", function ()
1465 local a = loadfile(t)
1466 return a and a()
1467end)
1468assert(os.remove(t))
1469assert(_G.AA == "aaax")
1470
1471
1472-- other generic tests
1473
1474testamem("gsub", function ()
1475 local a, b = string.gsub("alo alo", "(a)", function (x) return x..'b' end)
1476 return (a == 'ablo ablo')
1477end)
1478
1479testamem("dump/undump", function ()
1480 local a = load(testprog)
1481 local b = a and string.dump(a)
1482 a = b and load(b)
1483 return a and a()
1484end)
1485
1486_G.AA = nil
1487
1488local t = os.tmpname()
1489testamem("file creation", function ()
1490 local f = assert(io.open(t, 'w'))
1491 assert (not io.open"nomenaoexistente")
1492 io.close(f);
1493 return not loadfile'nomenaoexistente'
1494end)
1495assert(os.remove(t))
1496
1497testamem("table creation", function ()
1498 local a, lim = {}, 10
1499 for i=1,lim do a[i] = i; a[i..'a'] = {} end
1500 return (type(a[lim..'a']) == 'table' and a[lim] == lim)
1501end)
1502
1503testamem("constructors", function ()
1504 local a = {10, 20, 30, 40, 50; a=1, b=2, c=3, d=4, e=5}
1505 return (type(a) == 'table' and a.e == 5)
1506end)
1507
1508local a = 1
1509local close = nil
1510testamem("closure creation", function ()
1511 function close (b)
1512 return function (x) return b + x end
1513 end
1514 return (close(2)(4) == 6)
1515end)
1516
1517testamem("using coroutines", function ()
1518 local a = coroutine.wrap(function ()
1519 coroutine.yield(string.rep("a", 10))
1520 return {}
1521 end)
1522 assert(string.len(a()) == 10)
1523 return a()
1524end)
1525
1526do -- auxiliary buffer
1527 local lim = 100
1528 local a = {}; for i = 1, lim do a[i] = "01234567890123456789" end
1529 testamem("auxiliary buffer", function ()
1530 return (#table.concat(a, ",") == 20*lim + lim - 1)
1531 end)
1532end
1533
1534testamem("growing stack", function ()
1535 local function foo (n)
1536 if n == 0 then return 1 else return 1 + foo(n - 1) end
1537 end
1538 return foo(100)
1539end)
1540
1541-- }==================================================================
1542
1543
1544do -- testing failing in 'lua_checkstack' 1301do -- testing failing in 'lua_checkstack'
1545 local res = T.testC([[rawcheckstack 500000; return 1]]) 1302 local res = T.testC([[rawcheckstack 500000; return 1]])
1546 assert(res == false) 1303 assert(res == false)