From 2203246b3cf8ca6e739168c33a5228f57096c0c3 Mon Sep 17 00:00:00 2001 From: Gavin Nishizawa Date: Fri, 7 Apr 2023 14:03:32 -0700 Subject: [PATCH] support multiboard rendering in e2e tests --- d2renderers/d2svg/d2svg.go | 35 +++++++++++++++++++++++++++++++++++ e2etests/e2e_test.go | 20 ++++++++++++++++++-- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go index 1b2b175bd..8905d4077 100644 --- a/d2renderers/d2svg/d2svg.go +++ b/d2renderers/d2svg/d2svg.go @@ -2165,3 +2165,38 @@ func hash(s string) string { h.Write([]byte(fmt.Sprintf("%s%s", s, secret))) return fmt.Sprint(h.Sum32()) } + +func RenderMultiboard(diagram *d2target.Diagram, opts *RenderOpts) ([][]byte, error) { + var boards [][]byte + for _, dl := range diagram.Layers { + childrenBoards, err := RenderMultiboard(dl, opts) + if err != nil { + return nil, err + } + boards = append(boards, childrenBoards...) + } + for _, dl := range diagram.Scenarios { + childrenBoards, err := RenderMultiboard(dl, opts) + if err != nil { + return nil, err + } + boards = append(boards, childrenBoards...) + } + for _, dl := range diagram.Steps { + childrenBoards, err := RenderMultiboard(dl, opts) + if err != nil { + return nil, err + } + boards = append(boards, childrenBoards...) + } + + if !diagram.IsFolderOnly { + out, err := Render(diagram, opts) + if err != nil { + return boards, err + } + boards = append([][]byte{out}, boards...) + return boards, nil + } + return boards, nil +} diff --git a/e2etests/e2e_test.go b/e2etests/e2e_test.go index 7b71d909b..ba19b4866 100644 --- a/e2etests/e2e_test.go +++ b/e2etests/e2e_test.go @@ -25,6 +25,7 @@ import ( "oss.terrastruct.com/d2/d2layouts/d2sequence" "oss.terrastruct.com/d2/d2lib" "oss.terrastruct.com/d2/d2plugin" + "oss.terrastruct.com/d2/d2renderers/d2animate" "oss.terrastruct.com/d2/d2renderers/d2svg" "oss.terrastruct.com/d2/d2target" "oss.terrastruct.com/d2/lib/log" @@ -205,11 +206,26 @@ func run(t *testing.T, tc testCase) { dataPath := filepath.Join("testdata", strings.TrimPrefix(t.Name(), "TestE2E/"), layoutName) pathGotSVG := filepath.Join(dataPath, "sketch.got.svg") - svgBytes, err := d2svg.Render(diagram, &d2svg.RenderOpts{ + renderOpts := &d2svg.RenderOpts{ Pad: 0, ThemeID: tc.themeID, - }) + } + if len(diagram.Layers) > 0 || len(diagram.Scenarios) > 0 || len(diagram.Steps) > 0 { + masterID, err := diagram.HashID() + assert.Success(t, err) + renderOpts.MasterID = masterID + } + boards, err := d2svg.RenderMultiboard(diagram, renderOpts) assert.Success(t, err) + + var svgBytes []byte + if len(boards) == 1 { + svgBytes = boards[0] + } else { + svgBytes, err = d2animate.Wrap(diagram, boards, *renderOpts, 1000) + assert.Success(t, err) + } + err = os.MkdirAll(dataPath, 0755) assert.Success(t, err) err = ioutil.WriteFile(pathGotSVG, svgBytes, 0600)