mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-13 11:38:15 +07:00
398 lines
13 KiB
Lua
398 lines
13 KiB
Lua
local evo = require 'evolved'
|
|
|
|
do
|
|
do
|
|
local p = evo.spawn()
|
|
local e = evo.clone(p)
|
|
assert(evo.alive(e) and evo.empty(e))
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn()
|
|
local e = evo.clone(p, {})
|
|
assert(evo.alive(e) and evo.empty(e))
|
|
end
|
|
|
|
do
|
|
local f1, f2 = evo.id(2)
|
|
evo.set(f1, evo.REQUIRES, { f2 })
|
|
evo.set(f2, evo.DEFAULT, 42)
|
|
|
|
local p = evo.spawn()
|
|
local e = evo.clone(p, { [f1] = 'hello' })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f1, f2))
|
|
assert(evo.has(e, f1) and evo.get(e, f1) == 'hello')
|
|
assert(evo.has(e, f2) and evo.get(e, f2) == 42)
|
|
end
|
|
end
|
|
|
|
do
|
|
local f1, f2, f3, f4 = evo.id(4)
|
|
evo.set(f1, evo.TAG)
|
|
evo.set(f1, evo.REQUIRES, { f2, f3 })
|
|
evo.set(f4, evo.UNIQUE)
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local e = evo.clone(p)
|
|
assert(evo.alive(e) and evo.empty(e))
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local e = evo.clone(p, {})
|
|
assert(evo.alive(e) and evo.empty(e))
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local e = evo.clone(p, { [f4] = 'another' })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f4))
|
|
assert(evo.has(e, f4) and evo.get(e, f4) == 'another')
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local e = evo.clone(p, { [f4] = 'another' })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f2, f4))
|
|
assert(evo.has(e, f2) and evo.get(e, f2) == 100)
|
|
assert(evo.has(e, f4) and evo.get(e, f4) == 'another')
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local e = evo.clone(p, { [f1] = 'hello', [f3] = 10 })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f1, f2, f3))
|
|
assert(evo.has(e, f1) and evo.get(e, f1) == nil)
|
|
assert(evo.has(e, f2) and evo.get(e, f2) == 100)
|
|
assert(evo.has(e, f3) and evo.get(e, f3) == 10)
|
|
end
|
|
end
|
|
|
|
do
|
|
do
|
|
local f1, f2, f3, f4 = evo.id(4)
|
|
evo.set(f4, evo.TAG)
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 21, [f3] = 'hello', [f4] = true }
|
|
local e = evo.clone(p, { [f1] = 'world', [f2] = 10 })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f1, f2, f3, f4))
|
|
assert(evo.has(e, f1) and evo.get(e, f1) == 'world')
|
|
assert(evo.has(e, f2) and evo.get(e, f2) == 10)
|
|
assert(evo.has(e, f3) and evo.get(e, f3) == 'hello')
|
|
assert(evo.has(e, f4) and evo.get(e, f4) == nil)
|
|
end
|
|
end
|
|
|
|
do
|
|
local f1, f2, f3, f4 = evo.id(4)
|
|
evo.set(f2, evo.DEFAULT, 42)
|
|
evo.set(f3, evo.DUPLICATE, function() return nil end)
|
|
evo.set(f4, evo.TAG)
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 21, [f3] = 'hello', [f4] = true }
|
|
local e = evo.clone(p, { [f1] = 'world', [f2] = 10 })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f1, f2, f3, f4))
|
|
assert(evo.has(e, f1) and evo.get(e, f1) == 'world')
|
|
assert(evo.has(e, f2) and evo.get(e, f2) == 10)
|
|
assert(evo.has(e, f3) and evo.get(e, f3) == true)
|
|
assert(evo.has(e, f4) and evo.get(e, f4) == nil)
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local f1, f2, f3, f4 = evo.id(4)
|
|
evo.set(f1, evo.TAG)
|
|
evo.set(f1, evo.REQUIRES, { f2, f3 })
|
|
evo.set(f2, evo.DEFAULT, 42)
|
|
evo.set(f2, evo.DUPLICATE, function(v) return v * 2 end)
|
|
evo.set(f3, evo.DUPLICATE, function() return nil end)
|
|
evo.set(f4, evo.UNIQUE)
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local e = evo.clone(p)
|
|
assert(evo.alive(e) and evo.empty(e))
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local e = evo.clone(p, {})
|
|
assert(evo.alive(e) and evo.empty(e))
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local e = evo.clone(p, { [f4] = 'another' })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f4))
|
|
assert(evo.has(e, f4) and evo.get(e, f4) == 'another')
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local e = evo.clone(p, { [f4] = 'another' })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f2, f4))
|
|
assert(evo.has(e, f2) and evo.get(e, f2) == 200 * 2)
|
|
assert(evo.has(e, f4) and evo.get(e, f4) == 'another')
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local e = evo.clone(p, { [f1] = 'hello', [f2] = 10 })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f1, f2, f3))
|
|
assert(evo.has(e, f1) and evo.get(e, f1) == nil)
|
|
assert(evo.has(e, f2) and evo.get(e, f2) == 10 * 2)
|
|
assert(evo.has(e, f3) and evo.get(e, f3) == true)
|
|
end
|
|
|
|
local f1_set_count, f1_inserted_count = 0, 0
|
|
local f2_set_sum, f3_inserted_count = 0, 0
|
|
|
|
evo.set(f1, evo.ON_SET, function(e, f, c)
|
|
assert(evo.get(e, f) == c)
|
|
f1_set_count = f1_set_count + 1
|
|
end)
|
|
|
|
evo.set(f1, evo.ON_INSERT, function(e, f, c)
|
|
assert(evo.get(e, f) == c)
|
|
f1_inserted_count = f1_inserted_count + 1
|
|
end)
|
|
|
|
evo.set(f2, evo.ON_SET, function(e, f, c)
|
|
assert(evo.get(e, f) == c)
|
|
f2_set_sum = f2_set_sum + c
|
|
end)
|
|
|
|
evo.set(f3, evo.ON_INSERT, function(e, f, c)
|
|
assert(evo.get(e, f) == c)
|
|
f3_inserted_count = f3_inserted_count + 1
|
|
end)
|
|
|
|
do
|
|
f1_set_count, f1_inserted_count = 0, 0
|
|
f2_set_sum, f3_inserted_count = 0, 0
|
|
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local e = evo.clone(p, { [f1] = 'hello', [f2] = 10 })
|
|
assert(evo.alive(e) and not evo.empty(e) and evo.locate(e) == evo.chunk(f1, f2, f3))
|
|
assert(evo.has(e, f1) and evo.get(e, f1) == nil)
|
|
assert(evo.has(e, f2) and evo.get(e, f2) == 10 * 2)
|
|
assert(evo.has(e, f3) and evo.get(e, f3) == true)
|
|
|
|
assert(f1_set_count == 1)
|
|
assert(f1_inserted_count == 1)
|
|
assert(f2_set_sum == 100 * 2 + 10 * 2)
|
|
assert(f3_inserted_count == 1)
|
|
end
|
|
end
|
|
|
|
do
|
|
local f1, f2, f3, f4 = evo.id(4)
|
|
evo.set(f1, evo.TAG)
|
|
evo.set(f1, evo.REQUIRES, { f2, f3 })
|
|
evo.set(f4, evo.UNIQUE)
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(1, p)
|
|
assert(#es == 1 and ec == 1)
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and evo.empty(es[i]))
|
|
end
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(2, p, {})
|
|
assert(#es == 2 and ec == 2)
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and evo.empty(es[i]))
|
|
end
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(3, p, { [f4] = 'another' })
|
|
assert(#es == 3 and ec == 3)
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f4))
|
|
assert(evo.has(es[i], f4) and evo.get(es[i], f4) == 'another')
|
|
end
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(4, p, { [f4] = 'another' })
|
|
assert(#es == 4 and ec == 4)
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f2, f4))
|
|
assert(evo.has(es[i], f2) and evo.get(es[i], f2) == 100)
|
|
assert(evo.has(es[i], f4) and evo.get(es[i], f4) == 'another')
|
|
end
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(5, p, { [f1] = 'hello', [f3] = 10 })
|
|
assert(#es == 5 and ec == 5)
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f1, f2, f3))
|
|
assert(evo.has(es[i], f1) and evo.get(es[i], f1) == nil)
|
|
assert(evo.has(es[i], f2) and evo.get(es[i], f2) == 100)
|
|
assert(evo.has(es[i], f3) and evo.get(es[i], f3) == 10)
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
do
|
|
local f1, f2, f3, f4 = evo.id(4)
|
|
evo.set(f4, evo.TAG)
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 21, [f3] = 'hello', [f4] = true }
|
|
local es, ec = evo.multi_clone(2, p, { [f1] = 'world', [f2] = 10 })
|
|
assert(#es == 2 and ec == 2)
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f1, f2, f3, f4))
|
|
assert(evo.has(es[i], f1) and evo.get(es[i], f1) == 'world')
|
|
assert(evo.has(es[i], f2) and evo.get(es[i], f2) == 10)
|
|
assert(evo.has(es[i], f3) and evo.get(es[i], f3) == 'hello')
|
|
assert(evo.has(es[i], f4) and evo.get(es[i], f4) == nil)
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local f1, f2, f3, f4 = evo.id(4)
|
|
evo.set(f2, evo.DEFAULT, 42)
|
|
evo.set(f3, evo.DUPLICATE, function() return nil end)
|
|
evo.set(f4, evo.TAG)
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 21, [f3] = 'hello', [f4] = true }
|
|
local es, ec = evo.multi_clone(2, p, { [f1] = 'world', [f2] = 10 })
|
|
assert(#es == 2 and ec == 2)
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f1, f2, f3, f4))
|
|
assert(evo.has(es[i], f1) and evo.get(es[i], f1) == 'world')
|
|
assert(evo.has(es[i], f2) and evo.get(es[i], f2) == 10)
|
|
assert(evo.has(es[i], f3) and evo.get(es[i], f3) == true)
|
|
assert(evo.has(es[i], f4) and evo.get(es[i], f4) == nil)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
do
|
|
local f1, f2, f3, f4 = evo.id(4)
|
|
evo.set(f1, evo.TAG)
|
|
evo.set(f1, evo.REQUIRES, { f2, f3 })
|
|
evo.set(f2, evo.DEFAULT, 42)
|
|
evo.set(f2, evo.DUPLICATE, function(v) return v * 2 end)
|
|
evo.set(f3, evo.DUPLICATE, function() return nil end)
|
|
evo.set(f4, evo.UNIQUE)
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(3, p)
|
|
assert(#es == 3 and ec == 3)
|
|
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and evo.empty(es[i]))
|
|
end
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(3, p, {})
|
|
assert(#es == 3 and ec == 3)
|
|
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and evo.empty(es[i]))
|
|
end
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(2, p, { [f4] = 'another' })
|
|
assert(#es == 2 and ec == 2)
|
|
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f4))
|
|
assert(evo.has(es[i], f4) and evo.get(es[i], f4) == 'another')
|
|
end
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(4, p, { [f4] = 'another' })
|
|
assert(#es == 4 and ec == 4)
|
|
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f2, f4))
|
|
assert(evo.has(es[i], f2) and evo.get(es[i], f2) == 200 * 2)
|
|
assert(evo.has(es[i], f4) and evo.get(es[i], f4) == 'another')
|
|
end
|
|
end
|
|
|
|
do
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(5, p, { [f1] = 'hello', [f2] = 10 })
|
|
assert(#es == 5 and ec == 5)
|
|
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f1, f2, f3))
|
|
assert(evo.has(es[i], f1) and evo.get(es[i], f1) == nil)
|
|
assert(evo.has(es[i], f2) and evo.get(es[i], f2) == 10 * 2)
|
|
assert(evo.has(es[i], f3) and evo.get(es[i], f3) == true)
|
|
end
|
|
end
|
|
|
|
local f1_set_count, f1_inserted_count = 0, 0
|
|
local f2_set_sum, f3_inserted_count = 0, 0
|
|
|
|
evo.set(f1, evo.ON_SET, function(e, f, c)
|
|
assert(evo.get(e, f) == c)
|
|
f1_set_count = f1_set_count + 1
|
|
end)
|
|
|
|
evo.set(f1, evo.ON_INSERT, function(e, f, c)
|
|
assert(evo.get(e, f) == c)
|
|
f1_inserted_count = f1_inserted_count + 1
|
|
end)
|
|
|
|
evo.set(f2, evo.ON_SET, function(e, f, c)
|
|
assert(evo.get(e, f) == c)
|
|
f2_set_sum = f2_set_sum + c
|
|
end)
|
|
|
|
evo.set(f3, evo.ON_INSERT, function(e, f, c)
|
|
assert(evo.get(e, f) == c)
|
|
f3_inserted_count = f3_inserted_count + 1
|
|
end)
|
|
|
|
do
|
|
f1_set_count, f1_inserted_count = 0, 0
|
|
f2_set_sum, f3_inserted_count = 0, 0
|
|
|
|
local p = evo.spawn { [f2] = 100, [f4] = 'unique' }
|
|
local es, ec = evo.multi_clone(1, p, { [f1] = 'hello', [f2] = 10 })
|
|
|
|
for i = 1, ec do
|
|
assert(evo.alive(es[i]) and not evo.empty(es[i]) and evo.locate(es[i]) == evo.chunk(f1, f2, f3))
|
|
assert(evo.has(es[i], f1) and evo.get(es[i], f1) == nil)
|
|
assert(evo.has(es[i], f2) and evo.get(es[i], f2) == 10 * 2)
|
|
assert(evo.has(es[i], f3) and evo.get(es[i], f3) == true)
|
|
|
|
assert(f1_set_count == 1)
|
|
assert(f1_inserted_count == 1)
|
|
assert(f2_set_sum == 100 * 2 + 10 * 2)
|
|
assert(f3_inserted_count == 1)
|
|
end
|
|
end
|
|
end
|