From 15ad53eec482154bc56b73ccf9bd36429f91dd4b Mon Sep 17 00:00:00 2001
From: Austin Lancaster <aus@lancaster@gmail.com>
Date: Sun, 2 Sep 2018 12:12:52 +1000
Subject: [PATCH] submit assignment

---
 examples/add.s                                |   4 +
 examples/addlong.s                            |   5 +
 examples/addshort.s                           |   4 +
 examples/blankline.s                          |   7 +
 examples/div.s                                |   4 +
 examples/divlong.s                            |   5 +
 examples/divshort.s                           |   4 +
 examples/divzero.s                            |   5 +
 examples/empty.s                              |   0
 examples/intlarge.s                           |   3 +
 examples/intmax.s                             |   3 +
 examples/intmin.s                             |   3 +
 examples/intsmall.s                           |   3 +
 examples/invalidcommand.s                     |   2 +
 examples/invalidregister.s                    |   4 +
 examples/invalidregister2.s                   |   4 +
 examples/jmp.s                                |   4 +
 examples/jmpbackjump.s                        |   4 +
 examples/jmpfwdjump.s                         |   4 +
 examples/jmplong.s                            |   4 +
 examples/jmpshort.s                           |   4 +
 examples/jz.s                                 |   4 +
 examples/jzback.s                             |   4 +
 examples/jzfwd.s                              |   4 +
 examples/jzlong.s                             |   4 +
 examples/jzmax.s                              |   4 +
 examples/jznotzero.s                          |   4 +
 examples/jzshort.s                            |   4 +
 examples/jzzero.s                             |   7 +
 examples/ldrlong.s                            |   6 +
 examples/ldrshort.s                           |   6 +
 examples/ldrstr.s                             |   6 +
 examples/ldrstrbig.s                          |   5 +
 examples/ldrstrmax.s                          |   5 +
 examples/ldrstrmin.s                          |   5 +
 examples/ldrstrsmall.s                        |   5 +
 examples/mov.s                                |   3 +
 examples/movlong.s                            |   3 +
 examples/movshort.s                           |   3 +
 examples/mul.s                                |   4 +
 examples/mullong.s                            |   5 +
 examples/mulshort.s                           |   4 +
 examples/noret.s                              |   3 +
 examples/oneline.s                            |   1 +
 examples/register30.s                         |   4 +
 examples/retlong.s                            |   4 +
 examples/strlong.s                            |   6 +
 examples/strshort.s                           |   6 +
 examples/sub.s                                |   4 +
 examples/sublong.s                            |   5 +
 examples/subshort.s                           |   4 +
 .../mutant-1/swen90006/machine/Machine.java   |   2 +-
 .../mutant-2/swen90006/machine/Machine.java   |   2 +-
 .../mutant-3/swen90006/machine/Machine.java   |   2 +-
 .../mutant-4/swen90006/machine/Machine.java   |   2 +-
 .../mutant-5/swen90006/machine/Machine.java   |   2 +-
 test/swen90006/machine/BoundaryTests.java     | 446 ++++++++++++++++--
 test/swen90006/machine/PartitioningTests.java | 411 ++++++++++++++--
 58 files changed, 1010 insertions(+), 69 deletions(-)
 create mode 100644 examples/add.s
 create mode 100644 examples/addlong.s
 create mode 100644 examples/addshort.s
 create mode 100644 examples/blankline.s
 create mode 100644 examples/div.s
 create mode 100644 examples/divlong.s
 create mode 100644 examples/divshort.s
 create mode 100644 examples/divzero.s
 create mode 100644 examples/empty.s
 create mode 100644 examples/intlarge.s
 create mode 100644 examples/intmax.s
 create mode 100644 examples/intmin.s
 create mode 100644 examples/intsmall.s
 create mode 100644 examples/invalidcommand.s
 create mode 100644 examples/invalidregister.s
 create mode 100644 examples/invalidregister2.s
 create mode 100644 examples/jmp.s
 create mode 100644 examples/jmpbackjump.s
 create mode 100644 examples/jmpfwdjump.s
 create mode 100644 examples/jmplong.s
 create mode 100644 examples/jmpshort.s
 create mode 100644 examples/jz.s
 create mode 100644 examples/jzback.s
 create mode 100644 examples/jzfwd.s
 create mode 100644 examples/jzlong.s
 create mode 100644 examples/jzmax.s
 create mode 100644 examples/jznotzero.s
 create mode 100644 examples/jzshort.s
 create mode 100644 examples/jzzero.s
 create mode 100644 examples/ldrlong.s
 create mode 100644 examples/ldrshort.s
 create mode 100644 examples/ldrstr.s
 create mode 100644 examples/ldrstrbig.s
 create mode 100644 examples/ldrstrmax.s
 create mode 100644 examples/ldrstrmin.s
 create mode 100644 examples/ldrstrsmall.s
 create mode 100644 examples/mov.s
 create mode 100644 examples/movlong.s
 create mode 100644 examples/movshort.s
 create mode 100644 examples/mul.s
 create mode 100644 examples/mullong.s
 create mode 100644 examples/mulshort.s
 create mode 100644 examples/noret.s
 create mode 100644 examples/oneline.s
 create mode 100644 examples/register30.s
 create mode 100644 examples/retlong.s
 create mode 100644 examples/strlong.s
 create mode 100644 examples/strshort.s
 create mode 100644 examples/sub.s
 create mode 100644 examples/sublong.s
 create mode 100644 examples/subshort.s

