From 57637f8aae6172e7713e885f41f4574cfa2770b3 Mon Sep 17 00:00:00 2001
From: Albert Krewinkel <albert@zeitkraut.de>
Date: Sat, 11 Jan 2020 14:32:29 +0100
Subject: Add tests for pandoc.List module

---
 test/Tests/Lua/Module.hs        |   2 +
 test/lua/module/pandoc-list.lua | 111 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 113 insertions(+)
 create mode 100644 test/lua/module/pandoc-list.lua

(limited to 'test')

diff --git a/test/Tests/Lua/Module.hs b/test/Tests/Lua/Module.hs
index baa81f4f0..8fc5965e0 100644
--- a/test/Tests/Lua/Module.hs
+++ b/test/Tests/Lua/Module.hs
@@ -21,6 +21,8 @@ tests :: [TestTree]
 tests =
   [ testPandocLua "pandoc"
                   ("lua" </> "module" </> "pandoc.lua")
+  , testPandocLua "pandoc.List"
+                  ("lua" </> "module" </> "pandoc-list.lua")
   , testPandocLua "pandoc.mediabag"
                   ("lua" </> "module" </> "pandoc-mediabag.lua")
   , testPandocLua "pandoc.types"
diff --git a/test/lua/module/pandoc-list.lua b/test/lua/module/pandoc-list.lua
new file mode 100644
index 000000000..faa5e966e
--- /dev/null
+++ b/test/lua/module/pandoc-list.lua
@@ -0,0 +1,111 @@
+local tasty = require 'tasty'
+local List = require 'pandoc.List'
+
+local assert = tasty.assert
+local test = tasty.test_case
+local group = tasty.test_group
+
+return {
+  group 'new' {
+    test('make table usable as list', function ()
+      local test = List:new{1, 1, 2, 3, 5}
+      assert.are_same(
+        {1, 1, 4, 9, 25},
+        test:map(function (x) return x^2 end)
+      )
+    end),
+    test('return empty list if no argument is given', function ()
+       assert.are_same({}, List:new())
+    end),
+    test('metatable of result is pandoc.List', function ()
+      local test = List:new{5}
+      assert.are_equal(List, getmetatable(test))
+    end)
+  },
+
+  group 'includes' {
+    test('finds elements in list', function ()
+      local lst = List:new {'one', 'two', 'three'}
+      assert.is_truthy(lst:includes('one'))
+      assert.is_truthy(lst:includes('two'))
+      assert.is_truthy(lst:includes('three'))
+      assert.is_falsy(lst:includes('four'))
+    end)
+  },
+
+  group 'clone' {
+    test('changing the clone does not affect original', function ()
+      local orig = List:new {23, 42}
+      local copy = orig:clone()
+      copy[1] = 5
+      assert.are_same({23, 42}, orig)
+      assert.are_same({5, 42}, copy)
+    end),
+    test('result is a list', function ()
+      local orig = List:new {23, 42}
+      assert.are_equal(List, getmetatable(orig:clone()))
+    end),
+                },
+
+  group 'find' {
+    test('returns element and index if found', function ()
+      local list = List:new {5, 23, 71}
+      local elem, idx = list:find(71)
+      assert.are_same(71, elem)
+      assert.are_same(3, idx)
+    end),
+    test('respects start index', function ()
+      local list = List:new {19, 23, 29, 71}
+      assert.are_equal(23, list:find(23, 1))
+      assert.are_equal(23, list:find(23, 2))
+      assert.is_nil(list:find(23, 3))
+    end),
+    test('returns nil if element not found', function ()
+      assert.is_nil((List:new {18, 20, 22, 0, 24}):find('0'))
+    end),
+  },
+
+  group 'find_if' {
+    test('returns element and index if found', function ()
+      local perm_prime = List:new {2, 3, 5, 7, 11, 13, 17, 31, 37, 71}
+      local elem, idx = perm_prime:find_if(function (x) return x >= 10 end)
+      assert.are_same(11, elem)
+      assert.are_same(5, idx)
+    end),
+    test('returns nil if element not found', function ()
+      local is_null = function (n) return List.includes({23,35,46,59}, n) end
+      assert.is_nil((List:new {18, 20, 22, 24, 27}):find_if(is_null))
+    end),
+  },
+
+  group 'extend' {
+    test('extends list with other list', function ()
+      local primes = List:new {2, 3, 5, 7}
+      primes:extend {11, 13, 17}
+      assert.are_same({2, 3, 5, 7, 11, 13, 17}, primes)
+    end)
+  },
+
+  group 'map' {
+    test('applies function to elements', function ()
+      local primes = List:new {2, 3, 5, 7}
+      local squares = primes:map(function (x) return x^2 end)
+      assert.are_same({4, 9, 25, 49}, squares)
+    end),
+    test('leaves original list unchanged', function ()
+      local primes = List:new {2, 3, 5, 7}
+      local squares = primes:map(function (x) return x^2 end)
+      assert.are_same({2, 3, 5, 7}, primes)
+    end)
+  },
+
+  group 'filter' {
+    test('keep elements for which property is truthy', function ()
+      local is_small_prime = function (x)
+        return List.includes({2, 3, 5, 7}, x)
+      end
+      local numbers = List:new {4, 7, 2, 9, 5, 11}
+      assert.are_same({7, 2, 5}, numbers:filter(is_small_prime))
+    end),
+  },
+}
-- 
cgit v1.2.3