describe("Readerpaging module", function()
    local sample_pdf = "spec/front/unit/data/sample.pdf"
    local readerui, UIManager, Event, DocumentRegistry, ReaderUI, Screen
    local paging

    setup(function()
        require("commonrequire")
        UIManager = require("ui/uimanager")
        stub(UIManager, "getNthTopWidget")
        UIManager.getNthTopWidget.returns({})
        Event = require("ui/event")
        DocumentRegistry = require("document/documentregistry")
        ReaderUI = require("apps/reader/readerui")
        Screen = require("device").screen
    end)

    describe("Page mode", function()
        setup(function()
            readerui = ReaderUI:new{
                dimen = Screen:getSize(),
                document = DocumentRegistry:openDocument(sample_pdf),
            }
            paging = readerui.paging
        end)
        teardown(function()
            readerui:closeDocument()
            readerui:onClose()
        end)

        it("should emit EndOfBook event at the end", function()
            UIManager:quit()
            UIManager:show(readerui)
            UIManager:nextTick(function()
                UIManager:close(readerui)
                -- We haven't torn it down yet
                ReaderUI.instance = readerui
            end)
            UIManager:run()
            readerui:handleEvent(Event:new("SetScrollMode", false))
            readerui.zooming:setZoomMode("pageheight")
            paging:onGotoPage(readerui.document:getPageCount())
            local called = false
            readerui.onEndOfBook = function()
                called = true
            end
            paging:onGotoViewRel(1)
            assert.is.truthy(called)
            readerui.onEndOfBook = nil
            UIManager:quit()
        end)
    end)

    describe("Scroll mode", function()
        setup(function()
            local purgeDir = require("ffi/util").purgeDir
            local DocSettings = require("docsettings")
            purgeDir(DocSettings:getSidecarDir(sample_pdf))
            os.remove(DocSettings:getHistoryPath(sample_pdf))

            readerui = ReaderUI:new{
                dimen = Screen:getSize(),
                document = DocumentRegistry:openDocument(sample_pdf),
            }
            paging = readerui.paging
        end)
        teardown(function()
            readerui:closeDocument()
            readerui:onClose()
        end)

        it("should emit EndOfBook event at the end", function()
            UIManager:quit()
            UIManager:show(readerui)
            UIManager:nextTick(function()
                UIManager:close(readerui)
                -- We haven't torn it down yet
                ReaderUI.instance = readerui
            end)
            UIManager:run()
            paging.page_positions = {}
            readerui:handleEvent(Event:new("SetScrollMode", true))
            paging:onGotoPage(readerui.document:getPageCount())
            readerui.zooming:setZoomMode("pageheight")
            local called = false
            readerui.onEndOfBook = function()
                called = true
            end
            paging:onGotoViewRel(1)
            paging:onGotoViewRel(1)
            assert.is.truthy(called)
            readerui.onEndOfBook = nil
            UIManager:quit()
        end)

        it("should scroll backward on the first page without crash", function()
            local sample_djvu = "spec/front/unit/data/djvu3spec.djvu"
            -- Unsafe second // ReaderUI instance!
            local tmp_readerui = ReaderUI:new{
                dimen = Screen:getSize(),
                document = DocumentRegistry:openDocument(sample_djvu),
            }
            tmp_readerui.paging:onScrollPanRel(-100)
            tmp_readerui:closeDocument()
            tmp_readerui:onClose()
            -- Restore the ref to the original ReaderUI instance
            ReaderUI.instance = readerui
        end)

        it("should scroll forward on the last page without crash", function()
            local sample_djvu = "spec/front/unit/data/djvu3spec.djvu"
            -- Unsafe second // ReaderUI instance!
            local tmp_readerui = ReaderUI:new{
                dimen = Screen:getSize(),
                document = DocumentRegistry:openDocument(sample_djvu),
            }
            paging = tmp_readerui.paging
            paging:onGotoPage(tmp_readerui.document:getPageCount())
            paging:onScrollPanRel(120)
            paging:onScrollPanRel(-1)
            paging:onScrollPanRel(120)
            tmp_readerui:closeDocument()
            tmp_readerui:onClose()
            -- Restore the ref to the original ReaderUI instance
            ReaderUI.instance = readerui
        end)
    end)
end)
