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