diff --git a/classes/swen90006/machine/PartitioningTests.class b/classes/swen90006/machine/PartitioningTests.class
index af52566636122d3ab4edeca3dfd4fb3e867aa1db..209c3ac177b18c8da68af96be8ead1f6b97dc2bc 100644
Binary files a/classes/swen90006/machine/PartitioningTests.class and b/classes/swen90006/machine/PartitioningTests.class differ
diff --git a/test/swen90006/machine/PartitioningTests.java b/test/swen90006/machine/PartitioningTests.java
index 5494b44f4615351a610fc7b0b649d30b4b2d0a40..ca837b33d46f7d6cb321997e0d530244c984e019 100644
--- a/test/swen90006/machine/PartitioningTests.java
+++ b/test/swen90006/machine/PartitioningTests.java
@@ -1,5 +1,15 @@
 package swen90006.machine;
 
+/*
+* University of Melbourne
+* SWEN90006 Software Testing and Reliability
+* Semester 2 - 2018
+* Assignment 1
+* Author: Junhan Yang
+* Login: junhany
+* StudentID: 777738
+*/
+
 import java.util.List;
 import java.util.ArrayList;
 import java.nio.charset.Charset;
@@ -12,79 +22,485 @@ import static org.junit.Assert.*;
 
 public class PartitioningTests
 {
-  //Any method annotated with "@Before" will be executed before each test,
+  //  EC refers to equivalent class.
+  //  These test cases are created to test equivalent classes derived from
+  //the test template tree drawn by the author from Task 1
+  //using Equivalent Partitioning method.
+
+  //  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,
+  //  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()
+  //  For EC1:
+  //  This test aims to test the Machine's behaviour
+  //when there do not exist any RET instruction.
+  //  The Machine's expected behaviour is to raise a NoReturnValueException.
+  @Test(expected = NoReturnValueException.class)
+    public void noRETInstructionTest()
+    throws Throwable
   {
-    //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);
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R1 10");
+    Machine m = new Machine();
+    m.execute(lines);
   }
 
-  @Test public void anotherTest()
+  //  For EC2:
+  //  This test aims to test the Machine's behaviour
+  //when there exist multiple RET instructions.
+  //  We need to use MOV to closely verify such condition, so we assume that
+  //MOV executes correctly.
+  //  The Machine's expected behaviour is to return the register's value from
+  //the first RET, and the remaining instructions after the first RET
+  //shouldn't be executed.
+  @Test public void multiRETInstructionTest()
   {
-    List<String> list = new ArrayList<String>();
-    list.add("a");
-    list.add("b");
+    String err_msg = "Machine does not return the first RET value.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R1 10");
+    lines.add("RET R1");
+    lines.add("MOV R2 20");
+    lines.add("RET R2");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 10);
+  }
 
-    //the assertTrue method is used to check whether something holds.
-    assertTrue(list.contains("a"));
+  //  For EC3:
+  //  This test aims to test the Machine's behaviour
+  //when there exist unknown instructions that is
+  //attempting to be executed.
+  //  The Machine's expected behaviour is to raise an InvalidInstructionException.
+  @Test(expected = InvalidInstructionException.class)
+    public void executeUnknownInstructionTest()
+    throws Throwable
+  {
+    String unknown_ins = "FOO R0 100";
+    List<String> lines = new ArrayList<String>();
+    lines.add(unknown_ins);
+    lines.add("RET R0");
+    Machine m = new Machine();
+    m.execute(lines);
   }
 
-  //Test test opens a file and executes the machine
-  @Test public void aFileOpenTest()
+  //  For EC4:
+  //  This test aims to test the Machine's behaviour
+  //when there exist unknown instructions that is not
+  //attempting to be executed.
+  //  The Machine's expected behaviour is return a value normally.
+  @Test public void notExecuteUnknownInstructionTest()
   {
-    final List<String> lines = readInstructions("examples/array.s");
+    String unknown_ins = "FOO R0 100";
+    String err_msg = "Machine recognises unknown instruction " +
+              "that is not even attempting to execute.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("RET R0");
+    lines.add(unknown_ins);
     Machine m = new Machine();
-    assertEquals(m.execute(lines), 45);
+    assertEquals(err_msg, m.execute(lines), 0);
   }
