This commit is contained in:
parent
db3a3e29eb
commit
42fa039daf
11 changed files with 522 additions and 138 deletions
|
|
@ -15,7 +15,7 @@ func TestNewParser(t *testing.T) {
|
|||
t.Fatal("parser should not be nil")
|
||||
}
|
||||
|
||||
if p.pos != 0 {
|
||||
if p.state.pos != 0 {
|
||||
t.Error("parser should initialize position at 0")
|
||||
}
|
||||
|
||||
|
|
@ -715,6 +715,95 @@ func GetTokenTestData() map[string]TokenTestData {
|
|||
0, 0,
|
||||
},
|
||||
},
|
||||
"record/single": {
|
||||
[]Token{
|
||||
NewToken(TokenOpenParenthesis, 0, 0, 0, "("),
|
||||
NewToken(TokenName, 0, 0, 1, "a"),
|
||||
NewToken(TokenColon, 0, 0, 0, ":"),
|
||||
NewToken(TokenInteger, 0, 0, 0, "2"),
|
||||
NewToken(TokenCloseParenthesis, 0, 0, 0, ")"),
|
||||
NewToken(TokenEOF, 0, 0, 0, ""),
|
||||
},
|
||||
&BlockNode{
|
||||
[]Node{
|
||||
&RecordNode{
|
||||
map[string]Node{
|
||||
"a": &IntegerNode{
|
||||
big.NewInt(2),
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
"record/multiple": {
|
||||
[]Token{
|
||||
NewToken(TokenOpenParenthesis, 0, 0, 0, "("),
|
||||
NewToken(TokenName, 0, 0, 1, "a"),
|
||||
NewToken(TokenColon, 0, 0, 0, ":"),
|
||||
NewToken(TokenInteger, 0, 0, 0, "2"),
|
||||
NewToken(TokenComma, 0, 0, 0, ","),
|
||||
NewToken(TokenName, 0, 0, 1, "b"),
|
||||
NewToken(TokenColon, 0, 0, 0, ":"),
|
||||
NewToken(TokenInteger, 0, 0, 0, "4"),
|
||||
NewToken(TokenCloseParenthesis, 0, 0, 0, ")"),
|
||||
NewToken(TokenEOF, 0, 0, 0, ""),
|
||||
},
|
||||
&BlockNode{
|
||||
[]Node{
|
||||
&RecordNode{
|
||||
map[string]Node{
|
||||
"a": &IntegerNode{
|
||||
big.NewInt(2),
|
||||
0, 0,
|
||||
},
|
||||
"b": &IntegerNode{
|
||||
big.NewInt(4),
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
"record/shorthand": {
|
||||
[]Token{
|
||||
NewToken(TokenOpenParenthesis, 0, 0, 0, "("),
|
||||
NewToken(TokenName, 0, 0, 1, "a"),
|
||||
NewToken(TokenColon, 0, 0, 0, ":"),
|
||||
NewToken(TokenComma, 0, 0, 0, ","),
|
||||
NewToken(TokenName, 0, 0, 1, "b"),
|
||||
NewToken(TokenColon, 0, 0, 0, ":"),
|
||||
NewToken(TokenCloseParenthesis, 0, 0, 0, ")"),
|
||||
NewToken(TokenEOF, 0, 0, 0, ""),
|
||||
},
|
||||
&BlockNode{
|
||||
[]Node{
|
||||
&RecordNode{
|
||||
map[string]Node{
|
||||
"a": &ReferenceNode{
|
||||
"a",
|
||||
0, 0,
|
||||
},
|
||||
"b": &ReferenceNode{
|
||||
"b",
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
0, 0,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -912,6 +1001,23 @@ func NodeEquality(t *testing.T, n1 Node, n2 Node) {
|
|||
NodeEquality(t, v1, t2.items[i])
|
||||
}
|
||||
|
||||
case RecordNodeType:
|
||||
r1 := n1.(*RecordNode)
|
||||
r2 := n2.(*RecordNode)
|
||||
|
||||
if len(r1.entries) != len(r2.entries) {
|
||||
t.Fatalf("Record node entries count does not match")
|
||||
}
|
||||
|
||||
for i, v1 := range r1.entries {
|
||||
t.Logf("Checking item %s", i)
|
||||
if v2, ok := r2.entries[i]; ok {
|
||||
NodeEquality(t, v1, v2)
|
||||
} else {
|
||||
t.Errorf("Record node entry %s from first does not exist in other", i)
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
panic("unimplemented node equality")
|
||||
}
|
||||
|
|
@ -939,25 +1045,55 @@ func TestParser_Parse(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestParser_AcceptAll(t *testing.T) {
|
||||
func TestParser_AcceptSeq(t *testing.T) {
|
||||
p := NewParser("a:", []string{}, []Token{
|
||||
NewToken(TokenName, 0, 1, 0, "a"),
|
||||
NewToken(TokenColon, 1, 2, 0, "a"),
|
||||
NewToken(TokenColon, 1, 2, 0, ":"),
|
||||
NewToken(TokenEOF, 2, 2, 0, ""),
|
||||
})
|
||||
|
||||
if !p.acceptAll(TokenName, TokenColon) {
|
||||
// initialize
|
||||
p.advance()
|
||||
|
||||
if !p.acceptSeq(TokenName, TokenColon) {
|
||||
t.Fatalf("tokens were not accepted")
|
||||
}
|
||||
|
||||
t.Logf("tokens were accepted")
|
||||
}
|
||||
|
||||
func TestParser_AcceptAll_TooFew(t *testing.T) {
|
||||
p := NewParser("a", []string{}, []Token{
|
||||
func TestParser_AcceptSeqAndAfter(t *testing.T) {
|
||||
p := NewParser("a: 1", []string{}, []Token{
|
||||
NewToken(TokenName, 0, 1, 0, "a"),
|
||||
NewToken(TokenColon, 1, 2, 0, ":"),
|
||||
NewToken(TokenInteger, 3, 4, 0, "1"),
|
||||
NewToken(TokenEOF, 4, 4, 0, ""),
|
||||
})
|
||||
|
||||
if p.acceptAll(TokenName, TokenColon) {
|
||||
// initialize
|
||||
p.advance()
|
||||
|
||||
if !p.acceptSeq(TokenName, TokenColon) {
|
||||
t.Fatalf("seq tokens were not accepted")
|
||||
}
|
||||
|
||||
if !p.accept(TokenInteger) {
|
||||
t.Fatalf("integer was not accepted")
|
||||
}
|
||||
|
||||
t.Logf("tokens were accepted")
|
||||
}
|
||||
|
||||
func TestParser_AcceptSeq_TooFew(t *testing.T) {
|
||||
p := NewParser("a", []string{}, []Token{
|
||||
NewToken(TokenName, 0, 1, 0, "a"),
|
||||
NewToken(TokenEOF, 1, 1, 0, ""),
|
||||
})
|
||||
|
||||
// initialize
|
||||
p.advance()
|
||||
|
||||
if p.acceptSeq(TokenName, TokenColon) {
|
||||
t.Fatalf("tokens were incorrectly accepted")
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue