Skip to content

Commit

Permalink
test(register and override_page)!: add new cov
Browse files Browse the repository at this point in the history
BREAKING CHANGE: override_page now allows for tab renaming, to ensure
that state is always consistant.
BREAKING CHANGE: More runtime typechecking is done.
  • Loading branch information
Lazerbeak12345 committed Oct 1, 2023
1 parent 957e1d8 commit 8489600
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 27 deletions.
51 changes: 32 additions & 19 deletions api.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3,47 +3,60 @@ sway.pages = {}
sway.pages_unordered = {}
local contexts = {}
sway.enabled = true
sway.widgets = {}
local gui = flow.widgets

-- TODO: use fake tabheader

function sway.register_page(name, def)
assert(name, "Invalid sway page. Requires a name")
assert(def, "Invalid sway page. Requires a def[inition] table")
assert(def.get, "Invalid sway page. Def requires a get function.")
assert(not sway.pages[name], "Attempt to register already registered sway page " .. dump(name))
assert(type(name) == "string", "[sway] register_page: requires name to be string")
assert(type(def) == "table", "[sway] register_page: requires definition table to be table")
assert(type(def.get) == "function", "[sway] register_page: requires get inside the definition table to be function")
assert(not sway.pages[name], "[sway] register_page: page '" .. name .. "' must not already be registered")

sway.pages[name] = def
def.name = name
table.insert(sway.pages_unordered, def)
end

function sway.override_page(name, def)
minetest.log("action", "overriding page " .. name)
assert(name, "Invalid sway page override. Requires a name")
assert(def, "Invalid sway page override. Requires a def[inition] table")
assert(type(name) == "string", "[sway] override_page: requires name to be a string")
assert(type(def) == "table", "[sway] override_page: requires definition table to be a table")
local page = sway.pages[name]
assert(page, "Attempt to override sway page " .. dump(name) .. " which does not exist.")
assert(type(page) == "table", "[sway] override_page: the page '" .. name .. "' could not be found to override")
if type(def.name) ~= "nil" then
assert(type(def.name) == "string", "[sway] override_page: When overriding the name, it must be a string.")
end
if type(def.get) ~= "nil" then
assert(type(def.get) == "function", "[sway] override_page: When overriding get, it must be a function.")
end
minetest.log("action", "[sway] override_page: '" .. name .. "' is becoming overriden")
for key, value in pairs(def) do
page[key] = value
end
if type(def.name) == "string" and name ~= def.name then
minetest.log("action", "[sway] override_page: '" .. name .. "' is becoming renamed to '" .. page.name .. "'")
sway.pages[page.name] = page
sway.pages[name] = nil
end
end

