hcl/hclsyntax/peeker_test.go
Martin Atkins 6c4344623b Unfold the "hcl" directory up into the root
The main HCL package is more visible this way, and so it's easier than
having to pick it out from dozens of other package directories.
2019-09-09 16:08:19 -07:00

164 lines
2.5 KiB
Go

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)
}
}
}