def METHOD_NAME(qtbot, monkeypatch, nwGUI, prjLipsum):
    """Test the document viewer."""
    # Open project
    assert nwGUI.openProject(prjLipsum)
    # Rebuild the index
    nwGUI.mainMenu.aRebuildIndex.activate(QAction.Trigger)
    assert SHARED.project.index._tagsIndex._tags != {}
    assert SHARED.project.index._itemIndex._items != {}
    # Select a document in the project tree
    nwGUI.projView.setSelectedHandle("88243afbe5ed8")
    # Middle-click the selected item
    theItem = nwGUI.projView.projTree._getTreeItem("88243afbe5ed8")
    theRect = nwGUI.projView.projTree.visualItemRect(theItem)
    qtbot.mouseClick(nwGUI.projView.projTree.viewport(), Qt.MidButton, pos=theRect.center())
    assert nwGUI.docViewer.docHandle == "88243afbe5ed8"
    # Reload the text
    origText = nwGUI.docViewer.toPlainText()
    nwGUI.docViewer.setPlainText("Oops, all gone!")
    nwGUI.docViewer.docHeader._refreshDocument()
    assert nwGUI.docViewer.toPlainText() == origText
    # Select word
    theCursor = nwGUI.docViewer.textCursor()
    theCursor.setPosition(100)
    nwGUI.docViewer.setTextCursor(theCursor)
    nwGUI.docViewer._makeSelection(QTextCursor.WordUnderCursor)
    qClip = qApp.clipboard()
    qClip.clear()
    # Cut
    assert nwGUI.docViewer.docAction(nwDocAction.CUT) is True
    assert qClip.text() == "laoreet"
    qClip.clear()
    # Copy
    assert nwGUI.docViewer.docAction(nwDocAction.COPY) is True
    assert qClip.text() == "laoreet"
    qClip.clear()
    # Select Paragraph
    assert nwGUI.docViewer.docAction(nwDocAction.SEL_PARA) is True
    theCursor = nwGUI.docViewer.textCursor()
    assert theCursor.selectedText() == (
        "Synopsis: Aenean ut placerat velit. Etiam laoreet ullamcorper risus, "
        "eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et "
        "mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. "
        "Etiam finibus nisi vel mi molestie consectetur."
    )
    # Select All
    assert nwGUI.docViewer.docAction(nwDocAction.SEL_ALL) is True
    theCursor = nwGUI.docViewer.textCursor()
    assert len(theCursor.selectedText()) == 3061
    # Other actions
    assert nwGUI.docViewer.docAction(nwDocAction.NO_ACTION) is False
    # Close document
    nwGUI.docViewer.docHeader._closeDocument()
    assert nwGUI.docViewer.docHandle is None
    # Action on no document
    assert nwGUI.docViewer.docAction(nwDocAction.COPY) is False
    # Open again via menu
    assert nwGUI.projView.setSelectedHandle("88243afbe5ed8")
    nwGUI.mainMenu.aViewDoc.activate(QAction.Trigger)
    # Select "Bod" link
    theCursor = nwGUI.docViewer.textCursor()
    theCursor.setPosition(27)
    nwGUI.docViewer.setTextCursor(theCursor)
    nwGUI.docViewer._makeSelection(QTextCursor.WordUnderCursor)
    theRect = nwGUI.docViewer.cursorRect()
    # qtbot.mouseClick(nwGUI.docViewer.viewport(), Qt.LeftButton, pos=theRect.center(), delay=100)
    nwGUI.docViewer._linkClicked(QUrl("#char=Bod"))
    assert nwGUI.docViewer.docHandle == "4c4f28287af27"
    # Click mouse nav buttons
    qtbot.mouseClick(nwGUI.docViewer.viewport(), Qt.BackButton, pos=theRect.center(), delay=100)
    assert nwGUI.docViewer.docHandle == "88243afbe5ed8"
    qtbot.mouseClick(nwGUI.docViewer.viewport(), Qt.ForwardButton, pos=theRect.center(), delay=100)
    assert nwGUI.docViewer.docHandle == "4c4f28287af27"
    # Scroll bar default on empty document
    nwGUI.docViewer.clear()
    assert nwGUI.docViewer.scrollPosition == 0
    nwGUI.docViewer.reloadText()
    # Change document title
    nwItem = SHARED.project.tree["4c4f28287af27"]
    nwItem.setName("Test Title")
    assert nwItem.itemName == "Test Title"
    nwGUI.docViewer.updateDocInfo("4c4f28287af27")
    assert nwGUI.docViewer.docHeader.theTitle.text() == "Characters  ›  Test Title"
    # Title without full path
    CONFIG.showFullPath = False
    nwGUI.docViewer.updateDocInfo("4c4f28287af27")
    assert nwGUI.docViewer.docHeader.theTitle.text() == "Test Title"
    CONFIG.showFullPath = True
    # Document footer show/hide references
    viewState = nwGUI.viewMeta.isVisible()
    nwGUI.docViewer.docFooter._doShowHide()
    assert nwGUI.viewMeta.isVisible() is not viewState
    nwGUI.docViewer.docFooter._doShowHide()
    assert nwGUI.viewMeta.isVisible() is viewState
    # Document footer sticky
    viewState = nwGUI.docViewer.stickyRef
    nwGUI.docViewer.docFooter._doToggleSticky(not viewState)
    assert nwGUI.docViewer.stickyRef is not viewState
    nwGUI.docViewer.docFooter._doToggleSticky(viewState)
    assert nwGUI.docViewer.stickyRef is viewState
    # Document footer show/hide synopsis
    assert nwGUI.viewDocument("f96ec11c6a3da") is True
    assert len(nwGUI.docViewer.toPlainText()) == 4315
    nwGUI.docViewer.docFooter._doToggleSynopsis(False)
    assert len(nwGUI.docViewer.toPlainText()) == 4099
    # Document footer show/hide comments
    assert nwGUI.viewDocument("846352075de7d") is True
    assert len(nwGUI.docViewer.toPlainText()) == 675
    nwGUI.docViewer.docFooter._doToggleComments(False)
    assert len(nwGUI.docViewer.toPlainText()) == 635
    # Crash the HTML rendering
    with monkeypatch.context() as mp:
        mp.setattr(ToHtml, "doConvert", causeException)
        assert nwGUI.docViewer.loadText("846352075de7d") is False
        assert nwGUI.docViewer.toPlainText() == "An error occurred while generating the preview."
    # Check reference panel (issue #1378)
    assert nwGUI.viewDocument("4c4f28287af27") is True
    assert nwGUI.docViewer.toPlainText().startswith("Nobody Owens")
    nwGUI.viewMeta._linkClicked("fb609cd8319dc")
    assert nwGUI.docViewer.toPlainText().startswith("Chapter One")
    nwGUI.viewMeta._linkClicked("88243afbe5ed8#T0001")
    assert nwGUI.docViewer.toPlainText().startswith("Scene One")
    nwGUI.viewMeta._linkClicked("88243afbe5ed8#ABCD")
    assert nwGUI.docViewer.toPlainText().startswith("Scene One")
    # qtbot.stop()