diff --git a/PartitioningTests.java b/PartitioningTests.java new file mode 100644 index 0000000000000000000000000000000000000000..41092c667f213710f4a9d78c892c70a838509538 --- /dev/null +++ b/PartitioningTests.java @@ -0,0 +1,484 @@ +package swen90006.machine; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.ArrayList; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.nio.file.Files; +import java.nio.file.FileSystems; + +import org.junit.*; + +import static org.junit.Assert.*; + + +public class PartitioningTests { + /* + * 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() { + } + + /* + * EC1 + * test for no RET instruction + * if there is no RET instruction + * throw the NoReturnValueException + * */ + @Test(expected = NoReturnValueException.class) + public void noRetTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 10"); + machineExeLines(lines); + } + + /* + * EC2 + * test for more than one RET instructions + * return the value of first RET + * */ + @Test + public void multiRetTest() { + List<String> lines = new ArrayList<String>(); + final int expected = -10; + lines.add("MOV R0 " + expected); + lines.add("RET R0"); + lines.add("MOV R1 " + expected * 10); + lines.add("RET R1"); + assertEquals(expected, machineExeLines(lines)); + } + + /* + * EC3 + * test for the index i of a register less than 0 + * if i < 0 + * throw the InvalidInstructionException + * */ + @Test(expected = InvalidInstructionException.class) + public void smallRegIndexTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R-1 0"); + machineExeLines(lines); + } + + /* + * EC4 + * test for the index i of a register bigger than 31 + * if i > 31 + * throw the InvalidInstructionException + * */ + @Test(expected = InvalidInstructionException.class) + public void bigRegIndexTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R32 0"); + machineExeLines(lines); + } + + /* + * EC5 + * test for the value val + * use MOV for an example + * if val < -65535 + * throw the InvalidInstructionException + * */ + @Test(expected = InvalidInstructionException.class) + public void smallValTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R1 -65536"); + lines.add("RET R1"); + machineExeLines(lines); + } + + /* + * EC6 + * test for the value val + * use MOV for an example + * if val > 65535 + * throw the InvalidInstructionException + * */ + @Test(expected = InvalidInstructionException.class) + public void bigValTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R1 65536"); + lines.add("RET R1"); + machineExeLines(lines); + } + + /* + * EC7 + * test for the value of a register + * if regV < -(2^31) + 1 + * stop the function, show the error + * EC7 cannot give a test + * + @Test + public void smallRegVTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 -2"); + lines.add("MOV R1 2"); + int minRegV = 2; + + for (int i = 0; i < 30; i++) { + lines.add("MUL R0 R0 R1"); + minRegV *= 2; + } + //regV_of_R0 = -(2^31), minRegV = -(2^31) + minRegV += 1; + lines.add("MUL R0 R0 R1"); + lines.add("RET R0"); + assertEquals("The value of register if overflow.", minRegV, machineExeLines(lines)); + //System.exit(1); + }*/ + + /* + * EC8 + * test for the value of a register + * if regV > 2^31 + * stop the function, show the error + * + @Test + public void bigRegVTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 2"); + lines.add("MOV R1 2"); + int maxRegV = 2; + + for (int i = 0; i < 30; i++) { + lines.add("MUL R0 R0 R1"); + maxRegV *= 2; + } + //regV_of_R0 = (2^31), minRegV = (2^31) + + lines.add("MUL R0 R0 R1"); + lines.add("RET R0"); + assertEquals("The value of register if overflow.", maxRegV, machineExeLines(lines)); + //System.exit(1); + }*/ + + /* + * EC9 + * test for ADD + * return a normal value + * */ + @Test + public void addNormalTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 1"); + lines.add("ADD R0 R0 R0"); + lines.add("RET R0"); + assertEquals("Wrong ADD result.", 2, machineExeLines(lines)); + } + + /* + * EC10 + * test for SUB + * return a normal value + * */ + @Test + public void subNormalTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 1"); + lines.add("SUB R0 R0 R0"); + lines.add("RET R0"); + assertEquals("Wrong SUB result.", 0, machineExeLines(lines)); + } + + /* + * EC11 + * test for MUL + * return a normal value + * */ + @Test + public void mulNoramlTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 1"); + lines.add("MUL R0 R0 R0"); + lines.add("RET R0"); + assertEquals("Wrong MUL result.", 1, machineExeLines(lines)); + } + + /* + * EC12 + * test for DIV + * if divisor = 0 + * return a normal value (still the value of the dividend) + * */ + @Test + public void divByZeroTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R1 0"); + lines.add("MOV R0 -3"); + lines.add("DIV R0 R0 R1"); + lines.add("RET R0"); + assertEquals(-3, machineExeLines(lines)); + } + + /* + * EC13 + * test for DIV + * if divisor != 0 + * return a normal value + * */ + @Test + public void divByNonZeroTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R1 1"); + lines.add("MOV R0 3"); + lines.add("DIV R0 R0 R1"); + lines.add("RET R0"); + assertEquals(3, machineExeLines(lines)); + } + + /* + * EC14 + * test for MOV + * return a normal value + * */ + @Test + public void movNormalTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 1"); + lines.add("RET R0"); + assertEquals("Wrong ADD result.", 1, machineExeLines(lines)); + } + + /* + * EC15 + * test for RET + * if the register is undefined + * return a normal value + * */ + @Test + public void retUndefinedTest() { + List<String> lines = new ArrayList<String>(); + lines.add("RET R0"); + assertEquals(0, machineExeLines(lines)); + } + + /* + * EC16 + * test for RET + * if the register is defined + * return a normal value + * */ + @Test + public void retNormalTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 1"); + lines.add("RET R0"); + assertEquals("Wrong RET result.", 1, machineExeLines(lines)); + } + + /* + * EC17 + * test for JMP + * if val = 0 + * cause an infinite loop + * but can not have a test case since it will loop forever + * */ + + /* + * EC18 + * test for JMP + * if v < 0 && |v| > the amount of previous pc count + * throw the NoReturnValueException + * */ + @Test(expected = NoReturnValueException.class) + public void jmpMinusPCNoReturnTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("JMP -1"); + lines.add("RET R0"); + machineExeLines(lines); + } + + /* + * EC19 + * test for JMP + * if v > 0 && v > the amount of pc count above + * throw the NoReturnValueException + * */ + @Test(expected = NoReturnValueException.class) + public void jmpPositivePCNoReturnTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("JMP 2"); + lines.add("RET R0"); + machineExeLines(lines); + } + + /* + * EC20 + * test for JMP + * if _pc <= v <= pc_ && v != 0 + * return a normal value + * */ + @Test + public void jmpNormalTest() { + List<String> lines = new ArrayList<String>(); + lines.add("JMP 2"); + lines.add("MOV R0 1"); + lines.add("MOV R0 2"); + lines.add("RET R0"); + assertEquals("Wrong JMP result.", 2, machineExeLines(lines)); + } + + /* + * EC21 + * test for JZ + * if val = 0 + * cause an infinite loop + * but can not have a test case since it will loop forever + * */ + + /* + * EC22 + * test for JZ + * if v < 0 && |v| > the amount of previous pc count + * throw the NoReturnValueException + * */ + @Test(expected = NoReturnValueException.class) + public void jzMinusPCNoReturnTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("JZ R0 -1"); + lines.add("RET R0"); + machineExeLines(lines); + } + + /* + * EC23 + * test for JZ + * if v > 0 && v > the amount of pc count above + * throw the NoReturnValueException + * */ + @Test(expected = NoReturnValueException.class) + public void jzPositivePCNoReturnTest() + throws Throwable { + List<String> lines = new ArrayList<String>(); + lines.add("JZ R0 2"); + lines.add("RET R0"); + machineExeLines(lines); + } + + /* + * EC24 + * test for JZ + * if _pc <= v <= pc_ && v != 0 + * return a normal value + * */ + @Test + public void jzNormalTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R1 1"); + lines.add("JZ R1 3"); + lines.add("SUB R1 R1 R1"); + lines.add("MOV R1 2"); + lines.add("RET R1"); + assertEquals("Wrong JMP result.", 2, machineExeLines(lines)); + } + + /* + * EC25 + * test for LDR + * if b + v <= -(2^31) + * stop the programme and print out the error + * + @Test + public void ldrSmallAddressTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 2"); + lines.add("MOV R1 2"); + lines.add("MOV R2 2"); + int m = 2; + + for (int i = 0; i < 29; i++) { + lines.add("MUL R0 R0 R2"); + lines.add("MUL R1 R1 R2"); + m *= 2; + } + System.out.println(m); + lines.add("LDR R0 R1 -65535"); + lines.add("RET R0"); + machineExeLines(lines); + }*/ + + /* + * EC26 + * test for LDR + * if b + v in -(2^31-1) ... (2^31-1) + * return a normal value + * */ + @Test + public void ldrNormalAddressTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 1"); + lines.add("MOV R1 2"); + lines.add("LDR R0 R1 -2"); + lines.add("RET R0"); + assertEquals("Wrong LDR result.", 0, machineExeLines(lines)); + } + + /* + * EC27 + * test for LDR + * if b + v >= 2^31 + * stop the programme and print out the error + */ + + /* + * EC28 + * test for STR + * if b + v <= -(2^31) + * stop the programme and print out the error + */ + + /* + * EC29 + * test for STR + * if b + v in -(2^31-1) ... (2^31-1) + * return a normal value + * */ + @Test + public void strNormalAddressTest() { + List<String> lines = new ArrayList<String>(); + lines.add("MOV R0 1"); + lines.add("MOV R1 2"); + lines.add("STR R0 -1 R1"); + lines.add("RET R0"); + machineExeLines(lines); + } + + /* + * EC30 + * test for STR + * if b + v >= 2^31 + * stop the programme and print out the error + */ + + + /* + * Machine executes input lines + * */ + private int machineExeLines(List<String> lines) { + Machine m = new Machine(); + return m.execute(lines); + } +} \ No newline at end of file