local luaunit = require("luaunit")
local assertions = require("luatypechecks.assertions")
local iterators = require("luaplot.iterators")
local Plot = require("luaplot.plot")
local DistanceLimit = require("luaplot.distancelimit")
local function _item_difference(item_count, item_index)
assertions.is_number(item_count)
assertions.is_number(item_index)
return ((item_count + 1) / 2 - item_index) / 100
end
-- luacheck: globals TestIterators
TestIterators = {}
function TestIterators.test_inext_middle()
local items = {10, 20, 30, 40, 50}
local next_index, next_item = iterators.inext(items, 2)
luaunit.assert_is_number(next_index)
luaunit.assert_equals(next_index, 3)
luaunit.assert_is_number(next_item)
luaunit.assert_equals(next_item, 30)
end
function TestIterators.test_inext_start()
local items = {10, 20, 30, 40, 50}
local next_index, next_item = iterators.inext(items, 0)
luaunit.assert_is_number(next_index)
luaunit.assert_equals(next_index, 1)
luaunit.assert_is_number(next_item)
luaunit.assert_equals(next_item, 10)
end
function TestIterators.test_inext_end()
local items = {10, 20, 30, 40, 50}
local next_index, next_item = iterators.inext(items, 4)
luaunit.assert_is_number(next_index)
luaunit.assert_equals(next_index, 5)
luaunit.assert_is_number(next_item)
luaunit.assert_equals(next_item, 50)
end
function TestIterators.test_inext_after_end()
local items = {10, 20, 30, 40, 50}
local result = iterators.inext(items, 5)
luaunit.assert_is_nil(result)
end
function TestIterators.test_difference_tables()
local item_count = 5
local table_one = {}
local table_two = {}
for i = 1, item_count do
table.insert(table_one, i / 10 + _item_difference(item_count, i))
table.insert(table_two, i / 10)
end
local wanted_differences = {}
local differences = {}
for i = 1, item_count do
table.insert(wanted_differences, _item_difference(item_count, i))
local difference = iterators.difference(table_one, table_two, i)
table.insert(differences, difference)
end
luaunit.assert_equals(#differences, #wanted_differences)
for index, difference in ipairs(differences) do
local wanted_difference = wanted_differences[index]
luaunit.assert_almost_equals(difference, wanted_difference, 1e-6)
end
end
function TestIterators.test_difference_tables_modulo()
local item_count = 5
local table_one = {}
local table_two = {}
for i = 1, item_count do
table.insert(table_one, i / 10 + _item_difference(item_count, i))
table.insert(table_two, i / 10)
end
local wanted_differences = {}
local differences = {}
for i = 1, item_count do
table.insert(wanted_differences, math.abs(_item_difference(item_count, i)))
local difference = iterators.difference(table_one, table_two, i, true)
table.insert(differences, difference)
end
luaunit.assert_equals(#differences, #wanted_differences)
for index, difference in ipairs(differences) do
local wanted_difference = wanted_differences[index]
luaunit.assert_almost_equals(difference, wanted_difference, 1e-6)
end
end
function TestIterators.test_difference_indexables()
local item_count = 5
local plot_one = Plot:new(0, 0.5)
local plot_two = Plot:new(0, 0.5)
for i = 1, item_count do
plot_one:push(i / 10 + _item_difference(item_count, i))
plot_two:push(i / 10)
end
local wanted_differences = {}
local differences = {}
for i = 1, item_count do
table.insert(wanted_differences, _item_difference(item_count, i))
local difference = iterators.difference(plot_one, plot_two, i)
table.insert(differences, difference)
end
luaunit.assert_equals(#differences, #wanted_differences)
for index, difference in ipairs(differences) do
local wanted_difference = wanted_differences[index]
luaunit.assert_almost_equals(difference, wanted_difference, 1e-6)
end
end
function TestIterators.test_difference_indexables_modulo()
local item_count = 5
local plot_one = Plot:new(0, 0.5)
local plot_two = Plot:new(0, 0.5)
for i = 1, item_count do
plot_one:push(i / 10 + _item_difference(item_count, i))
plot_two:push(i / 10)
end
local wanted_differences = {}
local differences = {}
for i = 1, item_count do
table.insert(wanted_differences, math.abs(_item_difference(item_count, i)))
local difference = iterators.difference(plot_one, plot_two, i, true)
table.insert(differences, difference)
end
luaunit.assert_equals(#differences, #wanted_differences)
for index, difference in ipairs(differences) do
local wanted_difference = wanted_differences[index]
luaunit.assert_almost_equals(difference, wanted_difference, 1e-6)
end
end
function TestIterators.test_select_by_distance_tables()
local item_count = 5
local table_one = {}
local table_two = {}
for i = 1, item_count do
table.insert(table_one, i / 10 - i / 100)
table.insert(table_two, i / 10)
end
local values = {}
for i = 1, item_count do
local value = iterators.select_by_distance(table_one, table_two, i, {
DistanceLimit:new(-0.05 + 0.001, "one"),
DistanceLimit:new(-0.02 + 0.001, "two"),
DistanceLimit:new(math.huge, "three"),
})
table.insert(values, value)
end
luaunit.assert_equals(values, {"three", "two", "two", "two", "one"})
end
function TestIterators.test_select_by_distance_tables_modulo()
local item_count = 5
local table_one = {}
local table_two = {}
for i = 1, item_count do
table.insert(table_one, i / 10 - i / 100)
table.insert(table_two, i / 10)
end
local values = {}
for i = 1, item_count do
local value = iterators.select_by_distance(table_one, table_two, i, true, {
DistanceLimit:new(0.02 - 0.001, "one"),
DistanceLimit:new(0.05 - 0.001, "two"),
DistanceLimit:new(math.huge, "three"),
})
table.insert(values, value)
end
luaunit.assert_equals(values, {"one", "two", "two", "two", "three"})
end
function TestIterators.test_select_by_distance_indexables()
local item_count = 5
local plot_one = Plot:new(0, 0.5)
local plot_two = Plot:new(0, 0.5)
for i = 1, item_count do
plot_one:push(i / 10 - i / 100)
plot_two:push(i / 10)
end
local values = {}
for i = 1, item_count - 1 do
local index = i + 0.5
local value = iterators.select_by_distance(plot_one, plot_two, index, {
DistanceLimit:new(-0.04, "one"),
DistanceLimit:new(-0.02, "two"),
DistanceLimit:new(math.huge, "three"),
})
table.insert(values, value)
end
luaunit.assert_equals(values, {"three", "two", "two", "one"})
end
function TestIterators.test_select_by_distance_indexables_modulo()
local item_count = 5
local plot_one = Plot:new(0, 0.5)
local plot_two = Plot:new(0, 0.5)
for i = 1, item_count do
plot_one:push(i / 10 - i / 100)
plot_two:push(i / 10)
end
local values = {}
for i = 1, item_count - 1 do
local index = i + 0.5
local value =
iterators.select_by_distance(plot_one, plot_two, index, true, {
DistanceLimit:new(0.02, "one"),
DistanceLimit:new(0.04, "two"),
DistanceLimit:new(math.huge, "three"),
})
table.insert(values, value)
end
luaunit.assert_equals(values, {"one", "two", "two", "three"})
end