| package util |
| |
| import ( |
| "fmt" |
| "testing" |
| ) |
| |
| type lexTest struct { |
| name string // Name of the sub-test. |
| input string // Input string to be lexed. |
| want []item // Expected items produced by lexer. |
| } |
| |
| const ( |
| block1 = "echo $PATH\n" + |
| "echo $GOPATH" |
| block2 = "kill -9 $pid" |
| ) |
| |
| var ( |
| tEOF = item{itemEOF, ""} |
| ) |
| |
| var lexTests = []lexTest{ |
| {"empty", "", []item{tEOF}}, |
| {"spaces", " \t\n", []item{tEOF}}, |
| {"text", "blah blah blinkity blah", []item{tEOF}}, |
| {"comment1", "<!-- -->", []item{tEOF}}, |
| {"comment2", "a <!-- --> b", []item{tEOF}}, |
| {"block1", "aa <!-- @1 -->\n" + |
| "```\n" + block1 + "```\n bbb", |
| []item{{itemBlockLabel, "1"}, |
| {itemCommandBlock, block1}, |
| tEOF}}, |
| {"block2", "aa <!-- @1 @2-->\n" + |
| "```\n" + block1 + "```\n bb cc\n" + |
| "dd <!-- @3 @4-->\n" + |
| "```\n" + block2 + "```\n ee ff\n", |
| []item{ |
| {itemBlockLabel, "1"}, |
| {itemBlockLabel, "2"}, |
| {itemCommandBlock, block1}, |
| {itemBlockLabel, "3"}, |
| {itemBlockLabel, "4"}, |
| {itemCommandBlock, block2}, |
| tEOF}}, |
| } |
| |
| // collect gathers the emitted items into a slice. |
| func collect(t *lexTest) (items []item) { |
| l := newLex(t.input) |
| for { |
| item := l.nextItem() |
| items = append(items, item) |
| if item.typ == itemEOF || item.typ == itemError { |
| break |
| } |
| } |
| return |
| } |
| |
| func equal(i1, i2 []item) bool { |
| if len(i1) != len(i2) { |
| return false |
| } |
| for k := range i1 { |
| if i1[k].typ != i2[k].typ { |
| fmt.Printf("types not equal - got : %s\n", i1[k].typ) |
| fmt.Printf("types not equal - want: %s\n", i2[k].typ) |
| fmt.Printf("\n") |
| return false |
| } |
| if i1[k].val != i2[k].val { |
| fmt.Printf("vals not equal - got : %q\n", i1[k].val) |
| fmt.Printf("vals not equal - want: %q\n", i2[k].val) |
| fmt.Printf("\n") |
| return false |
| } |
| } |
| return true |
| } |
| |
| func TestLex(t *testing.T) { |
| for _, test := range lexTests { |
| got := collect(&test) |
| if !equal(got, test.want) { |
| t.Errorf("%s:\ngot\n\t%+v\nexpected\n\t%v", test.name, got, test.want) |
| } |
| } |
| } |