unioffice/document/endnotes_test.go
Casey Kuhlman 5f9c94bf84
add the ability to utilize footnotes and endnotes in documents (#374)
* add ability to handle footnotes and endnotes
* address review comments to make code much cleaner
* add license headers and simple example
2020-03-13 09:53:51 +00:00

293 lines
6.3 KiB
Go

// Copyright 2017 FoxyUtils ehf. All rights reserved.
//
// Use of this source code is governed by the terms of the Affero GNU General
// Public License version 3.0 as published by the Free Software Foundation and
// appearing in the file LICENSE included in the packaging of this file. A
// commercial license can be purchased by contacting sales@baliance.com.
package document_test
import (
"bytes"
"fmt"
"testing"
"github.com/unidoc/unioffice/document"
)
func TestEndnotesLoad(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
saveTestData(t, doc)
}
func TestHasEndnotes(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
if !doc.HasEndnotes() {
t.Error("document should contain endnotes")
}
doc = document.New()
if doc.HasEndnotes() {
t.Error("document should not contain endnotes")
}
}
func TestEndnotesListEndnotes(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
if len(doc.Endnotes()) == 0 {
t.Error("document should contain endnotes")
}
if len(doc.Endnotes()) <= 2 {
t.Error("document should contain endnotes array that includes 2 added by the system")
}
saveTestData(t, doc)
}
func TestEndnotesPullByID(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
fn := doc.Endnote(2)
if fn.X().IdAttr != 2 {
t.Error("test did not retrieve the proper endnote")
}
saveTestData(t, doc)
}
func TestEndnotesPullParagraphs(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
fn := doc.Endnote(2)
if len(fn.Paragraphs()) == 0 {
t.Error("test did not retrieve the paragraphs properly")
}
saveTestData(t, doc)
}
func TestEndnotesLinkedToRuns(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
var linkedRuns int
for _, p := range doc.Paragraphs() {
for _, r := range p.Runs() {
if ok, _ := r.IsEndnote(); ok {
linkedRuns++
}
}
}
if linkedRuns == 0 {
t.Error("document not properly linked to endnotes")
}
saveTestData(t, doc)
}
func TestEndnotesLinkedToRunsProperly(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
linkedEnds := make([]document.Endnote, 0)
for _, p := range doc.Paragraphs() {
for _, r := range p.Runs() {
if ok, enID := r.IsEndnote(); ok {
linkedEnds = append(linkedEnds, doc.Endnote(enID))
}
}
}
if len(linkedEnds) == 0 {
t.Error("document not properly linked to endnotes")
}
saveTestData(t, doc)
}
func TestEndnotesHaveText(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
fn := doc.Endnote(2)
var buff bytes.Buffer
for _, p1 := range fn.Paragraphs() {
for _, r2 := range p1.Runs() {
buff.WriteString(r2.Text())
}
}
if buff.String() == "" {
t.Error("content not accessible from endnote")
}
saveTestData(t, doc)
}
func TestEndnotesClearContent(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
fn := doc.Endnote(2)
var buff bytes.Buffer
for _, p1 := range fn.Paragraphs() {
for _, r2 := range p1.Runs() {
r2.Clear()
buff.WriteString(r2.Text())
}
}
output := buff.String()
if output != "" {
t.Errorf("content not cleared from endnote: %s", output)
}
saveTestData(t, doc)
}
func TestEndnotesSimplifyContent(t *testing.T) {
newTxt := "This will be shortened."
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
en := doc.Endnote(2)
for i, p := range en.Paragraphs() {
if i > 0 {
en.RemoveParagraph(p)
}
for j, r := range p.Runs() {
if j > 0 {
p.RemoveRun(r)
}
r.Clear()
r.AddText(newTxt)
}
}
en2 := doc.Endnote(2)
if len(en2.Paragraphs()) != 1 {
t.Error("wrong number of paragraphs")
}
if len(en2.Paragraphs()[0].Runs()) != 1 {
t.Errorf("wrong number of runs: expect %d, got %d", 1, len(en2.Paragraphs()[0].Runs()))
}
if en2.Paragraphs()[0].Runs()[0].Text() != newTxt {
t.Error("incorrect modification to endnote text")
}
saveTestData(t, doc)
}
func TestEndnotesExpandContent(t *testing.T) {
newTxt := "This will be expanded."
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
en := doc.Endnote(2)
para := en.AddParagraph()
run := para.AddRun()
run.AddText(newTxt)
en2 := doc.Endnote(2)
if len(en2.Paragraphs()) != 2 {
t.Error("wrong number of paragraphs")
}
if len(en2.Paragraphs()[1].Runs()) != 1 {
t.Errorf("wrong number of runs: expect %d, got %d", 1, len(en2.Paragraphs()[0].Runs()))
}
if en2.Paragraphs()[1].Runs()[0].Text() != newTxt {
t.Error("incorrect modification to endnote text")
}
saveTestData(t, doc)
}
func TestEndnotesRemoveEndnote(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
enB4 := len(doc.Endnotes())
var runsInP int
var p document.Paragraph
for _, p1 := range doc.Paragraphs() {
for _, r := range p1.Runs() {
if ok, enID := r.IsEndnote(); ok {
if enID == 2 {
p = p1
runsInP = len(p.Runs())
}
}
}
}
p.RemoveEndnote(2)
if len(doc.Endnotes()) == enB4 {
fmt.Println(doc.Endnotes())
t.Fatal("did not properly remove endnote")
}
if len(p.Runs()) >= runsInP {
t.Fatal("did not properly remove endnote")
}
}
func TestEndnotesAddEndnote(t *testing.T) {
doc := loadTestData(t)
if doc == nil {
t.Fatal("could not read test document")
}
enB4 := len(doc.Endnotes())
var enB4InP int
var p document.Paragraph
for _, p1 := range doc.Paragraphs() {
for _, r := range p1.Runs() {
if ok, enID := r.IsEndnote(); ok {
if enID == 2 {
p = p1
enB4InP++
}
}
}
}
en := p.AddEndnote("testing")
if len(doc.Endnotes()) == enB4 {
t.Fatal("did not properly add endnote")
}
var enInP int
for _, r := range p.Runs() {
if ok, _ := r.IsEndnote(); ok {
enInP++
}
}
if enInP <= enB4InP {
t.Error("endnotes not properly added to run")
}
pinner := en.AddParagraph()
rinner := pinner.AddRun()
rinner.AddText("more test goes in this paragraph")
if len(en.Paragraphs()) != 2 {
t.Error("wrong number of paragraphs in endnote")
}
for _, p := range en.Paragraphs() {
if p.Properties().Style() != "Endnote" {
t.Error("wrong style set for the paragraph")
}
}
saveTestData(t, doc)
}