| package hclsyntax |
| |
| import ( |
| "reflect" |
| "testing" |
| ) |
| |
| func init() { |
| // see the documentation of this variable for more information |
| tracePeekerNewlinesStack = true |
| } |
| |
| func TestPeeker(t *testing.T) { |
| tokens := Tokens{ |
| { |
| Type: TokenIdent, |
| }, |
| { |
| Type: TokenComment, |
| }, |
| { |
| Type: TokenIdent, |
| }, |
| { |
| Type: TokenComment, |
| }, |
| { |
| Type: TokenIdent, |
| }, |
| { |
| Type: TokenNewline, |
| }, |
| { |
| Type: TokenIdent, |
| }, |
| { |
| Type: TokenNewline, |
| }, |
| { |
| Type: TokenIdent, |
| }, |
| { |
| Type: TokenNewline, |
| }, |
| { |
| Type: TokenEOF, |
| }, |
| } |
| |
| { |
| peeker := newPeeker(tokens, true) |
| |
| wantTypes := []TokenType{ |
| TokenIdent, |
| TokenComment, |
| TokenIdent, |
| TokenComment, |
| TokenIdent, |
| TokenNewline, |
| TokenIdent, |
| TokenNewline, |
| TokenIdent, |
| TokenNewline, |
| TokenEOF, |
| } |
| var gotTypes []TokenType |
| |
| for { |
| peeked := peeker.Peek() |
| read := peeker.Read() |
| if peeked.Type != read.Type { |
| t.Errorf("mismatched Peek %s and Read %s", peeked, read) |
| } |
| |
| gotTypes = append(gotTypes, read.Type) |
| |
| if read.Type == TokenEOF { |
| break |
| } |
| } |
| |
| if !reflect.DeepEqual(gotTypes, wantTypes) { |
| t.Errorf("wrong types\ngot: %#v\nwant: %#v", gotTypes, wantTypes) |
| } |
| } |
| |
| { |
| peeker := newPeeker(tokens, false) |
| |
| wantTypes := []TokenType{ |
| TokenIdent, |
| TokenIdent, |
| TokenIdent, |
| TokenNewline, |
| TokenIdent, |
| TokenNewline, |
| TokenIdent, |
| TokenNewline, |
| TokenEOF, |
| } |
| var gotTypes []TokenType |
| |
| for { |
| peeked := peeker.Peek() |
| read := peeker.Read() |
| if peeked.Type != read.Type { |
| t.Errorf("mismatched Peek %s and Read %s", peeked, read) |
| } |
| |
| gotTypes = append(gotTypes, read.Type) |
| |
| if read.Type == TokenEOF { |
| break |
| } |
| } |
| |
| if !reflect.DeepEqual(gotTypes, wantTypes) { |
| t.Errorf("wrong types\ngot: %#v\nwant: %#v", gotTypes, wantTypes) |
| } |
| } |
| |
| { |
| peeker := newPeeker(tokens, false) |
| |
| peeker.PushIncludeNewlines(false) |
| |
| wantTypes := []TokenType{ |
| TokenIdent, |
| TokenIdent, |
| TokenIdent, |
| TokenIdent, |
| TokenIdent, |
| TokenNewline, // we'll pop off the PushIncludeNewlines before we get here |
| TokenEOF, |
| } |
| var gotTypes []TokenType |
| |
| idx := 0 |
| for { |
| peeked := peeker.Peek() |
| read := peeker.Read() |
| if peeked.Type != read.Type { |
| t.Errorf("mismatched Peek %s and Read %s", peeked, read) |
| } |
| |
| gotTypes = append(gotTypes, read.Type) |
| |
| if read.Type == TokenEOF { |
| break |
| } |
| |
| if idx == 4 { |
| peeker.PopIncludeNewlines() |
| } |
| |
| idx++ |
| } |
| |
| if !reflect.DeepEqual(gotTypes, wantTypes) { |
| t.Errorf("wrong types\ngot: %#v\nwant: %#v", gotTypes, wantTypes) |
| } |
| } |
| } |