blob: dbb8dc8a7a0aace9f12ba847aa1f372af9b43efe [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package rules
import (
"testing"
)
func TestBadHeaders(t *testing.T) {
ruleTestCase{
files: map[string]string{
"dupe_header.md": `
# Header
## Summary
Duplicate header below!
«##» Summary
Duplicate header above!`,
"trip_header.md": `
# Header
## Summary
Duplicate header below!
«##» Summary
Duplicate header above, triplicate header below!
«##» Summary
Triplicate header above!`,
"dupe_at_eof.md": `
# Header
## Summary
Duplicate header in final line (i.e. followed by EOF, not newline) should still be caught.
«##» Summary`,
"trip_at_eof.md": `
# Header
## Summary
Duplicate header below!
«##» Summary
Duplicate header above, triplicate header below!
«##» Summary`,
},
}.runOverTokens(t, newBadHeaders)
}
func TestBadHeaders_siblingHeaders(t *testing.T) {
ruleTestCase{
files: map[string]string{
"trip_sibling_header.md": `
# Header
## Section A
### Introduction
## Section B
The header below has no duplicate siblings, although it does have duplicate 'cousins'; this is acceptable.
### Introduction
## Section C
### Introduction
The header below is a duplicate of it's sibling one line above; this is unacceptable.
«###» Introduction
## Section D
### Section D1
#### Introduction
### Section D2
#### Introduction
«####» Introduction`,
},
}.runOverTokens(t, newBadHeaders)
}
func TestBadHeaders_headersIgnoreCaseAndWhitespace(t *testing.T) {
ruleTestCase{
files: map[string]string{
"ignore_whitespace.md": `
# Header
## Duplicate
«##» Duplicate
## Not a duplicate
«##» Dupli cat e `,
"ignore_case": `
# Header
## Introduction
«##» INTRODUCTION
«##» iNtRoDuCtIoN
## Intro`,
"ignore_both_case_and_whitespace": `
# Header
## Duplicate
«##» Du Pli Cate
«##» Dup LiCaTe
«##» DuplicatE `,
},
}.runOverTokens(t, newBadHeaders)
}
func TestBadHeaders_misnumberedHeaders(t *testing.T) {
ruleTestCase{
files: map[string]string{
"misnumbered_headers.md": `
# H1
## H2
«####» H4
Above header is two levels higher than previous header, making it invalid. Only H2, or H3 would be valid here.
### H3
#### H4
## H2-2
Above header is two levels lower than previous header, which is valid.
## H2-3
«#» Title B
Above header is H1, which is invalid; only one H1 can exist in a doc.
### H3-2
#### H4
## H2-4`,
},
}.runOverTokens(t, newBadHeaders)
}
func TestBadHeaders_initialHeaderAtTopOfDoc(t *testing.T) {
ruleTestCase{
files: map[string]string{
"h1_at_top.md": `
# Header`,
"h1_preceded_by_jinja.md": `
{% set a = 0 %}
{% set b = 1 %}
{# comment #}
# Header`,
"h1_preceded_by_text.md": `
«This» is text before a header, only the first token is reported to avoid spamming.
# Header
`,
"h1_preceded_by_jinja_and_text.md": `
{# This comment is acceptable #}
«This» is text before a header, and it is unacceptable.
{# This comment is acceptable #}
# Header`,
"h1_preceded_by_html_comment.md": `
<!-- This is an HTML comment, which is allowed to precede H1 -->
# Header`,
"h1_preceded_by_html_comment_jinja_and_text.md": `
<!-- This HTML comment is acceptable -->
{# This jinja comment is acceptable #}
«This» is text before a header, and it is unacceptable.
# Header`,
},
}.runOverTokens(t, newBadHeaders)
}