104 lines
4.0 KiB
Go
104 lines
4.0 KiB
Go
package fdx
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"plotzilla/internal/screenplay"
|
|
)
|
|
|
|
func TestRoundTrip(t *testing.T) {
|
|
doc := &screenplay.Document{
|
|
TitlePage: screenplay.TitlePage{Title: "Le Dernier Rouleau", Credit: "Written by", Author: "Jane Doe"},
|
|
Elements: []screenplay.Element{
|
|
{Type: screenplay.Scene, Runs: []screenplay.Run{{Text: "INT. CABINE - NUIT"}}, SceneNumber: "1"},
|
|
{Type: screenplay.Action, Runs: []screenplay.Run{{Text: "Elle "}, {Text: "entre", Bold: true, Underline: true}, {Text: "."}}},
|
|
{Type: screenplay.Character, Runs: []screenplay.Run{{Text: "ÉLODIE"}}},
|
|
{Type: screenplay.Parenthetical, Runs: []screenplay.Run{{Text: "(bas)"}}},
|
|
{Type: screenplay.Dialogue, Runs: []screenplay.Run{{Text: "Ça finit ici."}}},
|
|
{Type: screenplay.Character, Runs: []screenplay.Run{{Text: "BOB"}}, Dual: true},
|
|
{Type: screenplay.Dialogue, Runs: []screenplay.Run{{Text: "Non."}}},
|
|
{Type: screenplay.Shot, Runs: []screenplay.Run{{Text: "INSERT - LA LETTRE"}}},
|
|
{Type: screenplay.Centered, Runs: []screenplay.Run{{Text: "Fin"}}},
|
|
{Type: screenplay.Intertitle, Runs: []screenplay.Run{{Text: "PARIS, 1942"}}},
|
|
},
|
|
}
|
|
var buf bytes.Buffer
|
|
if err := Write(&buf, doc); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got, err := Read(&buf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(got.Elements, doc.Elements) {
|
|
t.Errorf("elements:\n got %+v\nwant %+v", got.Elements, doc.Elements)
|
|
}
|
|
if got.TitlePage.Title != doc.TitlePage.Title || got.TitlePage.Author != doc.TitlePage.Author {
|
|
t.Errorf("title page: %+v", got.TitlePage)
|
|
}
|
|
}
|
|
|
|
func TestOutlineNotesRevisions(t *testing.T) {
|
|
bob := screenplay.Element{Type: screenplay.Character, Runs: []screenplay.Run{{Text: "BOB"}}, Dual: true}
|
|
doc := &screenplay.Document{
|
|
Settings: screenplay.Settings{
|
|
Revisions: []screenplay.Revision{{Name: "Blue", Color: "blue", Date: "09/14/26"}, {Name: "Pink", Color: "pink", Date: "09/28/26"}},
|
|
Revising: true,
|
|
},
|
|
Elements: []screenplay.Element{
|
|
{Type: screenplay.Section, Level: 2, Runs: []screenplay.Run{{Text: "Act One"}}},
|
|
{Type: screenplay.Synopsis, Runs: []screenplay.Run{{Text: "It starts."}}},
|
|
{Type: screenplay.Scene, Runs: []screenplay.Run{{Text: "INT. BOOTH - NIGHT"}}, NewPage: true},
|
|
{Type: screenplay.Action, Runs: []screenplay.Run{
|
|
{Text: "He "}, {Text: "waits", Rev: 2, Bold: true}, {Text: ".", Rev: 1},
|
|
{Text: "# not a section", Note: true}, {Text: " Then", Rev: 1}, {Text: "fix", Note: true},
|
|
}},
|
|
{Type: screenplay.Action, Runs: []screenplay.Run{{Text: "only a note", Note: true}}},
|
|
{Type: screenplay.Character, Runs: []screenplay.Run{{Text: "ALICE"}}, NewPage: true},
|
|
{Type: screenplay.Dialogue, Runs: []screenplay.Run{{Text: "Hi."}}},
|
|
bob,
|
|
{Type: screenplay.Dialogue, Runs: []screenplay.Run{{Text: "Hey."}}},
|
|
{Type: screenplay.Section, Level: 1, Runs: []screenplay.Run{{Text: "The End"}}},
|
|
},
|
|
}
|
|
var buf bytes.Buffer
|
|
if err := Write(&buf, doc); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
out := buf.String()
|
|
for _, want := range []string{`StartsNewPage="Yes"`, `RevisionID="2"`, `Name="Pink Revision - 09/28/26"`, `RevisionMode="Yes"`, `\# not a section`} {
|
|
if !strings.Contains(out, want) {
|
|
t.Errorf("missing %s in:\n%s", want, out)
|
|
}
|
|
}
|
|
got, err := Read(&buf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(got.Settings, doc.Settings) {
|
|
t.Errorf("settings: %+v", got.Settings)
|
|
}
|
|
if !reflect.DeepEqual(got.Elements, doc.Elements) {
|
|
for i := range got.Elements {
|
|
if i >= len(doc.Elements) || !reflect.DeepEqual(got.Elements[i], doc.Elements[i]) {
|
|
t.Errorf("element %d: %+v", i, got.Elements[i])
|
|
}
|
|
}
|
|
t.Fatalf("round trip:\n%s", out)
|
|
}
|
|
}
|
|
|
|
func TestFinalDraftRevisionNames(t *testing.T) {
|
|
// A set named by Final Draft keeps its colour; an unknown name falls
|
|
// back to the colour of its position.
|
|
if r := readRevision(revision{Name: "Goldenrod Rev."}, 5); r.Name != "Goldenrod" || r.Color != "goldenrod" {
|
|
t.Errorf("got %+v", r)
|
|
}
|
|
if r := readRevision(revision{Name: "Second draft"}, 2); r.Name != "Second draft" || r.Color != "pink" {
|
|
t.Errorf("got %+v", r)
|
|
}
|
|
}
|