-  
-  //To test an exception, specify the expected exception after the @Test
-  @Test(expected = java.io.IOException.class) 
-    public void anExceptionTest()
+
+  //  For EC5:
+  //  This test aims to test the Machine's behaviour
+  //when there exist register Rx such that x is int and x < 0.
+  //  The Machine's expected behaviour is to raise an InvalidInstructionException.
+  @Test(expected = InvalidInstructionException.class)
+    public void smallResgisterTest()
     throws Throwable
   {
-    throw new java.io.IOException();
+    List<String> lines = new ArrayList<String>();
+    lines.add("RET R-1");
+    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()
+
+  //  For EC6:
+  //  This test aims to test the Machine's behaviour
+  //when there exist register Rx such that x is int and x > 31.
+  //  The Machine's expected behaviour is to raise an InvalidInstructionException.
+  @Test(expected = InvalidInstructionException.class)
+    public void largeResgisterTest()
+    throws Throwable
   {
-    //include a message for better feedback
-    final int expected = 2;
-    final int actual = 1 + 2;
-    assertEquals("Some failure message", expected, actual);
+    List<String> lines = new ArrayList<String>();;
+    lines.add("RET R32");
+    Machine m = new Machine();
+    m.execute(lines);
   }
 
-  //Read in a file containing a program and convert into a list of
-  //string instructions
-  private List<String> readInstructions(String file)
+  //  For EC7:
+  //  This test aims to test the Machine's behaviour
+  //when there exist some value val such that val is int and val > 65535 and
+  //the instructions consists of MOV and RET instructions only.
+  //  RET is assumed to be correct in this test case, so that MOV's execution can
+  //be tested.
+  //  The Machine's expected behaviour is to raise an InvalidInstructionException.
+  @Test(expected = InvalidInstructionException.class)
+    public void largeValMOVAndRETTest()
+    throws Throwable
   {
-    Charset charset = Charset.forName("UTF-8");
-    List<String> lines = null;
-    try {
-      lines = Files.readAllLines(FileSystems.getDefault().getPath(file), charset);
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R1 65536");
+    lines.add("RET R1");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  //  For EC8:
+  //  This test aims to test the Machine's behaviour
+  //when there exist some value val such that val is int and val < -65535 and
+  //the instructions consists of MOV and RET instructions only.
+  //  RET is assumed to be correct in this test case, so that MOV's execution can
+  //be tested.
+  //  The Machine's expected behaviour is to raise an InvalidInstructionException.
+  @Test(expected = InvalidInstructionException.class)
+    public void smallValMOVAndRETTest()
+    throws Throwable
+  {
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R1 -65536");
+    lines.add("RET R1");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  //  For EC9:
+  //  This test aims to test the Machine's behaviour
+  //when there exist some value val such that val is int and 65535 <= val <= 65535
+  //and the instructions consists of MOV and RET instructions only.
+  //  RET is assumed to be correct in this test case, so that MOV's execution can
+  //be tested.
+  //  The Machine's expected behaviour is to raise an InvalidInstructionException.
+  @Test public void normalValMOVAndRETTest()
+  {
+    String err_msg = "Machine does not execute MOV correctly.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R1 0");
+    lines.add("RET R1");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 0);
+  }
+
+  //  For EC10:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of ADD, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on ADD instruction.
+  //  Passing this test means that ADD execute correctly.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void ADDTest()
+  {
+    String err_msg = "Machine does not execute ADD correctly.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 2");
+    lines.add("MOV R1 1");
+    lines.add("ADD R3 R0 R1");
+    lines.add("RET R3");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 3);
+  }
+
+  //  For EC11:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of SUB, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on SUB instruction.
+  //  Passing this test means that SUB execute correctly.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void SUBTest()
+  {
+    String err_msg = "Machine does not execute SUB correctly.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 3");
+    lines.add("MOV R1 1");
+    lines.add("SUB R3 R0 R1");
+    lines.add("RET R3");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 2);
+  }
+
+
+    //  For EC12:
+    //  This test aims to test the Machine's behaviour
+    //for the correctness of executing combination of MUL, MOV and RET only.
+    //  This test assumes the correctness of RET and MOV executions so that we
+    //can test on MUL instruction.
+    //  Passing this test means that MUL execute correctly.
+    //  The Machine's expected behaviour is to return a value normally.
+    @Test public void MULTest()
+    {
+      String err_msg = "Machine does not execute MUL correctly.";
+      List<String> lines = new ArrayList<String>();
+      lines.add("MOV R0 3");
+      lines.add("MOV R1 -1");
+      lines.add("MUL R3 R0 R1");
+      lines.add("RET R3");
+      Machine m = new Machine();
+      assertEquals(err_msg, m.execute(lines), -3);
     }
