conjur-asset-ui 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +7 -0
  2. data/.git-hooks/pre_commit/ensure_livescript_compiled.rb +31 -0
  3. data/.git-hooks/pre_commit/trailing_whitespace.rb +26 -0
  4. data/.gitignore +20 -0
  5. data/.overcommit.yml +5 -0
  6. data/.project +18 -0
  7. data/CHANGELOG.md +3 -0
  8. data/Gemfile +8 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +41 -0
  11. data/Rakefile +3 -0
  12. data/compile_ls +6 -0
  13. data/conjur-asset-ui.gemspec +37 -0
  14. data/lib/conjur/command/ui.rb +46 -0
  15. data/lib/conjur/webserver/api_proxy.rb +94 -0
  16. data/lib/conjur/webserver/authorize.rb +28 -0
  17. data/lib/conjur/webserver/conjur_info.rb +33 -0
  18. data/lib/conjur/webserver/home.rb +42 -0
  19. data/lib/conjur/webserver/login.rb +57 -0
  20. data/lib/conjur/webserver/renderer.rb +34 -0
  21. data/lib/conjur/webserver/server.rb +113 -0
  22. data/lib/conjur-asset-ui-version.rb +7 -0
  23. data/lib/conjur-asset-ui.rb +7 -0
  24. data/livescript/views/audit.ls +136 -0
  25. data/public/_client_code.html +42 -0
  26. data/public/_client_libs.html +24 -0
  27. data/public/css/bootstrap.css +7 -0
  28. data/public/css/styles.less +461 -0
  29. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  30. data/public/fonts/glyphicons-halflings-regular.svg +229 -0
  31. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  32. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  33. data/public/images/conjur-logo.svg +26 -0
  34. data/public/images/icon-client-pc.svg +12 -0
  35. data/public/images/icon-environment.png +0 -0
  36. data/public/images/icon-person.svg +12 -0
  37. data/public/images/icon-policy.png +0 -0
  38. data/public/images/icon-resource.png +0 -0
  39. data/public/images/icon-service-dots.svg +13 -0
  40. data/public/images/icon-variable.png +0 -0
  41. data/public/index.html.erb +62 -0
  42. data/public/js/init.js +107 -0
  43. data/public/js/lib/JSXTransformer.js +10862 -0
  44. data/public/js/lib/async.js +958 -0
  45. data/public/js/lib/backbone.js +2 -0
  46. data/public/js/lib/bootstrap.js +6 -0
  47. data/public/js/lib/date.extensions.js +141 -0
  48. data/public/js/lib/less.js +16 -0
  49. data/public/js/lib/moment.js +7768 -0
  50. data/public/js/lib/pace.js +2 -0
  51. data/public/js/lib/prelude-browser-min.js +1 -0
  52. data/public/js/lib/react-bootstrap.js +5346 -0
  53. data/public/js/lib/react-bootstrap.min.js +4 -0
  54. data/public/js/lib/sorted-set.no-require.js +1170 -0
  55. data/public/js/lib/sorted-set.no-require.js.txt +6 -0
  56. data/public/js/lib/underscore-min.js +6 -0
  57. data/public/js/lib/underscore.string.min.js +1 -0
  58. data/public/js/main.js +57 -0
  59. data/public/js/models/groupRecord.js +70 -0
  60. data/public/js/models/hostRecord.js +55 -0
  61. data/public/js/models/layerRecord.js +77 -0
  62. data/public/js/models/namespace.js +10 -0
  63. data/public/js/models/policyList.js +14 -0
  64. data/public/js/models/policyRecord.js +54 -0
  65. data/public/js/models/record.js +85 -0
  66. data/public/js/models/resourceList.js +69 -0
  67. data/public/js/models/userList.js +20 -0
  68. data/public/js/models/userRecord.js +70 -0
  69. data/public/js/models/variableList.js +16 -0
  70. data/public/js/models/variableRecord.js +73 -0
  71. data/public/js/routers.js +205 -0
  72. data/public/js/views/annotations.js +36 -0
  73. data/public/js/views/audit.js +363 -0
  74. data/public/js/views/dashboard.js +67 -0
  75. data/public/js/views/generic.js +115 -0
  76. data/public/js/views/group.js +61 -0
  77. data/public/js/views/groups.js +30 -0
  78. data/public/js/views/host.js +64 -0
  79. data/public/js/views/hosts.js +30 -0
  80. data/public/js/views/layer.js +92 -0
  81. data/public/js/views/layers.js +30 -0
  82. data/public/js/views/mixins/search.js +15 -0
  83. data/public/js/views/mixins/tabs.js +114 -0
  84. data/public/js/views/namespaces.js +40 -0
  85. data/public/js/views/navSearch.js +25 -0
  86. data/public/js/views/owned.js +178 -0
  87. data/public/js/views/permissions.js +188 -0
  88. data/public/js/views/policies.js +28 -0
  89. data/public/js/views/policy.js +43 -0
  90. data/public/js/views/resource.js +39 -0
  91. data/public/js/views/role.js +41 -0
  92. data/public/js/views/searchResults.js +145 -0
  93. data/public/js/views/time.js +14 -0
  94. data/public/js/views/user.js +68 -0
  95. data/public/js/views/users.js +31 -0
  96. data/public/js/views/variable.js +70 -0
  97. data/public/js/views/variables.js +30 -0
  98. data/spec/javascripts/helpers/.gitkeep +0 -0
  99. data/spec/javascripts/support/jasmine.yml +112 -0
  100. data/spec/javascripts/support/jasmine_helper.rb +22 -0
  101. data/spec/javascripts/support/run.html.erb +23 -0
  102. data/spec/javascripts/views/AuditSpec.js +22 -0
  103. data/spec/javascripts/views/AuditSpec.ls +18 -0
  104. data/vendor/prelude-ls/.gitignore +2 -0
  105. data/vendor/prelude-ls/.travis.yml +3 -0
  106. data/vendor/prelude-ls/CHANGELOG.md +81 -0
  107. data/vendor/prelude-ls/LICENSE +22 -0
  108. data/vendor/prelude-ls/Makefile +50 -0
  109. data/vendor/prelude-ls/README.md +15 -0
  110. data/vendor/prelude-ls/browser/prelude-browser-min.js +1 -0
  111. data/vendor/prelude-ls/browser/prelude-browser.js +1172 -0
  112. data/vendor/prelude-ls/lib/Func.js +40 -0
  113. data/vendor/prelude-ls/lib/List.js +602 -0
  114. data/vendor/prelude-ls/lib/Num.js +129 -0
  115. data/vendor/prelude-ls/lib/Obj.js +153 -0
  116. data/vendor/prelude-ls/lib/Str.js +68 -0
  117. data/vendor/prelude-ls/lib/index.js +164 -0
  118. data/vendor/prelude-ls/package.json +50 -0
  119. data/vendor/prelude-ls/package.ls +46 -0
  120. data/vendor/prelude-ls/src/Func.ls +17 -0
  121. data/vendor/prelude-ls/src/List.ls +299 -0
  122. data/vendor/prelude-ls/src/Num.ls +83 -0
  123. data/vendor/prelude-ls/src/Obj.ls +61 -0
  124. data/vendor/prelude-ls/src/Str.ls +32 -0
  125. data/vendor/prelude-ls/src/index.ls +56 -0
  126. data/vendor/prelude-ls/test/Func.ls +36 -0
  127. data/vendor/prelude-ls/test/List.ls +751 -0
  128. data/vendor/prelude-ls/test/Num.ls +258 -0
  129. data/vendor/prelude-ls/test/Obj.ls +145 -0
  130. data/vendor/prelude-ls/test/Prelude.ls +49 -0
  131. data/vendor/prelude-ls/test/Str.ls +208 -0
  132. data/vendor/prelude-ls/test/browser.html +5 -0
  133. metadata +369 -0
