2
0
mirror of https://github.com/koreader/koreader synced 2024-11-11 19:11:14 +00:00
koreader/spec/unit/readersearch_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

222 lines
9.3 KiB
Lua

describe("Readersearch module", function()
local sample_epub = "spec/front/unit/data/juliet.epub"
local sample_pdf = "spec/front/unit/data/sample.pdf"
local DocumentRegistry, ReaderUI, Screen, dbg
setup(function()
require("commonrequire")
DocumentRegistry = require("document/documentregistry")
ReaderUI = require("apps/reader/readerui")
Screen = require("device").screen
dbg = require("dbg")
end)
describe("search API for EPUB documents", function()
local doc, search, rolling
setup(function()
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_epub),
}
doc = readerui.document
search = readerui.search
rolling = readerui.rolling
end)
it("should search backward", function()
rolling:onGotoPage(10)
assert.truthy(search:searchFromCurrent("Verona", 1))
for i = 1, 100, 10 do
rolling:onGotoPage(i)
local words = search:searchFromCurrent("Verona", 1)
if words then
for _, word in ipairs(words) do
local pageno = doc:getPageFromXPointer(word.start)
--dbg("found at pageno", pageno)
assert.truthy(pageno <= i)
end
end
end
end)
it("should search forward", function()
rolling:onGotoPage(10)
assert.truthy(search:searchFromCurrent("Verona", 0))
for i = 1, 100, 10 do
rolling:onGotoPage(i)
local words = search:searchFromCurrent("Verona", 0)
if words then
for _, word in ipairs(words) do
local pageno = doc:getPageFromXPointer(word.start)
--dbg("found at pageno", pageno)
assert.truthy(pageno >= i)
end
end
end
end)
it("should find the first occurrence", function()
for i = 10, 100, 10 do
rolling:onGotoPage(i)
local words = search:searchFromStart("Verona")
assert.truthy(words)
local pageno = doc:getPageFromXPointer(words[1].start)
assert.truthy(pageno < 10)
end
for i = 1, 5, 1 do
rolling:onGotoPage(i)
local words = search:searchFromStart("Verona")
assert(words == nil)
end
end)
it("should find the last occurrence", function()
-- local logger = require("logger")
-- logger.warn("nb of pages", doc:getPageCount())
-- 20190202: currently 242 pages
for i = 100, 180, 10 do
rolling:onGotoPage(i)
local words = search:searchFromEnd("Verona")
assert.truthy(words)
local pageno = doc:getPageFromXPointer(words[1].start)
-- logger.info("last match on page", pageno)
assert.truthy(pageno > 185)
end
for i = 290, 335, 1 do
rolling:onGotoPage(i)
local words = search:searchFromEnd("Verona")
assert(words == nil)
end
end)
it("should find all occurrences", function()
local count = 0
rolling:onGotoPage(1)
local cur_page = doc:getCurrentPage()
local words = search:searchFromCurrent("Verona", 0)
while words do
local new_page = nil
for _, word in ipairs(words) do
--dbg("found word", word.start)
local word_page = doc:getPageFromXPointer(word.start)
if word_page ~= cur_page then -- ignore words on current page
if not new_page then -- first word on a new page
new_page = word_page
count = count + 1
doc:gotoXPointer(word.start) -- go to this new page
else -- new page seen
if word_page == new_page then -- only count words on this new page
count = count + 1
end
end
end
end
if not new_page then -- no word seen on any new page
break
end
cur_page = doc:getCurrentPage()
words = search:searchNext("Verona", 0)
end
assert.are.equal(13, count)
end)
end)
describe("search API for PDF documents", function()
local doc, search, paging
setup(function()
local readerui = ReaderUI:new{
dimen = Screen:getSize(),
document = DocumentRegistry:openDocument(sample_pdf),
}
doc = readerui.document
search = readerui.search
paging = readerui.paging
end)
it("should match single word with case insensitive option in one page", function()
assert.are.equal(9, #doc.koptinterface:findAllMatches(doc, "what", true, 20))
assert.are.equal(51, #doc.koptinterface:findAllMatches(doc, "the", true, 20))
assert.are.equal(0, #doc.koptinterface:findAllMatches(doc, "xxxx", true, 20))
end)
it("should match single word with case sensitive option in one page", function()
assert.are.equal(7, #doc.koptinterface:findAllMatches(doc, "what", false, 20))
assert.are.equal(49, #doc.koptinterface:findAllMatches(doc, "the", false, 20))
assert.are.equal(0, #doc.koptinterface:findAllMatches(doc, "xxxx", false, 20))
end)
it("should match phrase in one page", function()
assert.are.equal(2*2, #doc.koptinterface:findAllMatches(doc, "mean that", true, 20))
end)
it("should match whole phrase in one page", function()
assert.are.equal(1*3, #doc.koptinterface:findAllMatches(doc, "mean that the", true, 20))
end)
it("should match with lua pattern", function()
assert.are.equal(7*1, #doc.koptinterface:findAllMatches(doc, "chapter", true, 30))
assert.are.equal(3*2, #doc.koptinterface:findAllMatches(doc, "chapter %d", true, 30))
assert.are.equal(2*2, #doc.koptinterface:findAllMatches(doc, "chapter %d%d", true, 30))
assert.are.equal(0*2, #doc.koptinterface:findAllMatches(doc, "chapter %d%d%d", true, 30))
end)
it("should not match empty string", function()
assert.are.equal(0, #doc.koptinterface:findAllMatches(doc, "", true, 1))
end)
it("should not match on page without text layer", function()
assert.are.equal(0, #doc.koptinterface:findAllMatches(doc, "e", true, 1))
end)
it("should search backward", function()
paging:onGotoPage(20)
assert.truthy(search:searchFromCurrent("test", 1))
for i = 1, 40, 10 do
paging:onGotoPage(i)
local words = search:searchFromCurrent("test", 1)
if words then
dbg("search backward: found at page", words.page)
assert.truthy(words.page <= i)
end
end
end)
it("should search forward", function()
paging:onGotoPage(20)
assert.truthy(search:searchFromCurrent("test", 0))
for i = 1, 40, 10 do
paging:onGotoPage(i)
local words = search:searchFromCurrent("test", 0)
if words then
dbg("search forward: found at page", words.page)
assert.truthy(words.page >= i)
end
end
end)
it("should find the first occurrence", function()
for i = 20, 40, 10 do
paging:onGotoPage(i)
local words = search:searchFromStart("test")
assert.truthy(words)
assert.are.equal(10, words.page)
end
for i = 1, 10, 2 do
paging:onGotoPage(i)
local words = search:searchFromStart("test")
assert(words == nil)
end
end)
it("should find the last occurrence", function()
for i = 10, 30, 10 do
paging:onGotoPage(i)
local words = search:searchFromEnd("test")
assert.truthy(words)
assert.are.equal(32, words.page)
end
for i = 40, 50, 2 do
paging:onGotoPage(i)
local words = search:searchFromEnd("test")
assert(words == nil)
end
end)
it("should find all occurrences", function()
local count = 0
paging:onGotoPage(1)
local words = search:searchFromCurrent("test", 0)
while words do
count = count + #words
--dbg("found words", #words, words.page)
paging:onGotoPage(words.page)
words = search:searchNext("test", 0)
end
assert.are.equal(11, count)
end)
end)
end)