describe("The peripheral library", function()
    local it_modem = peripheral.getType("top") == "modem" and it or pending

    describe("peripheral.isPresent", function()
        it("validates arguments", function()
            peripheral.isPresent("")
            expect.error(peripheral.isPresent, nil):eq("bad argument #1 (expected string, got nil)")
        end)
    end)

    describe("peripheral.getName", function()
        it("validates arguments", function()
            expect.error(peripheral.getName, nil):eq("bad argument #1 (expected table, got nil)")
            expect.error(peripheral.getName, {}):eq("bad argument #1 (table is not a peripheral)")
        end)

        it_modem("can get the name of a wrapped peripheral", function()
            expect(peripheral.getName(peripheral.wrap("top"))):eq("top")
        end)
    end)

    describe("peripheral.getType", function()
        it("validates arguments", function()
            peripheral.getType("")
            expect.error(peripheral.getType, nil):eq("bad argument #1 (expected string or table, got nil)")
            expect.error(peripheral.getType, {}):eq("bad argument #1 (table is not a peripheral)")
        end)

        it_modem("can get the type of a peripheral by side", function()
            expect(peripheral.getType("top")):eq("modem")
        end)

        it_modem("can get the type of a wrapped peripheral", function()
            expect(peripheral.getType(peripheral.wrap("top"))):eq("modem")
        end)
    end)

    describe("peripheral.getMethods", function()
        it("validates arguments", function()
            peripheral.getMethods("")
            expect.error(peripheral.getMethods, nil):eq("bad argument #1 (expected string, got nil)")
        end)
    end)

    describe("peripheral.call", function()
        it("validates arguments", function()
            peripheral.call("", "")
            expect.error(peripheral.call, nil):eq("bad argument #1 (expected string, got nil)")
            expect.error(peripheral.call, "", nil):eq("bad argument #2 (expected string, got nil)")
        end)

        it_modem("has the correct error location", function()
            expect.error(function() peripheral.call("top", "isOpen", false) end)
                :str_match("^[^:]+:%d+: bad argument #1 %(number expected, got boolean%)$")
        end)
    end)

    describe("peripheral.wrap", function()
        it("validates arguments", function()
            peripheral.wrap("")
            expect.error(peripheral.wrap, nil):eq("bad argument #1 (expected string, got nil)")
        end)
    end)

    describe("peripheral.find", function()
        it("validates arguments", function()
            peripheral.find("")
            peripheral.find("", function()
            end)
            expect.error(peripheral.find, nil):eq("bad argument #1 (expected string, got nil)")
            expect.error(peripheral.find, "", false):eq("bad argument #2 (expected function, got boolean)")
        end)
    end)
end)
