From 65fadfd1648fbc8e4e5dd3734bc62ad35f94e07d Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Mon, 4 Jul 2022 16:50:39 +0300 Subject: [PATCH] Add tests for left-hand side of assignment being an identifier. Relates to #106 --- src/token/mod.rs | 15 ++++++++++++++- tests/integration.rs | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/token/mod.rs b/src/token/mod.rs index 7b9d504..3bb49cd 100644 --- a/src/token/mod.rs +++ b/src/token/mod.rs @@ -444,7 +444,7 @@ pub(crate) fn tokenize(string: &str) -> EvalexprResult> { #[cfg(test)] mod tests { - use crate::token::{char_to_partial_token, tokenize}; + use crate::token::{char_to_partial_token, tokenize, Token}; use std::fmt::Write; #[test] @@ -474,4 +474,17 @@ mod tests { assert_eq!(token_string, result_string); } + + #[test] + fn assignment_lhs_is_identifier() { + let tokens = tokenize("a = 1").unwrap(); + assert_eq!( + tokens.as_slice(), + [ + Token::Identifier("a".to_string()), + Token::Assign, + Token::Int(1) + ] + ); + } } diff --git a/tests/integration.rs b/tests/integration.rs index 6a096d3..30f20d4 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -2083,3 +2083,28 @@ fn test_try_from() { ); assert_eq!(EmptyType::try_from(value.clone()), Ok(())); } + +#[test] +fn assignment_lhs_is_identifier() { + let tree = build_operator_tree("a = 1").unwrap(); + let operators: Vec<_> = tree.iter().map(|node| node.operator().clone()).collect(); + + let mut context = HashMapContext::new(); + tree.eval_empty_with_context_mut(&mut context).unwrap(); + assert_eq!(context.get_value("a"), Some(&Value::Int(1))); + + assert!( + matches!( + operators.as_slice(), + [ + Operator::Assign, + Operator::VariableIdentifier { identifier: value }, + Operator::Const { + value: Value::Int(1) + } + ] if value == "a" + ), + "actual: {:#?}", + operators + ); +}