From 46f125d3de646f431e8ba5d0b90f1b5f8c870a3a Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Wed, 23 Sep 2020 16:49:17 +0200
Subject: [PATCH] all tests pass

---
 examples/scopes.rs     | 12 ++++++++++++
 examples/scopes_err.rs | 12 ++++++++++++
 src/vm.rs              |  2 +-
 tests/test_parser.rs   | 21 +++++++++++----------
 tests/test_vm.rs       |  8 ++++----
 5 files changed, 40 insertions(+), 15 deletions(-)
 create mode 100644 examples/scopes.rs
 create mode 100644 examples/scopes_err.rs

diff --git a/examples/scopes.rs b/examples/scopes.rs
new file mode 100644
index 0000000..9dac1e1
--- /dev/null
+++ b/examples/scopes.rs
@@ -0,0 +1,12 @@
+fn main() {
+    let mut a = 7;
+    let mut b;
+    {
+        a = 5;
+        b = false;
+        let mut a = false;
+        a = true;
+    };
+    a = 0;
+    b = true;
+}
diff --git a/examples/scopes_err.rs b/examples/scopes_err.rs
new file mode 100644
index 0000000..ef2d7f6
--- /dev/null
+++ b/examples/scopes_err.rs
@@ -0,0 +1,12 @@
+fn main() {
+    let mut a = 7;
+    let mut b;
+    {
+        a = 5;
+        b = false;
+        let mut a = false;
+        a = true;
+    };
+    a = false;
+    b = true;
+}
diff --git a/src/vm.rs b/src/vm.rs
index 8e0aa62..bfe9005 100644
--- a/src/vm.rs
+++ b/src/vm.rs
@@ -286,7 +286,7 @@ fn eval_stmts(stmts: &Stmts, m: &mut Mem, fn_env: &FnEnv) -> Val {
                 println!("block");
                 eval_stmts(block, m, fn_env)
             }
-            Stmt::Semi => panic!("ICE"),
+            Stmt::Semi => Val::Unit,
         }
     }
     m.pop_scope();
diff --git a/tests/test_parser.rs b/tests/test_parser.rs
index f7e0dc4..67881ff 100644
--- a/tests/test_parser.rs
+++ b/tests/test_parser.rs
@@ -56,36 +56,37 @@ fn test_exprs() {
 #[test]
 fn test_stmts() {
     // test empty sequence
-    assert!(BlockParser::new().parse("").is_ok());
+    assert!(BlockParser::new().parse("{}").is_ok());
 
     // test let with no assignment and inferred type
-    assert!(BlockParser::new().parse("let a").is_ok());
+    assert!(BlockParser::new().parse("{ let a }").is_ok());
 
     // test let with no assignment and excplicit type
-    assert!(BlockParser::new().parse("let a : u32").is_ok());
+    assert!(BlockParser::new().parse("{ let a : u32 }").is_ok());
 
     // test let with inferred type
-    assert!(BlockParser::new().parse("let a = 0").is_ok());
+    assert!(BlockParser::new().parse("{ let a = 0 }").is_ok());
 
     // test let with explicit type
-    assert!(BlockParser::new().parse("let a : u16 = 1 + 2").is_ok());
+    assert!(BlockParser::new().parse("{ let a : u16 = 1 + 2 }").is_ok());
 
     // test assignment
-    assert!(BlockParser::new().parse("a = 1 + 2").is_ok());
+    assert!(BlockParser::new().parse("{ a = 1 + 2 }").is_ok());
 
     // test assignment
-    assert!(BlockParser::new().parse("*a = 1 + 2").is_ok());
+    assert!(BlockParser::new().parse("{ *a = 1 + 2}").is_ok());
 
     // test if then
-    assert!(BlockParser::new().parse("if a { b = 5 }").is_ok());
+    assert!(BlockParser::new().parse("{ if a { b = 5 } }").is_ok());
 
     // test if then else
     assert!(BlockParser::new()
-        .parse("if a { b = 5 } else { b = 7 }")
+        .parse("{ if a { b = 5 } else { b = 7 } }")
         .is_ok());
 
+    // test hello
     assert!(BlockParser::new()
-        .parse("while hello(b) { b = b - 5 }")
+        .parse("{ while hello(b) { b = b - 5 } }")
         .is_ok());
 }
 
diff --git a/tests/test_vm.rs b/tests/test_vm.rs
index 33d7729..f8998fc 100644
--- a/tests/test_vm.rs
+++ b/tests/test_vm.rs
@@ -55,13 +55,13 @@ fn while_test() {
 }
 
 #[test]
-fn mut_test() {
-    eval_prog("examples/mut.rs");
+fn let_test() {
+    eval_prog("examples/let.rs");
 }
 
 #[test]
-fn mut2_test() {
-    eval_prog("examples/mut2.rs");
+fn let2_test() {
+    eval_prog("examples/let2.rs");
 }
 
 #[test]
-- 
GitLab