-
Notifications
You must be signed in to change notification settings - Fork 219
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Document and test the redstone library
The tests may be a little agressive, but I wanted some sanity checks for the 1.15 API rewrite.
- Loading branch information
Showing
5 changed files
with
221 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,120 @@ | ||
--[[- Interact with redstone attached to this computer. | ||
The @{redstone} library exposes three "types" of redstone control: | ||
- Binary input/output (@{setOutput}/@{getInput}): These simply check if a | ||
redstone wire has any input or output. A signal strength of 1 and 15 are | ||
treated the same. | ||
- Analogue input/output (@{setAnalogueOutput}/@{getAnalogueInput}): These | ||
work with the actual signal strength of the redstone wired, from 0 to 15. | ||
- Bundled cables (@{setBundledOutput}/@{getBundledInput}): These interact with | ||
"bundled" cables, such as those from Project:Red. These allow you to send | ||
16 separate on/off signals. Each channel corresponds to a colour, with the | ||
first being @{colors.white} and the last @{colors.black}. | ||
Whenever a redstone input changes, a `redstone` event will be fired. This may | ||
be used in or | ||
This module may also be referred to as `rs`. For example, one may call | ||
`rs.getSides()` instead of @{redstone.getSides}. | ||
@module redstone | ||
@usage Toggle the redstone signal above the computer every 0.5 seconds. | ||
while true do | ||
redstone.setOutput("top", not redstone.getOutput("top")) | ||
sleep(0.5) | ||
end | ||
@usage Mimic a redstone comparator in [subtraction mode][comparator]. | ||
while true do | ||
local rear = rs.getAnalogueInput("back") | ||
local sides = math.max(rs.getAnalogueInput("left"), rs.getAnalogueInput("right")) | ||
rs.setAnalogueOutput("front", math.max(rear - sides, 0)) | ||
os.pullEvent("redstone") -- Wait for a change to inputs. | ||
end | ||
[comparator]: https://minecraft.gamepedia.com/Redstone_Comparator#Subtract_signal_strength "Redstone Comparator on the Minecraft wiki." | ||
]] | ||
|
||
--- Returns a table containing the six sides of the computer. Namely, "top", | ||
-- "bottom", "left", "right", "front" and "back". | ||
-- | ||
-- @treturn { string... } A table of valid sides. | ||
function getSides() end | ||
|
||
--- Turn the redstone signal of a specific side on or off. | ||
-- | ||
-- @tparam string side The side to set. | ||
-- @tparam boolean on Whether the redstone signal should be on or off. When on, | ||
-- a signal strength of 15 is emitted. | ||
function setOutput(side, on) end | ||
|
||
--- Get the current redstone output of a specific side. | ||
-- | ||
-- @tparam string side The side to get. | ||
-- @treturn boolean Whether the redstone output is on or off. | ||
-- @see setOutput | ||
function getOutput(side) end | ||
|
||
--- Get the current redstone input of a specific side. | ||
-- | ||
-- @tparam string side The side to get. | ||
-- @treturn boolean Whether the redstone input is on or off. | ||
function getInput(side) end | ||
function setBundledOutput(side, output) end | ||
function getBundledOutput(side) end | ||
function getBundledInput(side) end | ||
function testBundledInput(side, mask) end | ||
|
||
--- Set the redstone signal strength for a specific side. | ||
-- | ||
-- @tparam string side The side to set. | ||
-- @tparam number value The signal strength, between 0 and 15. | ||
-- @throws If `value` is not between 0 and 15. | ||
function setAnalogOutput(side, value) end | ||
setAnalogueOutput = setAnalogOutput | ||
|
||
--- Get the redstone output signal strength for a specific side. | ||
-- | ||
-- @tparam string side The side to get. | ||
-- @treturn number The output signal strength, between 0 and 15. | ||
-- @see setAnalogueOutput | ||
function getAnalogOutput(sid) end | ||
getAnalogueOutput = getAnalogOutput | ||
|
||
--- Get the redstone input signal strength for a specific side. | ||
-- | ||
-- @tparam string side The side to get. | ||
-- @treturn number The input signal strength, between 0 and 15. | ||
function getAnalogInput(side) end | ||
getAnalogueInput = getAnalogInput | ||
|
||
--- Set the bundled cable output for a specific side. | ||
-- | ||
-- @tparam string side The side to set. | ||
-- @tparam number The colour bitmask to set. | ||
-- @see colors.subtract For removing a colour from the bitmask. | ||
-- @see colors.combine For adding a colour to the bitmask. | ||
function setBundledOutput(side, output) end | ||
|
||
--- Get the bundled cable output for a specific side. | ||
-- | ||
-- @tparam string side The side to get. | ||
-- @treturn number The bundled cable's output. | ||
function getBundledOutput(side) end | ||
|
||
--- Get the bundled cable input for a specific side. | ||
-- | ||
-- @tparam string side The side to get. | ||
-- @treturn number The bundled cable's input. | ||
-- @see testBundledInput To determine if a specific colour is set. | ||
function getBundledInput(side) end | ||
|
||
--- Determine if a specific combination of colours are on for the given side. | ||
-- | ||
-- @tparam string side The side to test. | ||
-- @tparam number mask The mask to test. | ||
-- @see getBundledInput | ||
-- @see colors.combine For adding a colour to the bitmask. | ||
-- @usage Check if @{colors.white} and @{colors.black} are on for above the | ||
-- computer. | ||
-- | ||
-- print(redstone.testBundledInput("top", colors.combine(colors.white, colors.black))) | ||
function testBundledInput(side, mask) end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
local function it_side(func, ...) | ||
local arg = table.pack(...) | ||
it("requires a specific side", function() | ||
expect.error(func, 0):eq("bad argument #1 (string expected, got number)") | ||
expect.error(func, "blah", table.unpack(arg)):eq("Invalid side.") | ||
|
||
func("top", table.unpack(arg)) | ||
func("Top", table.unpack(arg)) | ||
func("toP", table.unpack(arg)) | ||
end) | ||
end | ||
|
||
describe("The redstone library", function() | ||
describe("redstone.setOutput", function() | ||
it_side(redstone.setOutput, false) | ||
|
||
it("sets the output strength correctly", function() | ||
redstone.setOutput("top", false) | ||
expect(redstone.getAnalogueOutput("top")):eq(0) | ||
|
||
redstone.setOutput("top", true) | ||
expect(redstone.getAnalogueOutput("top")):eq(15) | ||
end) | ||
end) | ||
|
||
describe("redstone.getOutput", function() | ||
it_side(redstone.getOutput) | ||
|
||
it("gets the output strength correctly", function() | ||
redstone.setAnalogueOutput("top", 0) | ||
expect(redstone.getOutput("top")):eq(false) | ||
|
||
redstone.setAnalogueOutput("top", 1) | ||
expect(redstone.getOutput("top")):eq(true) | ||
|
||
redstone.setAnalogueOutput("top", 15) | ||
expect(redstone.getOutput("top")):eq(true) | ||
end) | ||
end) | ||
|
||
describe("redstone.getInput", function() | ||
it_side(redstone.getInput) | ||
end) | ||
|
||
describe("redstone.setAnalogueOutput", function() | ||
it_side(redstone.setAnalogueOutput, 0) | ||
|
||
it("checks the strength parameter", function() | ||
expect.error(redstone.setAnalogueOutput, "top", true):eq("bad argument #2 (number expected, got boolean)") | ||
expect.error(redstone.setAnalogueOutput, "top", 0 / 0):eq("bad argument #2 (number expected, got nan)") | ||
expect.error(redstone.setAnalogueOutput, "top", math.huge):eq("bad argument #2 (number expected, got inf)") | ||
expect.error(redstone.setAnalogueOutput, "top", -1):eq("Expected number in range 0-15") | ||
expect.error(redstone.setAnalogueOutput, "top", 16):eq("Expected number in range 0-15") | ||
end) | ||
end) | ||
|
||
describe("redstone.getAnalogueOutput", function() | ||
it_side(redstone.getAnalogueOutput) | ||
end) | ||
|
||
describe("redstone.getAnalogueInput", function() | ||
it_side(redstone.getAnalogueInput) | ||
end) | ||
|
||
describe("redstone.setBundledOutput", function() | ||
it_side(redstone.setBundledOutput, 0) | ||
|
||
it("checks the mask parameter", function() | ||
expect.error(redstone.setBundledOutput, "top", true):eq("bad argument #2 (number expected, got boolean)") | ||
expect.error(redstone.setBundledOutput, "top", 0 / 0):eq("bad argument #2 (number expected, got nan)") | ||
expect.error(redstone.setBundledOutput, "top", math.huge):eq("bad argument #2 (number expected, got inf)") | ||
end) | ||
end) | ||
|
||
describe("redstone.getBundledOutput", function() | ||
it_side(redstone.getBundledOutput) | ||
end) | ||
|
||
describe("redstone.getBundledInput", function() | ||
it_side(redstone.getBundledInput) | ||
end) | ||
|
||
describe("redstone.testBundledInput", function() | ||
it_side(redstone.testBundledInput, 0) | ||
|
||
it("checks the mask parameter", function() | ||
expect.error(redstone.testBundledInput, "top", true):eq("bad argument #2 (number expected, got boolean)") | ||
expect.error(redstone.testBundledInput, "top", 0 / 0):eq("bad argument #2 (number expected, got nan)") | ||
expect.error(redstone.testBundledInput, "top", math.huge):eq("bad argument #2 (number expected, got inf)") | ||
end) | ||
end) | ||
end) |