diff --git a/examples/add.s b/examples/add.s
new file mode 100644
index 0000000..ea53133
--- /dev/null
+++ b/examples/add.s
@@ -0,0 +1,4 @@
+MOV R1 3;
+MOV R2 4;
+ADD R0 R1 R2;
+RET R0;
\ No newline at end of file
diff --git a/examples/addlong.s b/examples/addlong.s
new file mode 100644
index 0000000..ba98bbd
--- /dev/null
+++ b/examples/addlong.s
@@ -0,0 +1,5 @@
+MOV R1 3;
+MOV R2 4;
+MOV R3 5;
+ADD R0 R1 R2 R3;
+RET R0;
\ No newline at end of file
diff --git a/examples/addshort.s b/examples/addshort.s
new file mode 100644
index 0000000..e89f4c9
--- /dev/null
+++ b/examples/addshort.s
@@ -0,0 +1,4 @@
+MOV R1 3;
+MOV R2 4;
+ADD R0 R1;
+RET R0;
\ No newline at end of file
diff --git a/examples/blankline.s b/examples/blankline.s
new file mode 100644
index 0000000..9aa3f4d
--- /dev/null
+++ b/examples/blankline.s
@@ -0,0 +1,7 @@
+MOV R1 3;
+
+
+MOV R2 4;
+ADD R0 R1 R2;
+
+RET R0;
\ No newline at end of file
diff --git a/examples/div.s b/examples/div.s
new file mode 100644
index 0000000..02c9e57
--- /dev/null
+++ b/examples/div.s
@@ -0,0 +1,4 @@
+MOV R1 12;
+MOV R2 5;
+DIV R0 R1 R2;
+RET R0;
\ No newline at end of file
diff --git a/examples/divlong.s b/examples/divlong.s
new file mode 100644
index 0000000..6e7bee5
--- /dev/null
+++ b/examples/divlong.s
@@ -0,0 +1,5 @@
+MOV R1 12;
+MOV R2 5;
+MOV R3 2;
+DIV R0 R1 R2 R3;
+RET R0;
\ No newline at end of file
diff --git a/examples/divshort.s b/examples/divshort.s
new file mode 100644
index 0000000..4281660
--- /dev/null
+++ b/examples/divshort.s
@@ -0,0 +1,4 @@
+MOV R1 12;
+MOV R2 5;
+DIV R0 R1;
+RET R0;
\ No newline at end of file
diff --git a/examples/divzero.s b/examples/divzero.s
new file mode 100644
index 0000000..c8826fc
--- /dev/null
+++ b/examples/divzero.s
@@ -0,0 +1,5 @@
+MOV R0 17;
+MOV R1 12;
+MOV R2 0;
+DIV R0 R1 R2;
+RET R0;
\ No newline at end of file
diff --git a/examples/empty.s b/examples/empty.s
new file mode 100644
index 0000000..e69de29
diff --git a/examples/intlarge.s b/examples/intlarge.s
new file mode 100644
index 0000000..d75d8c6
--- /dev/null
+++ b/examples/intlarge.s
@@ -0,0 +1,3 @@
+MOV R0 1;
+MOV R0 65536;
+RET R0;
\ No newline at end of file
diff --git a/examples/intmax.s b/examples/intmax.s
new file mode 100644
index 0000000..abb465f
--- /dev/null
+++ b/examples/intmax.s
@@ -0,0 +1,3 @@
+MOV R0 1;
+MOV R0 65535;
+RET R0;
\ No newline at end of file
diff --git a/examples/intmin.s b/examples/intmin.s
new file mode 100644
index 0000000..43b3b6b
--- /dev/null
+++ b/examples/intmin.s
@@ -0,0 +1,3 @@
+MOV R0 1;
+MOV R0 -65535;
+RET R0;
\ No newline at end of file
diff --git a/examples/intsmall.s b/examples/intsmall.s
new file mode 100644
index 0000000..48c91ab
--- /dev/null
+++ b/examples/intsmall.s
@@ -0,0 +1,3 @@
+MOV R0 1;
+MOV R0 -65536;
+RET R0;
\ No newline at end of file
diff --git a/examples/invalidcommand.s b/examples/invalidcommand.s
new file mode 100644
index 0000000..a00b697
--- /dev/null
+++ b/examples/invalidcommand.s
@@ -0,0 +1,2 @@
+ADR R0 R1 R2;
+RET R0;
\ No newline at end of file
diff --git a/examples/invalidregister.s b/examples/invalidregister.s
new file mode 100644
index 0000000..efc103c
--- /dev/null
+++ b/examples/invalidregister.s
@@ -0,0 +1,4 @@
+MOV R1 3;
+MOV R32 4;
+ADD R0 R1 R32;
+RET R0;
\ No newline at end of file
diff --git a/examples/invalidregister2.s b/examples/invalidregister2.s
new file mode 100644
index 0000000..83f59eb
--- /dev/null
+++ b/examples/invalidregister2.s
@@ -0,0 +1,4 @@
+MOV R1 3;
+MOV R32 4;
+ADD R0 R1 15;
+RET R0;
\ No newline at end of file
diff --git a/examples/jmp.s b/examples/jmp.s
new file mode 100644
index 0000000..45bc56b
--- /dev/null
+++ b/examples/jmp.s
@@ -0,0 +1,4 @@
+MOV R0 5
+JMP 2
+MOV R0 3
+RET R0
\ No newline at end of file
diff --git a/examples/jmpbackjump.s b/examples/jmpbackjump.s
new file mode 100644
index 0000000..7032f2b
--- /dev/null
+++ b/examples/jmpbackjump.s
@@ -0,0 +1,4 @@
+MOV R0 5
+JMP -2
+MOV R0 3
+RET R0
\ No newline at end of file
diff --git a/examples/jmpfwdjump.s b/examples/jmpfwdjump.s
new file mode 100644
index 0000000..c03edc7
--- /dev/null
+++ b/examples/jmpfwdjump.s
@@ -0,0 +1,4 @@
+MOV R0 5
+JMP 3
+MOV R0 3
+RET R0
\ No newline at end of file
diff --git a/examples/jmplong.s b/examples/jmplong.s
new file mode 100644
index 0000000..10c9500
--- /dev/null
+++ b/examples/jmplong.s
@@ -0,0 +1,4 @@
+MOV R0 5
+JMP 2 3
+MOV R0 3
+RET R0
\ No newline at end of file
diff --git a/examples/jmpshort.s b/examples/jmpshort.s
new file mode 100644
index 0000000..87a5021
--- /dev/null
+++ b/examples/jmpshort.s
@@ -0,0 +1,4 @@
+MOV R0 5
+JMP
+MOV R0 3
+RET R0
\ No newline at end of file
diff --git a/examples/jz.s b/examples/jz.s
new file mode 100644
index 0000000..093880b
--- /dev/null
+++ b/examples/jz.s
@@ -0,0 +1,4 @@
+MOV R0 0;
+JZ R0 2;
+MOV R0 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/jzback.s b/examples/jzback.s
new file mode 100644
index 0000000..ec0c9ee
--- /dev/null
+++ b/examples/jzback.s
@@ -0,0 +1,4 @@
+MOV R0 0;
+JZ R0 -2;
+MOV R0 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/jzfwd.s b/examples/jzfwd.s
new file mode 100644
index 0000000..236af9f
--- /dev/null
+++ b/examples/jzfwd.s
@@ -0,0 +1,4 @@
+MOV R0 0;
+JZ R0 3;
+MOV R0 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/jzlong.s b/examples/jzlong.s
new file mode 100644
index 0000000..eb804a5
--- /dev/null
+++ b/examples/jzlong.s
@@ -0,0 +1,4 @@
+MOV R0 0;
+JZ R0 2 3;
+MOV R0 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/jzmax.s b/examples/jzmax.s
new file mode 100644
index 0000000..093880b
--- /dev/null
+++ b/examples/jzmax.s
@@ -0,0 +1,4 @@
+MOV R0 0;
+JZ R0 2;
+MOV R0 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/jznotzero.s b/examples/jznotzero.s
new file mode 100644
index 0000000..0f500c7
--- /dev/null
+++ b/examples/jznotzero.s
@@ -0,0 +1,4 @@
+MOV R0 1;
+JZ R0 2;
+MOV R0 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/jzshort.s b/examples/jzshort.s
new file mode 100644
index 0000000..bc8aeb4
--- /dev/null
+++ b/examples/jzshort.s
@@ -0,0 +1,4 @@
+MOV R0 0;
+JZ R0;
+MOV R0 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/jzzero.s b/examples/jzzero.s
new file mode 100644
index 0000000..4951d92
--- /dev/null
+++ b/examples/jzzero.s
@@ -0,0 +1,7 @@
+MOV R0 5
+MOV R1 1
+JZ R0 4
+ADD R5 R5 R0
+SUB R0 R0 R1
+JMP -3
+RET R5
\ No newline at end of file
diff --git a/examples/ldrlong.s b/examples/ldrlong.s
new file mode 100644
index 0000000..e924051
--- /dev/null
+++ b/examples/ldrlong.s
@@ -0,0 +1,6 @@
+MOV R0 13;
+MOV R1 60;
+STR R1 15 R0;
+MOV R2 37;
+LDR R3 R2 R0 38;
+RET R3;
\ No newline at end of file
diff --git a/examples/ldrshort.s b/examples/ldrshort.s
new file mode 100644
index 0000000..494695e
--- /dev/null
+++ b/examples/ldrshort.s
@@ -0,0 +1,6 @@
+MOV R0 13;
+MOV R1 60;
+STR R1 15 R0;
+MOV R2 37;
+LDR R3 38;
+RET R3;
\ No newline at end of file
diff --git a/examples/ldrstr.s b/examples/ldrstr.s
new file mode 100644
index 0000000..0e51171
--- /dev/null
+++ b/examples/ldrstr.s
@@ -0,0 +1,6 @@
+MOV R0 13;
+MOV R1 60;
+STR R1 15 R0;
+MOV R2 37;
+LDR R3 R2 38;
+RET R3;
\ No newline at end of file
diff --git a/examples/ldrstrbig.s b/examples/ldrstrbig.s
new file mode 100644
index 0000000..dd9c141
--- /dev/null
+++ b/examples/ldrstrbig.s
@@ -0,0 +1,5 @@
+MOV R0 15;
+MOV R1 65536;
+STR R1 15 R0;
+LDR R2 R1 0;
+RET R2;
\ No newline at end of file
diff --git a/examples/ldrstrmax.s b/examples/ldrstrmax.s
new file mode 100644
index 0000000..4abe586
--- /dev/null
+++ b/examples/ldrstrmax.s
@@ -0,0 +1,5 @@
+MOV R0 15;
+MOV R1 65535;
+STR R1 15 R0;
+LDR R2 R1 0;
+RET R2;
\ No newline at end of file
diff --git a/examples/ldrstrmin.s b/examples/ldrstrmin.s
new file mode 100644
index 0000000..6cc76ca
--- /dev/null
+++ b/examples/ldrstrmin.s
@@ -0,0 +1,5 @@
+MOV R0 15;
+MOV R1 -65535;
+STR R1 15 R0;
+LDR R2 R1 0;
+RET R2;
\ No newline at end of file
diff --git a/examples/ldrstrsmall.s b/examples/ldrstrsmall.s
new file mode 100644
index 0000000..0243044
--- /dev/null
+++ b/examples/ldrstrsmall.s
@@ -0,0 +1,5 @@
+MOV R0 15;
+MOV R1 -65536;
+STR R1 15 R0;
+LDR R2 R1 0;
+RET R2;
\ No newline at end of file
diff --git a/examples/mov.s b/examples/mov.s
new file mode 100644
index 0000000..5d547a4
--- /dev/null
+++ b/examples/mov.s
@@ -0,0 +1,3 @@
+MOV R0 1;
+MOV R0 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/movlong.s b/examples/movlong.s
new file mode 100644
index 0000000..9017ec8
--- /dev/null
+++ b/examples/movlong.s
@@ -0,0 +1,3 @@
+MOV R0 1;
+MOV R0 R1 5;
+RET R0;
\ No newline at end of file
diff --git a/examples/movshort.s b/examples/movshort.s
new file mode 100644
index 0000000..b142235
--- /dev/null
+++ b/examples/movshort.s
@@ -0,0 +1,3 @@
+MOV R0 1;
+MOV R0;
+RET R0;
\ No newline at end of file
diff --git a/examples/mul.s b/examples/mul.s
new file mode 100644
index 0000000..99dc9cf
--- /dev/null
+++ b/examples/mul.s
@@ -0,0 +1,4 @@
+MOV R1 3;
+MOV R2 4;
+MUL R0 R1 R2;
+RET R0;
\ No newline at end of file
diff --git a/examples/mullong.s b/examples/mullong.s
new file mode 100644
index 0000000..35d8339
--- /dev/null
+++ b/examples/mullong.s
@@ -0,0 +1,5 @@
+MOV R1 3;
+MOV R2 4;
+MOV R3 5;
+MUL R0 R1 R2 R3;
+RET R0;
\ No newline at end of file
diff --git a/examples/mulshort.s b/examples/mulshort.s
new file mode 100644
index 0000000..485fb69
--- /dev/null
+++ b/examples/mulshort.s
@@ -0,0 +1,4 @@
+MOV R1 3;
+MOV R2 4;
+MUL R0 R1;
+RET R0;
\ No newline at end of file
diff --git a/examples/noret.s b/examples/noret.s
new file mode 100644
index 0000000..9962e76
--- /dev/null
+++ b/examples/noret.s
@@ -0,0 +1,3 @@
+MOV R1 3;
+MOV R2 4;
+ADD R0 R1 R2;
\ No newline at end of file
diff --git a/examples/oneline.s b/examples/oneline.s
new file mode 100644
index 0000000..6e67d3c
--- /dev/null
+++ b/examples/oneline.s
@@ -0,0 +1 @@
+RET R0;
\ No newline at end of file
diff --git a/examples/register30.s b/examples/register30.s
new file mode 100644
index 0000000..580e1a8
--- /dev/null
+++ b/examples/register30.s
@@ -0,0 +1,4 @@
+MOV R1 3;
+MOV R31 4;
+ADD R0 R1 R31;
+RET R0;
\ No newline at end of file
diff --git a/examples/retlong.s b/examples/retlong.s
new file mode 100644
index 0000000..4ebd2bb
--- /dev/null
+++ b/examples/retlong.s
@@ -0,0 +1,4 @@
+MOV R1 3;
+MOV R2 4;
+ADD R0 R1 R2;
+RET R0 R1 R2;
\ No newline at end of file
diff --git a/examples/strlong.s b/examples/strlong.s
new file mode 100644
index 0000000..975f6fd
--- /dev/null
+++ b/examples/strlong.s
@@ -0,0 +1,6 @@
+MOV R0 13;
+MOV R1 60;
+STR R1 15 R0 R0;
+MOV R2 37;
+LDR R3 R2 38;
+RET R3;
\ No newline at end of file
diff --git a/examples/strshort.s b/examples/strshort.s
new file mode 100644
index 0000000..1c4ef2e
--- /dev/null
+++ b/examples/strshort.s
@@ -0,0 +1,6 @@
+MOV R0 13;
+MOV R1 60;
+STR R1 15;
+MOV R2 37;
+LDR R3 R2 38;
+RET R3;
\ No newline at end of file
diff --git a/examples/sub.s b/examples/sub.s
new file mode 100644
index 0000000..d7d9510
--- /dev/null
+++ b/examples/sub.s
@@ -0,0 +1,4 @@
+MOV R1 4;
+MOV R2 7;
+SUB R0 R1 R2;
+RET R0;
\ No newline at end of file
diff --git a/examples/sublong.s b/examples/sublong.s
new file mode 100644
index 0000000..1cdf899
--- /dev/null
+++ b/examples/sublong.s
@@ -0,0 +1,5 @@
+MOV R1 4;
+MOV R2 7;
+MOV R3 1;
+SUB R0 R1 R2 R3;
+RET R0;
\ No newline at end of file
diff --git a/examples/subshort.s b/examples/subshort.s
new file mode 100644
index 0000000..6c6e752
--- /dev/null
+++ b/examples/subshort.s
@@ -0,0 +1,4 @@
+MOV R1 4;
+MOV R2 7;
+SUB R0 R1;
+RET R0;
\ No newline at end of file
diff --git a/mutants/mutant-1/swen90006/machine/Machine.java b/mutants/mutant-1/swen90006/machine/Machine.java
index 9bf5731..1601984 100644
--- a/mutants/mutant-1/swen90006/machine/Machine.java
+++ b/mutants/mutant-1/swen90006/machine/Machine.java
@@ -73,7 +73,7 @@ public class Machine
     
   private void do_div(int dest, int src1, int src2)
   {
-    if (regs[src2] == 0){
+    if (false){
       /* no op */
     }else{
       regs[dest] = regs[src1] / regs[src2];
diff --git a/mutants/mutant-2/swen90006/machine/Machine.java b/mutants/mutant-2/swen90006/machine/Machine.java
index 9bf5731..ba00f5e 100644
--- a/mutants/mutant-2/swen90006/machine/Machine.java
+++ b/mutants/mutant-2/swen90006/machine/Machine.java
@@ -148,7 +148,7 @@ public class Machine
   private void validate_offset(int offset)
     throws InvalidInstructionException
   {
-    if (offset < -MAX_ADDR || offset > MAX_ADDR) {
+    if (offset <= -MAX_ADDR || offset > MAX_ADDR) {
       throw new InvalidInstructionException();
     }
   }
diff --git a/mutants/mutant-3/swen90006/machine/Machine.java b/mutants/mutant-3/swen90006/machine/Machine.java
index 9bf5731..a56907a 100644
--- a/mutants/mutant-3/swen90006/machine/Machine.java
+++ b/mutants/mutant-3/swen90006/machine/Machine.java
@@ -148,7 +148,7 @@ public class Machine
   private void validate_offset(int offset)
     throws InvalidInstructionException
   {
-    if (offset < -MAX_ADDR || offset > MAX_ADDR) {
+    if (offset < -MAX_ADDR || offset >= MAX_ADDR) {
       throw new InvalidInstructionException();
     }
   }
diff --git a/mutants/mutant-4/swen90006/machine/Machine.java b/mutants/mutant-4/swen90006/machine/Machine.java
index 9bf5731..eb7249f 100644
--- a/mutants/mutant-4/swen90006/machine/Machine.java
+++ b/mutants/mutant-4/swen90006/machine/Machine.java
@@ -140,7 +140,7 @@ public class Machine
   private void validate_reg(int reg)
     throws InvalidInstructionException
   {
-    if (reg < 0 || reg > MAX_REG) {
+    if (reg < 0 || reg >= MAX_REG) {
       throw new InvalidInstructionException();
     }
   }
diff --git a/mutants/mutant-5/swen90006/machine/Machine.java b/mutants/mutant-5/swen90006/machine/Machine.java
index 9bf5731..ce9915b 100644
--- a/mutants/mutant-5/swen90006/machine/Machine.java
+++ b/mutants/mutant-5/swen90006/machine/Machine.java
@@ -140,7 +140,7 @@ public class Machine
   private void validate_reg(int reg)
     throws InvalidInstructionException
   {
-    if (reg < 0 || reg > MAX_REG) {
+    if (reg <= 0 || reg > MAX_REG) {
       throw new InvalidInstructionException();
     }
   }
diff --git a/test/swen90006/machine/BoundaryTests.java b/test/swen90006/machine/BoundaryTests.java
index 61ce1ca..9335587 100644
--- a/test/swen90006/machine/BoundaryTests.java
+++ b/test/swen90006/machine/BoundaryTests.java
@@ -24,51 +24,435 @@ public class BoundaryTests
   {
   }
 
-  //Any method annotation with "@Test" is executed as a test.
-  @Test public void aTest()
+  // lines = 0
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void zeroLines()
   {
-    //the assertEquals method used to check whether two values are
-    //equal, using the equals method
-    final int expected = 2;
-    final int actual = 1 + 1;
-    assertEquals(expected, actual);
+    final List<String> lines = readInstructions("examples/empty.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // lines = 1
+  @Test public void oneLine()
+  {
+    final List<String> lines = readInstructions("examples/oneline.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 0);
+  }
+
+  // command not a subset of ["ADD" .. "JZ]
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void invalidCommand()
+  {
+    final List<String> lines = readInstructions("examples/invalidcommand.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // ADD words = 3, Ra in R, program contains RET
+  @Test public void add()
+  {
+    final List<String> lines = readInstructions("examples/add.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 7);
+  }
+
+  // ADD words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void addShort()
+  {
+    final List<String> lines = readInstructions("examples/addshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // ADD words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void addLong()
+  {
+    final List<String> lines = readInstructions("examples/addlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // Program does not contain RET
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void noret()
+  {
+    final List<String> lines = readInstructions("examples/noret.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // SUB words = 3
+  @Test public void sub()
+  {
+    final List<String> lines = readInstructions("examples/sub.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, -3);
+  }
+
+  // SUB words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void subShort()
+  {
+    final List<String> lines = readInstructions("examples/subshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // SUB words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void subLong()
+  {
+    final List<String> lines = readInstructions("examples/sublong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // MUL words = 3
+  @Test public void mul()
+  {
+    final List<String> lines = readInstructions("examples/mul.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 12);
+  }
+
+  // MUL words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void mulShort()
+  {
+    final List<String> lines = readInstructions("examples/mulshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // MUL words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void mulLong()
+  {
+    final List<String> lines = readInstructions("examples/mullong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // DIV words = 3, Rc != 0
+  @Test public void div()
+  {
+    final List<String> lines = readInstructions("examples/div.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 2);
+  }
+
+  // DIV words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void divShort()
+  {
+    final List<String> lines = readInstructions("examples/divshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // DIV words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void divLong()
+  {
+    final List<String> lines = readInstructions("examples/divlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // Rc = 0 (divide by zero)
+  @Test public void divzero()
+  {
+    final List<String> lines = readInstructions("examples/divzero.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 17);
+  }
+
+  // MOV words = 2
+  @Test public void mov()
+  {
+    final List<String> lines = readInstructions("examples/mov.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 5);
+  }
+
+  // MOV words < 2
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void movShort()
+  {
+    final List<String> lines = readInstructions("examples/movshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // MOV words > 2
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void movLong()
+  {
+    final List<String> lines = readInstructions("examples/movlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // register > 31
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void invalidRegister()
+  {
+    final List<String> lines = readInstructions("examples/invalidregister.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // register = 31
+  @Test public void register30()
+  {
+    final List<String> lines = readInstructions("examples/register30.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 7);
+  }
+
+  // val < INT_MIN
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void intSmall()
+  {
+    final List<String> lines = readInstructions("examples/intsmall.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // val > INT_MAX
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void intLarge()
+  {
+    final List<String> lines = readInstructions("examples/intlarge.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // val = INT_MIN
+  @Test public void intMin()
+  {
+    final List<String> lines = readInstructions("examples/intmin.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, -65535);
+  }
+
+  // val = INT_MAX
+  @Test public void intMax()
+  {
+    final List<String> lines = readInstructions("examples/intmax.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 65535);
+  }
+
+  // LDR words = 3, STR words = 3
+  @Test public void ldrStr()
+  {
+    final List<String> lines = readInstructions("examples/ldrstr.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 13);
+  }
+
+  // LDR words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void ldrShort()
+  {
+    final List<String> lines = readInstructions("examples/ldrshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // LDR words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void ldrLong()
+  {
+    final List<String> lines = readInstructions("examples/ldrlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // LDR b + v > MAX_ADDR
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void ldrBig()
+  {
+    final List<String> lines = readInstructions("examples/ldrstrbig.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // LDR b + v < -MAX_ADDR
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void ldrSmall()
+  {
+    final List<String> lines = readInstructions("examples/ldrstrsmall.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // LDR b + v = MAX_ADDR
+  @Test public void ldrMax()
+  {
+    final List<String> lines = readInstructions("examples/ldrstrmax.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 0);
+  }
+
+  @Test public void ldrMin()
+  {
+    final List<String> lines = readInstructions("examples/ldrstrmin.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 0);
+  }
+
+  // STR words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void strShort()
+  {
+    final List<String> lines = readInstructions("examples/strshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // STR words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void strLong()
+  {
+    final List<String> lines = readInstructions("examples/strlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JMP words = 1, 0 < pc + val < program length
+  @Test public void jmp()
+  {
+    final List<String> lines = readInstructions("examples/jmp.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 5);
+  }
+
+  // JMP words < 1
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void jmpShort()
+  {
+    final List<String> lines = readInstructions("examples/jmpshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JMP words > 1
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void jmpLong()
+  {
+    final List<String> lines = readInstructions("examples/jmplong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JMP pc + val > program length
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void jmpFwdJump()
+  {
+    final List<String> lines = readInstructions("examples/jmpfwdjump.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JMP pc + val < 0
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void jmpBackJump()
+  {
+    final List<String> lines = readInstructions("examples/jmpbackjump.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JZ words = 2, Ra == 0, pc + val = program length - 1
+  @Test public void jz()
+  {
+    final List<String> lines = readInstructions("examples/jz.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 0);
+  }
+
+  // JZ words = 2, Ra != 0
+  @Test public void jznotzero()
+  {
+    final List<String> lines = readInstructions("examples/jznotzero.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 5);
   }
 
-  @Test public void anotherTest()
+  // jZ words < 2
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void jzShort()
   {
-    List<String> list = new ArrayList<String>();
-    list.add("a");
-    list.add("b");
+    final List<String> lines = readInstructions("examples/jzshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
 
-    //the assertTrue method is used to check whether something holds.
-    assertTrue(list.contains("a"));
+  // JZ words > 2
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void jzLong()
+  {
+    final List<String> lines = readInstructions("examples/jzlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
   }
 
-  //Test test opens a file and executes the machine
-  @Test public void aFileOpenTest()
+  // JZ Ra==0, pc + val = program length
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void jzFwd()
   {
-    final List<String> lines = readInstructions("examples/array.s");
+    final List<String> lines = readInstructions("examples/jzfwd.s");
     Machine m = new Machine();
-    assertEquals(m.execute(lines), 45);
+    m.execute(lines);
   }
-  
-  //To test an exception, specify the expected exception after the @Test
-  @Test(expected = java.io.IOException.class) 
-    public void anExceptionTest()
-    throws Throwable
+
+  // jZ Ra==0, pc + val = -1
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void jzBack()
   {
-    throw new java.io.IOException();
+    final List<String> lines = readInstructions("examples/jzback.s");
+    Machine m = new Machine();
+    m.execute(lines);
   }
 
-  //This test should fail.
-  //To provide additional feedback when a test fails, an error message
-  //can be included
-  @Test public void aFailedTest()
+  // JZ Ra==0, pc + val = 0
+  public void jzZero()
   {
-    //include a message for better feedback
-    final int expected = 2;
-    final int actual = 1 + 2;
-    assertEquals("Some failure message", expected, actual);
+    final List<String> lines = readInstructions("examples/jzzero.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 15);
+  }
+
+  // Check that blank lines are ignored
+  @Test public void blankLine()
+  {
+    final List<String> lines = readInstructions("examples/blankline.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 7);
   }
 
   //Read in a file containing a program and convert into a list of
diff --git a/test/swen90006/machine/PartitioningTests.java b/test/swen90006/machine/PartitioningTests.java
index 5494b44..7f1c664 100644
--- a/test/swen90006/machine/PartitioningTests.java
+++ b/test/swen90006/machine/PartitioningTests.java
@@ -24,55 +24,400 @@ public class PartitioningTests
   {
   }
 
-  //Any method annotation with "@Test" is executed as a test.
-  @Test public void aTest()
+// lines = 0
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void zeroLines()
   {
-    //the assertEquals method used to check whether two values are
-    //equal, using the equals method
-    final int expected = 2;
-    final int actual = 1 + 1;
-    assertEquals(expected, actual);
+    final List<String> lines = readInstructions("examples/empty.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // lines = 1
+  @Test public void oneLine()
+  {
+      final List<String> lines = readInstructions("examples/oneline.s");
+      Machine m = new Machine();
+      m.execute(lines);
+  }
+  // command not a subset of ["ADD" .. "JZ]
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void invalidCommand()
+  {
+    final List<String> lines = readInstructions("examples/invalidcommand.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // ADD words = 3, Ra in R, program contains RET
+  @Test public void add()
+  {
+    final List<String> lines = readInstructions("examples/add.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 7);
+  }
+
+  // ADD words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void addShort()
+  {
+    final List<String> lines = readInstructions("examples/addshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // ADD words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void addLong()
+  {
+    final List<String> lines = readInstructions("examples/addlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // Program does not contain RET
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void noret()
+  {
+    final List<String> lines = readInstructions("examples/noret.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // SUB words = 3
+  @Test public void sub()
+  {
+    final List<String> lines = readInstructions("examples/sub.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, -3);
+  }
+
+  // SUB words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void subShort()
+  {
+    final List<String> lines = readInstructions("examples/subshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // SUB words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void subLong()
+  {
+    final List<String> lines = readInstructions("examples/sublong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // MUL words = 3
+  @Test public void mul()
+  {
+    final List<String> lines = readInstructions("examples/mul.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 12);
+  }
+
+  // MUL words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void mulShort()
+  {
+    final List<String> lines = readInstructions("examples/mulshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // MUL words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void mulLong()
+  {
+    final List<String> lines = readInstructions("examples/mullong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // DIV words = 3, Rc != 0
+  @Test public void div()
+  {
+    final List<String> lines = readInstructions("examples/div.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 2);
+  }
+
+  // DIV words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void divShort()
+  {
+    final List<String> lines = readInstructions("examples/divshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // DIV words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void divLong()
+  {
+    final List<String> lines = readInstructions("examples/divlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // Rc = 0 (divide by zero)
+  @Test public void divzero()
+  {
+    final List<String> lines = readInstructions("examples/divzero.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 17);
+  }
+
+  // MOV words = 2
+  @Test public void mov()
+  {
+    final List<String> lines = readInstructions("examples/mov.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 5);
+  }
+
+  // MOV words < 2
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void movShort()
+  {
+    final List<String> lines = readInstructions("examples/movshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // MOV words > 2
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void movLong()
+  {
+    final List<String> lines = readInstructions("examples/movlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // register > 31
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void invalidRegister()
+  {
+    final List<String> lines = readInstructions("examples/invalidregister.s");
+    Machine m = new Machine();
+    m.execute(lines);
   }
 
-  @Test public void anotherTest()
+  // ra not a register (is an int)
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void invalidRegister2()
   {
-    List<String> list = new ArrayList<String>();
-    list.add("a");
-    list.add("b");
+    final List<String> lines = readInstructions("examples/invalidregister2.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // val < INT_MIN
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void intSmall()
+  {
+    final List<String> lines = readInstructions("examples/intsmall.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // val > INT_MAX
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void intLarge()
+  {
+    final List<String> lines = readInstructions("examples/intlarge.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // LDR words = 3, STR words = 3
+  @Test public void ldrStr()
+  {
+    final List<String> lines = readInstructions("examples/ldrstr.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 13);
+  }
+
+  // LDR words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void ldrShort()
+  {
+    final List<String> lines = readInstructions("examples/ldrshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // LDR words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void ldrLong()
+  {
+    final List<String> lines = readInstructions("examples/ldrlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // LDR b + v > MAX_ADDR
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void ldrBig()
+  {
+    final List<String> lines = readInstructions("examples/ldrstrbig.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // LDR b + v < -MAX_ADDR
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void ldrSmall()
+  {
+    final List<String> lines = readInstructions("examples/ldrstrsmall.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
 
-    //the assertTrue method is used to check whether something holds.
-    assertTrue(list.contains("a"));
+  // STR words < 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void strShort()
+  {
+    final List<String> lines = readInstructions("examples/strshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // STR words > 3
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void strLong()
+  {
+    final List<String> lines = readInstructions("examples/strlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
   }
 
-  //Test test opens a file and executes the machine
-  @Test public void aFileOpenTest()
+  // JMP words = 1, 0 < pc + val < program length
+  @Test public void jmp()
   {
-    final List<String> lines = readInstructions("examples/array.s");
+    final List<String> lines = readInstructions("examples/jmp.s");
     Machine m = new Machine();
-    assertEquals(m.execute(lines), 45);
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 5);
   }
-  
-  //To test an exception, specify the expected exception after the @Test
-  @Test(expected = java.io.IOException.class) 
-    public void anExceptionTest()
-    throws Throwable
+
+  // JMP words < 1
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void jmpShort()
   {
-    throw new java.io.IOException();
+    final List<String> lines = readInstructions("examples/jmpshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
   }
 
-  //This test should fail.
-  //To provide additional feedback when a test fails, an error message
-  //can be included
-  @Test public void aFailedTest()
+  // JMP words > 1
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void jmpLong()
   {
-    //include a message for better feedback
-    final int expected = 2;
-    final int actual = 1 + 2;
-    assertEquals("Some failure message", expected, actual);
+    final List<String> lines = readInstructions("examples/jmplong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JMP pc + val > program length
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void jmpFwdJump()
+  {
+    final List<String> lines = readInstructions("examples/jmpfwdjump.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JMP pc + val < 0
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void jmpBackJump()
+  {
+    final List<String> lines = readInstructions("examples/jmpbackjump.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JZ words = 2, Ra == 0, 0 < pc + val < program length
+  @Test public void jz()
+  {
+    final List<String> lines = readInstructions("examples/jz.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 0);
+  }
+
+  // JZ words = 2, Ra != 0
+  @Test public void jznotzero()
+  {
+    final List<String> lines = readInstructions("examples/jznotzero.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 5);
+  }
+
+  // jZ words < 2
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void jzShort()
+  {
+    final List<String> lines = readInstructions("examples/jzshort.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JZ words > 2
+  @Test(expected = swen90006.machine.InvalidInstructionException.class)
+  public void jzLong()
+  {
+    final List<String> lines = readInstructions("examples/jzlong.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JZ Ra==0, pc + val > program length
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void jzFwd()
+  {
+    final List<String> lines = readInstructions("examples/jzfwd.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // jZ Ra==0, pc + val < 0
+  @Test(expected = swen90006.machine.NoReturnValueException.class)
+  public void jzBack()
+  {
+    final List<String> lines = readInstructions("examples/jzback.s");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  // JZ Ra==0, pc + val = 0
+  public void jzZero()
+  {
+    final List<String> lines = readInstructions("examples/jzzero.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 15);
+  }
+
+  // Check that blank lines are ignored
+  @Test public void blankLine()
+  {
+    final List<String> lines = readInstructions("examples/blankline.s");
+    Machine m = new Machine();
+    int result = m.execute(lines);
+    Assert.assertEquals(result, 7);
   }
 
-  //Read in a file containing a program and convert into a list of
-  //string instructions
   private List<String> readInstructions(String file)
   {
     Charset charset = Charset.forName("UTF-8");
-- 
GitLab