3
0
mirror of https://github.com/britzl/monarch.git synced 2025-11-26 19:00:53 +01:00

Compare commits

..

15 Commits
4.2.0 ... 4.6.1

Author SHA1 Message Date
Björn Ritzl
b01f5d28c3 Update monarch.lua 2023-12-27 15:54:09 +01:00
Pete Garcin
43e847dacc Guard DEPRECATED transition_id overwriting transition_url (#100) 2023-12-27 15:52:36 +01:00
Björn Ritzl
ce5ca26b6c Update README_TRANSITIONS.md
Fixes #102
2023-12-27 15:51:38 +01:00
Björn Ritzl
742779d749 Allow monarch.post() to loaded screens
Fixes #98
2023-10-26 13:54:14 +02:00
Björn Ritzl
84944f3f22 Added monarch.is_loaded() 2023-10-26 11:43:19 +02:00
Björn Ritzl
c473aa053c Update monarch.lua 2023-08-31 09:25:00 +02:00
Björn Ritzl
169236acbd Improved on_post() to also accept a url 2023-08-31 09:22:24 +02:00
Björn Ritzl
b7053d2ce4 Fixed another back issue (and tests) 2023-08-10 00:21:15 +02:00
Björn Ritzl
91204ca30b Wait for both in and out transitions (#97) 2023-08-10 00:08:10 +02:00
Björn Ritzl
6f79bd0326 Swap transition count and listener order 2023-08-08 23:51:48 +02:00
Björn Ritzl
e5214edb22 Fix back() callback 2023-08-08 23:51:29 +02:00
Björn Ritzl
1d4e48c0de Update test_monarch.lua 2023-08-08 22:55:29 +02:00
Björn Ritzl
5bdc3e4540 Added option table to back() 2023-08-08 22:53:00 +02:00
Björn Ritzl
85123c84e9 Show how to use monarch listeners 2023-08-08 22:49:58 +02:00
Björn Ritzl
a605f4f6f8 Fixed tests 2023-08-03 10:42:06 +02:00
7 changed files with 156 additions and 64 deletions

View File

@@ -40,13 +40,18 @@ Clear the stack of screens completely. Any visible screen will be hidden by navi
* `callback` (function) - Optional function to call when the stack has been cleared. * `callback` (function) - Optional function to call when the stack has been cleared.
## monarch.back([data], [callback]) ## monarch.back([options], [data], [callback])
Go back to a previous Monarch screen. This operation will be added to the queue if Monarch is busy. Go back to a previous Monarch screen. This operation will be added to the queue if Monarch is busy.
**PARAMETERS** **PARAMETERS**
* `options` (table) - Options when showing the new screen (see below).
* `data` (table) - Optional data to associate with the screen you are going back to. Retrieve using `monarch.data()`. * `data` (table) - Optional data to associate with the screen you are going back to. Retrieve using `monarch.data()`.
* `callback` (function) - Optional function to call when the previous screen is visible. * `callback` (function) - Optional function to call when the previous screen is visible.
The options table can contain the following fields:
* `sequential` (boolean) - If the `sequential` flag is set Monarch will start loading the screen only after the previous screen finished transitioning out.
## monarch.preload(screen_id, [options], [callback]) ## monarch.preload(screen_id, [options], [callback])
Preload a Monarch screen. This will load but not enable the screen. This is useful for content heavy screens that you wish to be able to show without having to wait for it load. This operation will be added to the queue if Monarch is busy. Preload a Monarch screen. This will load but not enable the screen. This is useful for content heavy screens that you wish to be able to show without having to wait for it load. This operation will be added to the queue if Monarch is busy.
@@ -207,12 +212,14 @@ IMPORTANT! You must call `monarch.on_message(message_id, message, sender)` from
* `fn` (function) - The function to call screen focus changes * `fn` (function) - The function to call screen focus changes
## monarch.on_post(screen_id, fn) ## monarch.on_post(screen_id, fn_or_url)
Set a function to be called when `msg.post()` is called on a specific screen. IMPORTANT! You must call `monarch.on_message(message_id, message, sender)` from the same script as this function was called. Set either a function to be called when `msg.post()` is called on a specific screen or a URL where the message is sent.
IMPORTANT! If you provide a function you must also make sure to call `monarch.on_message(message_id, message, sender)` from the same script as this function was called.
**PARAMETERS** **PARAMETERS**
* `screen_id` (string|hash) - Id of the screen * `screen_id` (string|hash) - Id of the screen
* `fn` (function) - The function to call when the screen receives a message using `msg.post` * `fn_or_url` (function) - The function to call or URL to send message to
## monarch.debug() ## monarch.debug()

View File

@@ -114,7 +114,7 @@ end
function on_message(self, message_id, message, sender) function on_message(self, message_id, message, sender)
if message_id == hash("my_resize_message") then if message_id == hash("my_resize_message") then
self.transition.window_resized(message.width, message.height) transition.window_resized(message.width, message.height)
end end
end end
``` ```

View File

@@ -4,10 +4,25 @@ function init(self)
monarch.debug() monarch.debug()
msg.post("@render:/", "clear_color", { color = vmath.vector4(0.4, 0.6, 0.8,1.0) }) msg.post("@render:/", "clear_color", { color = vmath.vector4(0.4, 0.6, 0.8,1.0) })
msg.post("#", "init_monarch") -- wait until init() has been called for all screen.script instances msg.post("#", "init_monarch") -- wait until init() has been called for all screen.script instances
monarch.add_listener()
end
function final(self)
monarch.remove_listener()
end end
function on_message(self, message_id, message, sender) function on_message(self, message_id, message, sender)
if message_id == hash("init_monarch") then if message_id == hash("init_monarch") then
monarch.show(hash("window1")) monarch.show(hash("window1"))
elseif message_id == monarch.SCREEN_TRANSITION_IN_STARTED then
print("Monarch screen transition in started", message.screen)
elseif message_id == monarch.SCREEN_TRANSITION_IN_FINISHED then
print("Monarch screen transition in finished", message.screen)
elseif message_id == monarch.SCREEN_TRANSITION_OUT_STARTED then
print("Monarch screen transition out started", message.screen)
elseif message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED then
print("Monarch screen transition out finished", message.screen)
elseif message_id == monarch.SCREEN_TRANSITION_FAILED then
print("Monarch screen transition failed")
end end
end end

View File

@@ -228,6 +228,17 @@ function M.is_visible(id)
end end
--- Check if a screen is loaded
-- @param id (string|hash)
-- @return true if the screen is loaded
function M.is_loaded(id)
assert(id, "You must provide a screen id")
id = tohash(id)
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
return screens[id].loaded
end
--- Check if a screen is a popup --- Check if a screen is a popup
-- @param id Screen id -- @param id Screen id
-- @return true if the screen is a popup -- @return true if the screen is a popup
@@ -509,8 +520,12 @@ local function load(screen)
msg.post(screen.proxy, MSG_ENABLE) msg.post(screen.proxy, MSG_ENABLE)
elseif screen.factory then elseif screen.factory then
screen.factory_ids = collectionfactory.create(screen.factory) screen.factory_ids = collectionfactory.create(screen.factory)
screen.transition_url = screen.factory_ids[screen.transition_id] if screen.transition_id then
screen.focus_url = screen.factory_ids[screen.focus_id] screen.transition_url = screen.factory_ids[screen.transition_id]
end
if screen.focus_id then
screen.focus_url = screen.factory_ids[screen.focus_id]
end
end end
screen.loaded = true screen.loaded = true
screen.preloaded = false screen.preloaded = false
@@ -715,8 +730,8 @@ local function back_out(screen, next_screen, wait_for_transition, cb)
log("back_out()", screen.id) log("back_out()", screen.id)
assert(wait_for_transition ~= nil) assert(wait_for_transition ~= nil)
run_coroutine(screen, cb, function() run_coroutine(screen, cb, function()
notify_transition_listeners(M.SCREEN_TRANSITION_OUT_STARTED, { screen = screen.id, next_screen = next_screen and next_screen.id })
active_transition_count = active_transition_count + 1 active_transition_count = active_transition_count + 1
notify_transition_listeners(M.SCREEN_TRANSITION_OUT_STARTED, { screen = screen.id, next_screen = next_screen and next_screen.id })
change_context(screen) change_context(screen)
release_input(screen, next_screen) release_input(screen, next_screen)
focus_lost(screen, next_screen) focus_lost(screen, next_screen)
@@ -863,13 +878,10 @@ function M.show(id, options, data, cb)
show_in(screen, top, options and options.reload, add_to_stack, WAIT_FOR_TRANSITION, callbacks.track()) show_in(screen, top, options and options.reload, add_to_stack, WAIT_FOR_TRANSITION, callbacks.track())
else else
-- show screen -- show screen
local cb = callbacks.track() show_in(screen, top, options and options.reload, add_to_stack, WAIT_FOR_TRANSITION, callbacks.track())
show_in(screen, top, options and options.reload, add_to_stack, DO_NOT_WAIT_FOR_TRANSITION, function() if add_to_stack and top and not top.popup then
if add_to_stack and top and not top.popup then show_out(top, screen, WAIT_FOR_TRANSITION, callbacks.track())
show_out(top, screen, WAIT_FOR_TRANSITION, callbacks.track()) end
end
cb()
end)
end end
callbacks.when_done(function() callbacks.when_done(function()
@@ -965,21 +977,38 @@ end
-- Go back to the previous screen in the stack. -- Go back to the previous screen in the stack.
-- @param options (table) - Table with options when backing out from the screen (can be nil).
-- Valid values:
-- * sequential - Set to true to wait for the current screen to hide itself out before starting the
-- back in transition even when transitioning to a different scene ID.
-- @param data (*) - Optional data to set for the previous screen -- @param data (*) - Optional data to set for the previous screen
-- @param cb (function) - Optional callback to invoke when the previous screen is visible again -- @param cb (function) - Optional callback to invoke when the previous screen is visible again
function M.back(data, cb) function M.back(options, data, cb)
log("back() queuing action") log("back() queuing action")
-- backwards compatibility with old version M.back(data, cb)
-- case when back(data, cb)
if type(data) == "function" then
cb = data
data = options
options = nil
-- case when back(data, nil)
elseif options ~= nil and data == nil and cb == nil then
data = options
options = nil
end
queue_action(function(action_done) queue_action(function(action_done)
local callbacks = callback_tracker() local callbacks = callback_tracker()
local back_cb = callbacks.track()
local screen = table.remove(stack) local screen = table.remove(stack)
if screen then if screen then
log("back()", screen.id) log("back()", screen.id)
local top = stack[#stack] local top = stack[#stack]
-- if we go back to the same screen we need to first hide it -- if we go back to the same screen we need to first hide it
-- and wait until it is hidden before we show it again -- and wait until it is hidden before we show it again
if top and screen.id == top.id then local same_screen = top and top.id == screen.id
if same_screen or (options and options.sequential) then
local back_cb = callbacks.track()
back_out(screen, top, WAIT_FOR_TRANSITION, function() back_out(screen, top, WAIT_FOR_TRANSITION, function()
if data then if data then
top.data = data top.data = data
@@ -997,16 +1026,16 @@ function M.back(data, cb)
-- we do this to ensure that we do not reset the times step of the screen -- we do this to ensure that we do not reset the times step of the screen
-- we go back to until it is no longer obscured by the popup -- we go back to until it is no longer obscured by the popup
if screen.popup and not top.popup then if screen.popup and not top.popup then
local back_cb = callbacks.track()
back_out(screen, top, WAIT_FOR_TRANSITION, function() back_out(screen, top, WAIT_FOR_TRANSITION, function()
back_in(top, screen, WAIT_FOR_TRANSITION, back_cb) back_in(top, screen, WAIT_FOR_TRANSITION, back_cb)
end) end)
else else
back_in(top, screen, DO_NOT_WAIT_FOR_TRANSITION, function() back_in(top, screen, WAIT_FOR_TRANSITION, callbacks.track())
back_out(screen, top, WAIT_FOR_TRANSITION, back_cb) back_out(screen, top, WAIT_FOR_TRANSITION, callbacks.track())
end)
end end
else else
back_out(screen, top, WAIT_FOR_TRANSITION, back_cb) back_out(screen, top, WAIT_FOR_TRANSITION, callbacks.track())
end end
end end
end end
@@ -1164,8 +1193,8 @@ end
-- @return error (string|nil) Error message if unable to send message -- @return error (string|nil) Error message if unable to send message
function M.post(id, message_id, message) function M.post(id, message_id, message)
assert(id, "You must provide a screen id") assert(id, "You must provide a screen id")
if not M.is_visible(id) then if not M.is_loaded(id) then
return false, "Unable to post message to screen if it isn't visible" return false, "Unable to post message to screen if it isn't loaded"
end end
assert(message_id, "You must provide a message_id") assert(message_id, "You must provide a message_id")
@@ -1317,20 +1346,30 @@ function M.on_focus_changed(id, fn)
end end
--- ---
-- Set a function to call when a screen is sent a message using monarch.post() -- Set either a function to be called when msg.post() is called on a specific
-- The function will receive (message_id, message, sender) -- screen or a URL where the message is sent.
-- IMPORTANT! You must call monarch.on_message() from the same script as -- IMPORTANT! If you provide a function you must also make sure to call
-- this function was called -- monarch.on_message(message_id, message, sender) from the same script as
-- this function was called.
-- @param id Screen id to associate the message listener function with -- @param id Screen id to associate the message listener function with
-- @param fn Message listener function -- @param fn_or_url The function to call or URL to send message to
function M.on_post(id, fn) function M.on_post(id, fn_or_url)
assert(id, "You must provide a screen id") assert(id, "You must provide a screen id")
assert(fn, "You must provide a post receiver function")
id = tohash(id) id = tohash(id)
assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id))) assert(screens[id], ("There is no screen registered with id %s"):format(tostring(id)))
local screen = screens[id] local screen = screens[id]
screen.receiver_url = msg.url()
screen.receiver_fn = fn local t = type(fn_or_url)
if t == "function" then
screen.receiver_fn = fn_or_url
screen.receiver_url = msg.url()
elseif t == "userdata" or t == "string" then
screen.receiver_fn = nil
screen.receiver_url = fn_or_url
else
screen.receiver_fn = nil
screen.receiver_url = msg.url()
end
end end
local function url_to_key(url) local function url_to_key(url)

View File

@@ -1,5 +1,11 @@
local monarch
function init(self) function init(self)
print("init - screen1") monarch = require "monarch.monarch"
print("init - screen1", msg.url())
monarch.on_post("screen1", function(message_id, message, sender)
_G.screen1_on_post = message or true
end)
end end
function final(self) function final(self)
@@ -7,7 +13,8 @@ function final(self)
end end
function on_message(self, message_id, message, sender) function on_message(self, message_id, message, sender)
monarch.on_message(message_id, message, sender)
if message_id == hash("foobar") then if message_id == hash("foobar") then
_G.screen1_foobar = message or true _G.screen1_on_message = message or true
end end
end end

View File

@@ -1,5 +1,11 @@
local monarch
function init(self) function init(self)
print("init - screen2") monarch = require "monarch.monarch"
print("init - screen2", msg.url())
monarch.on_post("screen2", function(message_id, message, sender)
_G.screen2_on_post = message or true
end)
end end
function final(self) function final(self)
@@ -7,7 +13,8 @@ function final(self)
end end
function on_message(self, message_id, message, sender) function on_message(self, message_id, message, sender)
monarch.on_message(message_id, message, sender)
if message_id == hash("foobar") then if message_id == hash("foobar") then
_G.screen2_foobar = message or true _G.screen2_on_message = message or true
end end
end end

View File

@@ -12,7 +12,6 @@ local FOCUS1 = hash("focus1")
local BACKGROUND = hash("background") local BACKGROUND = hash("background")
local POPUP1 = hash("popup1") local POPUP1 = hash("popup1")
local POPUP2 = hash("popup2") local POPUP2 = hash("popup2")
local FOOBAR = hash("foobar")
local TRANSITION1 = hash("transition1") local TRANSITION1 = hash("transition1")
local function check_stack(expected_screens) local function check_stack(expected_screens)
@@ -82,7 +81,7 @@ return function()
monarch.when_preloaded(screen_id, done) monarch.when_preloaded(screen_id, done)
end) end)
end end
describe("monarch", function() describe("monarch", function()
before(function() before(function()
mock_msg.mock() mock_msg.mock()
@@ -143,12 +142,12 @@ return function()
monarch.show(SCREEN1) monarch.show(SCREEN1)
assert(wait_until_stack({ SCREEN1 })) assert(wait_until_stack({ SCREEN1 }))
assert(wait_until_visible(SCREEN1)) assert(wait_until_visible(SCREEN1))
monarch.show(SCREEN2) monarch.show(SCREEN2)
assert(wait_until_stack({ SCREEN1, SCREEN2 })) assert(wait_until_stack({ SCREEN1, SCREEN2 }))
assert(wait_until_hidden(SCREEN1)) assert(wait_until_hidden(SCREEN1))
assert(wait_until_visible(SCREEN2)) assert(wait_until_visible(SCREEN2))
monarch.show(POPUP1) monarch.show(POPUP1)
assert(wait_until_stack({ SCREEN1, SCREEN2, POPUP1 })) assert(wait_until_stack({ SCREEN1, SCREEN2, POPUP1 }))
assert(wait_until_hidden(SCREEN1)) assert(wait_until_hidden(SCREEN1))
@@ -156,6 +155,17 @@ return function()
assert(wait_until_visible(POPUP1)) assert(wait_until_visible(POPUP1))
end) end)
it("should be able to tell if a screen is loaded or not", function()
assert(not monarch.is_loaded(SCREEN1))
monarch.show(SCREEN1)
assert(wait_until_visible(SCREEN1))
assert(monarch.is_loaded(SCREEN1))
monarch.hide(SCREEN1)
assert(wait_until_hidden(SCREEN1))
assert(not monarch.is_loaded(SCREEN1))
end)
it("should be able to show a screen without adding it to the stack", function() it("should be able to show a screen without adding it to the stack", function()
monarch.show(BACKGROUND, { no_stack = true }) monarch.show(BACKGROUND, { no_stack = true })
assert(wait_until_visible(BACKGROUND), "Background was never shown") assert(wait_until_visible(BACKGROUND), "Background was never shown")
@@ -220,7 +230,7 @@ return function()
assert(monarch.data(SCREEN2) == data2, "Expected data on screen2 doesn't match actual data") assert(monarch.data(SCREEN2) == data2, "Expected data on screen2 doesn't match actual data")
local data_back = { going = "back" } local data_back = { going = "back" }
monarch.back(data_back) monarch.back(nil, data_back)
assert(wait_until_visible(SCREEN1)) assert(wait_until_visible(SCREEN1))
assert(monarch.data(SCREEN1) == data_back, "Expected data on screen1 doesn't match actual data") assert(monarch.data(SCREEN1) == data_back, "Expected data on screen1 doesn't match actual data")
@@ -416,7 +426,7 @@ return function()
assert(mock_msg.messages(URL1)[2].message.screen == SCREEN1) assert(mock_msg.messages(URL1)[2].message.screen == SCREEN1)
assert(mock_msg.messages(URL2)[2].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED) assert(mock_msg.messages(URL2)[2].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
assert(mock_msg.messages(URL2)[2].message.screen == SCREEN1) assert(mock_msg.messages(URL2)[2].message.screen == SCREEN1)
monarch.remove_listener(URL2) monarch.remove_listener(URL2)
monarch.show(SCREEN2) monarch.show(SCREEN2)
assert(wait_until_not_busy()) assert(wait_until_not_busy())
@@ -425,10 +435,10 @@ return function()
assert(#mock_msg.messages(URL2) == 2) assert(#mock_msg.messages(URL2) == 2)
assert(mock_msg.messages(URL1)[3].message_id == monarch.SCREEN_TRANSITION_IN_STARTED) assert(mock_msg.messages(URL1)[3].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
assert(mock_msg.messages(URL1)[3].message.screen == SCREEN2) assert(mock_msg.messages(URL1)[3].message.screen == SCREEN2)
assert(mock_msg.messages(URL1)[4].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED) assert(mock_msg.messages(URL1)[4].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
assert(mock_msg.messages(URL1)[4].message.screen == SCREEN2) assert(mock_msg.messages(URL1)[4].message.screen == SCREEN1)
assert(mock_msg.messages(URL1)[5].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED) assert(mock_msg.messages(URL1)[5].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
assert(mock_msg.messages(URL1)[5].message.screen == SCREEN1) assert(mock_msg.messages(URL1)[5].message.screen == SCREEN2)
assert(mock_msg.messages(URL1)[6].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED) assert(mock_msg.messages(URL1)[6].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
assert(mock_msg.messages(URL1)[6].message.screen == SCREEN1) assert(mock_msg.messages(URL1)[6].message.screen == SCREEN1)
@@ -439,10 +449,10 @@ return function()
assert(#mock_msg.messages(URL2) == 2) assert(#mock_msg.messages(URL2) == 2)
assert(mock_msg.messages(URL1)[7].message_id == monarch.SCREEN_TRANSITION_IN_STARTED) assert(mock_msg.messages(URL1)[7].message_id == monarch.SCREEN_TRANSITION_IN_STARTED)
assert(mock_msg.messages(URL1)[7].message.screen == SCREEN1) assert(mock_msg.messages(URL1)[7].message.screen == SCREEN1)
assert(mock_msg.messages(URL1)[8].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED) assert(mock_msg.messages(URL1)[8].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED)
assert(mock_msg.messages(URL1)[8].message.screen == SCREEN1) assert(mock_msg.messages(URL1)[8].message.screen == SCREEN2)
assert(mock_msg.messages(URL1)[9].message_id == monarch.SCREEN_TRANSITION_OUT_STARTED) assert(mock_msg.messages(URL1)[9].message_id == monarch.SCREEN_TRANSITION_IN_FINISHED)
assert(mock_msg.messages(URL1)[9].message.screen == SCREEN2) assert(mock_msg.messages(URL1)[9].message.screen == SCREEN1)
assert(mock_msg.messages(URL1)[10].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED) assert(mock_msg.messages(URL1)[10].message_id == monarch.SCREEN_TRANSITION_OUT_FINISHED)
assert(mock_msg.messages(URL1)[10].message.screen == SCREEN2) assert(mock_msg.messages(URL1)[10].message.screen == SCREEN2)
end) end)
@@ -491,49 +501,56 @@ return function()
it("should be able to post messages without message data to visible screens", function() it("should be able to post messages without message data to visible screens", function()
_G.screen1_foobar = nil _G.screen1_on_message = nil
_G.screen2_foobar = nil _G.screen1_on_post = nil
_G.screen2_on_message = nil
_G.screen2_on_post = nil
-- proxy screen -- proxy screen
monarch.show(SCREEN1) monarch.show(SCREEN1)
wait_until_visible(SCREEN1) wait_until_visible(SCREEN1)
assert(monarch.post(SCREEN1, "foobar"), "Expected monarch.post() to return true") assert(monarch.post(SCREEN1, "foobar"), "Expected monarch.post() to return true")
cowait(0.1) cowait(0.1)
assert(_G.screen1_foobar, "Screen1 never received a message") assert(_G.screen1_on_message, "Screen1 never received a message")
assert(_G.screen1_on_post, "Screen1 never received a callback")
-- factory screen -- factory screen
monarch.show(SCREEN2) monarch.show(SCREEN2)
wait_until_visible(SCREEN2) wait_until_visible(SCREEN2)
assert(monarch.post(SCREEN2, "foobar"), "Expected monarch.post() to return true") assert(monarch.post(SCREEN2, "foobar"), "Expected monarch.post() to return true")
cowait(0.1) cowait(0.1)
assert(_G.screen2_foobar, "Screen2 never received a message") assert(_G.screen2_on_message, "Screen2 never received a message")
assert(_G.screen2_on_post, "Screen2 never received a callback")
end) end)
it("should be able to post messages with message data to visible screens", function() it("should be able to post messages with message data to visible screens", function()
_G.screen1_foobar = nil _G.screen1_on_message = nil
_G.screen2_foobar = nil _G.screen1_on_post = nil
_G.screen2_on_message = nil
_G.screen2_on_post = nil
-- proxy screen -- proxy screen
monarch.show(SCREEN1) monarch.show(SCREEN1)
wait_until_visible(SCREEN1) wait_until_visible(SCREEN1)
assert(monarch.post(SCREEN1, "foobar", { foo = "bar" }), "Expected monarch.post() to return true") assert(monarch.post(SCREEN1, "foobar", { foo = "bar" }), "Expected monarch.post() to return true")
cowait(0.1) cowait(0.1)
assert(_G.screen1_foobar, "Screen1 never received a message") assert(_G.screen1_on_message, "Screen1 never received a message")
assert(_G.screen1_foobar.foo == "bar", "Screen1 never received message data") assert(_G.screen1_on_message.foo == "bar", "Screen1 never received message data")
-- factory screen -- factory screen
monarch.show(SCREEN2) monarch.show(SCREEN2)
wait_until_visible(SCREEN2) wait_until_visible(SCREEN2)
assert(monarch.post(SCREEN2, "foobar", { foo = "bar" }), "Expected monarch.post() to return true") assert(monarch.post(SCREEN2, "foobar", { foo = "bar" }), "Expected monarch.post() to return true")
cowait(0.1) cowait(0.1)
assert(_G.screen2_foobar, "Screen2 never received a message") assert(_G.screen2_on_message, "Screen2 never received a message")
assert(_G.screen2_foobar.foo == "bar", "Screen2 never received message data") assert(_G.screen2_on_message.foo == "bar", "Screen2 never received message data")
end) end)
it("should not be able to post messages to hidden screens", function() it("should not be able to post messages to hidden screens", function()
_G.screen1_foobar = nil _G.screen1_on_message = nil
_G.screen1_on_post = nil
monarch.show(SCREEN1) monarch.show(SCREEN1)
monarch.show(SCREEN2) monarch.show(SCREEN2)
@@ -542,7 +559,7 @@ return function()
local ok, err = monarch.post(SCREEN1, "foobar") local ok, err = monarch.post(SCREEN1, "foobar")
assert(not ok and err, "Expected monarch.post() to return false plus an error message") assert(not ok and err, "Expected monarch.post() to return false plus an error message")
cowait(0.1) cowait(0.1)
assert(not _G.screen1_foobar, "Screen1 should not have received a message") assert(not _G.screen1_on_message, "Screen1 should not have received a message")
end) end)