@Test
  public void shouldExecuteAddiOperation()
      throws UnreachableLabelException, InvalidInstructionException {
    Instruction first = new InstructionIType("addi $s0, $zero, 23");

    Datapath datapath = new Datapath(Arrays.asList(first), new HashMap<String, Integer>());

    datapath.moveForward();

    assertEquals("addi", datapath.getIfId().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getIdEx().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getExMem().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getMemWb().getInstructionFetched().getOperation());

    datapath.moveForward();

    assertEquals("NOP", datapath.getIfId().getInstructionFetched().getOperation());
    assertEquals("addi", datapath.getIdEx().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getExMem().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getMemWb().getInstructionFetched().getOperation());

    datapath.moveForward();

    assertEquals("NOP", datapath.getIfId().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getIdEx().getInstructionFetched().getOperation());
    assertEquals("addi", datapath.getExMem().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getMemWb().getInstructionFetched().getOperation());

    assertEquals(23, datapath.getExMem().getALUOut());

    datapath.moveForward();

    assertEquals("NOP", datapath.getIfId().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getIdEx().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getExMem().getInstructionFetched().getOperation());
    assertEquals("addi", datapath.getMemWb().getInstructionFetched().getOperation());

    assertEquals(0, rBank.getValue("s0"));

    datapath.moveForward();

    assertEquals("NOP", datapath.getIfId().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getIdEx().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getExMem().getInstructionFetched().getOperation());
    assertEquals("NOP", datapath.getMemWb().getInstructionFetched().getOperation());

    assertEquals(
        23,
        rBank.getValue("s0")); // S� modificou o valor no banco de registradores no quinto est�gio
  }
  @Test
  public void shoudSimulateLoadWordWithoutHazard()
      throws UnreachableLabelException, InvalidInstructionException {
    Instruction first = new InstructionIType("lw $t0, 20($s1)");

    Datapath datapath = new Datapath(Arrays.asList(first), new HashMap<String, Integer>());
    memory.write(20, 15); // na posi��o 20 vou colocar o inteiro 15

    // First stage
    datapath.moveForward();

    // Second Stage
    datapath.moveForward();

    // Load Word soma o valor do imeadiato com o valor do registrador

    // Third Stage
    datapath.moveForward();
    assertEquals(
        20,
        datapath
            .getExMem()
            .getALUOut()); // $s0 estava como zero, por isso a soma � 20 que � a constante
    assertTrue(datapath.getExMem().isMemToReg());
    assertTrue(datapath.getExMem().isMemRead());
    assertFalse(datapath.getExMem().isMemWrite());
    assertEquals(0, rBank.getValue("t0")); // o t0 n�o foi inicializado

    // Fourth Stage
    datapath.moveForward();
    assertEquals(15, datapath.getMemWb().getMemoryData());

    // Fifth Stage
    datapath.moveForward();
    assertEquals(15, rBank.getValue("t0"));
  }