/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.tableeditor.source.assist; import static com.google.common.collect.Lists.newArrayList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.junit.Test; import org.robotframework.ide.eclipse.main.plugin.RedImages; import org.robotframework.ide.eclipse.main.plugin.assist.AssistProposal; import org.robotframework.ide.eclipse.main.plugin.mockdocument.Document; import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.assist.RedCompletionProposalAdapter.DocumentationModification; import org.robotframework.red.graphics.ImagesManager; public class RedCompletionProposalAdapterTest { @Test public void contentIsTakenFromAdaptedProposalWithSuffixFromModificationOperation() { final AssistProposal proposal = mock(AssistProposal.class); when(proposal.getContent()).thenReturn("content"); final DocumentationModification modification1 = new DocumentationModification("", new Position(0)); final DocumentationModification modification2 = new DocumentationModification(" enhanced", new Position(0)); final RedCompletionProposalAdapter adapter1 = new RedCompletionProposalAdapter(proposal, modification1); assertThat(adapter1.getPrefixCompletionText(mock(IDocument.class), 0)).isEqualTo("content"); final RedCompletionProposalAdapter adapter2 = new RedCompletionProposalAdapter(proposal, modification2); assertThat(adapter2.getPrefixCompletionText(mock(IDocument.class), 0)).isEqualTo("content enhanced"); } @Test public void prefixCompletionStartIsTakenFromModificationToReplacePosition() { final DocumentationModification modification1 = new DocumentationModification("", new Position(10)); final DocumentationModification modification2 = new DocumentationModification("", new Position(20), true); final DocumentationModification modification3 = new DocumentationModification("", new Position(30), new ArrayList<Runnable>()); final DocumentationModification modification4 = new DocumentationModification("", new Position(40), new Position(100, 200), new ArrayList<Runnable>()); final DocumentationModification modification5 = new DocumentationModification("", new Position(50), new Position(100, 200), true, new ArrayList<Runnable>()); final RedCompletionProposalAdapter adapter1 = new RedCompletionProposalAdapter(null, modification1); assertThat(adapter1.getPrefixCompletionStart(mock(IDocument.class), 0)).isEqualTo(10); final RedCompletionProposalAdapter adapter2 = new RedCompletionProposalAdapter(null, modification2); assertThat(adapter2.getPrefixCompletionStart(mock(IDocument.class), 0)).isEqualTo(20); final RedCompletionProposalAdapter adapter3 = new RedCompletionProposalAdapter(null, modification3); assertThat(adapter3.getPrefixCompletionStart(mock(IDocument.class), 0)).isEqualTo(30); final RedCompletionProposalAdapter adapter4 = new RedCompletionProposalAdapter(null, modification4); assertThat(adapter4.getPrefixCompletionStart(mock(IDocument.class), 0)).isEqualTo(40); final RedCompletionProposalAdapter adapter5 = new RedCompletionProposalAdapter(null, modification5); assertThat(adapter5.getPrefixCompletionStart(mock(IDocument.class), 0)).isEqualTo(50); } @Test public void imageIsTakenFromAdaptedProposal() { final ImageDescriptor imageDescriptor = RedImages.getRobotImage(); final AssistProposal proposal = mock(AssistProposal.class); when(proposal.getImage()).thenReturn(imageDescriptor); final DocumentationModification modification = new DocumentationModification("", new Position(0)); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(proposal, modification); assertThat(adapter.getImage()).isSameAs(ImagesManager.getImage(imageDescriptor)); } @Test public void styledLabelIsTakenFromAdaptedProposal() { final StyledString label = new StyledString("foo"); final AssistProposal proposal = mock(AssistProposal.class); when(proposal.getStyledLabel()).thenReturn(label); final DocumentationModification modification = new DocumentationModification("", new Position(0)); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(proposal, modification); assertThat(adapter.getStyledDisplayString()).isSameAs(label); } @Test public void labelIsTakenFromAdaptedProposal() { final StyledString label = new StyledString("label"); final AssistProposal proposal = mock(AssistProposal.class); when(proposal.getStyledLabel()).thenReturn(label); final DocumentationModification modification = new DocumentationModification("", new Position(0)); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(proposal, modification); assertThat(adapter.getDisplayString()).isEqualTo("label"); } @Test public void operationsToPerformAfterAcceptAreTakendFromModification() { final Runnable r1 = new Runnable() { @Override public void run() { // empty runnable } }; final Runnable r2 = new Runnable() { @Override public void run() { // empty runnable } }; final DocumentationModification modification = new DocumentationModification("", new Position(0), newArrayList(r1, r2)); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(null, modification); assertThat(adapter.operationsToPerformAfterAccepting()).containsExactly(r1, r2); } @Test public void assistantShouldBeActivateAfterAccept_whenItIsSpecifiedInModification() { final DocumentationModification modification1 = new DocumentationModification("", new Position(0), true); final RedCompletionProposalAdapter adapter1 = new RedCompletionProposalAdapter(null, modification1); assertThat(adapter1.shouldActivateAssitantAfterAccepting()).isTrue(); final DocumentationModification modification2 = new DocumentationModification("", new Position(0), false); final RedCompletionProposalAdapter adapter2 = new RedCompletionProposalAdapter(null, modification2); assertThat(adapter2.shouldActivateAssitantAfterAccepting()).isFalse(); } @Test public void contextInfoIsNullByDefault() { final AssistProposal proposal = mock(AssistProposal.class); final DocumentationModification modification = new DocumentationModification("", new Position(0)); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(proposal, modification); assertThat(adapter.getContextInformation()).isNull(); } @Test public void contextInfoIsProvided_whenPassedToConstructor() { final AssistProposal proposal = mock(AssistProposal.class); final IContextInformation contextInfo = mock(IContextInformation.class); final DocumentationModification modification = new DocumentationModification("", new Position(0)); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(proposal, modification, contextInfo); assertThat(adapter.getContextInformation()).isSameAs(contextInfo); } @Test public void completionProposalsAreComparedUsingLabel() { final StyledString label1 = new StyledString("abc"); final AssistProposal proposal1 = mock(AssistProposal.class); when(proposal1.getStyledLabel()).thenReturn(label1); final StyledString label2 = new StyledString("xyz"); final AssistProposal proposal2 = mock(AssistProposal.class); when(proposal2.getStyledLabel()).thenReturn(label2); final StyledString label3 = new StyledString("def"); final AssistProposal proposal3 = mock(AssistProposal.class); when(proposal3.getStyledLabel()).thenReturn(label3); final RedCompletionProposalAdapter adapter1 = new RedCompletionProposalAdapter(proposal1, null); final RedCompletionProposalAdapter adapter2 = new RedCompletionProposalAdapter(proposal2, null); final RedCompletionProposalAdapter adapter3 = new RedCompletionProposalAdapter(proposal3, null); assertThat(adapter1.compareTo(adapter2)).isNegative(); assertThat(adapter1.compareTo(adapter3)).isNegative(); assertThat(adapter2.compareTo(adapter3)).isPositive(); assertThat(adapter2.compareTo(adapter1)).isPositive(); assertThat(adapter3.compareTo(adapter1)).isPositive(); assertThat(adapter3.compareTo(adapter2)).isNegative(); } @Test public void descriptionIsTakenFromAdaptedProposal_ifThereIsADescription() { final AssistProposal proposal = mock(AssistProposal.class); when(proposal.hasDescription()).thenReturn(true); when(proposal.getDescription()).thenReturn("desc"); final DocumentationModification modification = new DocumentationModification("", new Position(0)); assertThat(new RedCompletionProposalAdapter(proposal, modification).getAdditionalProposalInfo()) .isEqualTo("desc"); } @Test public void descriptionIsNull_IfThereIsNoDescription() { final AssistProposal proposal = mock(AssistProposal.class); when(proposal.hasDescription()).thenReturn(false); when(proposal.getDescription()).thenReturn("desc"); final DocumentationModification modification = new DocumentationModification("", new Position(0)); assertThat(new RedCompletionProposalAdapter(proposal, modification).getAdditionalProposalInfo()).isNull(); } @Test public void contentInDocumentIsProperlyReplacedByProposal() { final IDocument document = new Document("document content is here"); final AssistProposal proposal = mock(AssistProposal.class); when(proposal.getContent()).thenReturn("stuff"); final DocumentationModification modification = new DocumentationModification(" with suffix", new Position(9, 7)); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(proposal, modification); adapter.apply(document); assertThat(document).isEqualTo(new Document("document stuff with suffix is here")); } @Test public void selectionIsTakenFromModification_whenProvided() { final DocumentationModification modification = new DocumentationModification("", new Position(0), new Position(42, 84), new ArrayList<Runnable>()); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(null, modification); assertThat(adapter.getSelection(mock(IDocument.class))).isEqualTo(new Point(42, 84)); } @Test public void selectionIsCalculatedFromContentWhichWillBeInserted_whenModificationDoesNotProvideSelection() { final AssistProposal proposal = mock(AssistProposal.class); when(proposal.getContent()).thenReturn("stuff"); final DocumentationModification modification = new DocumentationModification("suffix", new Position(15)); final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(proposal, modification); assertThat(adapter.getSelection(mock(IDocument.class))).isEqualTo(new Point(26, 0)); } @Test public void informationContentCreatorIsAlwaysNew() { final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(null, null); final IInformationControlCreator creator1 = adapter.getInformationControlCreator(); final IInformationControlCreator creator2 = adapter.getInformationControlCreator(); assertThat(creator1).isNotSameAs(creator2); } @Test public void informationControlCreatorAlwaysProvidesDefaultControl() { final RedCompletionProposalAdapter adapter = new RedCompletionProposalAdapter(null, null); final IInformationControlCreator creator = adapter.getInformationControlCreator(); final Shell shell = new Shell(Display.getCurrent()); final IInformationControl infoControl = creator.createInformationControl(shell); assertThat(infoControl).isExactlyInstanceOf(DefaultInformationControl.class); shell.close(); shell.dispose(); } }