diff --git a/test/swen90006/machine/BoundaryTests.java b/test/swen90006/machine/BoundaryTests.java index 61ce1ca647f325fbf452047408c1e22d9befcb99..ba1eb33c70b85f19273d30cabbe3e5122d72b77d 100644 --- a/test/swen90006/machine/BoundaryTests.java +++ b/test/swen90006/machine/BoundaryTests.java @@ -10,81 +10,249 @@ import java.nio.file.FileSystems; import org.junit.*; import static org.junit.Assert.*; -public class BoundaryTests -{ - //Any method annotated with "@Before" will be executed before each test, - //allowing the tester to set up some shared resources. - @Before public void setUp() - { - } - - //Any method annotated with "@After" will be executed after each test, - //allowing the tester to release any shared resources used in the setup. - @After public void tearDown() - { - } - - //Any method annotation with "@Test" is executed as a test. - @Test public void aTest() - { - //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); - } - - @Test public void anotherTest() - { - List<String> list = new ArrayList<String>(); - list.add("a"); - list.add("b"); - - //the assertTrue method is used to check whether something holds. - assertTrue(list.contains("a")); - } - - //Test test opens a file and executes the machine - @Test public void aFileOpenTest() - { - final List<String> lines = readInstructions("examples/array.s"); - Machine m = new Machine(); - assertEquals(m.execute(lines), 45); - } - - //To test an exception, specify the expected exception after the @Test - @Test(expected = java.io.IOException.class) - public void anExceptionTest() - throws Throwable - { - throw new java.io.IOException(); - } - - //This test should fail. - //To provide additional feedback when a test fails, an error message - //can be included - @Test public void aFailedTest() - { - //include a message for better feedback - final int expected = 2; - final int actual = 1 + 2; - assertEquals("Some failure message", expected, actual); - } - - //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"); - List<String> lines = null; - try { - lines = Files.readAllLines(FileSystems.getDefault().getPath(file), charset); - } - catch (Exception e){ - System.err.println("Invalid input file! (stacktrace follows)"); - e.printStackTrace(System.err); - System.exit(1); - } - return lines; - } +public class BoundaryTests { +// // Any method annotated with "@Before" will be executed before each test, +// // allowing the tester to set up some shared resources. +// @Before +// public void setUp() { +// } +// +// // Any method annotated with "@After" will be executed after each test, +// // allowing the tester to release any shared resources used in the setup. +// @After +// public void tearDown() { +// } +// +// // Any method annotation with "@Test" is executed as a test. +// @Test +// public void aTest() { +// // 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); +// } +// +// @Test +// public void anotherTest() { +// List<String> list = new ArrayList<String>(); +// list.add("a"); +// list.add("b"); +// +// // the assertTrue method is used to check whether something holds. +// assertTrue(list.contains("a")); +// } +// +// // Test test opens a file and executes the machine +// @Test +// public void aFileOpenTest() { +// final List<String> lines = readInstructions("examples/array.s"); +// Machine m = new Machine(); +// assertEquals(m.execute(lines), 45); +// } +// +// // To test an exception, specify the expected exception after the @Test +// @Test(expected = java.io.IOException.class) +// public void anExceptionTest() throws Throwable { +// throw new java.io.IOException(); +// } +// +// // This test should fail. +// // To provide additional feedback when a test fails, an error message +// // can be included +// @Test +// public void aFailedTest() { +// // include a message for better feedback +// final int expected = 2; +// final int actual = 1 + 2; +// assertEquals("Some failure message", expected, actual); +// } +// +// // 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"); +// List<String> lines = null; +// try { +// lines = Files.readAllLines(FileSystems.getDefault().getPath(file), charset); +// } catch (Exception e) { +// System.err.println("Invalid input file! (stacktrace follows)"); +// e.printStackTrace(System.err); +// System.exit(1); +// } +// return lines; +// } + + // Tests the off point for Register < 0 + @Test(expected = InvalidInstructionException.class) + public void EC1() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("add R-1 R0"); + machine.execute(instruction); + } + + // Tests the off point for Register > 31 + @Test(expected = InvalidInstructionException.class) + public void EC2() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("sub R32 R0"); + machine.execute(instruction); + } + + // Tests the off point for val < -65535 + @Test(expected = InvalidInstructionException.class) + public void EC3() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("mov R0 -65536"); + machine.execute(instruction); + } + + // Tests the off point for val > 65535 + @Test(expected = InvalidInstructionException.class) + public void EC4() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("ldr R0 R1 65536"); + machine.execute(instruction); + } + + // Tests the on point for Register < 0 and Last command == "RET" + @Test + public void EC5_OnPointRegisterLessThanMin() { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("ret R0"); + assertEquals(machine.execute(instruction), 0); + } + + // Tests the on point for Register > 31 and Last command == "RET" + @Test + public void EC5_OnPointRegisterGreaterThanMax() { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("ret R31"); + assertEquals(machine.execute(instruction), 0); + } + + // Test on point for val < -65535, Register < 0 and off point for Last command == "RET" + @Test(expected = NoReturnValueException.class) + public void EC6_OnPointValLessThanMin() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("str R0 -65535 R1"); + machine.execute(instruction); + } + + // Test on point for val > 65535, Register > 31 and off point for Last command == "RET" + @Test(expected = NoReturnValueException.class) + public void EC6_OnPointValGreaterThanMax() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("jz R31 65535"); + machine.execute(instruction); + } + + // Tests the off point for Register < 0 + @Test(expected = InvalidInstructionException.class) + public void EC7() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("div R-1 R0 R1"); + instruction.add("ret R0"); + machine.execute(instruction); + } + + // Tests the off point for Register > 31 + @Test(expected = InvalidInstructionException.class) + public void EC8() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("jmp 1"); + instruction.add("ret R32"); + machine.execute(instruction); + } + + // Test off point for val < -65535 + @Test(expected = InvalidInstructionException.class) + public void EC9() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("jz R0 -65536"); + instruction.add("ret R0"); + machine.execute(instruction); + } + + // Test off point for val > 65535 + @Test(expected = InvalidInstructionException.class) + public void EC10() throws Throwable { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("mov R0 65536"); + instruction.add("jz R0 1"); + instruction.add("ret R0"); + machine.execute(instruction); + } + + // Test on points for Register < 0, Register > 31, val < -65535, val > 65535 and Last command == "RET" + @Test + public void EC11() { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("mov R0 -65535"); + instruction.add("mov R31 65535"); + instruction.add("MUL R1 R0 R31"); + instruction.add("ret R31"); + assertEquals(machine.execute(instruction), 65535); + } + + // Test on point for Register < 0, Register > 31, val < -65535, val > 65535 and off point for Last command == "RET" + @Test(expected = NoReturnValueException.class) + public void EC12() { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("mov R0 -65535"); + instruction.add("mov R31 65535"); + instruction.add("jmp -5"); + machine.execute(instruction); + } + + // Test on point for wrong syntax + @Test(expected = InvalidInstructionException.class) + public void EC13_On() { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add(""); + instruction.add("abc"); + machine.execute(instruction); + } + + // Test off point for wrong syntax + @Test + public void EC13_Off() { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("ret R0"); + machine.execute(instruction); + assertEquals(machine.execute(instruction), 0); + } + + // Test on point for list length == 0 + @Test(expected = NoReturnValueException.class) + public void EC14_On() { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + machine.execute(instruction); + } + + // Test off point for list length == 0 + @Test(expected = InvalidInstructionException.class) + public void EC14_Off() { + Machine machine = new Machine(); + List<String> instruction = new ArrayList<>(); + instruction.add("ABC AA"); + machine.execute(instruction); + } }