Files
2026-09-28 14:21:06 +02:00

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)
}
}