/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.editor.synchronization;
import com.google.web.bindery.event.shared.Event;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.HandlerRegistration;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.editor.EditorPartPresenter;
import org.eclipse.che.ide.api.editor.EditorWithAutoSave;
import org.eclipse.che.ide.api.editor.document.Document;
import org.eclipse.che.ide.api.editor.document.DocumentEventBus;
import org.eclipse.che.ide.api.editor.document.DocumentHandle;
import org.eclipse.che.ide.api.editor.document.DocumentStorage;
import org.eclipse.che.ide.api.editor.events.DocumentChangeEvent;
import org.eclipse.che.ide.api.editor.texteditor.TextEditor;
import org.eclipse.che.ide.api.notification.NotificationManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.withSettings;
/** @author Roman Nikitenko */
@RunWith(MockitoJUnitRunner.class)
public class EditorGroupSynchronizationImplTest {
@Mock
private EventBus eventBus;
@Mock
private EditorAgent editorAgent;
@Mock
private Document document;
@Mock
private DocumentHandle documentHandle;
@Mock
private DocumentEventBus documentEventBus;
@Mock
private DocumentStorage documentStorage;
@Mock
private NotificationManager notificationManager;
@Mock
private HandlerRegistration handlerRegistration;
@Mock
private DocumentChangeEvent documentChangeEvent;
private EditorPartPresenter activeEditor;
private EditorPartPresenter openedEditor1;
private EditorPartPresenter openedEditor2;
private EditorGroupSynchronizationImpl editorGroupSynchronization;
@Before
public void init() {
activeEditor = mock(EditorPartPresenter.class, withSettings().extraInterfaces(TextEditor.class, EditorWithAutoSave.class));
openedEditor1 = mock(EditorPartPresenter.class, withSettings().extraInterfaces(TextEditor.class, EditorWithAutoSave.class));
openedEditor2 = mock(EditorPartPresenter.class, withSettings().extraInterfaces(TextEditor.class, EditorWithAutoSave.class));
when(((EditorWithAutoSave)openedEditor1).isAutoSaveEnabled()).thenReturn(true);
when(((EditorWithAutoSave)openedEditor2).isAutoSaveEnabled()).thenReturn(true);
when(editorAgent.getActiveEditor()).thenReturn(activeEditor);
when(document.getDocumentHandle()).thenReturn(documentHandle);
when(documentHandle.getDocEventBus()).thenReturn(documentEventBus);
when(documentHandle.getDocument()).thenReturn(document);
when(((TextEditor)activeEditor).getDocument()).thenReturn(document);
when(((TextEditor)openedEditor1).getDocument()).thenReturn(document);
when(((TextEditor)openedEditor2).getDocument()).thenReturn(document);
when(documentEventBus.addHandler((Event.Type<Object>)anyObject(), anyObject())).thenReturn(handlerRegistration);
editorGroupSynchronization = new EditorGroupSynchronizationImpl(eventBus, documentStorage, notificationManager);
editorGroupSynchronization.addEditor(activeEditor);
editorGroupSynchronization.addEditor(openedEditor1);
editorGroupSynchronization.addEditor(openedEditor2);
editorGroupSynchronization.onActiveEditorChanged(activeEditor);
}
@Test
public void shouldAddEditor() {
reset(documentEventBus);
editorGroupSynchronization.addEditor(activeEditor);
verify(documentEventBus).addHandler(Matchers.<DocumentChangeEvent.Type>anyObject(), eq(editorGroupSynchronization));
}
@Test
public void shouldRemoveEditorFromGroup() {
when(activeEditor.isDirty()).thenReturn(true);
editorGroupSynchronization.addEditor(activeEditor);
editorGroupSynchronization.removeEditor(activeEditor);
//should save content before closing (autosave will not have time to do it)
verify(activeEditor).doSave();
verify(handlerRegistration).removeHandler();
}
@Test
public void shouldRemoveAllEditorsFromGroup() {
editorGroupSynchronization.unInstall();
verify(handlerRegistration, times(3)).removeHandler();
}
@Test
public void shouldNotApplyChangesFromNotActiveEditor() {
DocumentHandle documentHandle1 = mock(DocumentHandle.class);
when(documentChangeEvent.getDocument()).thenReturn(documentHandle1);
when(documentHandle1.isSameAs(documentHandle)).thenReturn(false);
editorGroupSynchronization.onDocumentChange(documentChangeEvent);
verify(document, never()).replace(anyInt(), anyInt(), anyString());
}
@Test
public void shouldApplyChangesFromActiveEditor() {
int offset = 10;
int removeCharCount = 100;
String text = "someText";
when(documentChangeEvent.getOffset()).thenReturn(offset);
when(documentChangeEvent.getRemoveCharCount()).thenReturn(removeCharCount);
when(documentChangeEvent.getText()).thenReturn(text);
DocumentHandle documentHandle1 = mock(DocumentHandle.class);
when(documentChangeEvent.getDocument()).thenReturn(documentHandle1);
when(documentHandle1.isSameAs(documentHandle)).thenReturn(true);
editorGroupSynchronization.onDocumentChange(documentChangeEvent);
verify(document, times(2)).replace(eq(offset), eq(removeCharCount), eq(text));
}
@Test
public void shouldResolveAutoSave() {
// AutoSave for active editor should always be enabled,
// but AutoSave for other editors with the same path should be disabled
verify(((EditorWithAutoSave)activeEditor)).enableAutoSave();
verify(((EditorWithAutoSave)openedEditor1)).disableAutoSave();
verify(((EditorWithAutoSave)openedEditor2)).disableAutoSave();
}
}