@Test
  public void testShowEditorsInReadOnlyMode() {
    // Given:
    userWorkspaceContext.setProjectActive(false);
    userWorkspaceContext.setHasEditTranslationAccess(false);
    selectedTU = currentPageRows.get(0);
    ArrayList<ToggleEditor> currentEditors = Lists.newArrayList(editor);
    when(editor.getId()).thenReturn(selectedTU.getId());
    ArrayList<ToggleEditor> previousEditors = Lists.newArrayList(editor2);
    presenter.setStatesForTesting(null, 0, display);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditors()).thenReturn(previousEditors, currentEditors);
    when(sourceContentPresenter.getSourceContent(selectedTU.getId()))
        .thenReturn(Optional.of("source"));

    // When:
    presenter.setSelected(selectedTU.getId());

    // Then:
    verify(editorTranslators).clearTranslatorList(previousEditors);
    verify(editor).clearTranslatorList();
    verify(display).showButtons(false);
    verify(display).setToMode(ToggleEditor.ViewMode.VIEW);
    verify(editorKeyShortcuts).enableNavigationContext();
  }
  @Test
  public void willNotMoveToNextEntryIfTranslationHasError() {
    // Given: selected display and focus on first entry
    ValidationMessages messages = mock(ValidationMessages.class);

    Map<ValidationAction, List<String>> errorMessage = Maps.newHashMap();
    errorMessage.put(
        new HtmlXmlTagValidation(ValidationId.HTML_XML, messages), new ArrayList<String>());

    selectedTU = currentPageRows.get(0);
    when(display.getNewTargets()).thenReturn(NEW_TARGETS);
    when(display.getCachedTargets()).thenReturn(CACHED_TARGETS);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor));
    when(display.getErrorMessages()).thenReturn(errorMessage);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    // When:
    presenter.saveAsApprovedAndMoveNext(selectedTU.getId());

    // Then:
    verify(validationWarning)
        .center(
            selectedTU.getId(), userWorkspaceContext.getSelectedDoc(), NEW_TARGETS, errorMessage);
  }
  @Test
  public void testOnInsertString() {
    // Given:
    selectedTU = currentPageRows.get(0);
    when(editor.getId()).thenReturn(selectedTU.getId());
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor));
    when(tableEditorMessages.notifyCopied()).thenReturn("copied");
    when(sourceContentPresenter.getSourceContent(selectedTU.getId()))
        .thenReturn(Optional.of("source content"));

    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    // When:
    presenter.onInsertString(new InsertStringInEditorEvent("", "suggestion"));

    // Then:
    verify(editor).insertTextInCursorPosition("suggestion");

    verify(eventBus, atLeastOnce()).fireEvent(eventCaptor.capture());
    NotificationEvent notificationEvent =
        TestFixture.extractFromEvents(eventCaptor.getAllValues(), NotificationEvent.class);
    MatcherAssert.assertThat(notificationEvent.getMessage(), Matchers.equalTo("copied"));

    RunValidationEvent runValidationEvent =
        TestFixture.extractFromEvents(eventCaptor.getAllValues(), RunValidationEvent.class);
    assertThat(runValidationEvent.getSourceContent(), equalTo("source content"));
  }
  @Test
  public void willSaveAndMoveToNextRow() {
    // Given: selected display and there is only one entry(no plural or last entry of plural)
    selectedTU = currentPageRows.get(0);
    when(display.getNewTargets()).thenReturn(NEW_TARGETS);
    when(display.getCachedTargets()).thenReturn(CACHED_TARGETS);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor));
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    // When:
    presenter.saveAsApprovedAndMoveNext(selectedTU.getId());

    // Then:
    verify(eventBus, atLeastOnce()).fireEvent(eventCaptor.capture());

    TransUnitSaveEvent saveEvent =
        TestFixture.extractFromEvents(eventCaptor.getAllValues(), TransUnitSaveEvent.class);
    assertThat(saveEvent.getTransUnitId(), equalTo(selectedTU.getId()));
    assertThat(saveEvent.getTargets(), Matchers.equalTo(NEW_TARGETS));
    assertThat(saveEvent.getStatus(), equalTo(ContentState.Translated));

    NavTransUnitEvent navEvent =
        TestFixture.extractFromEvents(eventCaptor.getAllValues(), NavTransUnitEvent.class);
    assertThat(navEvent.getRowType(), equalTo(NavTransUnitEvent.NavigationType.NextEntry));
  }
  @Test
  public void canGetCurrentTransUnitId() {
    selectedTU = currentPageRows.get(0);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    TransUnitId result = presenter.getCurrentTransUnitIdOrNull();
    assertThat(result, Matchers.sameInstance(selectedTU.getId()));
  }
  @Test
  public void testSetFocus() {
    presenter.setStatesForTesting(selectedTU.getId(), 99, display);

    presenter.setFocus();

    // current editor index will be corrected if out of bound
    verify(display).focusEditor(0);
  }
  @Test
  public void canGetNewTargets() {
    selectedTU = currentPageRows.get(0);
    when(display.getNewTargets()).thenReturn(NEW_TARGETS);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    List<String> result = presenter.getNewTargets();

    MatcherAssert.assertThat(result, Matchers.sameInstance(NEW_TARGETS));
  }
  @Test
  public void willIgnoreRejectIfItsAlreadyRejectedState() {
    selectedTU = currentPageRows.get(1);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getCachedState()).thenReturn(ContentState.Rejected);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    presenter.rejectTranslation(selectedTU.getId());

    verifyZeroInteractions(eventBus);
  }
  @Test
  public void canMoveToPreviousEditorInPluralForm() {
    // Given: current editor index is 1
    presenter.setStatesForTesting(selectedTU.getId(), 1, display);

    // When:
    presenter.moveToPreviousEntry();

    // Then:
    verify(display).focusEditor(0);
    verifyZeroInteractions(eventBus);
  }
  @Test
  public void canShowHistory() {
    // Given:
    selectedTU = currentPageRows.get(0);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    // When:
    presenter.showHistory(selectedTU.getId());

    // Then:
    verify(historyPresenter).showTranslationHistory(selectedTU.getId());
  }
  @Test
  public void canMoveToPreviousEntry() {
    // Given: default current editor index is 0
    TargetContentsPresenter spyPresenter = spy(presenter);
    doNothing().when(spyPresenter).savePendingChangesIfApplicable();

    // When:
    spyPresenter.moveToPreviousEntry();

    // Then:
    verify(spyPresenter).savePendingChangesIfApplicable();
    verify(eventBus).fireEvent(NavTransUnitEvent.PREV_ENTRY_EVENT);
  }
  @Test
  public void canMoveToNextEditorInPluralForm() {
    // Given: current editor index is 0
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor, editor2));
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    // When:
    presenter.moveToNextEntry();

    // Then:
    verify(display).focusEditor(1);
    verifyZeroInteractions(eventBus);
  }
  @Test
  public void canMoveToNextEditorInPluralFormOnFirstRow() {
    // Given: current editor index is last index (represent last entry from move to previous)
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor, editor2));
    presenter.setStatesForTesting(selectedTU.getId(), TargetContentsPresenter.LAST_INDEX, display);

    // When:
    presenter.moveToNextEntry();

    // Then:
    verify(display).focusEditor(1);
    verifyZeroInteractions(eventBus);
  }
  @Test
  public void testOnFocus() {
    selectedTU = currentPageRows.get(0);
    TransUnitId oldSelection = currentPageRows.get(1).getId();
    presenter.setStatesForTesting(oldSelection, 0, display);

    presenter.onEditorClicked(selectedTU.getId(), 1);

    verify(eventBus).fireEvent(eventCaptor.capture());
    TableRowSelectedEvent tableRowSelectedEvent =
        TestFixture.extractFromEvents(eventCaptor.getAllValues(), TableRowSelectedEvent.class);
    assertThat(tableRowSelectedEvent.getSelectedId(), Matchers.equalTo(selectedTU.getId()));
  }
  @Test
  public void willMoveToNextEntryIfItIsPluralAndNotAtLastEntry() {
    // Given: selected display and focus on first entry
    selectedTU = currentPageRows.get(0);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor, editor2));
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    // When:
    presenter.saveAsApprovedAndMoveNext(selectedTU.getId());

    // Then:
    verify(display).focusEditor(1);
  }
  @Test
  public void rejectTranslationWillForceComment() {
    selectedTU = currentPageRows.get(1);
    when(display.getId()).thenReturn(selectedTU.getId());
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    presenter.rejectTranslation(selectedTU.getId());

    verify(eventBus).fireEvent(eventCaptor.capture());
    CommentBeforeSaveEvent commentBeforeSaveEvent =
        extractFromEvents(eventCaptor.getAllValues(), CommentBeforeSaveEvent.class);
    assertThat(
        commentBeforeSaveEvent.getSaveEvent().getStatus(), Matchers.equalTo(ContentState.Rejected));
  }
  @Test
  public void canConfirmSavedOnSavingState() {
    selectedTU = currentPageRows.get(1);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditingState()).thenReturn(TargetContentsDisplay.EditingState.SAVING);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    presenter.confirmSaved(selectedTU);

    verify(display)
        .updateCachedTargetsAndVersion(
            selectedTU.getTargets(), selectedTU.getVerNum(), selectedTU.getStatus());
    verify(display).setState(TargetContentsDisplay.EditingState.SAVED);
  }
  @Test
  public void canConfirmSavedOnSavedState() {
    selectedTU = currentPageRows.get(1);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditingState()).thenReturn(TargetContentsDisplay.EditingState.SAVED);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    presenter.confirmSaved(selectedTU);

    InOrder inOrder = Mockito.inOrder(display);
    inOrder.verify(display).setValueAndCreateNewEditors(selectedTU);
    inOrder.verify(display).refresh();
    inOrder.verify(display).setState(TargetContentsDisplay.EditingState.SAVED);
  }
  @Test
  public void canUpdateRowIfInCurrentDisplaysAndIsCurrentRow() {
    selectedTU = currentPageRows.get(2);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);
    when(display.getId()).thenReturn(selectedTU.getId());
    TransUnit updatedTransUnit = TestFixture.makeTransUnit(selectedTU.getId().getId());

    presenter.updateRow(updatedTransUnit);

    verify(display).setValueAndCreateNewEditors(updatedTransUnit);
    verify(display).refresh();
    verify(display).getEditors();
    verify(editorTranslators).updateTranslator(display.getEditors(), selectedTU.getId());
  }
  @Test
  public void canMoveToNextEntry() {
    // Given: current editor index is 1
    TargetContentsPresenter spyPresenter = spy(presenter);
    spyPresenter.setStatesForTesting(selectedTU.getId(), 1, display);
    doNothing().when(spyPresenter).savePendingChangesIfApplicable();

    // When:
    spyPresenter.moveToNextEntry();

    // Then:
    verify(spyPresenter).savePendingChangesIfApplicable();
    verify(eventBus).fireEvent(NavTransUnitEvent.NEXT_ENTRY_EVENT);
  }
  @Test
  public void canCopySource() {
    // Given: selected one trans unit
    selectedTU = currentPageRows.get(0);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor));
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);
    when(sourceContentPresenter.getSelectedSource()).thenReturn("source");

    presenter.copySource(editor, selectedTU.getId());

    verify(editor).setTextAndValidate("source");
    verify(editor).setFocus();
    verify(eventBus).fireEvent(isA(NotificationEvent.class));
  }
  @Test
  public void willIgnoreSavePendingIfNoChange() {
    // Given: display new targets is equal to cached targets
    selectedTU = currentPageRows.get(0);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);
    when(display.getCachedTargets()).thenReturn(CACHED_TARGETS);
    when(display.getNewTargets()).thenReturn(CACHED_TARGETS);

    // When:
    presenter.savePendingChangesIfApplicable();

    // Then:
    verifyZeroInteractions(eventBus);
    verify(display, never()).revertEditorContents();
  }
  @Test
  public void canCopySourceForActiveRow() {
    // Given: current editor is focused
    TargetContentsPresenter spyPresenter = spy(presenter);
    selectedTU = currentPageRows.get(0);
    spyPresenter.setStatesForTesting(selectedTU.getId(), 0, display);
    doNothing().when(spyPresenter).copySource(editor, selectedTU.getId());
    when(editor.isFocused()).thenReturn(true);
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor));

    // When:
    spyPresenter.copySourceForActiveRow();

    // Then:
    verify(spyPresenter).copySource(editor, selectedTU.getId());
  }
  @Test
  public void testOnTransMemoryCopy() {
    when(tableEditorMessages.notifyCopied()).thenReturn("copied");
    selectedTU = currentPageRows.get(0);
    when(display.getId()).thenReturn(selectedTU.getId());
    when(display.getEditors()).thenReturn(Lists.newArrayList(editor));
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    presenter.onDataCopy(new CopyDataToEditorEvent(Arrays.asList("target")));

    verify(editor).setTextAndValidate("target");
    verify(eventBus, atLeastOnce()).fireEvent(eventCaptor.capture());
    NotificationEvent notificationEvent =
        TestFixture.extractFromEvents(eventCaptor.getAllValues(), NotificationEvent.class);
    MatcherAssert.assertThat(notificationEvent.getMessage(), Matchers.equalTo("copied"));
  }
  @Test
  public void onTransUnitEditEvent() {
    selectedTU = currentPageRows.get(0);
    TransUnitEditEvent event = mock(TransUnitEditEvent.class);
    when(event.getSelectedTransUnitId()).thenReturn(selectedTU.getId());
    ArrayList<ToggleEditor> currentEditors = Lists.newArrayList(editor);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);
    when(display.getEditors()).thenReturn(currentEditors);

    presenter.onTransUnitEdit(event);

    InOrder inOrder = inOrder(editorTranslators);
    inOrder.verify(editorTranslators).clearTranslatorList(currentEditors);
    inOrder.verify(editorTranslators).updateTranslator(currentEditors, selectedTU.getId());
    verifyNoMoreInteractions(editorTranslators);
  }
  @BeforeMethod
  public void beforeMethod() {
    MockitoAnnotations.initMocks(this);
    configHolder = new UserConfigHolder();

    when(userOptionsService.getConfigHolder()).thenReturn(configHolder);

    userWorkspaceContext = TestFixture.userWorkspaceContext();
    presenter =
        new TargetContentsPresenter(
            displayProvider,
            editorTranslators,
            eventBus,
            tableEditorMessages,
            sourceContentPresenter,
            userWorkspaceContext,
            editorKeyShortcuts,
            historyPresenter,
            userOptionsService,
            saveAsApprovedConfirmation,
            reviewCommentPresenter);

    verify(eventBus).addHandler(UserConfigChangeEvent.TYPE, presenter);
    verify(eventBus).addHandler(RequestValidationEvent.getType(), presenter);
    verify(eventBus).addHandler(InsertStringInEditorEvent.getType(), presenter);
    verify(eventBus).addHandler(CopyDataToEditorEvent.getType(), presenter);
    verify(eventBus).addHandler(TransUnitEditEvent.getType(), presenter);
    verify(eventBus).addHandler(TransUnitEditEvent.getType(), presenter);
    verify(eventBus).addHandler(WorkspaceContextUpdateEvent.getType(), presenter);
    verify(saveAsApprovedConfirmation).setListener(presenter);

    when(displayProvider.get()).thenReturn(display);
    presenter.showData(currentPageRows);
  }
  @Test
  public void canAddUndoLink() {
    UndoLink undoLink = mock(UndoLink.class);

    presenter.addUndoLink(0, undoLink);

    verify(display).addUndo(undoLink);
  }
  @Test
  public void testIsReadOnly() {
    userWorkspaceContext.setProjectActive(false);

    boolean readOnly = presenter.isReadOnly();

    assertThat(readOnly, Matchers.is(true));
  }
  @Test
  public void testIsDisplayButtons() {
    userWorkspaceContext.setHasEditTranslationAccess(false);
    userWorkspaceContext.setHasReviewAccess(false);

    boolean displayButtons = presenter.isDisplayButtons();

    assertThat(displayButtons, Matchers.is(false));
  }
  @Test
  public void onCancelCanResetTextBack() {
    // Given:
    selectedTU = currentPageRows.get(0);
    when(display.getCachedTargets()).thenReturn(CACHED_TARGETS);
    when(display.getId()).thenReturn(selectedTU.getId());
    ArrayList<ToggleEditor> currentEditors = Lists.newArrayList(editor);
    when(display.getEditors()).thenReturn(currentEditors);
    presenter.setStatesForTesting(selectedTU.getId(), 0, display);

    // When:
    presenter.onCancel(selectedTU.getId());

    // Then:
    verify(display).revertEditorContents();
    verify(display).highlightSearch(anyString());
    verify(display).focusEditor(0);
  }