aboutsummaryrefslogtreecommitdiff
path: root/test/lua/module/pandoc-list.lua
blob: faa5e966e42c9c1ff80d193427789b15484329d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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),
  },
}