@@ -0,0 +1,751 @@
1
+ {
2
+ id
3
+ Num: {even, odd, floor, is-it-NaN}
4
+ List: {
5
+ each, map, filter, compact, reject, partition, find,
6
+ head, first, tail, last, initial, empty,
7
+ reverse, difference, intersection, union, count-by, group-by,
8
+ fold, fold1, foldl, foldl1, foldr, foldr1, unfoldr, and-list, or-list,
9
+ any, all, unique, sort, sort-with, sort-by, sum, product, mean, average,
10
+ concat, concat-map, flatten,
11
+ maximum, minimum, scan, scan1, scanl, scanl1, scanr, scanr1,
12
+ slice, take, drop, split-at, take-while, drop-while, span, break-list,
13
+ zip, zip-with, zip-all, zip-all-with,
14
+ }
15
+ } = require '..'
16
+ {equal: eq, deep-equal: deep-eq, ok} = require 'assert'
17
+
18
+ suite 'each' ->
19
+ test 'empty list as input' ->
20
+ deep-eq [], each id, []
21
+
22
+ test 'side effects affect input (and thus result)' ->
23
+ deep-eq [[1],[2]] each (.pop!), [[1 5] [2 6]]
24
+
25
+ test 'curried' ->
26
+ f = each (.pop!)
27
+ deep-eq [[1],[2]], f [[1 5] [2 6]]
28
+
29
+ suite 'map' ->
30
+ test 'empty list as input' ->
31
+ deep-eq [], map id, []
32
+
33
+ test 'mapping over array' ->
34
+ deep-eq [2 3 4], map (+ 1), [1 2 3]
35
+
36
+ test 'curried' ->
37
+ f = map (+ 1)
38
+ deep-eq [2 3 4], f [1 2 3]
39
+
40
+ suite 'compact' ->
41
+ test 'empty list as input' ->
42
+ deep-eq [], compact []
43
+
44
+ test 'compacting array' ->
45
+ deep-eq [1 true 'ha'], compact [0 1 false true '' 'ha']
46
+
47
+ suite 'filter' ->
48
+ test 'empty list as input' ->
49
+ deep-eq [], filter id, []
50
+
51
+ test 'filtering array' ->
52
+ deep-eq [2, 4], filter even, [1 to 5]
53
+
54
+ test 'filter on true returns original list' ->
55
+ deep-eq [1 2 3], filter (-> true), [1 2 3]
56
+
57
+ test 'filter on false returns empty list' ->
58
+ deep-eq [], filter (-> false), [1 2 3]
59
+
60
+ test 'curried' ->
61
+ f = filter even
62
+ deep-eq [2, 4], f [1 to 5]
63
+
64
+ suite 'reject' ->
65
+ test 'empty list as input' ->
66
+ deep-eq [], reject id, []
67
+
68
+ test 'reject list' ->
69
+ deep-eq [1 3 5], reject even, [1 to 5]
70
+
71
+ test 'reject on true returns empty list' ->
72
+ deep-eq [], reject (-> true), [1 2 3]
73
+
74
+ test 'reject on true returns original list' ->
75
+ deep-eq [1 2 3], reject (-> false), [1 2 3]
76
+
77
+ test 'curried' ->
78
+ f = reject even
79
+ deep-eq [1 3 5], f [1 to 5]
80
+
81
+ suite 'partition' ->
82
+ test 'empty list as input' ->
83
+ deep-eq [[],[]], partition id, []
84
+
85
+ test 'partition list' ->
86
+ deep-eq [[76 88 77 90],[49 58 43]], partition (>60), [49 58 76 43 88 77 90]
87
+
88
+ test 'partition on true returns original list as passing, empty list as failing' ->
89
+ deep-eq [[1 2 3],[]], partition (-> true), [1 2 3]
90
+
91
+ test 'partition on false returns empty list as failing, empty list as passing' ->
92
+ deep-eq [[], [1 2 3]], partition (-> false), [1 2 3]
93
+
94
+ test 'curried' ->
95
+ f = partition (>60)
96
+ deep-eq [[76 88 77 90],[49 58 43]], f [49 58 76 43 88 77 90]
97
+
98
+ suite 'find' ->
99
+ test 'empty list as input' ->
100
+ eq void, find id, []
101
+
102
+ test 'find from list' ->
103
+ eq 4, find even, [3 1 4 8 6]
104
+
105
+ test 'finding nothing when function always false' ->
106
+ eq void, find (-> false), [1 2 3]
107
+
108
+ test 'find first item when function always true' ->
109
+ eq 1, find (-> true), [1 2 3]
110
+
111
+ test 'curried' ->
112
+ f = find even
113
+ eq 4, f [3 1 4 8 6]
114
+
115
+ suite 'list portions' ->
116
+ list = [1 2 3 4 5]
117
+
118
+ suite 'head' ->
119
+ test 'empty list as input' ->
120
+ eq void, head []
121
+
122
+ test 'list' ->
123
+ eq 1, head list
124
+
125
+ test 'first as alias' ->
126
+ eq first, head
127
+
128
+ suite 'tail' ->
129
+ test 'empty list as input' ->
130
+ eq void, tail []
131
+
132
+ test 'list' ->
133
+ deep-eq [2 3 4 5], tail list
134
+
135
+ test 'one element list' ->
136
+ deep-eq [], tail [1]
137
+
138
+ suite 'last' ->
139
+ test 'empty list as input' ->
140
+ eq void, last []
141
+
142
+ test 'list' ->
143
+ eq 5, last list
144
+
145
+ test 'one element list' ->
146
+ eq 1, last [1]
147
+
148
+ suite 'initial' ->
149
+ test 'empty list as input' ->
150
+ eq void, initial []
151
+
152
+ test 'list' ->
153
+ deep-eq [1 2 3 4], initial list
154
+
155
+ test 'one element list' ->
156
+ deep-eq [], initial [1]
157
+
158
+ suite 'empty' ->
159
+ test 'empty list as input' ->
160
+ ok empty []
161
+
162
+ test 'non-empty list as input' ->
163
+ ok not empty [1]
164
+
165
+ suite 'reverse' ->
166
+ test 'empty list as input' ->
167
+ deep-eq [], reverse []
168
+
169
+ test 'reverse list, it is unmodified' ->
170
+ list = [1 2 3 4 5]
171
+ deep-eq [5 4 3 2 1], reverse list
172
+ deep-eq [1 2 3 4 5], list
173
+
174
+ suite 'unique' ->
175
+ test 'empty list as input' ->
176
+ deep-eq [], unique []
177
+
178
+ test 'unique list' ->
179
+ deep-eq [1,2,3,4,5,6], unique [1 1 2 3 3 4 5 5 5 5 5 6 6 6 6]
180
+
181
+ suite 'fold' ->
182
+ test 'empty list as input' ->
183
+ eq 0, fold (+), 0, []
184
+
185
+ test 'list as input' ->
186
+ eq 12, fold (+), 0, [1 2 3 6]
187
+
188
+ test 'foldl is alias' ->
189
+ eq fold, foldl
190
+
191
+ test 'curried' ->
192
+ f = fold (+)
193
+ eq 12, f 0, [1 2 3 6]
194
+
195
+ g = fold (+), 0
196
+ eq 12 g [1 2 3 6]
197
+
198
+ suite 'fold1' ->
199
+ test 'empty list as input' ->
200
+ eq void, fold1 (+), []
201
+
202
+ test 'list as input' ->
203
+ eq 12, fold1 (+), [1 2 3 6]
204
+
205
+ test 'foldl1 as alais' ->
206
+ eq fold1, foldl1
207
+
208
+ test 'curried' ->
209
+ f = fold1 (+)
210
+ eq 12, f [1 2 3 6]
211
+
212
+ suite 'foldr' ->
213
+ test 'empty list as input' ->
214
+ eq 0, foldr (+), 0, []
215
+
216
+ test 'list as input' ->
217
+ eq -1, foldr (-), 9, [1 2 3 4]
218
+
219
+ test 'curried' ->
220
+ f = foldr (-)
221
+ eq -1, f 9, [1 2 3 4]
222
+
223
+ g = foldr (-), 9
224
+ eq -1, g [1 2 3 4]
225
+
226
+ suite 'foldr1' ->
227
+ test 'empty list as input' ->
228
+ eq void, foldr1 (+), []
229
+
230
+ test 'list as input' ->
231
+ eq -1, foldr1 (-), [1 2 3 4 9]
232
+
233
+ test 'curried' ->
234
+ f = foldr1 (-)
235
+ eq -1, f [1 2 3 4 9]
236
+
237
+ suite 'unfoldr' ->
238
+ test 'complex case' ->
239
+ deep-eq [10,9,8,7,6,5,4,3,2,1], unfoldr (-> if it == 0 then null else [it, it - 1]), 10
240
+
241
+ test 'returning null right away results in a one item list' ->
242
+ deep-eq [], unfoldr (-> null), 'a'
243
+
244
+ test 'curried' ->
245
+ f = unfoldr (-> if it == 0 then null else [it, it - 1])
246
+ deep-eq [10,9,8,7,6,5,4,3,2,1], f 10
247
+
248
+ suite 'concat' ->
249
+ test 'empty list as input' ->
250
+ deep-eq [], concat []
251
+
252
+ test 'multiple lists' ->
253
+ deep-eq [1,2,3,4,5,6], concat [[1 2] [3 4] [5 6]]
254
+
255
+ suite 'concat-map' ->
256
+ test 'empty list as input' ->
257
+ deep-eq [], concat-map id, []
258
+
259
+ test 'just using mapping' ->
260
+ deep-eq [1 2 3], concat-map (+ 1), [0 1 2]
261
+
262
+ test 'just using concatinating' ->
263
+ deep-eq [1 2 3], concat-map id, [[1],[2],[3]]
264
+
265
+ test 'using mapping and concatinating' ->
266
+ deep-eq [1,1,2,1,2,3], concat-map (-> [1 to it]), [1 2 3]
267
+
268
+ test 'curried' ->
269
+ f = concat-map (-> [1 to it])
270
+ deep-eq [1,1,2,1,2,3], f [1 2 3]
271
+
272
+ suite 'flatten' ->
273
+ test 'empty list as input' ->
274
+ deep-eq [], flatten []
275
+
276
+ test 'nested lists as input' ->
277
+ deep-eq [1,2,3,4,5], flatten [1, [[2], 3], [4, [[5]]]]
278
+
279
+ test 'lists with strings' ->
280
+ deep-eq ['a','b','c','d','e'], flatten ['a', [['b'], 'c'], ['d', [['e']]]]
281
+
282
+ suite 'difference' ->
283
+ test 'empty list(s) as input' ->
284
+ deep-eq [], difference []
285
+ deep-eq [], difference [] []
286
+
287
+ test 'subtract nothing' ->
288
+ deep-eq [1 2 3], difference [1 2 3]
289
+ deep-eq [1 2 3], difference [1 2 3] []
290
+
291
+ test 'subtract single element' ->
292
+ deep-eq [2 3], difference [1 2 3] [1]
293
+
294
+ test 'subtract multiple elements' ->
295
+ deep-eq [1 3 4], difference [1 2 3 4 5] [5 2 10] [9]
296
+
297
+ suite 'intersection' ->
298
+ test 'empty list(s) as input' ->
299
+ deep-eq [], intersection []
300
+ deep-eq [], intersection [] []
301
+
302
+ test 'no common elements' ->
303
+ deep-eq [],intersection [2 3] [9 8] [12 1] [99]
304
+
305
+ test 'some common elements' ->
306
+ deep-eq [1 2], intersection [1 2 3] [101 2 1 10] [2 1] [-1 0 1 2]
307
+
308
+ test 'all common elements' ->
309
+ deep-eq [1 2 3], intersection [1 2 3] [2 1 3] [3 1 2]
310
+
311
+ suite 'union' ->
312
+ test 'empty list(s) as input' ->
313
+ deep-eq [], union []
314
+ deep-eq [], union [] []
315
+
316
+ test 'list and empty list' ->
317
+ deep-eq [1 2 3], union [1 2 3] []
318
+
319
+ test 'with various' ->
320
+ deep-eq [1 5 7 3], union [1 5 7] [3 5] []
321
+
322
+ suite 'count-by' ->
323
+ test 'empty list as input' ->
324
+ deep-eq [], count-by id, []
325
+
326
+ test 'list of numbers' ->
327
+ deep-eq {4: 1, 6: 2}, count-by floor, [4.2, 6.1, 6.4]
328
+
329
+ test 'list of strings' ->
330
+ deep-eq {3: 2, 5: 1}, count-by (.length), <[ one two three ]>
331
+
332
+ test 'curried' ->
333
+ f = count-by floor
334
+ deep-eq {4: 1, 6: 2}, f [4.2, 6.1, 6.4]
335
+
336
+ suite 'group-by' ->
337
+ test 'empty list as input' ->
338
+ deep-eq [], group-by id, []
339
+
340
+ test 'list of numbers' ->
341
+ deep-eq {4: [4.2], 6: [6.1 6.4]}, group-by floor, [4.2, 6.1, 6.4]
342
+
343
+ test 'list of strings' ->
344
+ deep-eq {3: <[ one two ]>, 5: <[ three ]>}, group-by (.length), <[ one two three ]>
345
+
346
+ test 'curried' ->
347
+ f = group-by floor
348
+ deep-eq {4: [4.2], 6: [6.1 6.4]}, f [4.2, 6.1, 6.4]
349
+
350
+ suite 'and-list' ->
351
+ test 'empty list as input' ->
352
+ ok and-list []
353
+
354
+ test 'true' ->
355
+ ok and-list [true, 2 + 2 == 4]
356
+
357
+ test 'false' ->
358
+ ok not and-list [true true false true]
359
+
360
+ suite 'or-list' ->
361
+ test 'empty list as input' ->
362
+ ok not or-list []
363
+
364
+ test 'true' ->
365
+ ok or-list [false false false true false]
366
+
367
+ test 'false' ->
368
+ ok not or-list [false, 2 + 2 == 3]
369
+
370
+ suite 'any' ->
371
+ test 'empty list as input' ->
372
+ ok not any id, []
373
+
374
+ test 'true' ->
375
+ ok any even, [1 4 3]
376
+
377
+ test 'false' ->
378
+ ok not any even, [1 3 7 5]
379
+
380
+ test 'curried' ->
381
+ f = any even
382
+ ok f [1 4 3]
383
+
384
+ suite 'all' ->
385
+ test 'empty list as input' ->
386
+ ok all even, []
387
+
388
+ test 'true' ->
389
+ ok all even, [2 4 6]
390
+
391
+ test 'false' ->
392
+ ok not all even, [2 5 6]
393
+
394
+ test 'curried' ->
395
+ f = all even
396
+ ok f [2 4 6]
397
+
398
+ suite 'sort' ->
399
+ test 'empty list as input' ->
400
+ deep-eq [], sort []
401
+
402
+ test 'single digit numbers' ->
403
+ deep-eq [1,2,3,4,5,6], sort [3 1 5 2 4 6]
404
+
405
+ test 'multi digit numbers' ->
406
+ deep-eq [2,5,6,12,334,4999], sort [334 12 5 2 4999 6]
407
+
408
+ suite 'sort-with' ->
409
+ f = (x, y) ->
410
+ | x.length > y.length => 1
411
+ | x.length < y.length => -1
412
+ | otherwise => 0
413
+
414
+ test 'empty list as input' ->
415
+ deep-eq [], sort-with id, []
416
+
417
+ test 'complex case' ->
418
+ deep-eq ['one','two','three'], sort-with f, <[ three one two ]>
419
+
420
+ test 'curried' ->
421
+ g = sort-with f
422
+ deep-eq ['one','two','three'], g <[ three one two ]>
423
+
424
+ suite 'sort-by' ->
425
+ arr =
426
+ 'hey'
427
+ 'a'
428
+ 'there'
429
+ 'ha'
430
+
431
+ test 'empty list as input' ->
432
+ deep-eq [], sort-by id, []
433
+
434
+ test 'complex case' ->
435
+ deep-eq ['a', 'ha', 'hey', 'there'], sort-by (.length), arr
436
+
437
+ test 'curried' ->
438
+ f = sort-by (.length)
439
+ deep-eq ['a', 'ha', 'hey', 'there'], f arr
440
+
441
+ suite 'sum' ->
442
+ test 'empty list as input' ->
443
+ eq 0, sum []
444
+
445
+ test 'list as input' ->
446
+ eq 10, sum [1 2 3 4]
447
+
448
+ test 'negative numbers' ->
449
+ eq -2, sum [1 -2 3 -4]
450
+
451
+ suite 'product' ->
452
+ test 'empty list as input' ->
453
+ eq 1, product []
454
+
455
+ test 'list as input' ->
456
+ eq 24, product [1 2 3 4]
457
+
458
+ test 'negative numbers' ->
459
+ eq -6, product [1 -2 3]
460
+
461
+ suite 'mean' ->
462
+ test 'empty list as input' ->
463
+ ok is-it-NaN mean []
464
+
465
+ test 'list as input' ->
466
+ eq 4, mean [2 3 4 5 6]
467
+
468
+ test 'average as alias' ->
469
+ eq mean, average
470
+
471
+ suite 'maximum' ->
472
+ test 'empty list as input' ->
473
+ eq void, maximum []
474
+
475
+ test 'single element list' ->
476
+ eq 1, maximum [1]
477
+
478
+ test 'multi element list' ->
479
+ eq 6, maximum [1 2 6 4 5]
480
+
481
+ suite 'minimum' ->
482
+ test 'empty list as input' ->
483
+ eq void, minimum []
484
+
485
+ test 'single element list' ->
486
+ eq 1, minimum [1]
487
+
488
+ test 'multi element list' ->
489
+ eq 2, minimum [4 3 2 6 9]
490
+
491
+ test 'list of strings' ->
492
+ eq 'a', minimum ['c', 'e', 'a', 'd', 'b']
493
+
494
+ suite 'scan' ->
495
+ test 'empty list as input' ->
496
+ deep-eq [null], scan id, null, []
497
+
498
+ test 'complex case' ->
499
+ deep-eq [4,9,20,43], scan ((x, y) -> 2 * x + y), 4, [1 2 3]
500
+
501
+ test 'scanl as alias' ->
502
+ eq scan, scanl
503
+
504
+ test 'curried' ->
505
+ f = scan ((x, y) -> 2 * x + y)
506
+ deep-eq [4,9,20,43], f 4, [1 2 3]
507
+
508
+ g = scan ((x, y) -> 2 * x + y), 4
509
+ deep-eq [4,9,20,43], g [1 2 3]
510
+
511
+ suite 'scan1' ->
512
+ test 'empty list as input' ->
513
+ deep-eq void, scan1 id, []
514
+
515
+ test 'complex case' ->
516
+ deep-eq [1,3,6,10], scan1 (+), [1 2 3 4]
517
+
518
+ test 'scanl1 as alias' ->
519
+ eq scan1, scanl1
520
+
521
+ test 'curried' ->
522
+ f = scan1 (+)
523
+ deep-eq [1,3,6,10], f [1 2 3 4]
524
+
525
+ suite 'scanr' ->
526
+ test 'empty list as input' ->
527
+ deep-eq [null], scanr id, null, []
528
+
529
+ test 'complex case' ->
530
+ deep-eq [15,14,12,9,5], scanr (+), 5, [1 2 3 4]
531
+
532
+ test 'curried' ->
533
+ f = scanr (+)
534
+ deep-eq [15,14,12,9,5], f 5, [1 2 3 4]
535
+
536
+ g = scanr (+), 5
537
+ deep-eq [15,14,12,9,5], g [1 2 3 4]
538
+
539
+ suite 'scanr1' ->
540
+ test 'empty list as input' ->
541
+ deep-eq void, scanr1 id, []
542
+
543
+ test 'complex case' ->
544
+ deep-eq [10,9,7,4], scanr1 (+), [1 2 3 4]
545
+
546
+ test 'curried' ->
547
+ f = scanr1 (+)
548
+ deep-eq [10,9,7,4], f [1 2 3 4]
549
+
550
+ suite 'slice' ->
551
+ test 'zero to zero' ->
552
+ deep-eq [], slice 0 0 [1 2 3 4 5]
553
+
554
+ test 'empty lsit as input' ->
555
+ deep-eq [], slice 2 3 []
556
+
557
+ test 'parts' ->
558
+ deep-eq [3 4], slice 2 4 [1 2 3 4 5]
559
+
560
+ test 'curried' ->
561
+ f = slice 2
562
+ deep-eq [3 4], f 4 [1 2 3 4 5]
563
+
564
+ g = slice 2 4
565
+ deep-eq [3 4], g [1 2 3 4 5]
566
+
567
+ suite 'take' ->
568
+ test 'empty list as input' ->
569
+ deep-eq [], take 3 []
570
+
571
+ test 'zero on list' ->
572
+ deep-eq [], take 0 [1 2 3 4 5]
573
+
574
+ test 'negative number' ->
575
+ deep-eq [], take -1 [1 2 3 4 5]
576
+
577
+ test 'too big number' ->
578
+ deep-eq [1 2 3 4 5], take 9 [1 2 3 4 5]
579
+
580
+ test 'list' ->
581
+ deep-eq [1 2 3], take 3 [1 2 3 4 5]
582
+
583
+ test 'curried' ->
584
+ f = take 3
585
+ deep-eq [1 2 3], f [1 2 3 4 5]
586
+
587
+ suite 'drop' ->
588
+ test 'empty list as input' ->
589
+ deep-eq [], drop 3 []
590
+
591
+ test 'zero on list' ->
592
+ deep-eq [1 2 3 4 5], drop 0 [1 2 3 4 5]
593
+
594
+ test 'negative number' ->
595
+ deep-eq [1 2 3 4 5], drop -1 [1 2 3 4 5]
596
+
597
+ test 'too big number' ->
598
+ deep-eq [], drop 9 [1 2 3 4 5]
599
+
600
+ test 'list' ->
601
+ deep-eq [4 5], drop 3 [1 2 3 4 5]
602
+
603
+ test 'curried' ->
604
+ f = drop 3
605
+ deep-eq [4 5], f [1 2 3 4 5]
606
+
607
+ suite 'split-at' ->
608
+ test 'empty list as input' ->
609
+ deep-eq [[], []], split-at 3 []
610
+
611
+ test 'zero on list' ->
612
+ deep-eq [[], [1 2 3 4 5]], split-at 0 [1 2 3 4 5]
613
+
614
+ test 'negative number' ->
615
+ deep-eq [[], [1 2 3 4 5]], split-at -1 [1 2 3 4 5]
616
+
617
+ test 'too big number' ->
618
+ deep-eq [[1 2 3 4 5], []], split-at 9 [1 2 3 4 5]
619
+
620
+ test 'list' ->
621
+ deep-eq [[1 2 3], [4 5]], split-at 3 [1 2 3 4 5]
622
+
623
+ test 'curried' ->
624
+ f = split-at 3
625
+ deep-eq [[1 2 3], [4 5]], f [1 2 3 4 5]
626
+
627
+ suite 'take-while' ->
628
+ test 'empty list as input' ->
629
+ deep-eq [], take-while id, []
630
+
631
+ test 'list' ->
632
+ deep-eq [1 3 5], take-while odd, [1 3 5 4 8 7 9]
633
+
634
+ test 'all pass' ->
635
+ deep-eq [42], take-while (== 42), [42]
636
+ deep-eq [2 4 8], take-while even, [2 4 8]
637
+
638
+ test 'all fail' ->
639
+ deep-eq [], take-while (== 7), [42]
640
+ deep-eq [], take-while odd, [2 4 8]
641
+
642
+ test 'curried' ->
643
+ f = take-while odd
644
+ deep-eq [1 3 5], f [1 3 5 4 8 7 9]
645
+
646
+ suite 'drop-while' ->
647
+ test 'empty list as input' ->
648
+ deep-eq [], drop-while id, []
649
+
650
+ test 'list' ->
651
+ deep-eq [7 9 10], drop-while even, [2 4 6 7 9 10]
652
+
653
+ test 'all pass' ->
654
+ deep-eq [], drop-while (== 42), [42]
655
+ deep-eq [], drop-while even, [2 4 8]
656
+
657
+ test 'all-fail' ->
658
+ deep-eq [42], drop-while (== 7), [42]
659
+ deep-eq [2 4 8], drop-while odd, [2 4 8]
660
+
661
+ test 'curried' ->
662
+ f = drop-while even
663
+ deep-eq [7 9 10], f [2 4 6 7 9 10]
664
+
665
+ suite 'span' ->
666
+ test 'empty list as input' ->
667
+ deep-eq [[], []], span id, []
668
+
669
+ test 'list' ->
670
+ deep-eq [[2 4 6], [7 9 10]], span even, [2 4 6 7 9 10]
671
+
672
+ test 'curried' ->
673
+ f = span even
674
+ deep-eq [[2 4 6], [7 9 10]], f [2 4 6 7 9 10]
675
+
676
+ suite 'break-list' ->
677
+ test 'empty list as input' ->
678
+ deep-eq [[], []], break-list id, []
679
+
680
+ test 'list' ->
681
+ deep-eq [[1 2], [3 4 5]], break-list (== 3), [1 2 3 4 5]
682
+
683
+ test 'curried' ->
684
+ f = break-list (== 3)
685
+ deep-eq [[1 2], [3 4 5]], f [1 2 3 4 5]
686
+
687
+ suite 'zip' ->
688
+ test 'empty lists as input' ->
689
+ deep-eq [], zip [] []
690
+
691
+ test 'equal length lists' ->
692
+ deep-eq [[1 4], [2 5]], zip [1 2] [4 5]
693
+
694
+ test 'first list shorter' ->
695
+ deep-eq [[1 4], [2 5]], zip [1 2] [4 5 6]
696
+
697
+ test 'second list shorter' ->
698
+ deep-eq [[1 4], [2 5]], zip [1 2 3] [4 5]
699
+
700
+ test 'curried' ->
701
+ f = zip [1 2]
702
+ deep-eq [[1 4], [2 5]], f [4 5]
703
+
704
+ suite 'zip-with' ->
705
+ test 'empty lists as input' ->
706
+ deep-eq [], zip-with id, [], []
707
+
708
+ test 'equal length lists' ->
709
+ deep-eq [4 4 4], zip-with (+), [1 2 3], [3 2 1]
710
+
711
+ test 'first list shorter' ->
712
+ deep-eq [5 7], zip-with (+), [1 2], [4 5 6]
713
+
714
+ test 'second list shorter' ->
715
+ deep-eq [5 7], zip-with (+), [1 2 3] [4 5]
716
+
717
+ test 'curried' ->
718
+ f = zip-with (+)
719
+ deep-eq [4 4 4], f [1 2 3], [3 2 1]
720
+
721
+ g = zip-with (+), [1 2 3]
722
+ deep-eq [4 4 4], g [3 2 1]
723
+
724
+ suite 'zip-all' ->
725
+ test 'empty lists as input' ->
726
+ deep-eq [], zip-all [] [] []
727
+
728
+ test 'equal length lists' ->
729
+ deep-eq [[1 4 7], [2 5 8], [3 6 9]], zip-all [1 2 3] [4 5 6] [7 8 9]
730
+
731
+ test 'first list shorter' ->
732
+ deep-eq [[1 4 7], [2 5 8]], zip-all [1 2] [4 5 6] [7 8 9]
733
+
734
+ test 'second list shorter' ->
735
+ deep-eq [[1 4 7], [2 5 8]], zip-all [1 2 3] [4 5] [7 8 9]
736
+
737
+ test 'third list shorter' ->
738
+ deep-eq [[1 4 7], [2 5 8]], zip-all [1 2 3] [4 5 6] [7 8]
739
+
740
+ suite 'zip-all-with' ->
741
+ test 'empty lists as input' ->
742
+ deep-eq [], zip-all-with id, [], []
743
+
744
+ test 'equal length lists' ->
745
+ deep-eq [5 5 5], zip-all-with (-> &0 + &1 + &2), [1 2 3], [3 2 1], [1 1 1]
746
+
747
+ test 'first list shorter' ->
748
+ deep-eq [5 7], zip-all-with (+), [1 2], [4 5 6]
749
+
750
+ test 'second list shorter' ->
751
+ deep-eq [5 7], zip-all-with (+), [1 2 3] [4 5]