Skip to content

Commit 8d79842

Browse files
committed
feat: String type comparison
1 parent b7174c4 commit 8d79842

10 files changed

+128
-18
lines changed

src/evaluator/expression/infix/mod.rs

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,22 @@ impl Evaluator {
1111
operator_token: Token,
1212
right_hand: Expression,
1313
) -> Result<Object, EvaluationError> {
14+
fn evaluate_same_boolean(operator_token: Token) -> Result<Object, EvaluationError> {
15+
match operator_token {
16+
Token::Equals => Ok(Object::True),
17+
Token::NotEquals => Ok(Object::False),
18+
_ => Err(EvaluationError::UnknownOperator),
19+
}
20+
}
21+
22+
fn evaluate_opposite_boolean(operator_token: Token) -> Result<Object, EvaluationError> {
23+
match operator_token {
24+
Token::Equals => Ok(Object::False),
25+
Token::NotEquals => Ok(Object::True),
26+
_ => Err(EvaluationError::UnknownOperator),
27+
}
28+
}
29+
1430
match self.evaluate_expression(left_hand)? {
1531
Object::Integer { value: left_value } => match self.evaluate_expression(right_hand)? {
1632
Object::Integer { value: right_value } => match operator_token {
@@ -56,26 +72,24 @@ impl Evaluator {
5672
Object::True => evaluate_opposite_boolean(operator_token),
5773
_ => Err(EvaluationError::TypeMismatch),
5874
},
59-
_ => Ok(Object::Null),
75+
Object::String { value: left_value } => match self.evaluate_expression(right_hand)? {
76+
Object::String { value: right_value } => match operator_token {
77+
Token::Equals => match left_value.eq(&right_value) {
78+
true => Ok(Object::True),
79+
false => Ok(Object::False),
80+
},
81+
Token::NotEquals => match left_value.ne(&right_value) {
82+
true => Ok(Object::True),
83+
false => Ok(Object::False),
84+
},
85+
_ => Err(EvaluationError::UnknownOperator),
86+
},
87+
_ => Err(EvaluationError::TypeMismatch),
88+
},
89+
_ => Err(EvaluationError::UnknownOperator),
6090
}
6191
}
6292
}
6393

64-
fn evaluate_same_boolean(operator_token: Token) -> Result<Object, EvaluationError> {
65-
match operator_token {
66-
Token::Equals => Ok(Object::True),
67-
Token::NotEquals => Ok(Object::False),
68-
_ => Err(EvaluationError::UnknownOperator),
69-
}
70-
}
71-
72-
fn evaluate_opposite_boolean(operator_token: Token) -> Result<Object, EvaluationError> {
73-
match operator_token {
74-
Token::Equals => Ok(Object::False),
75-
Token::NotEquals => Ok(Object::True),
76-
_ => Err(EvaluationError::UnknownOperator),
77-
}
78-
}
79-
8094
#[cfg(test)]
8195
mod tests;

src/evaluator/expression/infix/tests/mod.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,31 @@ fn test_evaluator_infix_integer_expressions(code: &str, snapshot_name: &str) {
4040
case("(1 < 2) == true", "test_evaluator_infix_boolean_expressions_case17"),
4141
case("(1 < 2) == false", "test_evaluator_infix_boolean_expressions_case18"),
4242
case("(1 > 2) == true", "test_evaluator_infix_boolean_expressions_case19"),
43-
case("(1 > 2) == false", "test_evaluator_infix_boolean_expressions_case20")
43+
case("(1 > 2) == false", "test_evaluator_infix_boolean_expressions_case20"),
44+
case(
45+
"\"name\" == \"name\"",
46+
"test_evaluator_infix_boolean_expressions_case21"
47+
),
48+
case(
49+
"\"this is a string\" == \"this is a string\"",
50+
"test_evaluator_infix_boolean_expressions_case22"
51+
),
52+
case(
53+
"\"first\" != \"last\"",
54+
"test_evaluator_infix_boolean_expressions_case23"
55+
),
56+
case(
57+
"\"string123\" != \"\\tstring123\"",
58+
"test_evaluator_infix_boolean_expressions_case24"
59+
),
60+
case(
61+
"\"string123\" != \"string123\"",
62+
"test_evaluator_infix_boolean_expressions_case25"
63+
),
64+
case(
65+
"\"name\" == \"name123\"",
66+
"test_evaluator_infix_boolean_expressions_case26"
67+
)
4468
)]
4569
fn test_evaluator_infix_boolean_expressions(code: &str, snapshot_name: &str) {
4670
assert_expected_returned_object!(code, snapshot_name);
@@ -58,6 +82,14 @@ fn test_evaluator_infix_boolean_expressions(code: &str, snapshot_name: &str) {
5882
case(
5983
"if (10 > 1) { return TRUE + 5; } return 1;",
6084
"test_evaluator_infix_type_mismatch_expressions_case4"
85+
),
86+
case(
87+
"\"this is a string\" == 3",
88+
"test_evaluator_infix_type_mismatch_expressions_case5"
89+
),
90+
case(
91+
"82 != \"this is a string\"",
92+
"test_evaluator_infix_type_mismatch_expressions_case6"
6193
)
6294
)]
6395
fn test_evaluator_infix_type_mismatch_expressions(code: &str, snapshot_name: &str) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: src/evaluator/expression/infix/tests/mod.rs
3+
expression: "evaluator.evaluate(crate::syntax_analysis::SyntaxAnalysis::from(crate::lexical_analysis::LexicalAnalysis::from(code).unwrap()).unwrap())"
4+
5+
---
6+
Ok(
7+
True,
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: src/evaluator/expression/infix/tests/mod.rs
3+
expression: "evaluator.evaluate(crate::syntax_analysis::SyntaxAnalysis::from(crate::lexical_analysis::LexicalAnalysis::from(code).unwrap()).unwrap())"
4+
5+
---
6+
Ok(
7+
True,
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: src/evaluator/expression/infix/tests/mod.rs
3+
expression: "evaluator.evaluate(crate::syntax_analysis::SyntaxAnalysis::from(crate::lexical_analysis::LexicalAnalysis::from(code).unwrap()).unwrap())"
4+
5+
---
6+
Ok(
7+
True,
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: src/evaluator/expression/infix/tests/mod.rs
3+
expression: "evaluator.evaluate(crate::syntax_analysis::SyntaxAnalysis::from(crate::lexical_analysis::LexicalAnalysis::from(code).unwrap()).unwrap())"
4+
5+
---
6+
Ok(
7+
True,
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: src/evaluator/expression/infix/tests/mod.rs
3+
expression: "evaluator.evaluate(crate::syntax_analysis::SyntaxAnalysis::from(crate::lexical_analysis::LexicalAnalysis::from(code).unwrap()).unwrap())"
4+
5+
---
6+
Ok(
7+
False,
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: src/evaluator/expression/infix/tests/mod.rs
3+
expression: "evaluator.evaluate(crate::syntax_analysis::SyntaxAnalysis::from(crate::lexical_analysis::LexicalAnalysis::from(code).unwrap()).unwrap())"
4+
5+
---
6+
Ok(
7+
False,
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: src/evaluator/expression/infix/tests/mod.rs
3+
expression: "evaluator.evaluate(crate::syntax_analysis::SyntaxAnalysis::from(crate::lexical_analysis::LexicalAnalysis::from(code).unwrap()).unwrap())"
4+
5+
---
6+
Err(
7+
TypeMismatch,
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
source: src/evaluator/expression/infix/tests/mod.rs
3+
expression: "evaluator.evaluate(crate::syntax_analysis::SyntaxAnalysis::from(crate::lexical_analysis::LexicalAnalysis::from(code).unwrap()).unwrap())"
4+
5+
---
6+
Err(
7+
TypeMismatch,
8+
)

0 commit comments

Comments
 (0)