batteries/tests.lua
David Briscoe d48d4b0e81 table: Rewrite *_copy to copy any kind of type
Allowing shallow_copy/deep_copy to accept any type makes it easier to
write generic code where you just want to copy some input without
knowing anything about it. Like an event system, save system, etc.

Add corresponding test.

Tests pass
2022-03-03 22:03:12 -08:00

127 lines
2.7 KiB
Lua

-- Run this file with testy:
-- testy.lua tests.lua
-- testy sets `...` to "module.test", so ignore that and use module top-level paths.
package.path = package.path .. ";../?.lua"
local assert = require("batteries.assert")
local tablex = require("batteries.tablex")
-- tablex {{{
local function test_shallow_copy()
local x,r
x = { a = 1, b = 2, c = 3 }
r = tablex.shallow_copy(x)
assert:equal(r.a, 1)
assert:equal(r.b, 2)
assert:equal(r.c, 3)
x = { a = { b = { 2 }, c = { 3 }, } }
r = tablex.shallow_copy(x)
assert:equal(r.a, x.a)
x = 10
r = tablex.shallow_copy(x)
assert:equal(r, x)
end
local function test_deep_copy()
local x,r
x = { a = 1, b = 2, c = 3 }
r = tablex.deep_copy(x)
assert:equal(r.a, 1)
assert:equal(r.b, 2)
assert:equal(r.c, 3)
x = { a = { b = { 2 }, c = { 3 }, } }
r = tablex.deep_copy(x)
assert(r.a ~= x.a)
assert:equal(r.a.b[1], 2)
assert:equal(r.a.c[1], 3)
x = 10
r = tablex.deep_copy(x)
assert:equal(r, x)
end
local function test_shallow_overlay()
local x,y,r
x = { a = 1, b = 2, c = 3 }
y = { c = 8, d = 9 }
r = tablex.shallow_overlay(x, y)
assert(
tablex.deep_equal(
r,
{ a = 1, b = 2, c = 8, d = 9 }
)
)
x = { b = { 2 }, c = { 3 }, }
y = { c = { 8 }, d = { 9 }, }
r = tablex.shallow_overlay(x, y)
assert(r.b == x.b)
assert(r.c == y.c)
assert(r.d == y.d)
assert(
tablex.deep_equal(
r,
{ b = { 2 }, c = { 8 }, d = { 9 }, }))
end
local function test_deep_overlay()
local x,y,r
x = { a = 1, b = 2, c = 3 }
y = { c = 8, d = 9 }
r = tablex.deep_overlay(x, y)
assert(
tablex.deep_equal(
r,
{ a = 1, b = 2, c = 8, d = 9 }))
x = { a = { b = { 2 }, c = { 3 }, } }
y = { a = { c = { 8 }, d = { 9 }, } }
r = tablex.deep_overlay(x, y)
assert(
tablex.deep_equal(
r,
{ a = { b = { 2 }, c = { 8 }, d = { 9 }, } }))
end
local function test_shallow_equal()
local x,y
x = { a = { b = { 2 }, } }
y = { a = { b = { 2 }, } }
assert(not tablex.shallow_equal(x, y))
x = { 3, 4, "hello", [20] = "end", }
y = { 3, 4, "hello", [20] = "end", }
assert(tablex.shallow_equal(x, y))
local z = { 1, 2, }
x = { a = z, b = 10, c = true, }
y = { a = z, b = 10, c = true, }
assert(tablex.shallow_equal(x, y))
assert(tablex.shallow_equal(y, x))
end
local function test_deep_equal()
local x,y
x = { a = { b = { 2 }, c = { 3 }, } }
y = { a = { b = { 2 }, c = { 3 }, } }
assert(tablex.deep_equal(x, y))
x = { a = { b = { 1, 2 }, c = { 3 }, } }
y = { a = { c = { 3 }, b = { [2] = 2, [1] = 1 }, } }
assert(tablex.deep_equal(x, y))
assert(tablex.deep_equal(y, x))
x = { a = { b = { 2 }, c = { 3 }, 2 } }
y = { a = { b = { 2 }, c = { 3 }, } }
assert(not tablex.deep_equal(x, y))
assert(not tablex.deep_equal(y, x))
end