-    catch (Exception e){
-      System.err.println("Invalid input file! (stacktrace follows)");
-      e.printStackTrace(System.err);
-      System.exit(1);
+
+  //  For EC13:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of JMP 1, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on JMP instruction.
+  //  Passing this test means that JMP 1 is a no-op.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void JMPONETest()
+  {
+    String err_msg = "Machine does not execute JMP 1 correctly.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("JMP 1");
+    lines.add("MOV R0 10");
+    lines.add("RET R0");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 10);
+  }
+
+  //  For EC14:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of JMP, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on JMP instruction.
+  //  Passing this test means that JMP -2 will cause pc < 0 which breaks the
+  //loop and ends the execution immdiately without returning a value by RET.
+  //  The Machine's expected behaviour is to raise a NoReturnValueException.
+  @Test(expected  = NoReturnValueException.class)
+    public void JMPNegValAndSmallNewpcTest()
+    throws Throwable
+  {
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 10");
+    lines.add("JMP -2");
+    lines.add("RET R0");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  //  For EC15:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of JMP, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on JMP instruction.
+  //  Passing this test means that JMP 2 skip the next instruction and rightaway
+  //returning a value by RET.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void JMPPosiValAndNormalNewpcTest()
+  {
+    String err_msg = "Machine does not execute JMP correctly with val > 1.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("JMP 2");
+    lines.add("MOV R0 10");
+    lines.add("RET R0");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 0);
+  }
+
+
+    //  For EC16:
+    //  This test aims to test the Machine's behaviour
+    //for the correctness of executing combination of JMP, MOV and RET only.
+    //  This test assumes the correctness of RET and MOV executions so that we
+    //can test on JMP instruction.
+    //  Passing this test means that JMP 3 will cause pc > progLength which breaks
+    //the loop and ends the execution immdiately without returning a value by RET.
+    //  The Machine's expected behaviour is to raise a NoReturnValueException.
+    @Test(expected  = NoReturnValueException.class)
+      public void JMPPosValAndLargeNewpcTest()
+      throws Throwable
+    {
+      List<String> lines = new ArrayList<String>();
+      lines.add("JMP 3");
+      lines.add("MOV R0 10");
+      lines.add("RET R0");
+      Machine m = new Machine();
+      m.execute(lines);
     }
