2
0
mirror of https://github.com/koreader/koreader synced 2024-11-10 01:10:34 +00:00
koreader/spec/unit/readerfooter_spec.lua
yparitcher f7d538b108
Landscape FM / Refactor rotation (#6309)
* landscape FM / Refactor rotation

refactor and simplify the orientation handling code. the user generally cares about the rotation (what direction the device is facing) and not about if koreader is displaying in portrait or landscape mode

* bump base

update luasocket, libjpeg-turbo, curl
add logging to evernote-sdk-lua
update framebuffer for proper rotation
2020-07-01 16:17:41 -04:00

705 lines
27 KiB
Lua

describe("Readerfooter module", function()
local DocumentRegistry, ReaderUI, DocSettings, UIManager
local purgeDir, Screen
local tapFooterMenu
setup(function()
require("commonrequire")
package.unloadAll()
require("document/canvascontext"):init(require("device"))
DocumentRegistry = require("document/documentregistry")
DocSettings = require("docsettings")
ReaderUI = require("apps/reader/readerui")
UIManager = require("ui/uimanager")
purgeDir = require("ffi/util").purgeDir
Screen = require("device").screen
function tapFooterMenu(menu_items, menu_title)
local status_bar = menu_items.status_bar
if status_bar then
for _, subitem in ipairs(status_bar.sub_item_table) do
if subitem.text_func and subitem.text_func() == menu_title then
subitem.callback()
return
end
if subitem.text == menu_title then
subitem.callback()
return
end
if subitem.sub_item_table then
local status_bar_sub_item = subitem.sub_item_table
for _, sub_subitem in ipairs(status_bar_sub_item) do
if sub_subitem.text_func and sub_subitem.text_func() == menu_title then
sub_subitem.callback()
return
end
if sub_subitem.text == menu_title then
sub_subitem.callback()
return
end
end
end
end
error('Menu item not found: "' .. menu_title .. '"!')
end
error('Menu item not found: "Status bar"!')
end
end)
before_each(function()
G_reader_settings:saveSetting("footer", {
disabled = false,
all_at_once = true,
toc_markers = true,
battery = true,
time = true,
page_progress = true,
pages_left = true,
percentage = true,
book_time_to_read = true,
chapter_time_to_read = true,
})
UIManager:run()
end)
it("should setup footer as visible in all_at_once mode", function()
G_reader_settings:saveSetting("reader_footer_mode", 1)
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
assert.is.same(true, readerui.view.footer_visible)
G_reader_settings:delSetting("reader_footer_mode")
end)
it("should setup footer as visible not in all_at_once", function()
G_reader_settings:saveSetting("footer", {
disabled = false,
all_at_once = false,
toc_markers = true,
battery = true,
time = true,
page_progress = true,
pages_left = true,
percentage = true,
book_time_to_read = true,
chapter_time_to_read = true,
})
G_reader_settings:saveSetting("reader_footer_mode", 1)
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
assert.is.same(true, readerui.view.footer_visible)
assert.is.same(1, readerui.view.footer.mode, 1)
G_reader_settings:delSetting("reader_footer_mode")
end)
it("should setup footer as invisible in full screen mode", function()
G_reader_settings:saveSetting("reader_footer_mode", 1)
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
local cfg = DocSettings:open(sample_pdf)
cfg:saveSetting("kopt_full_screen", 0)
cfg:flush()
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
assert.is.same(false, readerui.view.footer_visible)
G_reader_settings:delSetting("reader_footer_mode")
end)
it("should setup footer as visible in mini progress bar mode", function()
G_reader_settings:saveSetting("reader_footer_mode", 1)
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
local cfg = DocSettings:open(sample_pdf)
cfg:saveSetting("kopt_full_screen", 0)
cfg:flush()
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
assert.is.same(false, readerui.view.footer_visible)
G_reader_settings:delSetting("reader_footer_mode")
end)
it("should setup footer as invisible", function()
G_reader_settings:saveSetting("reader_footer_mode", 1)
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
local cfg = DocSettings:open(sample_epub)
cfg:saveSetting("copt_status_line", 1)
cfg:flush()
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
assert.is.same(true, readerui.view.footer_visible)
G_reader_settings:delSetting("reader_footer_mode")
end)
it("should setup footer for epub without error", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
footer:onPageUpdate(1)
footer:updateFooter()
local timeinfo = footer.textGeneratorMap.time(footer)
local page_count = readerui.document:getPageCount()
-- stats has not been initialized here, so we get na TB and TC
assert.are.same('1 / '..page_count..' | '..timeinfo..' | ⇒ 0 | 0% | ⤠ 0% | ⏳ na | ⤻ na',
footer.footer_text.text)
end)
it("should setup footer for pdf without error", function()
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
local footer = readerui.view.footer
readerui.view.footer:updateFooter()
local timeinfo = readerui.view.footer.textGeneratorMap.time(footer)
assert.are.same('1 / 2 | '..timeinfo..' | ⇒ 1 | 0% | ⤠ 50% | ⏳ na | ⤻ na',
readerui.view.footer.footer_text.text)
end)
it("should switch between different modes", function()
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
local fake_menu = {setting = {}}
local footer = readerui.view.footer
footer:addToMainMenu(fake_menu)
footer:resetLayout()
footer:updateFooter()
local timeinfo = footer.textGeneratorMap.time(footer)
assert.are.same('1 / 2 | '..timeinfo..' | ⇒ 1 | 0% | ⤠ 50% | ⏳ na | ⤻ na',
footer.footer_text.text)
-- disable show all at once, page progress should be on the first
tapFooterMenu(fake_menu, "Show all at once")
assert.are.same('1 / 2', footer.footer_text.text)
-- disable page progress, time should follow
tapFooterMenu(fake_menu, "Current page".." (/)")
assert.are.same(timeinfo, footer.footer_text.text)
-- disable time, page left should follow
tapFooterMenu(fake_menu, "Current time".." (⌚)")
assert.are.same('⇒ 1', footer.footer_text.text)
-- disable page left, battery should follow
tapFooterMenu(fake_menu, "Pages left in chapter".." (⇒)")
assert.are.same('0%', footer.footer_text.text)
-- disable battery, percentage should follow
tapFooterMenu(fake_menu, "Battery status".." ()")
assert.are.same('⤠ 50%', footer.footer_text.text)
-- disable percentage, book time to read should follow
tapFooterMenu(fake_menu, "Progress percentage".." (⤠)")
assert.are.same('⏳ na', footer.footer_text.text)
-- disable book time to read, chapter time to read should follow
tapFooterMenu(fake_menu, "Book time to read".." (⏳)")
assert.are.same('⤻ na', footer.footer_text.text)
-- disable chapter time to read, text should be empty
tapFooterMenu(fake_menu, "Chapter time to read".." (⤻)")
assert.are.same('', footer.footer_text.text)
-- reenable chapter time to read, text should be chapter time to read
tapFooterMenu(fake_menu, "Chapter time to read".." (⤻)")
assert.are.same('⤻ na', footer.footer_text.text)
end)
it("should rotate through different modes", function()
local sample_pdf = "spec/front/unit/data/2col.pdf"
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
local footer = readerui.view.footer
footer.settings.all_at_once = false
footer.mode = 0
footer:onTapFooter()
assert.is.same(1, footer.mode)
footer:onTapFooter()
assert.is.same(2, footer.mode)
footer:onTapFooter()
assert.is.same(3, footer.mode)
footer:onTapFooter()
assert.is.same(4, footer.mode)
footer:onTapFooter()
assert.is.same(5, footer.mode)
footer:onTapFooter()
assert.is.same(6, footer.mode)
footer:onTapFooter()
assert.is.same(7, footer.mode)
footer:onTapFooter()
assert.is.same(0, footer.mode)
footer.settings.all_at_once = true
footer.mode = 5
footer:onTapFooter()
assert.is.same(0, footer.mode)
footer:onTapFooter()
assert.is.same(1, footer.mode)
footer:onTapFooter()
assert.is.same(0, footer.mode)
-- Make it visible again to make the following tests behave...
footer:onTapFooter()
assert.is.same(1, footer.mode)
end)
it("should pick up screen resize in resetLayout", function()
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
local footer = readerui.view.footer
local horizontal_margin = Screen:scaleBySize(10)*2
footer:updateFooter()
assert.is.same(354, footer.text_width)
assert.is.same(600, footer.progress_bar.width
+ footer.text_width
+ horizontal_margin)
assert.is.same(226, footer.progress_bar.width)
local old_screen_getwidth = Screen.getWidth
Screen.getWidth = function() return 900 end
footer:resetLayout()
assert.is.same(354, footer.text_width)
assert.is.same(900, footer.progress_bar.width
+ footer.text_width
+ horizontal_margin)
assert.is.same(526, footer.progress_bar.width)
Screen.getWidth = old_screen_getwidth
end)
it("should update width on PosUpdate event", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
footer:onPageUpdate(1)
assert.are.same(218, footer.progress_bar.width)
assert.are.same(362, footer.text_width)
footer:onPageUpdate(100)
assert.are.same(194, footer.progress_bar.width)
assert.are.same(386, footer.text_width)
end)
it("should support chapter markers", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
G_reader_settings:saveSetting("footer", {
toc_markers = true,
})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
footer:onPageUpdate(1)
local page_count = readerui.document:getPageCount()
assert.are.same(28, #footer.progress_bar.ticks)
assert.are.same(page_count, footer.progress_bar.last)
-- test toggle TOC markers
footer.settings.toc_markers = false
footer:setTocMarkers()
assert.are.same(nil, footer.progress_bar.ticks)
end)
it("should schedule/unschedule auto refresh time task", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
UIManager:quit()
assert.are.same({}, UIManager._task_queue)
G_reader_settings:saveSetting("footer", {
page_progress = true,
auto_refresh_time = true,
})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
local found = 0
for _,task in ipairs(UIManager._task_queue) do
if task.action == footer.autoRefreshTime then
found = found + 1
end
end
assert.is.same(1, found)
footer:onCloseDocument()
found = 0
for _,task in ipairs(UIManager._task_queue) do
if task.action == footer.autoRefreshTime then
found = found + 1
end
end
assert.is.same(0, found)
end)
it("should not schedule auto refresh time task if footer is disabled", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
UIManager:quit()
assert.are.same({}, UIManager._task_queue)
G_reader_settings:saveSetting("footer", {
disabled = true,
page_progress = true,
auto_refresh_time = true,
})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
local found = 0
for _,task in ipairs(UIManager._task_queue) do
if task.action == footer.autoRefreshTime then
found = found + 1
end
end
assert.is.same(0, found)
end)
it("should toggle auto refresh time task by toggling the menu", function()
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
UIManager:quit()
assert.are.same({}, UIManager._task_queue)
G_reader_settings:saveSetting("footer", {
disabled = false,
page_progress = true,
auto_refresh_time = true,
})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
local footer = readerui.view.footer
local fake_menu = {setting = {}}
footer:addToMainMenu(fake_menu)
local found = 0
for _,task in ipairs(UIManager._task_queue) do
if task.action == footer.autoRefreshTime then
found = found + 1
end
end
assert.is.same(1, found)
-- disable auto refresh time
tapFooterMenu(fake_menu, "Auto refresh time")
found = 0
for _,task in ipairs(UIManager._task_queue) do
if task.action == footer.autoRefreshTime then
found = found + 1
end
end
assert.is.same(0, found)
-- enable auto refresh time again
tapFooterMenu(fake_menu, "Auto refresh time")
found = 0
for _,task in ipairs(UIManager._task_queue) do
if task.action == footer.autoRefreshTime then
found = found + 1
end
end
assert.is.same(1, found)
end)
it("should support toggle footer through menu if tap zone is disabled", function()
local saved_tap_zone_minibar = DTAP_ZONE_MINIBAR
DTAP_ZONE_MINIBAR.w = 0 --luacheck: ignore
DTAP_ZONE_MINIBAR.h = 0 --luacheck: ignore
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
UIManager:quit()
assert.are.same({}, UIManager._task_queue)
G_reader_settings:saveSetting("reader_footer_mode", 1)
G_reader_settings:saveSetting("footer", {
disabled = false,
page_progress = true,
time = true,
})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
local footer = readerui.view.footer
local fake_menu = {setting = {}}
footer:addToMainMenu(fake_menu)
local has_toggle_menu = false
if fake_menu.status_bar then
for _, subitem in ipairs(fake_menu.status_bar.sub_item_table) do
if subitem.text == 'Toggle mode' then
has_toggle_menu = true
break
end
end
end
assert.is.truthy(has_toggle_menu)
assert.is.same(1, footer.mode)
tapFooterMenu(fake_menu, "Toggle mode")
assert.is.same(2, footer.mode)
DTAP_ZONE_MINIBAR = saved_tap_zone_minibar --luacheck: ignore
end)
it("should remove and add modes to footer text in all_at_once mode", function()
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
UIManager:quit()
assert.are.same({}, UIManager._task_queue)
G_reader_settings:saveSetting("footer", {
all_at_once = true,
page_progress = true,
pages_left = true,
})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
local footer = readerui.view.footer
local fake_menu = {setting = {}}
footer:addToMainMenu(fake_menu)
assert.are.same('1 / 2 | ⇒ 1', footer.footer_text.text)
-- remove mode from footer text
tapFooterMenu(fake_menu, "Pages left in chapter".." (⇒)")
assert.are.same('1 / 2', footer.footer_text.text)
-- add mode to footer text
tapFooterMenu(fake_menu, "Progress percentage".." (⤠)")
assert.are.same('1 / 2 | ⤠ 50%', footer.footer_text.text)
end)
it("should initialize text mode in all_at_once mode", function()
local sample_pdf = "spec/front/unit/data/2col.pdf"
purgeDir(DocSettings:getSidecarDir(sample_pdf))
os.remove(DocSettings:getHistoryPath(sample_pdf))
UIManager:quit()
assert.are.same({}, UIManager._task_queue)
G_reader_settings:saveSetting("reader_footer_mode", 0)
G_reader_settings:saveSetting("footer", {
all_at_once = true,
page_progress = true,
pages_left = true,
})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf)
}
local footer = readerui.view.footer
assert.is.truthy(footer.settings.all_at_once)
assert.is.truthy(0, footer.mode)
assert.is.falsy(readerui.view.footer_visible)
end)
it("should support disabling all the modes", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
UIManager:quit()
assert.are.same({}, UIManager._task_queue)
G_reader_settings:saveSetting("footer", {})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
local fake_menu = {setting = {}}
footer:addToMainMenu(fake_menu)
assert.is.same(true, footer.has_no_mode)
assert.is.same(0, footer.text_width)
tapFooterMenu(fake_menu, "Progress percentage".." (⤠)")
assert.are.same('⤠ 0%', footer.footer_text.text)
assert.is.same(false, footer.has_no_mode)
assert.is.same(footer.footer_text:getSize().w + footer.text_left_margin,
footer.text_width)
tapFooterMenu(fake_menu, "Progress percentage".." (⤠)")
assert.is.same(true, footer.has_no_mode)
-- test in all at once mode
tapFooterMenu(fake_menu, "Progress percentage".." (⤠)")
tapFooterMenu(fake_menu, "Show all at once")
assert.is.same(false, footer.has_no_mode)
tapFooterMenu(fake_menu, "Progress percentage".." (⤠)")
assert.is.same(true, footer.has_no_mode)
tapFooterMenu(fake_menu, "Progress percentage".." (⤠)")
assert.is.same(false, footer.has_no_mode)
end)
it("should return correct footer height in time mode", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
UIManager:quit()
G_reader_settings:saveSetting("reader_footer_mode", 2)
G_reader_settings:saveSetting("footer", { time = true })
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
assert.falsy(footer.has_no_mode)
assert.truthy(readerui.view.footer_visible)
assert.is.same(15, footer:getHeight())
end)
it("should return correct footer height when all modes are disabled", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
UIManager:quit()
G_reader_settings:saveSetting("reader_footer_mode", 1)
G_reader_settings:saveSetting("footer", {})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
assert.truthy(footer.has_no_mode)
assert.truthy(readerui.view.footer_visible)
assert.is.same(15, footer:getHeight())
end)
it("should disable footer when all modes + progressbar are disabled", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
UIManager:quit()
G_reader_settings:saveSetting("reader_footer_mode", 1)
G_reader_settings:saveSetting("footer", {disable_progress_bar = true})
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
assert.truthy(footer.has_no_mode)
assert.falsy(readerui.view.footer_visible)
end)
it("should disable footer if settings.disabled is true", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
purgeDir(DocSettings:getSidecarDir(sample_epub))
os.remove(DocSettings:getHistoryPath(sample_epub))
UIManager:quit()
G_reader_settings:saveSetting("footer", { disabled = true })
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
local footer = readerui.view.footer
assert.falsy(readerui.view.footer_visible)
assert.truthy(footer.onCloseDocument == nil)
assert.truthy(footer.mode == 0)
end)
it("should toggle between full and min progress bar for cre documents", function()
local sample_txt = "spec/front/unit/data/sample.txt"
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_txt),
}
local footer = readerui.view.footer
footer:applyFooterMode(0)
assert.is.same(0, footer.mode)
assert.falsy(readerui.view.footer_visible)
readerui.rolling:onSetStatusLine(1)
assert.is.same(1, footer.mode)
assert.truthy(readerui.view.footer_visible)
footer.mode = 1
readerui.rolling:onSetStatusLine(1)
assert.is.same(1, footer.mode)
assert.truthy(readerui.view.footer_visible)
readerui.rolling:onSetStatusLine(0)
assert.is.same(0, footer.mode)
assert.falsy(readerui.view.footer_visible)
end)
end)