--- source: src/main.rs expression: compiled input_file: test-data/lua5.1-tests/sort.lua --- print("testing sort"); global fn check(a, f) { f = f || fn (x, y) { return x < y } for n = table.getn(a), 2, -1 { assert(!f(a[(n)], a[(n - 1)])); } } a = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } table.sort(a); check(a); limit = 30000 if rawget(_G, "_soft") { limit = 5000 } a = {} for i = 1, limit { a[(i)] = math.random() } local x = os.clock() table.sort(a); print(string.format("Sorting %d elements in %.2f sec.", limit, os.clock() - x)); check(a); x = os.clock() table.sort(a); print(string.format("Re-sorting %d elements in %.2f sec.", limit, os.clock() - x)); check(a); a = {} for i = 1, limit { a[(i)] = math.random() } x = os.clock() i = 0 table.sort(a, fn (x, y) { i = i + 1 return y < x }); print(string.format("Invert-sorting other %d elements in %.2f sec., with %i comparisons", limit, os.clock() - x, i)); check(a, fn (x, y) { return y < x }); table.sort({}); for i = 1, limit { a[(i)] = false } x = os.clock() table.sort(a, fn (x, y) { return nil }); print(string.format("Sorting %d equal elements in %.2f sec.", limit, os.clock() - x)); check(a, fn (x, y) { return nil }); for i, v with pairs(a) { assert(!v || i == 'n' && v == limit); } a = { "�lo", "\0first :-)", "alo", "then this one", "45", "and a new" } table.sort(a); check(a); table.sort(a, fn (x, y) { loadstring(string.format("a[%q] = ''", x))(); collectgarbage(); return x < y }); tt = { __lt = fn (a, b) { return a.val < b.val } } a = {} for i = 1, 10 { a[(i)] = { val = math.random(100) } setmetatable(a[(i)], tt); } table.sort(a); check(a, tt.__lt); check(a); print("OK");