From 9227021bc96b07681f1b9b5b4f74702f434b28b8 Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 2 Mar 2023 19:41:24 -0800 Subject: [PATCH 1/9] e2etests-cli: Add PNG test Closes #903 Closes #918 --- d2cli/main.go | 2 + e2etests-cli/main_test.go | 41 ++++++++++++++++-- .../testdata/TestCLI_E2E/hello_world.exp.png | Bin 0 -> 3041 bytes go.mod | 2 +- go.sum | 2 + 5 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 e2etests-cli/testdata/TestCLI_E2E/hello_world.exp.png diff --git a/d2cli/main.go b/d2cli/main.go index 11f5345694..c68f9ef0c2 100644 --- a/d2cli/main.go +++ b/d2cli/main.go @@ -152,6 +152,8 @@ func Run(ctx context.Context, ms *xmain.State) (err error) { outputPath = renameExt(inputPath, ".svg") } } + inputPath = filepath.Join(ms.PWD, inputPath) + outputPath = filepath.Join(ms.PWD, outputPath) match := d2themescatalog.Find(*themeFlag) if match == (d2themes.Theme{}) { diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index 22d88dac1b..1718566f80 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -2,8 +2,14 @@ package e2etests_cli import ( "context" + "path/filepath" "testing" "time" + + "oss.terrastruct.com/d2/d2cli" + "oss.terrastruct.com/util-go/assert" + "oss.terrastruct.com/util-go/xmain" + "oss.terrastruct.com/util-go/xos" ) func TestCLI_E2E(t *testing.T) { @@ -11,11 +17,17 @@ func TestCLI_E2E(t *testing.T) { tca := []struct { name string - run func(t *testing.T, ctx context.Context) + run func(t *testing.T, ctx context.Context, dir string, env *xos.Env) }{ { name: "hello_world", - run: func(t *testing.T, ctx context.Context) {}, + run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { + assert.WriteFile(t, filepath.Join(dir, "hello-world.d2"), []byte(`x -> y`), 0644) + err := runTestMain(t, ctx, dir, env, "hello-world.d2", "hello-world.png") + assert.Success(t, err) + png := assert.ReadFile(t, filepath.Join(dir, "hello-world.png")) + assert.Testdata(t, ".png", png) + }, }, } @@ -28,7 +40,30 @@ func TestCLI_E2E(t *testing.T) { ctx, cancel := context.WithTimeout(ctx, time.Minute*5) defer cancel() - tc.run(t, ctx) + dir, cleanup := assert.TempDir(t) + defer cleanup() + + env := xos.NewEnv(nil) + + tc.run(t, ctx, dir, env) }) } } + +// We do not run the CLI in its own process even though that makes it not truly e2e to +// test whether we're cleaning up state correctly. +func testMain(dir string, env *xos.Env, args ...string) *xmain.TestState { + return &xmain.TestState{ + Run: d2cli.Run, + Env: env, + Args: append([]string{"e2etests-cli/d2"}, args...), + PWD: dir, + } +} + +func runTestMain(tb testing.TB, ctx context.Context, dir string, env *xos.Env, args ...string) error { + tms := testMain(dir, env, args...) + tms.Start(tb, ctx) + defer tms.Cleanup(tb) + return tms.Wait(ctx) +} diff --git a/e2etests-cli/testdata/TestCLI_E2E/hello_world.exp.png b/e2etests-cli/testdata/TestCLI_E2E/hello_world.exp.png new file mode 100644 index 0000000000000000000000000000000000000000..45c9386f922beeae80d8a9e9b8e54f2c0e36607e GIT binary patch literal 3041 zcmeH}`#;;)AIDG7FbU~}#if<1m6=xDrYT)ryi zGHbsTt6Pnkkdmxg*P=x!C8DM7RPuF8B-v+s>`&+(-|r9o>3!ah^LU-}e!R~6JkLo# z@8+bUtfdS9P;qfSeG!gz03ePjA>mPAko6!O5YZQ%96)XV!36+N#V)5$dBl@eCch3X z*ii3WcV8qy4aPQV+CO#lQO}&pnE%bD+Wg^Z>Y|0~M|xrV-&ZgFqA*$60wB~+0oRK>W74kC!MGnpkUQb?3++3q926s?T3 zxORCBdFBC7w;uCLd}1~YzbbnCiOTbYK4C`GP%|Kh1bi*iovFCoU* z%cN4a&X_*Mi`u>HlXl76T{Q*7qq!;gl>!6Y_9fLr&n{V2S7Ep@^TgO5jToMe?-9A-wWT0 zv>L?E_4`F_wHlSTN{j^UDB29O%=q6azN&d;$4L1^0_UQKy$vt|ItjD8xMO)6=fd-C z*I1<5=2gp`*^{opq=5wB2KQX*f3$aMX6iY^J0qLA*3);a8`nx=L)nBO&X+~S#i#)j zQ3{a^upL86+%<_LX`v*hXn9O{&WA;A+YMb%N#$^OiU>6S0i=b9pXt1orbG8|D~qlS zoyX-|&7uS)cABP!@a3=>H_EQ6(~;6%|EZj@3VOvRE+T`5zo}`?E*EYu2-p>6IZP%q zpf6LThAl)9HQe-!Bc}02+oym$>#+Jhfc?HwfD!0@_aJ+(R!!8^W^SrqF!1z^#AOtSvpGpZxep?7H_eElbC+Ue4(cik9AoXg1d*Y1-v_{-^?5wRvi?DfZyxkz)GLBtJY;VgpXFWFaTk3e535kFA=&sbjgV z9mrATDogyMhK%Yf*H&cl!ut*Sy(vx9kG}C;_LB3yCEJp%|3WQ!hQ}?B`O;{;SWM2S z_;nXURrKwHrbqOn&`l91`B`z)iokx9*GBEOXb$CFI5VXtZUkQ}bA%I9qdaL((U2PF z=w=mySRq@nwadR%io02`K0b0zY8l{2b6to#YaMVOCgq0`op3yO^RuJVlOzg{TyWC9 zsgkXmtWi%ij{Fd0D~HMaQzpl4&)T#lMg&x6B`>oX;rpdptDNXP@OAK-8a-+-K)AEM z|G-qdw-*jt3Q{Bk18Hv0D^r+}nDlgan33sJ0ZduY|7pNWHJFh{N(nmhCXg_v&}t8i zS7(FlP8hF*5A@v-uy(Nftw_BQZx%nM%%)rUi5m<9`V z;X>c`GpHjUF)-0>R=&Z_|J?IOpUtY8-FugoK0xs=+zOpqzx7!1R9`c3PEY;%U3{t8 z<@?pNpIyhlG`Q3DU^W`W`cO*B!NCd&qgd{Fa7|=^TtrE&UzjqP(b(am%#Cb`Z8n7b pMzlf Date: Thu, 2 Mar 2023 20:02:36 -0800 Subject: [PATCH 2/9] e2etests-cli: Add pad test and cleanup --- e2etests-cli/main_test.go | 28 +++++++++++++++--- .../testdata/TestCLI_E2E/hello_world.exp.png | Bin 3041 -> 0 bytes .../TestCLI_E2E/hello_world_png.exp.png | Bin 0 -> 15325 bytes .../TestCLI_E2E/hello_world_png_pad.exp.png | Bin 0 -> 15325 bytes go.sum | 2 -- 5 files changed, 24 insertions(+), 6 deletions(-) delete mode 100644 e2etests-cli/testdata/TestCLI_E2E/hello_world.exp.png create mode 100644 e2etests-cli/testdata/TestCLI_E2E/hello_world_png.exp.png create mode 100644 e2etests-cli/testdata/TestCLI_E2E/hello_world_png_pad.exp.png diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index 1718566f80..e5b3e58521 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -20,12 +20,22 @@ func TestCLI_E2E(t *testing.T) { run func(t *testing.T, ctx context.Context, dir string, env *xos.Env) }{ { - name: "hello_world", + name: "hello_world_png", run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { - assert.WriteFile(t, filepath.Join(dir, "hello-world.d2"), []byte(`x -> y`), 0644) - err := runTestMain(t, ctx, dir, env, "hello-world.d2", "hello-world.png") + writeFile(t, dir, "hello-world.d2", `x -> y`) + err := runTestMain(t, ctx, dir, env, "hello-world.d2", "hello-world.png") assert.Success(t, err) - png := assert.ReadFile(t, filepath.Join(dir, "hello-world.png")) + png := readFile(t, dir, "hello-world.png") + assert.Testdata(t, ".png", png) + }, + }, + { + name: "hello_world_png_pad", + run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { + writeFile(t, dir, "hello-world.d2", `x -> y`) + err := runTestMain(t, ctx, dir, env, "-pad 4000", "hello-world.d2", "hello-world.png") + assert.Success(t, err) + png := readFile(t, dir, "hello-world.png") assert.Testdata(t, ".png", png) }, }, @@ -67,3 +77,13 @@ func runTestMain(tb testing.TB, ctx context.Context, dir string, env *xos.Env, a defer tms.Cleanup(tb) return tms.Wait(ctx) } + +func writeFile(tb testing.TB, dir, fp, data string) { + tb.Helper() + assert.WriteFile(tb, filepath.Join(dir, fp), []byte(data), 0644) +} + +func readFile(tb testing.TB, dir, fp string) []byte { + tb.Helper() + return assert.ReadFile(tb, filepath.Join(dir, fp)) +} diff --git a/e2etests-cli/testdata/TestCLI_E2E/hello_world.exp.png b/e2etests-cli/testdata/TestCLI_E2E/hello_world.exp.png deleted file mode 100644 index 45c9386f922beeae80d8a9e9b8e54f2c0e36607e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3041 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 Date: Thu, 2 Mar 2023 20:09:05 -0800 Subject: [PATCH 3/9] e2etests-cli: Add sketch test --- e2etests-cli/main_test.go | 12 +++++++++++- .../TestCLI_E2E/hello_world_png_pad.exp.png | Bin 15325 -> 73528 bytes .../hello_world_png_sketch.exp.png | Bin 0 -> 28353 bytes 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 e2etests-cli/testdata/TestCLI_E2E/hello_world_png_sketch.exp.png diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index e5b3e58521..a49fdd32cd 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -33,7 +33,17 @@ func TestCLI_E2E(t *testing.T) { name: "hello_world_png_pad", run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { writeFile(t, dir, "hello-world.d2", `x -> y`) - err := runTestMain(t, ctx, dir, env, "-pad 4000", "hello-world.d2", "hello-world.png") + err := runTestMain(t, ctx, dir, env, "--pad=400", "hello-world.d2", "hello-world.png") + assert.Success(t, err) + png := readFile(t, dir, "hello-world.png") + assert.Testdata(t, ".png", png) + }, + }, + { + name: "hello_world_png_sketch", + run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { + writeFile(t, dir, "hello-world.d2", `x -> y`) + err := runTestMain(t, ctx, dir, env, "--sketch", "hello-world.d2", "hello-world.png") assert.Success(t, err) png := readFile(t, dir, "hello-world.png") assert.Testdata(t, ".png", png) diff --git a/e2etests-cli/testdata/TestCLI_E2E/hello_world_png_pad.exp.png b/e2etests-cli/testdata/TestCLI_E2E/hello_world_png_pad.exp.png index 613ca9a6337b4c45eed3355693af6b4305db717c..296288588f1d201e1152eb956d58535f39132215 100644 GIT binary patch literal 73528 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 Z`o`gQU1Ezu)?h`DBSz+bDl~Km`!kJXRa*c6 literal 0 HcmV?d00001 From 4433f4bbae88bd48c3e4e4c60a9451333fd57fe4 Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 2 Mar 2023 20:29:56 -0800 Subject: [PATCH 4/9] e2etests-cli: Add multiboard test --- d2cli/main.go | 4 ++ e2etests-cli/main_test.go | 59 ++++++++++++++++++- .../TestCLI_E2E/multiboard/life/index.exp.svg | 23 ++++++++ .../multiboard/life/layers/broker.exp.svg | 23 ++++++++ .../multiboard/life/layers/core.exp.svg | 23 ++++++++ .../multiboard/life/layers/stocks.exp.svg | 23 ++++++++ .../multiboard/life/scenarios/why.exp.svg | 23 ++++++++ go.mod | 2 +- go.sum | 4 +- 9 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life/index.exp.svg create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/broker.exp.svg create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/core.exp.svg create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/stocks.exp.svg create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life/scenarios/why.exp.svg diff --git a/d2cli/main.go b/d2cli/main.go index c68f9ef0c2..a96277ce35 100644 --- a/d2cli/main.go +++ b/d2cli/main.go @@ -153,6 +153,10 @@ func Run(ctx context.Context, ms *xmain.State) (err error) { } } inputPath = filepath.Join(ms.PWD, inputPath) + d, err := os.Stat(inputPath) + if err == nil && d.IsDir() { + inputPath = filepath.Join(inputPath, "index.d2") + } outputPath = filepath.Join(ms.PWD, outputPath) match := d2themescatalog.Find(*themeFlag) diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index a49fdd32cd..7a8fd1844a 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -2,6 +2,7 @@ package e2etests_cli import ( "context" + "os" "path/filepath" "testing" "time" @@ -49,6 +50,39 @@ func TestCLI_E2E(t *testing.T) { assert.Testdata(t, ".png", png) }, }, + { + name: "multiboard/life", + run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { + writeFile(t, dir, "life/index.d2", `x -> y +layers: { + core: { + belief + food + diet + } + broker: { + mortgage + realtor + } + stocks: { + TSX + NYSE + NASDAQ + } +} + +scenarios: { + why: { + y -> x + } +} +`) + err := runTestMain(t, ctx, dir, env, "life") + assert.Success(t, err) + + assert.TestdataDir(t, filepath.Join(dir, "life")) + }, + }, } ctx := context.Background() @@ -85,11 +119,18 @@ func runTestMain(tb testing.TB, ctx context.Context, dir string, env *xos.Env, a tms := testMain(dir, env, args...) tms.Start(tb, ctx) defer tms.Cleanup(tb) - return tms.Wait(ctx) + err := tms.Wait(ctx) + if err != nil { + return err + } + removeD2Files(tb, dir) + return nil } func writeFile(tb testing.TB, dir, fp, data string) { tb.Helper() + err := os.MkdirAll(filepath.Dir(filepath.Join(dir, fp)), 0755) + assert.Success(tb, err) assert.WriteFile(tb, filepath.Join(dir, fp), []byte(data), 0644) } @@ -97,3 +138,19 @@ func readFile(tb testing.TB, dir, fp string) []byte { tb.Helper() return assert.ReadFile(tb, filepath.Join(dir, fp)) } + +func removeD2Files(tb testing.TB, dir string) { + ea, err := os.ReadDir(dir) + assert.Success(tb, err) + + for _, e := range ea { + if e.IsDir() { + removeD2Files(tb, filepath.Join(dir, e.Name())) + continue + } + ext := filepath.Ext(e.Name()) + if ext == ".d2" { + assert.Remove(tb, filepath.Join(dir, e.Name())) + } + } +} diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/index.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/index.exp.svg new file mode 100644 index 0000000000..4787423c11 --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/index.exp.svg @@ -0,0 +1,23 @@ +xy + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/broker.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/broker.exp.svg new file mode 100644 index 0000000000..adaadb7a21 --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/broker.exp.svg @@ -0,0 +1,23 @@ +mortgagerealtor + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/core.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/core.exp.svg new file mode 100644 index 0000000000..c3aac3445b --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/core.exp.svg @@ -0,0 +1,23 @@ +belieffooddiet + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/stocks.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/stocks.exp.svg new file mode 100644 index 0000000000..bbfda51516 --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/layers/stocks.exp.svg @@ -0,0 +1,23 @@ +TSXNYSENASDAQ + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/scenarios/why.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/scenarios/why.exp.svg new file mode 100644 index 0000000000..e5ed30e0cf --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life/scenarios/why.exp.svg @@ -0,0 +1,23 @@ +xy + + + diff --git a/go.mod b/go.mod index fdcf380e4f..a365cb60aa 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 gonum.org/v1/plot v0.12.0 nhooyr.io/websocket v1.8.7 - oss.terrastruct.com/util-go v0.0.0-20230303033840-484c630faa46 + oss.terrastruct.com/util-go v0.0.0-20230303042538-fdc0536b018e ) require ( diff --git a/go.sum b/go.sum index d8c5c9272b..97a072d2e5 100644 --- a/go.sum +++ b/go.sum @@ -277,6 +277,6 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -oss.terrastruct.com/util-go v0.0.0-20230303033840-484c630faa46 h1:pVcaRgqhNDXtWlsHg1cAy7BRycDiOaAEBexCFgMyUxQ= -oss.terrastruct.com/util-go v0.0.0-20230303033840-484c630faa46/go.mod h1:Fwy72FDIOOM4K8F96ScXkxHHppR1CPfUyo9+x9c1PBU= +oss.terrastruct.com/util-go v0.0.0-20230303042538-fdc0536b018e h1:twJhFNDPf1H45J9F2kDsof5lKQg7rW7/5M1waFngIHo= +oss.terrastruct.com/util-go v0.0.0-20230303042538-fdc0536b018e/go.mod h1:Fwy72FDIOOM4K8F96ScXkxHHppR1CPfUyo9+x9c1PBU= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= From 6706120bc63beb5f75d64605678758082232e94d Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 2 Mar 2023 20:34:12 -0800 Subject: [PATCH 5/9] ci: Install playwright deps in test.sh --- ci/release/docker/Dockerfile | 3 +-- ci/test.sh | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/release/docker/Dockerfile b/ci/release/docker/Dockerfile index 33acac831e..0d7789a260 100644 --- a/ci/release/docker/Dockerfile +++ b/ci/release/docker/Dockerfile @@ -7,8 +7,7 @@ RUN apt-get update && apt-get install -y ca-certificates curl dumb-init sudo RUN curl -fsSL https://deb.nodesource.com/setup_19.x | bash -s - && \ apt-get install -y nodejs -# See https://github.com/microsoft/playwright/issues/18319 -RUN npx playwright@1.31.1 install-deps chromium +RUN npx playwright@1.31.1 install --with-deps chromium RUN adduser --gecos '' --disabled-password debian \ && echo "debian ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/nopasswd diff --git a/ci/test.sh b/ci/test.sh index da523b72dc..f7d92a6de7 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -8,5 +8,6 @@ fi if [ "${CI:-}" ]; then export FORCE_COLOR=1 + npx playwright@1.31.1 install --with-deps chromium fi go test --timeout=30m "$@" From 6724ea3eb3f96f2bb49ccb2eae23e3dcd52cc126 Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 2 Mar 2023 20:39:00 -0800 Subject: [PATCH 6/9] e2etests-cli: Add separate index_d2 multiboard test --- e2etests-cli/main_test.go | 33 +++++++++++++++++++ .../multiboard/life_index_d2/index.exp.svg | 23 +++++++++++++ .../life_index_d2/layers/broker.exp.svg | 23 +++++++++++++ .../life_index_d2/layers/core.exp.svg | 23 +++++++++++++ .../life_index_d2/layers/stocks.exp.svg | 23 +++++++++++++ .../life_index_d2/scenarios/why.exp.svg | 23 +++++++++++++ 6 files changed, 148 insertions(+) create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/index.exp.svg create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/broker.exp.svg create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/core.exp.svg create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/stocks.exp.svg create mode 100644 e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/scenarios/why.exp.svg diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index 7a8fd1844a..f9b4c45650 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -52,6 +52,39 @@ func TestCLI_E2E(t *testing.T) { }, { name: "multiboard/life", + run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { + writeFile(t, dir, "life.d2", `x -> y +layers: { + core: { + belief + food + diet + } + broker: { + mortgage + realtor + } + stocks: { + TSX + NYSE + NASDAQ + } +} + +scenarios: { + why: { + y -> x + } +} +`) + err := runTestMain(t, ctx, dir, env, "life.d2") + assert.Success(t, err) + + assert.TestdataDir(t, filepath.Join(dir, "life")) + }, + }, + { + name: "multiboard/life_index_d2", run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { writeFile(t, dir, "life/index.d2", `x -> y layers: { diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/index.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/index.exp.svg new file mode 100644 index 0000000000..4787423c11 --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/index.exp.svg @@ -0,0 +1,23 @@ +xy + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/broker.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/broker.exp.svg new file mode 100644 index 0000000000..adaadb7a21 --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/broker.exp.svg @@ -0,0 +1,23 @@ +mortgagerealtor + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/core.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/core.exp.svg new file mode 100644 index 0000000000..c3aac3445b --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/core.exp.svg @@ -0,0 +1,23 @@ +belieffooddiet + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/stocks.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/stocks.exp.svg new file mode 100644 index 0000000000..bbfda51516 --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/layers/stocks.exp.svg @@ -0,0 +1,23 @@ +TSXNYSENASDAQ + + + diff --git a/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/scenarios/why.exp.svg b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/scenarios/why.exp.svg new file mode 100644 index 0000000000..e5ed30e0cf --- /dev/null +++ b/e2etests-cli/testdata/TestCLI_E2E/multiboard/life_index_d2/scenarios/why.exp.svg @@ -0,0 +1,23 @@ +xy + + + From 86de922ec01cf527eaced9f97d9bb9d58be767fc Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 2 Mar 2023 20:45:41 -0800 Subject: [PATCH 7/9] e2etests-cli: Skip sketch test for now --- e2etests-cli/main_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index f9b4c45650..a844b73315 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -18,6 +18,7 @@ func TestCLI_E2E(t *testing.T) { tca := []struct { name string + skip bool run func(t *testing.T, ctx context.Context, dir string, env *xos.Env) }{ { @@ -42,6 +43,8 @@ func TestCLI_E2E(t *testing.T) { }, { name: "hello_world_png_sketch", + // https://github.com/terrastruct/d2/pull/963#pullrequestreview-1323089392 + skip: true, run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { writeFile(t, dir, "hello-world.d2", `x -> y`) err := runTestMain(t, ctx, dir, env, "--sketch", "hello-world.d2", "hello-world.png") @@ -124,6 +127,10 @@ scenarios: { t.Run(tc.name, func(t *testing.T) { t.Parallel() + if tc.skip { + t.SkipNow() + } + ctx, cancel := context.WithTimeout(ctx, time.Minute*5) defer cancel() From 7077f2edefd7305c9af159375bc715b9d22e5b05 Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 2 Mar 2023 21:20:58 -0800 Subject: [PATCH 8/9] e2etests-cli: Ignore png and --sketch diffs --- e2etests-cli/main_test.go | 19 +++++++++---------- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index a844b73315..2155b96165 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -9,6 +9,7 @@ import ( "oss.terrastruct.com/d2/d2cli" "oss.terrastruct.com/util-go/assert" + "oss.terrastruct.com/util-go/diff" "oss.terrastruct.com/util-go/xmain" "oss.terrastruct.com/util-go/xos" ) @@ -18,7 +19,6 @@ func TestCLI_E2E(t *testing.T) { tca := []struct { name string - skip bool run func(t *testing.T, ctx context.Context, dir string, env *xos.Env) }{ { @@ -28,7 +28,7 @@ func TestCLI_E2E(t *testing.T) { err := runTestMain(t, ctx, dir, env, "hello-world.d2", "hello-world.png") assert.Success(t, err) png := readFile(t, dir, "hello-world.png") - assert.Testdata(t, ".png", png) + testdataIgnoreDiff(t, ".png", png) }, }, { @@ -38,19 +38,18 @@ func TestCLI_E2E(t *testing.T) { err := runTestMain(t, ctx, dir, env, "--pad=400", "hello-world.d2", "hello-world.png") assert.Success(t, err) png := readFile(t, dir, "hello-world.png") - assert.Testdata(t, ".png", png) + testdataIgnoreDiff(t, ".png", png) }, }, { name: "hello_world_png_sketch", - // https://github.com/terrastruct/d2/pull/963#pullrequestreview-1323089392 - skip: true, run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { writeFile(t, dir, "hello-world.d2", `x -> y`) err := runTestMain(t, ctx, dir, env, "--sketch", "hello-world.d2", "hello-world.png") assert.Success(t, err) png := readFile(t, dir, "hello-world.png") - assert.Testdata(t, ".png", png) + // https://github.com/terrastruct/d2/pull/963#pullrequestreview-1323089392 + testdataIgnoreDiff(t, ".png", png) }, }, { @@ -127,10 +126,6 @@ scenarios: { t.Run(tc.name, func(t *testing.T) { t.Parallel() - if tc.skip { - t.SkipNow() - } - ctx, cancel := context.WithTimeout(ctx, time.Minute*5) defer cancel() @@ -194,3 +189,7 @@ func removeD2Files(tb testing.TB, dir string) { } } } + +func testdataIgnoreDiff(tb testing.TB, ext string, got []byte) { + _ = diff.Testdata(filepath.Join("testdata", tb.Name()), ext, got) +} diff --git a/go.mod b/go.mod index a365cb60aa..a3d90206c4 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 gonum.org/v1/plot v0.12.0 nhooyr.io/websocket v1.8.7 - oss.terrastruct.com/util-go v0.0.0-20230303042538-fdc0536b018e + oss.terrastruct.com/util-go v0.0.0-20230303051516-f04d4d93bed8 ) require ( diff --git a/go.sum b/go.sum index 97a072d2e5..f7c1982238 100644 --- a/go.sum +++ b/go.sum @@ -277,6 +277,6 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -oss.terrastruct.com/util-go v0.0.0-20230303042538-fdc0536b018e h1:twJhFNDPf1H45J9F2kDsof5lKQg7rW7/5M1waFngIHo= -oss.terrastruct.com/util-go v0.0.0-20230303042538-fdc0536b018e/go.mod h1:Fwy72FDIOOM4K8F96ScXkxHHppR1CPfUyo9+x9c1PBU= +oss.terrastruct.com/util-go v0.0.0-20230303051516-f04d4d93bed8 h1:sXAJ18qH3RfrhvAo3YaGv1mDewEKV8etsFq1KqhbvIM= +oss.terrastruct.com/util-go v0.0.0-20230303051516-f04d4d93bed8/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= From ae689fcc1f4366a8b505b5555b4ec672b95ffe5a Mon Sep 17 00:00:00 2001 From: Anmol Sethi Date: Thu, 2 Mar 2023 21:28:33 -0800 Subject: [PATCH 9/9] e2etests-cli: Skip png tests on CI PNG renders seem to work intermittently on github actions so whatever. If we're ignoring the diffs we might as well not even run these on CI. --- e2etests-cli/main_test.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index 2155b96165..29529b8672 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -18,11 +18,13 @@ func TestCLI_E2E(t *testing.T) { t.Parallel() tca := []struct { - name string - run func(t *testing.T, ctx context.Context, dir string, env *xos.Env) + name string + skipCI bool + run func(t *testing.T, ctx context.Context, dir string, env *xos.Env) }{ { - name: "hello_world_png", + name: "hello_world_png", + skipCI: true, run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { writeFile(t, dir, "hello-world.d2", `x -> y`) err := runTestMain(t, ctx, dir, env, "hello-world.d2", "hello-world.png") @@ -32,7 +34,8 @@ func TestCLI_E2E(t *testing.T) { }, }, { - name: "hello_world_png_pad", + name: "hello_world_png_pad", + skipCI: true, run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { writeFile(t, dir, "hello-world.d2", `x -> y`) err := runTestMain(t, ctx, dir, env, "--pad=400", "hello-world.d2", "hello-world.png") @@ -42,7 +45,8 @@ func TestCLI_E2E(t *testing.T) { }, }, { - name: "hello_world_png_sketch", + name: "hello_world_png_sketch", + skipCI: true, run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { writeFile(t, dir, "hello-world.d2", `x -> y`) err := runTestMain(t, ctx, dir, env, "--sketch", "hello-world.d2", "hello-world.png") @@ -126,6 +130,10 @@ scenarios: { t.Run(tc.name, func(t *testing.T) { t.Parallel() + if tc.skipCI && os.Getenv("CI") != "" { + t.SkipNow() + } + ctx, cancel := context.WithTimeout(ctx, time.Minute*5) defer cancel()