diff options
| author | Thijs Schreijer <thijs@thijsschreijer.nl> | 2024-06-20 22:43:06 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-20 22:43:06 +0200 |
| commit | c1a64c1b75f97cef97965b3bd9a941564a6270bd (patch) | |
| tree | b9a92dff6462abd5859c3c76f19748fad5d6c025 /spec/05-bitflags_spec.lua | |
| parent | 47c24eed0191f8f72646be63dee94ac2b35eb062 (diff) | |
| parent | b87e6d6d762ee823e81dd7a8984f330eb4018fd8 (diff) | |
| download | luasystem-c1a64c1b75f97cef97965b3bd9a941564a6270bd.tar.gz luasystem-c1a64c1b75f97cef97965b3bd9a941564a6270bd.tar.bz2 luasystem-c1a64c1b75f97cef97965b3bd9a941564a6270bd.zip | |
Merge pull request #21 from lunarmodules/terminal
Diffstat (limited to 'spec/05-bitflags_spec.lua')
| -rw-r--r-- | spec/05-bitflags_spec.lua | 114 |
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 @@ | |||
| 1 | describe("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 | |||
| 114 | end) | ||
