summaryrefslogtreecommitdiff
path: root/Data/Libraries/Penlight/spec/permute_spec.lua
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-10-30 11:32:16 +0800
committerchai <chaifix@163.com>2021-10-30 11:32:16 +0800
commit42ec7286b2d36a9ba22925f816a17cb1cc2aa5ce (patch)
tree24bc7009457a8d7500f264e89946dc20d069294f /Data/Libraries/Penlight/spec/permute_spec.lua
parent164885fd98d48703bd771f802d79557b7db97431 (diff)
+ Penlight
Diffstat (limited to 'Data/Libraries/Penlight/spec/permute_spec.lua')
-rw-r--r--Data/Libraries/Penlight/spec/permute_spec.lua213
1 files changed, 213 insertions, 0 deletions
diff --git a/Data/Libraries/Penlight/spec/permute_spec.lua b/Data/Libraries/Penlight/spec/permute_spec.lua
new file mode 100644
index 0000000..49143c0
--- /dev/null
+++ b/Data/Libraries/Penlight/spec/permute_spec.lua
@@ -0,0 +1,213 @@
+local permute = require("pl.permute")
+local tcopy = require("pl.tablex").copy
+local utils = require("pl.utils")
+
+describe("pl.permute", function()
+
+ describe("order_iter", function()
+
+ it("returns all order combinations", function()
+ local result = {}
+ for list in permute.order_iter({"one", "two", "three"}) do
+ result[#result+1] = tcopy(list)
+ end
+ assert.same({
+ [1] = {
+ [1] = 'two',
+ [2] = 'three',
+ [3] = 'one' },
+ [2] = {
+ [1] = 'three',
+ [2] = 'two',
+ [3] = 'one' },
+ [3] = {
+ [1] = 'three',
+ [2] = 'one',
+ [3] = 'two' },
+ [4] = {
+ [1] = 'one',
+ [2] = 'three',
+ [3] = 'two' },
+ [5] = {
+ [1] = 'two',
+ [2] = 'one',
+ [3] = 'three' },
+ [6] = {
+ [1] = 'one',
+ [2] = 'two',
+ [3] = 'three' } }, result)
+ end)
+
+
+ it("returns nil on empty list", function()
+ local result = {}
+ for list in permute.order_iter({}) do
+ result[#result+1] = tcopy(list)
+ end
+ assert.equal(0, #result)
+ end)
+
+ end)
+
+
+
+ describe("order_table", function()
+
+ it("returns all order combinations", function()
+ local result = permute.order_table({"one", "two", "three"})
+ assert.same({
+ [1] = {
+ [1] = 'two',
+ [2] = 'three',
+ [3] = 'one' },
+ [2] = {
+ [1] = 'three',
+ [2] = 'two',
+ [3] = 'one' },
+ [3] = {
+ [1] = 'three',
+ [2] = 'one',
+ [3] = 'two' },
+ [4] = {
+ [1] = 'one',
+ [2] = 'three',
+ [3] = 'two' },
+ [5] = {
+ [1] = 'two',
+ [2] = 'one',
+ [3] = 'three' },
+ [6] = {
+ [1] = 'one',
+ [2] = 'two',
+ [3] = 'three' } }, result)
+ end)
+
+
+ it("returns empty table on empty input list", function()
+ local result = permute.order_table({})
+ assert.same({}, result)
+ end)
+
+ end)
+
+
+
+ describe("list_iter", function()
+
+ it("returns all combinations from sub-lists", function()
+ local result = {}
+ local strs = {"one", "two", "three"}
+ local ints = { 1,2,3 }
+ local bools = { true, false }
+ for count, str, int, bool in permute.list_iter(strs, ints, bools) do
+ result[#result+1] = {count, str, int, bool}
+ end
+ assert.same({
+ [1] = {1, 'one', 1, true },
+ [2] = {2, 'two', 1, true },
+ [3] = {3, 'three', 1, true },
+ [4] = {4, 'one', 2, true },
+ [5] = {5, 'two', 2, true },
+ [6] = {6, 'three', 2, true },
+ [7] = {7, 'one', 3, true },
+ [8] = {8, 'two', 3, true },
+ [9] = {9, 'three', 3, true },
+ [10] = {10, 'one', 1, false },
+ [11] = {11, 'two', 1, false },
+ [12] = {12, 'three', 1, false },
+ [13] = {13, 'one', 2, false },
+ [14] = {14, 'two', 2, false },
+ [15] = {15, 'three', 2, false },
+ [16] = {16, 'one', 3, false },
+ [17] = {17, 'two', 3, false },
+ [18] = {18, 'three', 3, false },
+ }, result)
+ end)
+
+
+ it("is nil-safe, given 'n' is set", function()
+ local result = {}
+ local bools = utils.pack(nil, true, false)
+ local strs = utils.pack("one", "two", nil)
+ for count, bool, str in permute.list_iter(bools, strs) do
+ result[#result+1] = {count, bool, str}
+ end
+ assert.same({
+ [1] = {1, nil, 'one' },
+ [2] = {2, true, 'one' },
+ [3] = {3, false, 'one' },
+ [4] = {4, nil, 'two' },
+ [5] = {5, true, 'two' },
+ [6] = {6, false, 'two' },
+ [7] = {7, nil, nil },
+ [8] = {8, true, nil },
+ [9] = {9, false, nil },
+ }, result)
+ end)
+
+
+ it("returns nil on empty list", function()
+ local count = 0
+ for list in permute.list_iter({}) do
+ count = count + 1
+ end
+ assert.equal(0, count)
+ end)
+
+ end)
+
+
+
+ describe("list_table", function()
+
+ it("returns all combinations from sub-lists", function()
+ local strs = {"one", "two", "three"}
+ local ints = { 1,2,3 }
+ local bools = { true, false }
+ assert.same({
+ [1] = {'one', 1, true, n = 3 },
+ [2] = {'two', 1, true, n = 3 },
+ [3] = {'three', 1, true, n = 3 },
+ [4] = {'one', 2, true, n = 3 },
+ [5] = {'two', 2, true, n = 3 },
+ [6] = {'three', 2, true, n = 3 },
+ [7] = {'one', 3, true, n = 3 },
+ [8] = {'two', 3, true, n = 3 },
+ [9] = {'three', 3, true, n = 3 },
+ [10] = {'one', 1, false, n = 3 },
+ [11] = {'two', 1, false, n = 3 },
+ [12] = {'three', 1, false, n = 3 },
+ [13] = {'one', 2, false, n = 3 },
+ [14] = {'two', 2, false, n = 3 },
+ [15] = {'three', 2, false, n = 3 },
+ [16] = {'one', 3, false, n = 3 },
+ [17] = {'two', 3, false, n = 3 },
+ [18] = {'three', 3, false, n = 3 },
+ }, permute.list_table(strs, ints, bools))
+ end)
+
+
+ it("is nil-safe, given 'n' is set", function()
+ local bools = utils.pack(nil, true, false)
+ local strs = utils.pack("one", "two", nil)
+ assert.same({
+ [1] = {nil, 'one', n = 2 },
+ [2] = {true, 'one', n = 2 },
+ [3] = {false, 'one', n = 2 },
+ [4] = {nil, 'two', n = 2 },
+ [5] = {true, 'two', n = 2 },
+ [6] = {false, 'two', n = 2 },
+ [7] = {nil, nil, n = 2 },
+ [8] = {true, nil, n = 2 },
+ [9] = {false, nil, n = 2 },
+ }, permute.list_table(bools, strs))
+ end)
+
+
+ it("returns nil on empty list", function()
+ assert.same({}, permute.list_table({}))
+ end)
+
+ end)
+
+end)