@Test
  public void changeOperationAddsMessageChangeOperation() {
    viewModel.setOperation(Operation.XOR);
    String message = viewModel.getLog().get(viewModel.getLog().size() - 1);

    assertTrue(message.matches(".*" + ViewModel.LogMessages.OPERATION_CHANGED + ".*"));
  }
  @Test
  public void initArrayAddsMessageInitArrayWithSize() {
    viewModel.setArraySize("5");

    viewModel.initializeArray();
    String message = viewModel.getLog().get(viewModel.getLog().size() - 1);

    assertTrue(message.matches(".*" + ViewModel.LogMessages.INIT_ARRAY_WITH_SIZE + ".*"));
  }
  @Test
  public void changeOperationNotAddsMessageToLogWithSameOperation() {
    viewModel.setOperation(Operation.XOR);
    int sizeFirst = viewModel.getLog().size();

    viewModel.setOperation(Operation.XOR);

    assertEquals(viewModel.getLog().size(), sizeFirst);
  }
  @Test
  public void updatedSecondBitArrayAddsMessageUpdatedSecondBitArray() {
    initArraysForOperations();
    viewModel.logUpdatedSecondBitArray();

    String message = viewModel.getLog().get(viewModel.getLog().size() - 1);

    assertTrue(message.matches(".*" + ViewModel.LogMessages.UPDATE_SECOND_BIT_ARRAY + ".*"));
  }
  @Test
  public void setSizeArrayAddsMessageToLog() {
    viewModel.setArraySize("5");
    viewModel.logUpdatedSize();

    String message = viewModel.getLog().get(viewModel.getLog().size() - 1);

    assertTrue(message.matches(".*" + ViewModel.LogMessages.UPDATE_ARRAY_SIZE + ".*"));
  }
  @Test
  public void doOperationAddsMessageDidOperation() {
    viewModel.setOperation(Operation.XOR);
    initArraysForOperations();

    viewModel.doOperation();
    String message = viewModel.getLog().get(viewModel.getLog().size() - 1);

    assertTrue(message.matches(".*" + ViewModel.LogMessages.OPERATION_DID + ".*"));
  }
  @Test
  public void logSaveCorrectInputData() {
    setInputData();
    viewModel.focusWasChanged(Boolean.FALSE);

    String message = viewModel.getLog().get(0);
    assertTrue(
        message.matches(
            ".*"
                + viewModel.seg1Point1XProperty().get()
                + ".*"
                + viewModel.seg1Point1YProperty().get()
                + ".*"
                + viewModel.seg1Point2XProperty().get()
                + ".*"
                + viewModel.seg1Point2YProperty().get()
                + ".*"
                + viewModel.seg2Point1XProperty().get()
                + ".*"
                + viewModel.seg2Point1YProperty().get()
                + ".*"
                + viewModel.seg2Point2XProperty().get()
                + ".*"
                + viewModel.seg2Point2YProperty().get()
                + ".*"));
  }
  @Test
  public void initArrayAddsMessageToLog() {
    viewModel.setArraySize("5");

    viewModel.initializeArray();

    assertFalse(viewModel.getLog().isEmpty());
  }
  @Test
  public void doesLogContainProperMessageAfterChangingInputData() {
    viewModel.seg2Point1XProperty().set("1");
    viewModel.focusWasChanged(Boolean.FALSE);
    String logMessage = viewModel.getLog().get(0);

    assertTrue(logMessage.matches(".*" + LogMessages.EDITING_FINISHED + ".*"));
  }
  @Test
  public void doesLogContainProperMessageAfterCalculation() {
    setInputData();
    viewModel.calculate();
    String logMessage = viewModel.getLog().get(0);

    assertTrue(logMessage.matches(".*" + LogMessages.CALCULATE_WAS_PRESSED + ".*"));
  }
  @Test
  public void doOperationAddsMessageToLog() {
    viewModel.setOperation(Operation.XOR);
    initArraysForOperations();

    viewModel.doOperation();

    assertFalse(viewModel.getLog().isEmpty());
  }
  @Test
  public void doNotAddLogMessageWhenSameParameterWasInput() {
    viewModel.seg1Point1XProperty().set("1");
    viewModel.focusWasChanged(Boolean.FALSE);
    viewModel.seg1Point1XProperty().set("1");
    viewModel.focusWasChanged(Boolean.FALSE);

    assertEquals(1, viewModel.getLog().size());
  }
  @Test
  public void logCanHaveSeveralMessages() {
    viewModel.seg2Point1XProperty().set("1");
    viewModel.focusWasChanged(Boolean.FALSE);
    viewModel.seg2Point1YProperty().set("5");
    viewModel.focusWasChanged(Boolean.FALSE);

    assertEquals(2, viewModel.getLog().size());
  }
  @Test
  public void addLogMessageAfterDeletingInputData() {
    viewModel.seg1Point1XProperty().set("1");
    viewModel.focusWasChanged(Boolean.FALSE);
    viewModel.seg1Point1XProperty().set("");
    viewModel.focusWasChanged(Boolean.FALSE);

    assertEquals(2, viewModel.getLog().size());
  }
 @Test
 public void defaultLogIsEmpty() {
   assertTrue(viewModel.getLog().isEmpty());
 }
 @Test
 public void isEmptyLogByDefault() {
   assertTrue(viewModel.getLog().isEmpty());
 }
  @Test
  public void changeOperationAddsMessageToLog() {
    viewModel.setOperation(Operation.XOR);

    assertFalse(viewModel.getLog().isEmpty());
  }