Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 80
Expand file tree
/
Copy patharray.lua
More file actions
Latest commit
70 lines (62 loc) · 2.45 KB
/
Copy patharray.lua
File metadata and controls
70 lines (62 loc) · 2.45 KB
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
localassert=require('luassert.assert')
localsay=require('say')
-- Example usage:
-- local arr = { "one", "two", "three" }
--
-- assert.array(arr).has.no.holes() -- checks the array to not contain holes --> passes
-- assert.array(arr).has.no.holes(4) -- sets explicit length to 4 --> fails
--
-- local first_hole = assert.array(arr).has.holes(4) -- check array of size 4 to contain holes --> passes
-- assert.equal(4, first_hole) -- passes, as the index of the first hole is returned
-- Unique key to store the object we operate on in the state object
-- key must be unique, to make sure we do not have name collissions in the shared state object
localARRAY_STATE_KEY="__array_state"
-- The modifier, to store the object in our state
localfunctionarray(state, args, level)
assert(args.n>0, "No array provided to the array-modifier")
assert(rawget(state, ARRAY_STATE_KEY) ==nil, "Array already set")
rawset(state, ARRAY_STATE_KEY, args[1])
returnstate
end
-- The actual assertion that operates on our object, stored via the modifier
localfunctionholes(state, args, level)
locallength=args[1]
localarr=rawget(state, ARRAY_STATE_KEY) -- retrieve previously set object
-- only check against nil, metatable types are allowed
assert(arr~=nil, "No array set, please use the array modifier to set the array to validate")
iflength==nilthen
length=0
foriinpairs(arr) do
iftype(i) =="number" and
i>lengthand
math.floor(i) ==ithen
length=i
end
end
end
assert(type(length) =="number", "expected array length to be of type 'number', got: "..tostring(length))
-- let's do the actual assertion
localmissing
fori=1, lengthdo
ifarr[i] ==nilthen
missing=i
break
end
end
-- format arguments for output strings;
args[1] =missing
args.n=missingand1or0
returnmissing~=nil, { missing } -- assert result + first missing index as return value
end
-- Register the proper assertion messages
say:set("assertion.array_holes.positive", [[
Expected array to have holes, but none were found.
]])
say:set("assertion.array_holes.negative", [[
Expected array to not have holes, but found a hole at index: %s
]])
-- Register the assertion, and the modifier
assert:register("assertion", "holes", holes,
"assertion.array_holes.positive",
"assertion.array_holes.negative")
assert:register("modifier", "array", array)