aboutsummaryrefslogtreecommitdiffstats
path: root/src/test.rs
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2021-11-24 14:17:53 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2021-11-25 09:53:44 +0200
commitb0c42f8ad5f89be748741a8dd2c17bfe1aa3d0eb (patch)
tree76ea979e2662167695237249bbae62d4c47ca897 /src/test.rs
parent502dd83e65b3e00b5150fe6fc7aa1d313effe824 (diff)
Fix bug in reduce Application case
Diffstat (limited to 'src/test.rs')
-rw-r--r--src/test.rs83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/test.rs b/src/test.rs
index a2dea85..0600798 100644
--- a/src/test.rs
+++ b/src/test.rs
@@ -236,3 +236,86 @@ fn reduce_builtin_int_eq() -> Result<(), String> {
Ok(())
}
+
+#[test]
+#[serial]
+fn reduce_builtin_str_eq() -> Result<(), String> {
+ initialize_before_test();
+ let source = "
+ string.eq? \"foo\" \"bar\"
+ \"true\"
+ \"false\";
+ string.eq? \"baz\" \"baz\"
+ \"true\"
+ \"false\";
+ ";
+
+ let (terms, symbol_table) = evaluate_from_source(String::from(source), None)?;
+ assert_eq!(terms.len(), 2);
+ let term1 = &terms[0];
+ let term2 = &terms[1];
+
+ // First expression
+ let (result_term1, _) = repeatedly_reduce_term(&symbol_table, Rc::clone(term1), &None, false)?;
+ let expected1_string = Value::String(String::from("false"));
+ let result_builtin1 = match &*result_term1 {
+ Term::Primitive(p) => p,
+ _ => return Err(format!("{} is not a primitive", result_term1)),
+ };
+
+ assert_eq!(*result_builtin1, expected1_string);
+
+ // Second expression
+ let (result_term2, _) = repeatedly_reduce_term(&symbol_table, Rc::clone(term2), &None, false)?;
+ let expected2_string = Value::String(String::from("true"));
+ let result_builtin2 = match &*result_term2 {
+ Term::Primitive(p) => p,
+ _ => return Err(format!("{} is not a primitive", result_term2)),
+ };
+
+ assert_eq!(*result_builtin2, expected2_string);
+
+ Ok(())
+}
+
+#[test]
+#[serial]
+fn reduce_nontrivial_terminates1() -> Result<(), String> {
+ initialize_before_test();
+ let source = "
+ string.eq?
+ (bool.to-string
+ true);
+ ";
+
+ let (terms, symbol_table) = evaluate_from_source(String::from(source), None)?;
+ assert_eq!(terms.len(), 1);
+ let term1 = &terms[0];
+
+ let (_, _) = reduce_term(&symbol_table, Rc::clone(term1), &None, false)?;
+
+ // Terminates
+ Ok(())
+}
+
+#[test]
+#[serial]
+fn reduce_nontrivial_terminates2() -> Result<(), String> {
+ initialize_before_test();
+ let source = "
+ result =
+ bool.to-string
+ (int.eq? 2 2);
+
+ string.eq? result \"true\";
+ ";
+
+ let (terms, symbol_table) = evaluate_from_source(String::from(source), None)?;
+ assert_eq!(terms.len(), 1);
+ let term1 = &terms[0];
+
+ let (_, _) = repeatedly_reduce_term(&symbol_table, Rc::clone(term1), &None, false)?;
+
+ // Terminates
+ Ok(())
+}