-    return lines;
+
+  //  For EC17:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of JZ, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on JZ instruction.
+  //  Passing this test means that JZ with non-zero register is a no-op,
+  //and the pc will increment by 1.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void JZNonZeroTest()
+  {
+    String err_msg = "Machine does not execute JZ correctly with non-zero register value.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 5");
+    lines.add("JZ R0 10");
+    lines.add("RET R0");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 5);
+  }
+
+  //  For EC18:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of JZ, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on JZ instruction.
+  //  Passing this test means that JZ with zero register value will add val to pc,
+  //only if 0 <= pc < progLength.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void JZZeroAndNormalNewpcTest()
+  {
+    String err_msg = "Machine does not execute JZ correctly with zero register value.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("JZ R0 2");
+    lines.add("MOV R0 5");
+    lines.add("RET R0");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 0);
+  }
+
+  //  For EC19:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of JZ, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on JZ instruction.
+  //  Passing this test means that JZ with zero register will add val to pc,
+  //but causing pc < 0 so breaking the loop without executing RET.
+  //  The Machine's expected behaviour is to raise a NoReturnValueException.
+  @Test(expected  = NoReturnValueException.class)
+    public void JZZeroAndSmallNewpcTest()
+    throws Throwable
+  {
+    List<String> lines = new ArrayList<String>();
+    lines.add("JZ R0 -1");
+    lines.add("MOV R0 5");
+    lines.add("RET R0");
+    Machine m = new Machine();
+    m.execute(lines);
+  }
+
+  //  For EC20:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of JZ, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on JZ instruction.
+  //  Passing this test means that JZ with zero register will add val to pc,
+  //but causing pc >= progLength so breaking the loop without executing RET.
+  //  The Machine's expected behaviour is to raise a NoReturnValueException.
+  @Test(expected  = NoReturnValueException.class)
+    public void JZZeroAndLargeNewpcTest()
+    throws Throwable
+  {
+    List<String> lines = new ArrayList<String>();
+    lines.add("JZ R0 3");
+    lines.add("MOV R0 5");
+    lines.add("RET R0");
+    Machine m = new Machine();
+    m.execute(lines);
+}
+
+  //  For EC21:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of DIV, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on DIV instruction.
+  //  Passing this test means that DIV by zero is a no-op.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void DIVByZeroTest()
+  {
+    String err_msg = "Machine does not execute DIV by Zero correctly.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 9");
+    lines.add("MOV R1 0");
+    lines.add("DIV R3 R0 R1");
+    lines.add("RET R3");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 0);
+  }
+
+  //  For EC22:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of DIV, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on DIV instruction.
+  //  Passing this test means that DIV by non-zero will obtain result normally.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void DIVByNonZeroTest()
+  {
+    String err_msg = "Machine does not execute DIV by non-zero correctly.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 9");
+    lines.add("MOV R1 3");
+    lines.add("DIV R3 R0 R1");
+    lines.add("RET R3");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 3);
+  }
+
+  //  For EC23:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of STR, LDR, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on STR and LDR instructions.
+  //  Passing this test means that STR and LDR with b + v > 65535 is a no-op.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void STRAndLDRLargeRegPlusValTest()
+  {
+    String err_msg = "Machine does not execute STR and/or LDR correctly with b + v > 65535.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 65535");
+    lines.add("MOV R1 5");
+    lines.add("STR R0 1 R1");
+    lines.add("LDR R2 R0 1");
+    lines.add("RET R2");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 0);
+  }
+
+  //  For EC24:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of STR, LDR, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on STR and LDR instruction.
+  //  Passing this test means that STR and LDR with b + v < 0 is a no-op.
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void STRSmallRegisterValuePlusValTest()
+  {
+    String err_msg = "Machine does not execute STR and/or LDR correctly with b + v < 0.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 4");
+    lines.add("MOV R1 5");
+    lines.add("STR R0 -5 R1");
+    lines.add("LDR R2 R0 -5");
+    lines.add("RET R2");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 0);
+  }
+
+  //  For EC25:
+  //  This test aims to test the Machine's behaviour
+  //for the correctness of executing combination of STR, LDR, MOV and RET only.
+  //  This test assumes the correctness of RET and MOV executions so that we
+  //can test on STR and LDR instruction.
+  //  Passing this test means that STR and LDR with 0 <= b + v <= 65535 works normally
+  //by assigning value on memory[b + v].
+  //  The Machine's expected behaviour is to return a value normally.
+  @Test public void STRNormalRegisterValuePlusValTest()
+  {
+    String err_msg = "Machine does not execute STR and/or LDR correctly 0 <= b + v <= 65535.";
+    List<String> lines = new ArrayList<String>();
+    lines.add("MOV R0 -1");
+    lines.add("MOV R1 2");
+    lines.add("STR R0 1 R1");
+    lines.add("LDR R2 R0 1");
+    lines.add("RET R2");
+    Machine m = new Machine();
+    assertEquals(err_msg, m.execute(lines), 2);
   }
 }
+
+/*------------------------- END of Partitioning Tests -------------------------*/