function sway.NavGui(fields)
local nav_titles = fields.nav_titles
local current_idx = fields.current_idx
if #nav_titles > 1 then
return gui.Tabheader{
h = 1,
name = "sway_nav_tabs",
captions = nav_titles,
current_tab = current_idx,
transparent = true,
draw_border = false,
on_event = function(player, context)
sway.set_page(player, context.nav[context.form.sway_nav_tabs])
end
return gui.HBox{
gui.Spacer{ expand = false, w = .2 },
gui.Tabheader{
h = 1,
name = "sway_nav_tabs",
captions = nav_titles,
current_tab = current_idx,
transparent = true,
draw_border = false,
on_event = function(player, context)
sway.set_page(player, context.nav[context.form.sway_nav_tabs])
end
}
}
else
return gui.Nil{}
Expand Down
142 changes: 134 additions & 8 deletions spec/sway_inv_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,6 @@ local function debug(...)
return ...
end
assert(debug) -- Hack to make it so I don't have to ignore that this function is usually unused.
_G.dump = function (...)
local out = "(\n"
for _, value in ipairs{ ... } do
out = out .. value .. ",\n"
end
return out .. ")\n"
end
local FORMSPEC_AST_PATH = '../formspec_ast'
_G.FORMSPEC_AST_PATH = FORMSPEC_AST_PATH
function minetest.get_modpath(modname)
Expand All @@ -45,7 +38,8 @@ _G.minetest = minetest -- Must be defined after formspec_ast runs
dofile"../flow/init.lua"
dofile"../flow-extras/init.lua"
dofile"init.lua"
local describe, it, assert = describe, it, assert
local describe, it, assert, pending, stub, before_each = describe, it, assert, pending, stub, before_each
assert(pending, "Hack to ensure pending doesn't give errors if it's not in use")
local sway = sway
describe("*basics*", function ()
it("doesn't error out when loading init.lua", function ()
Expand All @@ -55,3 +49,135 @@ describe("*basics*", function ()
assert.equal("table", type(sway), "sway is a table")
end)
end)
describe("pages", function ()
local testpagename = "sway:test"
before_each(function()
sway.pages = {}
sway.pages_unordered = {}
end)
describe("register_page", function ()
it("requires name", function ()
assert.has_error(function ()
sway.register_page()
end, "[sway] register_page: requires name to be string")
end)
it("requires name is string", function ()
assert.has_error(function ()
sway.register_page({}, { get = true })
end, "[sway] register_page: requires name to be string")
end)
it("requires definition table", function ()
assert.has_error(function ()
sway.register_page(testpagename)
end, "[sway] register_page: requires definition table to be table")
end)
it("requires definition table is table", function ()
assert.has_error(function ()
sway.register_page(testpagename, true)
end, "[sway] register_page: requires definition table to be table")
end)
it("requires get inside table", function ()
assert.has_error(function ()
sway.register_page(testpagename, {})
end, "[sway] register_page: requires get inside the definition table to be function")
end)
it("requires get inside table to be function", function ()
assert.has_error(function ()
sway.register_page(testpagename, { get = true })
end, "[sway] register_page: requires get inside the definition table to be function")
end)
it("page must not already be registered", function ()
sway.register_page(testpagename, { get = function () end })
assert.has_error(function ()
sway.register_page(testpagename, { get = function () end })
end, "[sway] register_page: page '" .. testpagename .. "' must not already be registered")
end)
it("inserts name into def, puts def into pages as key and pages_unordered", function ()
local def = { get = function () end }
sway.register_page(testpagename, def)
assert.equals(testpagename, def.name)
assert.equals(def, sway.pages[testpagename])
assert.equals(def, sway.pages_unordered[1])
end)
end)
describe("override_page", function ()
it("requires name", function ()
assert.has_error(function ()
sway.override_page()
end, "[sway] override_page: requires name to be a string")
end)
it("requires name to be a string", function ()
assert.has_error(function ()
sway.override_page({}, { get = function() end })
end, "[sway] override_page: requires name to be a string")
end)
it("requires definition table", function ()
assert.has_error(function ()
sway.override_page(testpagename)
end, "[sway] override_page: requires definition table to be a table")
end)
it("requires definition table to be a string", function ()
assert.has_error(function ()
sway.override_page(testpagename, true)
end, "[sway] override_page: requires definition table to be a table")
end)
it("requires that the page must already exsist", function ()
assert.has_error(function ()
sway.override_page(testpagename, {})
end, "[sway] override_page: the page '" .. testpagename .. "' could not be found to override")
end)
it("logs that a page is getting overriden", function ()
sway.register_page(testpagename, { get = function () end })
stub(minetest, "log")
sway.override_page(testpagename, {})
assert.stub(minetest.log).was.called_with(
"action",
"[sway] override_page: '" .. testpagename .. "' is becoming overriden"
)
assert.stub(minetest.log).was.called(1)
end)
it("copies all keys from the new def onto the old table", function ()
local def = { a = 1, b = 2, get = function () end }
local override = { b = 100, c = "value", thingy = {} }
sway.register_page(testpagename, def)
sway.override_page(testpagename, override)
assert.same({ a = 1, b = 100, c = "value", get = def.get, thingy = {}, name = testpagename }, def)
assert.are_not.equal(def, override)
assert.are_not.same(def, override)
assert.equal(override.thingy, def.thingy)
end)
-- This is to prevent invalid state, and also why it can be a bad idea to store self-refrences.
it("ensures that changing name in def will update sway.def", function ()
local def = { get = function () end }
local override = { name = "sway:test2" }
sway.register_page(testpagename, def)
stub(minetest, "log")
sway.override_page(testpagename, override)
assert.same({
["sway:test2"] = def,
}, sway.pages)
assert.same({ def }, sway.pages_unordered)
assert.stub(minetest.log).was.called_with(
"action",
"[sway] override_page: '" .. testpagename .. "' is becoming renamed to 'sway:test2'"
)
end)
it("requires overrides to name to be a string", function ()
sway.register_page(testpagename, { get = function () end})
assert.has_error(function ()
sway.override_page(testpagename, { name = true })
end, "[sway] override_page: When overriding the name, it must be a string.")
end)
it("requires overrides to get to be a function", function ()
sway.register_page(testpagename, { get = function () end})
assert.has_error(function ()
sway.override_page(testpagename, { get = true })
end, "[sway] override_page: When overriding get, it must be a function.")
end)
end)
pending"pages"
pending"pages_unordered"
pending"get_homepage_name"
pending"set_page"
pending"get_page"
end)

0 comments on commit 8489600

Please sign in to comment.