diff --git a/d2graph/seqdiagram.go b/d2graph/seqdiagram.go index 3cd2cf171a..472a1d3ed3 100644 --- a/d2graph/seqdiagram.go +++ b/d2graph/seqdiagram.go @@ -1,6 +1,8 @@ package d2graph -import "oss.terrastruct.com/d2/d2target" +import ( + "oss.terrastruct.com/d2/d2target" +) func (obj *Object) IsSequenceDiagram() bool { return obj != nil && obj.Shape.Value == d2target.ShapeSequenceDiagram diff --git a/d2layouts/d2sequence/sequence_diagram.go b/d2layouts/d2sequence/sequence_diagram.go index e5ec4d4d72..4b85cbe131 100644 --- a/d2layouts/d2sequence/sequence_diagram.go +++ b/d2layouts/d2sequence/sequence_diagram.go @@ -1,9 +1,11 @@ package d2sequence import ( + "cmp" "errors" "fmt" "math" + "slices" "sort" "strconv" "strings" @@ -76,6 +78,13 @@ func newSequenceDiagram(objects []*d2graph.Object, messages []*d2graph.Edge) (*s var actors []*d2graph.Object var groups []*d2graph.Object + slices.SortFunc(objects, func(a, b *d2graph.Object) int { + return cmp.Compare(getObjEarliestLineNum(a), getObjEarliestLineNum(b)) + }) + slices.SortFunc(messages, func(a, b *d2graph.Edge) int { + return cmp.Compare(getEdgeEarliestLineNum(a), getEdgeEarliestLineNum(b)) + }) + for _, obj := range objects { if obj.IsSequenceDiagramGroup() { queue := []*d2graph.Object{obj} diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index d586299121..273112a7fc 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -94,6 +94,30 @@ func TestCLI_E2E(t *testing.T) { assert.TestdataDir(t, filepath.Join(dir, "layer-link")) }, }, + { + name: "sequence-layer", + run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { + writeFile(t, dir, "index.d2", `k; layers: { seq: @seq.d2 }`) + writeFile(t, dir, "seq.d2", `shape: sequence_diagram +a: me +b: github.com/terrastruct/d2 + +a -> b: issue about a bug +a."some note about the bug" + +if i'm right: { + a <- b: fix +} + +if i'm wrong: { + a <- b: nah, intended +}`) + err := runTestMain(t, ctx, dir, env, "index.d2") + assert.Success(t, err) + + assert.TestdataDir(t, filepath.Join(dir, "index")) + }, + }, { // Skip the empty base board so the animation doesn't show blank for 1400ms name: "empty-base", diff --git a/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/index.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/index.exp.svg new file mode 100644 index 0000000000..29a8a55da6 --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/index.exp.svg @@ -0,0 +1,95 @@ +k + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/seq.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/seq.exp.svg new file mode 100644 index 0000000000..f8f8b973d1 --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/sequence-layer/seq.exp.svg @@ -0,0 +1,109 @@ +megithub.com/terrastruct/d2if i'm rightif i'm wrong fixnah, intended issue about a bugsome note about the bug + + + + + + + + + +