Changes:
- Added helper functions to test BooleanLiterals - Formatting git-svn-id: https://svn.tlawal.org/svn/monkey@33 f6afcba9-9ef1-4bdd-9b72-7484f5705bac
This commit is contained in:
parent
628a604701
commit
388700441e
@ -189,6 +189,6 @@ func (ie *InfixExpression) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Booleans
|
// Booleans
|
||||||
func (b *Boolean) expression_node() {}
|
func (b *Boolean) expression_node() {}
|
||||||
func (b *Boolean) TokenLiteral() string { return b.Token.Literal }
|
func (b *Boolean) TokenLiteral() string { return b.Token.Literal }
|
||||||
func (b *Boolean) String() string { return b.Token.Literal }
|
func (b *Boolean) String() string { return b.Token.Literal}
|
||||||
|
@ -271,7 +271,6 @@ func (l_parser *Parser) no_prefix_parse_function_error(l_token_type token.TokenT
|
|||||||
l_parser.errors = append(l_parser.errors, message)
|
l_parser.errors = append(l_parser.errors, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (l_parser *Parser) parse_boolean() ast.Expression {
|
func (l_parser *Parser) parse_boolean() ast.Expression {
|
||||||
defer untrace(trace("parse_boolean"))
|
defer untrace(trace("parse_boolean"))
|
||||||
return &ast.Boolean{
|
return &ast.Boolean{
|
||||||
|
@ -139,14 +139,16 @@ func TestIntegerLiteralExpressions(l_test *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParsingPrefixExpression(l_test *testing.T) {
|
func TestParsingPrefixExpressions(l_test *testing.T) {
|
||||||
prefix_tests := []struct {
|
prefix_tests := []struct {
|
||||||
input string
|
input string
|
||||||
operator string
|
operator string
|
||||||
integer_value int64
|
value interface{}
|
||||||
}{
|
}{
|
||||||
{"!5;", "!", 5},
|
{"!5;", "!", 5},
|
||||||
{"-15", "-", 15},
|
{"-15", "-", 15},
|
||||||
|
{"!true;", "!", true},
|
||||||
|
{"!false;", "!", false},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range prefix_tests {
|
for _, tt := range prefix_tests {
|
||||||
@ -172,7 +174,7 @@ func TestParsingPrefixExpression(l_test *testing.T) {
|
|||||||
l_test.Fatalf("exp.Operator is not '%s', got %s", tt.operator, expression.Operator)
|
l_test.Fatalf("exp.Operator is not '%s', got %s", tt.operator, expression.Operator)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !testIntegerLiteral(l_test, expression.Right, tt.integer_value) {
|
if !testLiteralExpression(l_test, expression.Right, tt.value) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,9 +183,9 @@ func TestParsingPrefixExpression(l_test *testing.T) {
|
|||||||
func TestParsingInfixExpressions(l_test *testing.T) {
|
func TestParsingInfixExpressions(l_test *testing.T) {
|
||||||
infix_tests := []struct {
|
infix_tests := []struct {
|
||||||
input string
|
input string
|
||||||
left_value int64
|
left_value interface{}
|
||||||
operator string
|
operator string
|
||||||
right_value int64
|
right_value interface{}
|
||||||
}{
|
}{
|
||||||
{"5 + 5;", 5, "+", 5},
|
{"5 + 5;", 5, "+", 5},
|
||||||
{"5 - 5;", 5, "-", 5},
|
{"5 - 5;", 5, "-", 5},
|
||||||
@ -193,6 +195,9 @@ func TestParsingInfixExpressions(l_test *testing.T) {
|
|||||||
{"5 < 5;", 5, "<", 5},
|
{"5 < 5;", 5, "<", 5},
|
||||||
{"5 == 5;", 5, "==", 5},
|
{"5 == 5;", 5, "==", 5},
|
||||||
{"5 != 5;", 5, "!=", 5},
|
{"5 != 5;", 5, "!=", 5},
|
||||||
|
{"true == true", true, "==", true},
|
||||||
|
{"true != false", true, "!=", false},
|
||||||
|
{"false == false", false, "==", false},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range infix_tests {
|
for _, tt := range infix_tests {
|
||||||
@ -269,6 +274,22 @@ func TestOperatorPrecedenceParsing(l_test *testing.T) {
|
|||||||
"3 + 4 * 5 == 3 * 1 + 4 * 5",
|
"3 + 4 * 5 == 3 * 1 + 4 * 5",
|
||||||
"((3 + (4 * 5)) == ((3 * 1) + (4 * 5)))",
|
"((3 + (4 * 5)) == ((3 * 1) + (4 * 5)))",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"true",
|
||||||
|
"true",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"false",
|
||||||
|
"false",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"3 > 5 == false",
|
||||||
|
"((3 > 5) == false)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"3 < 5 == true",
|
||||||
|
"((3 < 5) == true)",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
l_lexer := lexer.New(tt.input)
|
l_lexer := lexer.New(tt.input)
|
||||||
@ -406,6 +427,8 @@ func testLiteralExpression(l_test *testing.T, exp ast.Expression, expected inter
|
|||||||
return testIntegerLiteral(l_test, exp, v)
|
return testIntegerLiteral(l_test, exp, v)
|
||||||
case string:
|
case string:
|
||||||
return testIdentifier(l_test, exp, v)
|
return testIdentifier(l_test, exp, v)
|
||||||
|
case bool:
|
||||||
|
return testBooleanLiteral(l_test, exp, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
l_test.Errorf("type of exp not handled, got=%T", exp)
|
l_test.Errorf("type of exp not handled, got=%T", exp)
|
||||||
@ -433,3 +456,23 @@ func testInfixExpression(l_test *testing.T, exp ast.Expression, left interface{}
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testBooleanLiteral(l_test *testing.T, exp ast.Expression, value bool) bool {
|
||||||
|
boolean, ok := exp.(*ast.Boolean)
|
||||||
|
if !ok {
|
||||||
|
l_test.Errorf("exp not *ast.Boolean, got=%T", exp)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if boolean.Value != value {
|
||||||
|
l_test.Errorf("boolean.Value is not %t, got=%t", value, boolean.Value)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if boolean.TokenLiteral() != fmt.Sprintf("%t", value) {
|
||||||
|
l_test.Errorf("boolean.TokenLiteral is not %t, got=%s", value, boolean.TokenLiteral())
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user