2 # Copyright (C) 2006-2008, The Perl Foundation.
7 t/table.t - Lua Table Library
11 % perl -I../lib -Ilua/t lua/t/table.t
15 Tests Lua Table Library
16 (implemented in F<languages/lua/lib/luatable.pir>).
18 See "Lua 5.1 Reference Manual", section 5.5 "Table Manipulation",
19 L<http://www.lua.org/manual/5.1/manual.html#5.5>.
21 See "Programming in Lua", section 19 "The Table Library".
28 use lib "$FindBin::Bin";
30 use Parrot::Test tests => 18;
32 use Parrot::Test::Lua;
34 my $test_prog = Parrot::Test::Lua::get_test_prog();
36 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function concat' );
37 t = {"a","b","c","d","e"}
38 print(table.concat(t))
39 print(table.concat(t,","))
40 print(table.concat(t,",",2))
41 print(table.concat(t,",",2,4))
42 print(table.concat(t,",",4,2))
51 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function concat (number)' );
52 t = {"a","b",3,"d","e"}
53 print(table.concat(t,","))
58 language_output_like( 'lua', << 'CODE', << 'OUTPUT', 'function concat (out of range)' );
59 t = {"a","b","c","d","e"}
60 print(table.concat(t,",",2,7))
62 /^[^:]+: [^:]+:\d+: bad argument #1 to 'concat' \(table contains non-strings\)\nstack traceback:\n/
65 language_output_like( 'lua', << 'CODE', << 'OUTPUT', 'function concat (non-string)' );
66 t = {"a","b",true,"d","e"}
67 print(table.concat(t,","))
69 /^[^:]+: [^:]+:\d+: bad argument #1 to 'concat' \(table contains non-strings\)\nstack traceback:\n/
72 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function foreach (array)' );
74 table.foreach(t, print)
81 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function foreach (hash)' );
83 table.foreach(t, print)
89 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function foreachi' );
91 table.foreachi(t, print)
98 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function getn' );
99 print(table.getn{10,2,4})
100 print(table.getn{10,2,nil})
106 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function insert' );
108 table.insert(a, 1, 15)
109 print(table.concat(a,","))
112 print(table.concat(t,","))
114 print(table.concat(t,","))
115 table.insert(t, 1, "c")
116 print(table.concat(t,","))
117 table.insert(t, 2, "d")
118 print(table.concat(t,","))
119 table.insert(t, 7, "e")
121 table.insert(t, -9, "f")
133 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function maxn' );
147 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function maxn' );
155 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function remove' );
159 t = {"a","b","c","d","e"}
162 print(table.concat(t,",")) -- a,b,c,d
163 a = table.remove(t,3)
165 print(table.concat(t,",")) -- a,b,d
166 a = table.remove(t,1)
168 print(table.concat(t,",")) -- b,d
169 a = table.remove(t,7)
171 print(table.concat(t,",")) -- b,d
184 language_output_like( 'lua', << 'CODE', << 'OUTPUT', 'function setn' );
188 /^[^:]+: [^:]+:\d+: 'setn' is obsolete\nstack traceback:\n/
191 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function sort' );
199 for n in pairs(lines) do a[#a + 1] = n end
201 for i,n in ipairs(a) do print(n) end
208 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function sort' );
215 function pairsByKeys (t, f)
217 for n in pairs(t) do a[#a + 1] = n end
219 local i = 0 -- iterator variable
220 return function () -- iterator function
226 for name, line in pairsByKeys(lines) do
235 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function sort' );
242 function pairsByKeys (t, f)
244 for n in pairs(t) do a[#a + 1] = n end
246 local i = 0 -- iterator variable
247 return function () -- iterator function
253 for name, line in pairsByKeys(lines, function (a, b) return a < b end) do
262 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function sort (all permutations)' );
263 function permgen (a, n)
269 a[n], a[i] = a[i], a[n]
271 a[n], a[i] = a[i], a[n]
276 function permutations (a)
277 local co = coroutine.create(function () permgen(a) end)
279 local code, res = coroutine.resume(co)
285 for _, v in ipairs{'a', 'b', 'c', 'd', 'e', 'f', 'g'} do
287 local ref = table.concat(t, ' ')
290 for p in permutations(t) do
292 for i, v in ipairs(p) do
296 assert(ref == table.concat(c, ' '), table.concat(p, ' '))
318 language_output_like( 'lua', << 'CODE', << 'OUTPUT', 'function sort (bad func)' );
319 -- see bug : http://www.lua.org/bugs.html#5.1.3
321 table.sort( { t, t, t, t, }, function (a, b) return a[1] == b[1] end )
323 /^[^:]+: [^:]+:\d+: invalid order function for sorting\nstack traceback:\n/
328 # cperl-indent-level: 4
331 # vim: expandtab shiftwidth=4: