describe("Readertoc module", function()
    local DocumentRegistry, ReaderUI, Screen, DEBUG
    local readerui, toc, toc_max_depth, title

    setup(function()
        require("commonrequire")
        DocumentRegistry = require("document/documentregistry")
        ReaderUI = require("apps/reader/readerui")
        Screen = require("device").screen
        DEBUG = require("dbg")

        local sample_epub = "spec/front/unit/data/juliet.epub"
        -- Clear settings from previous tests
        local DocSettings = require("docsettings")
        local doc_settings = DocSettings:open(sample_epub)
        doc_settings:close()
        doc_settings:purge()

        readerui = ReaderUI:new{
            dimen = Screen:getSize(),
            document = DocumentRegistry:openDocument(sample_epub),
        }
        -- reset book to first page
        readerui.rolling:onGotoPage(0)
        toc = readerui.toc
    end)

    it("should get max toc depth", function()
        toc_max_depth = toc:getMaxDepth()
        assert.are.same(2, toc_max_depth)
    end)
    it("should get toc title from page", function()
        title = toc:getTocTitleByPage(60)
        DEBUG("toc", toc.toc)
        assert.is.equal("SCENE V. A hall in Capulet's house.", title)
        title = toc:getTocTitleByPage(187)
        assert.is.equal("SCENE I. Friar Laurence's cell.", title)
    end)
    describe("getTocTicks API", function()
        local ticks_level_1 = nil
        it("should get ticks of level 1", function()
            ticks_level_1 = toc:getTocTicks(1)
            assert.are.same(7, #ticks_level_1)
        end)
        local ticks_level_2 = nil
        it("should get ticks of level 2", function()
            ticks_level_2 = toc:getTocTicks(2)
            assert.are.same(26, #ticks_level_2)
        end)
        local ticks_level_m1 = nil
        it("should get ticks of level -1", function()
            ticks_level_m1 = toc:getTocTicks(-1)
            assert.are.same(26, #ticks_level_m1)
        end)
        it("should get the same ticks of level -1 and level 2", function()
            if toc_max_depth == 2 then
                assert.are.same(ticks_level_2, ticks_level_m1)
            end
        end)
        local ticks_level_flat = nil
        it("should get all ticks (flattened)", function()
            ticks_level_flat = toc:getTocTicksFlattened()
            assert.are.same(28, #ticks_level_flat)
        end)
    end)
    it("should get page of next chapter", function()
        assert.truthy(toc:getNextChapter(10) > 10)
        assert.truthy(toc:getNextChapter(100) > 100)
        assert.are.same(nil, toc:getNextChapter(290))
    end)
    it("should get page of previous chapter", function()
        assert.truthy(toc:getPreviousChapter(10) < 10)
        assert.truthy(toc:getPreviousChapter(100) < 100)
        assert.truthy(toc:getPreviousChapter(200) < 200)
    end)
    it("should get page left of chapter", function()
        assert.truthy(toc:getChapterPagesLeft(10) > 10)
        assert.truthy(toc:getChapterPagesLeft(95) > 10)
        assert.are.same(nil, toc:getChapterPagesLeft(290))
    end)
    it("should get page done of chapter", function()
        assert.truthy(toc:getChapterPagesDone(11) < 5)
        assert.truthy(toc:getChapterPagesDone(88) < 5)
        assert.truthy(toc:getChapterPagesDone(290) > 10)
    end)
    describe("collasible TOC", function()
        it("should collapse the secondary toc nodes by default", function()
            toc:onShowToc()
            assert.are.same(7, #toc.collapsed_toc)
        end)
        it("should not expand toc nodes that have no child nodes", function()
            toc:expandToc(2)
            assert.are.same(7, #toc.collapsed_toc)
        end)
        it("should expand toc nodes that have child nodes", function()
            toc:expandToc(3)
            assert.are.same(13, #toc.collapsed_toc)
            toc:expandToc(18)
            assert.are.same(18, #toc.collapsed_toc)
        end)
        it("should collapse toc nodes that have been expanded", function()
            toc:collapseToc(3)
            assert.are.same(12, #toc.collapsed_toc)
            toc:collapseToc(18)
            assert.are.same(7, #toc.collapsed_toc)

            --- @note: Delay the teardown 'til the last test, because of course the tests rely on incremental state changes across tests...
            readerui:closeDocument()
            readerui:onClose()
        end)
    end)
end)
