aboutsummaryrefslogtreecommitdiff
path: root/spec/05-bitflags_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'spec/05-bitflags_spec.lua')
-rw-r--r--spec/05-bitflags_spec.lua114
1 files changed, 114 insertions, 0 deletions
diff --git a/spec/05-bitflags_spec.lua b/spec/05-bitflags_spec.lua
new file mode 100644
index 0000000..8eea27f
--- /dev/null
+++ b/spec/05-bitflags_spec.lua
@@ -0,0 +1,114 @@
1describe("BitFlags library", function()
2
3 local sys = require("system")
4
5 it("creates new flag objects", function()
6 local bf = sys.bitflag(255)
7 assert.is_not_nil(bf)
8 assert.are.equal(255, bf:value())
9 assert.is.userdata(bf)
10 end)
11
12 it("converts to a hex string", function()
13 local bf = sys.bitflag(255)
14 assert.are.equal("bitflags: 255", tostring(bf))
15 end)
16
17 it("handles OR/ADD operations", function()
18 -- one at a time
19 local bf1 = sys.bitflag(1) -- b0001
20 local bf2 = sys.bitflag(2) -- b0010
21 local bf3 = bf1 + bf2 -- b0011
22 assert.are.equal(3, bf3:value())
23 -- multiple at once
24 local bf4 = sys.bitflag(4+8) -- b1100
25 local bf5 = bf3 + bf4 -- b1111
26 assert.are.equal(15, bf5:value())
27 -- multiple that were already set
28 local bf6 = sys.bitflag(15) -- b1111
29 local bf7 = sys.bitflag(8+2) -- b1010
30 local bf8 = bf6 + bf7 -- b1111
31 assert.are.equal(15, bf8:value())
32 end)
33
34 it("handles AND-NOT/SUBSTRACT operations", function()
35 -- one at a time
36 local bf1 = sys.bitflag(3) -- b0011
37 local bf2 = sys.bitflag(1) -- b0001
38 local bf3 = bf1 - bf2 -- b0010
39 assert.are.equal(2, bf3:value())
40 -- multiple at once
41 local bf4 = sys.bitflag(15) -- b1111
42 local bf5 = sys.bitflag(8+2) -- b1010
43 local bf6 = bf4 - bf5 -- b0101
44 assert.are.equal(5, bf6:value())
45 -- multiple that were not set
46 local bf7 = sys.bitflag(3) -- b0011
47 local bf8 = sys.bitflag(15) -- b1111
48 local bf9 = bf7 - bf8 -- b0000
49 assert.are.equal(0, bf9:value())
50 end)
51
52 it("checks for equality", function()
53 local bf1 = sys.bitflag(4)
54 local bf2 = sys.bitflag(4)
55 local bf3 = sys.bitflag(5)
56 assert.is.True(bf1 == bf2)
57 assert.is.False(bf1 == bf3)
58 end)
59
60 it("indexes bits correctly", function()
61 local bf = sys.bitflag(4) -- b100
62 assert.is_true(bf[2])
63 assert.is_false(bf[1])
64 end)
65
66 it("errors on reading invalid bit indexes", function()
67 local bf = sys.bitflag(4)
68 assert.has_error(function() return bf[-10] end, "index out of range")
69 assert.has_error(function() return bf[10000] end, "index out of range")
70 assert.has_no_error(function() return bf.not_a_number end)
71 end)
72
73 it("sets and clears bits correctly", function()
74 local bf = sys.bitflag(8) -- b1000
75 bf[1] = true
76 assert.is_true(bf[1]) -- b1010
77 assert.equals(10, bf:value())
78 bf[1] = false
79 assert.is_false(bf[1]) -- b1000
80 assert.equals(8, bf:value())
81 end)
82
83 it("errors on setting invalid bit indexes", function()
84 local bf = sys.bitflag(0)
85 assert.has_error(function() bf[-10] = true end, "index out of range")
86 assert.has_error(function() bf[10000] = true end, "index out of range")
87 assert.has_error(function() bf.not_a_number = true end, "index must be a number")
88 end)
89
90 it("checks for a subset using 'has_all_of'", function()
91 local bf1 = sys.bitflag(3) -- b0011
92 local bf2 = sys.bitflag(3) -- b0011
93 local bf3 = sys.bitflag(15) -- b1111
94 local bf0 = sys.bitflag(0) -- b0000
95 assert.is_true(bf1:has_all_of(bf2)) -- equal
96 assert.is_true(bf3:has_all_of(bf1)) -- is a subset, and has more flags
97 assert.is_false(bf1:has_all_of(bf3)) -- not a subset, bf3 has more flags
98 assert.is_false(bf1:has_all_of(bf0)) -- bf0 is unset, always returns false
99 end)
100
101 it("checks for a subset using 'has_any_of'", function()
102 local bf1 = sys.bitflag(3) -- b0011
103 local bf2 = sys.bitflag(3) -- b0011
104 local bf3 = sys.bitflag(7) -- b0111
105 local bf4 = sys.bitflag(8) -- b1000
106 local bf0 = sys.bitflag(0) -- b0000
107 assert.is_true(bf1:has_any_of(bf2)) -- equal
108 assert.is_true(bf3:has_any_of(bf1)) -- is a subset, and has more flags
109 assert.is_false(bf3:has_any_of(bf4)) -- no overlap in flags
110 assert.is_true(bf1:has_any_of(bf3)) -- not a subset, bf3 has more flags but still some overlap
111 assert.is_false(bf1:has_all_of(bf0)) -- bf0 is unset, always returns false
112 end)
113
114end)