tests/ui: warn when the correct state was seen temporarily.

Helped-by: Thiago de Arruda <tpadilha84@gmail.com>
This commit is contained in:
Björn Linse 2015-03-22 15:23:53 +01:00 committed by Thiago de Arruda
parent e5c4c4bca2
commit 1e7624d2a0

View File

@ -230,20 +230,41 @@ end
function Screen:wait(check, timeout) function Screen:wait(check, timeout)
local err, checked = false local err, checked = false
local success_seen = false
local failure_after_success = false
local function notification_cb(method, args) local function notification_cb(method, args)
assert(method == 'redraw') assert(method == 'redraw')
self:_redraw(args) self:_redraw(args)
err = check() err = check()
checked = true checked = true
if not err then if not err then
success_seen = true
stop() stop()
elseif success_seen and #args > 0 then
failure_after_success = true
--print(require('inspect')(args))
end end
return true return true
end end
run(nil, notification_cb, nil, timeout or default_screen_timeout) run(nil, notification_cb, nil, timeout or default_screen_timeout)
if not checked then if not checked then
err = check() err = check()
end end
if failure_after_success then
print([[
Warning: Screen changes have been received after the expected state was seen.
This is probably due to an indeterminism in the test. Try adding
`wait()` (or even a separate `screen:expect(...)`) at a point of possible
indeterminism, typically in between a `feed()` or `execute()` which is non-
synchronous, and a synchronous api call.
]])
local tb = debug.traceback()
local index = string.find(tb, '\n%s*%[C]')
print(string.sub(tb,1,index))
end
if err then if err then
assert(false, err) assert(false, err)
end end