diff --git a/docs_test.go b/docs_test.go new file mode 100644 index 0000000..ac48b43 --- /dev/null +++ b/docs_test.go @@ -0,0 +1,58 @@ +package mujica + +import ( + "os" + "path/filepath" + "regexp" + "strings" + "testing" +) + +var ( + docsGoBlock = regexp.MustCompile("(?s)```go\n(.*?)```") + docsSpace = regexp.MustCompile(`\s+`) +) + +// TestDocSnippetsAreCompiledExamples keeps every doc's first Go block inside a compiled Example. +func TestDocSnippetsAreCompiledExamples(t *testing.T) { + examples, err := filepath.Glob("example_*_test.go") + if err != nil { + t.Fatal(err) + } + var all strings.Builder + for _, f := range examples { + b, err := os.ReadFile(f) + if err != nil { + t.Fatal(err) + } + all.Write(b) + } + compiled := docsSpace.ReplaceAllString(all.String(), "") + docs, err := filepath.Glob("docs/components/*.md") + if err != nil { + t.Fatal(err) + } + if len(docs) != 100 { + t.Fatalf("%d component docs, want 100", len(docs)) + } + for _, d := range docs { + b, err := os.ReadFile(d) + if err != nil { + t.Fatal(err) + } + m := docsGoBlock.FindSubmatch(b) + if m == nil { + t.Errorf("%s has no Go example", d) + continue + } + for _, line := range strings.Split(string(m[1]), "\n") { + s := strings.TrimSpace(line) + if s == "" || strings.HasPrefix(s, "//") { + continue + } + if !strings.Contains(compiled, docsSpace.ReplaceAllString(s, "")) { + t.Errorf("%s: %q is not in any compiled Example", d, s) + } + } + } +}