2
0
mirror of https://github.com/koreader/koreader synced 2024-10-31 21:20:20 +00:00
koreader/spec/unit/readersearch_spec.lua
poire-z d8d0def122
Floating punctuation: change default to disabled (#4101)
It was enabled by default, but it's mostly only needed for CJK users.
Furthermore, when floating punctuation is enabled, some rendering
issues exist (text right alignment, variable margins...) that
only CJK developpers could really fix. So, best to disable it and
avoid these rendering issues for most users.

Also: fix CoverBrowser crash when "Delete cache database"
followed by "Prune cache of removed books".
2018-07-24 21:01:45 +02:00

219 lines
9.2 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, dbg
setup(function()
require("commonrequire")
DocumentRegistry = require("document/documentregistry")
ReaderUI = require("apps/reader/readerui")
dbg = require("dbg")
end)
describe("search API for EPUB documents", function()
local doc, search, rolling
setup(function()
local readerui = ReaderUI:new{
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.info("nb of pages", doc:getPageCount())
-- 20180723: currently 189 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 = 230, 235, 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{
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)