tagged release 0.6.4
[parrot.git] / languages / lua / t / table.t
bloba00d482b88252d63dee2e253f09951b5f6e0ad48
1 #! perl
2 # Copyright (C) 2006-2008, The Perl Foundation.
3 # $Id$
5 =head1 NAME
7 t/table.t - Lua Table Library
9 =head1 SYNOPSIS
11     % perl -I../lib -Ilua/t lua/t/table.t
13 =head1 DESCRIPTION
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".
23 =cut
25 use strict;
26 use warnings;
27 use FindBin;
28 use lib "$FindBin::Bin";
30 use Parrot::Test tests => 18;
31 use Test::More;
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))
43 CODE
44 abcde
45 a,b,c,d,e
46 b,c,d,e
47 b,c,d
49 OUTPUT
51 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function concat (number)' );
52 t = {"a","b",3,"d","e"}
53 print(table.concat(t,","))
54 CODE
55 a,b,3,d,e
56 OUTPUT
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))
61 CODE
62 /^[^:]+: [^:]+:\d+: bad argument #1 to 'concat' \(table contains non-strings\)\nstack traceback:\n/
63 OUTPUT
65 language_output_like( 'lua', << 'CODE', << 'OUTPUT', 'function concat (non-string)' );
66 t = {"a","b",true,"d","e"}
67 print(table.concat(t,","))
68 CODE
69 /^[^:]+: [^:]+:\d+: bad argument #1 to 'concat' \(table contains non-strings\)\nstack traceback:\n/
70 OUTPUT
72 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function foreach (array)' );
73 t = {"a","b","c"}
74 table.foreach(t, print)
75 CODE
76 1       a
77 2       b
78 3       c
79 OUTPUT
81 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function foreach (hash)' );
82 t = {a=10, b=100}
83 table.foreach(t, print)
84 CODE
85 a       10
86 b       100
87 OUTPUT
89 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function foreachi' );
90 t = {"a","b","c"}
91 table.foreachi(t, print)
92 CODE
93 1       a
94 2       b
95 3       c
96 OUTPUT
98 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function getn' );
99 print(table.getn{10,2,4})
100 print(table.getn{10,2,nil})
101 CODE
104 OUTPUT
106 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function insert' );
107 a = {10, 20, 30}
108 table.insert(a, 1, 15)
109 print(table.concat(a,","))
110 t = {}
111 table.insert(t, "a")
112 print(table.concat(t,","))
113 table.insert(t, "b")
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")
120 print(t[7])
121 table.insert(t, -9, "f")
122 print(t[-9])
123 CODE
124 15,10,20,30
127 c,a,b
128 c,d,a,b
131 OUTPUT
133 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function maxn' );
134 t = {}
135 print(table.maxn(t))
136 t[1] = "a"
137 t[2] = "b"
138 print(table.maxn(t))
139 t[6] = "g"
140 print(table.maxn(t))
141 CODE
145 OUTPUT
147 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function maxn' );
148 a = {}
149 a[10000] = 1
150 print(table.maxn(a))
151 CODE
152 10000
153 OUTPUT
155 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function remove' );
156 t = {}
157 a = table.remove(t)
158 print(a)                        -- nil
159 t = {"a","b","c","d","e"}
160 a = table.remove(t)
161 print(a)                        -- e
162 print(table.concat(t,","))      -- a,b,c,d
163 a = table.remove(t,3)
164 print(a)                        -- c
165 print(table.concat(t,","))      -- a,b,d
166 a = table.remove(t,1)
167 print(a)                        -- a
168 print(table.concat(t,","))      -- b,d
169 a = table.remove(t,7)
170 print(a)                        -- nil
171 print(table.concat(t,","))      -- b,d
172 CODE
175 a,b,c,d
177 a,b,d
182 OUTPUT
184 language_output_like( 'lua', << 'CODE', << 'OUTPUT', 'function setn' );
185 a = {}
186 table.setn(a, 10000)
187 CODE
188 /^[^:]+: [^:]+:\d+: 'setn' is obsolete\nstack traceback:\n/
189 OUTPUT
191 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function sort' );
192 lines = {
193     luaH_set = 10,
194     luaH_get = 24,
195     luaH_present = 48,
198 a = {}
199 for n in pairs(lines) do a[#a + 1] = n end
200 table.sort(a)
201 for i,n in ipairs(a) do print(n) end
202 CODE
203 luaH_get
204 luaH_present
205 luaH_set
206 OUTPUT
208 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function sort' );
209 lines = {
210     luaH_set = 10,
211     luaH_get = 24,
212     luaH_present = 48,
215 function pairsByKeys (t, f)
216     local a = {}
217     for n in pairs(t) do a[#a + 1] = n end
218     table.sort(a, f)
219     local i = 0     -- iterator variable
220     return function ()  -- iterator function
221         i = i + 1
222         return a[i], t[a[i]]
223     end
226 for name, line in pairsByKeys(lines) do
227     print(name, line)
229 CODE
230 luaH_get        24
231 luaH_present    48
232 luaH_set        10
233 OUTPUT
235 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function sort' );
236 lines = {
237     luaH_set = 10,
238     luaH_get = 24,
239     luaH_present = 48,
242 function pairsByKeys (t, f)
243     local a = {}
244     for n in pairs(t) do a[#a + 1] = n end
245     table.sort(a, f)
246     local i = 0     -- iterator variable
247     return function ()  -- iterator function
248         i = i + 1
249         return a[i], t[a[i]]
250     end
253 for name, line in pairsByKeys(lines, function (a, b) return a < b end) do
254     print(name, line)
256 CODE
257 luaH_get        24
258 luaH_present    48
259 luaH_set        10
260 OUTPUT
262 language_output_is( 'lua', << 'CODE', << 'OUTPUT', 'function sort (all permutations)' );
263 function permgen (a, n)
264     n = n or #a
265     if n <= 1 then
266         coroutine.yield(a)
267     else
268         for i=1,n do
269             a[n], a[i] = a[i], a[n]
270             permgen(a, n - 1)
271             a[n], a[i] = a[i], a[n]
272         end
273     end
276 function permutations (a)
277     local co = coroutine.create(function () permgen(a) end)
278     return function ()
279                local code, res = coroutine.resume(co)
280                return res
281            end
284 local t = {}
285 for _, v in ipairs{'a', 'b', 'c', 'd', 'e', 'f', 'g'} do
286     table.insert(t, v)
287     local ref = table.concat(t, ' ')
288     print(ref)
289     local n = 0
290     for p in permutations(t) do
291         local c = {}
292         for i, v in ipairs(p) do
293             c[i] = v
294         end
295         table.sort(c)
296         assert(ref == table.concat(c, ' '), table.concat(p, ' '))
297         n = n + 1
298     end
299     print(n)
301 CODE
304 a b
306 a b c
308 a b c d
310 a b c d e
312 a b c d e f
314 a b c d e f g
315 5040
316 OUTPUT
318 language_output_like( 'lua', << 'CODE', << 'OUTPUT', 'function sort (bad func)' );
319 -- see bug : http://www.lua.org/bugs.html#5.1.3
320 local t = { 1 }
321 table.sort( { t, t, t, t, }, function (a, b) return a[1] == b[1] end )
322 CODE
323 /^[^:]+: [^:]+:\d+: invalid order function for sorting\nstack traceback:\n/
324 OUTPUT
326 # Local Variables:
327 #   mode: cperl
328 #   cperl-indent-level: 4
329 #   fill-column: 100
330 # End:
331 # vim: expandtab shiftwidth=4: