package issue import "testing" const boxes = `## Acceptance criteria - [ ] первый пункт - [x] второй пункт, который переносится на вторую строку * [X] третий 1. [ ] четвёртый ## Notes ` + "```" + ` - [ ] это пример разметки, а не состояние ` + "```" + ` ` func TestCheckboxesReadTheWholeBody(t *testing.T) { items := Checkboxes(boxes) if len(items) != 4 { t.Fatalf("found %d items, want 4: %+v", len(items), items) } if items[1].Text != "второй пункт, который переносится на вторую строку" { t.Errorf("continuation not joined: %q", items[1].Text) } if items[1].EndLine != 4 { t.Errorf("end line = %d, want 4", items[1].EndLine) } if !items[2].Checked { t.Error("[X] must read as checked") } if items[3].Section != ACSection { t.Errorf("section = %q", items[3].Section) } for _, c := range items { if c.Section == "## Notes" { t.Error("a checkbox inside a code fence was counted") } } } func TestCheckboxProgressIsCountedOffTheBody(t *testing.T) { done, total := CheckboxProgress(boxes) if done != 2 || total != 4 { t.Errorf("progress = %d/%d, want 2/4", done, total) } } func TestSetCheckboxChangesExactlyOneByte(t *testing.T) { items := Checkboxes(boxes) got, err := SetCheckbox(boxes, items[0].Line, true) if err != nil { t.Fatal(err) } if len(got) != len(boxes) { t.Fatalf("length changed: %d -> %d", len(boxes), len(got)) } diff := 0 for i := range got { if got[i] != boxes[i] { diff++ } } if diff != 1 { t.Errorf("%d bytes changed, want 1", diff) } } func TestSetCheckboxIsANoOpWhenAlreadyInState(t *testing.T) { items := Checkboxes(boxes) // [X] keeps its capital: the state already matches, so nothing is rewritten. got, err := SetCheckbox(boxes, items[2].Line, true) if err != nil { t.Fatal(err) } if got != boxes { t.Error("an already-checked box was rewritten") } } func TestSetCheckboxRefusesALineThatIsNotOne(t *testing.T) { if _, err := SetCheckbox(boxes, 1, true); err == nil { t.Error("ticking a heading must fail") } if _, err := SetCheckbox(boxes, 9999, true); err == nil { t.Error("ticking past the end must fail") } } func TestBodyDepRefsOnlyReadTheDepSections(t *testing.T) { body := `## Summary смотри также some-other-issue, который не зависимость ## Depends on - migrate-schema — нужна схема - add-pool-cfg ## Issues - [ ] wire-sqlc-appclick — часть - [ ] #42 ` got := BodyDepRefs(body) want := []DepRef{ {DependsSection, "migrate-schema"}, {DependsSection, "add-pool-cfg"}, {IssuesSection, "wire-sqlc-appclick"}, {IssuesSection, "#42"}, } if len(got) != len(want) { t.Fatalf("got %+v, want %+v", got, want) } for i := range want { if got[i] != want[i] { t.Errorf("ref %d = %+v, want %+v", i, got[i], want[i]) } } }