// SPDX-License-Identifier: Apache-2.0 package sando import ( "bytes" "context" "html/template" "io" "testing" ) type benchmarkView struct { Title string URL string Admin bool Items []string } var ( benchmarkContext = context.Background() benchmarkData = benchmarkView{ Title: `A typed & its "output"`, URL: "/projects/sandwich-hime/?from=benchmark&mode=equivalent", Admin: true, Items: []string{"compiler", "runtime", "language server", "editor tooling"}, } benchmarkHTMLTemplate = template.Must(template.New("v1-corpus").Parse(`

{{.Title}}

{{if .Admin}}Admin{{end}}Open
`)) ) func benchmarkSandoComponent(view benchmarkView) Component { return ComponentFunc(func(_ context.Context, writer io.Writer) error { if err := WriteString(writer, `

`); err != nil { return err } if err := WriteText(writer, view.Title); err != nil { return err } if err := WriteString(writer, `

`); err != nil { return err } if view.Admin { if err := WriteString(writer, `Admin`); err != nil { return err } } if err := WriteString(writer, `Open
`) }) } func TestBenchmarkCorpusEquivalent(t *testing.T) { t.Parallel() var himeOutput bytes.Buffer if err := Render(benchmarkContext, &himeOutput, benchmarkSandoComponent(benchmarkData)); err != nil { t.Fatal(err) } var standardOutput bytes.Buffer if err := benchmarkHTMLTemplate.Execute(&standardOutput, benchmarkData); err != nil { t.Fatal(err) } if himeOutput.String() != standardOutput.String() { t.Fatalf("benchmark corpus is not output-equivalent\nhtml/template: %q\nSandwich Hime: %q", standardOutput.String(), himeOutput.String()) } } func BenchmarkV1CorpusSandwichHime(b *testing.B) { b.ReportAllocs() b.SetBytes(int64(renderedBenchmarkSize(b))) for b.Loop() { if err := Render(benchmarkContext, io.Discard, benchmarkSandoComponent(benchmarkData)); err != nil { b.Fatal(err) } } } func BenchmarkV1CorpusHTMLTemplate(b *testing.B) { b.ReportAllocs() b.SetBytes(int64(renderedBenchmarkSize(b))) for b.Loop() { if err := benchmarkHTMLTemplate.Execute(io.Discard, benchmarkData); err != nil { b.Fatal(err) } } } func renderedBenchmarkSize(tb testing.TB) int { tb.Helper() var output bytes.Buffer if err := Render(benchmarkContext, &output, benchmarkSandoComponent(benchmarkData)); err != nil { tb.Fatal(err) } return output.Len() }