/* * 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.verifyZeroInteractions; import java.util.ArrayList; 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.viewers.StyledString; import org.eclipse.jface.viewers.Stylers; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.TextStyle; 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.mockdocument.Document; import org.robotframework.red.graphics.ImagesManager; public class RedCompletionProposalTest { @Test(expected = NullPointerException.class) public void nullCannotBePassedAsReplacementString() { new RedCompletionProposal(null, 0, 0, 0, 0, 0, null, false, null, true, new ArrayList<Runnable>(), null, false); } @Test(expected = IllegalStateException.class) public void negativeNumberCannotBePassedAsReplacementOffset() { new RedCompletionProposal("", -10, 0, 0, 0, 0, null, false, null, true, new ArrayList<Runnable>(), null, false); } @Test(expected = IllegalStateException.class) public void negativeNumberCannotBePassedAsReplacementLength() { new RedCompletionProposal("", 0, -10, 0, 0, 0, null, false, null, true, new ArrayList<Runnable>(), null, false); } @Test(expected = IllegalStateException.class) public void negativeNumberCannotBePassedAsCursorPosition() { new RedCompletionProposal("", 0, 0, 0, -50, 0, null, false, null, true, new ArrayList<Runnable>(), null, false); } @Test public void shouldActivateProposalsAfterAccepting_isProperlyReturned() { final RedCompletionProposal proposal1 = new RedCompletionProposal("", 0, 0, 0, 0, 0, null, false, null, true, new ArrayList<Runnable>(), null, false); final RedCompletionProposal proposal2 = new RedCompletionProposal("", 0, 0, 0, 0, 0, null, false, null, false, new ArrayList<Runnable>(), null, false); assertThat(proposal1.shouldActivateAssitantAfterAccepting()).isTrue(); assertThat(proposal2.shouldActivateAssitantAfterAccepting()).isFalse(); } @Test public void operationsToPerformAreProperlyReturned() { final Runnable op1 = new Runnable() { @Override public void run() { } }; final Runnable op2 = new Runnable() { @Override public void run() { } }; final RedCompletionProposal proposal1 = new RedCompletionProposal("", 0, 0, 0, 0, 0, null, false, null, false, new ArrayList<Runnable>(), null, false); final RedCompletionProposal proposal2 = new RedCompletionProposal("", 0, 0, 0, 0, 0, null, false, null, false, newArrayList(op1), null, false); final RedCompletionProposal proposal3 = new RedCompletionProposal("", 0, 0, 0, 0, 0, null, false, null, false, newArrayList(op1, op2), null, false); assertThat(proposal1.operationsToPerformAfterAccepting()).isEmpty(); assertThat(proposal2.operationsToPerformAfterAccepting()).containsExactly(op1); assertThat(proposal3.operationsToPerformAfterAccepting()).containsExactly(op1, op2); } @Test public void prefixCompletionTextIsProperlyReturned() { final RedCompletionProposal proposal = new RedCompletionProposal("replacement", 0, 0, 0, 0, 0, null, false, null, false, new ArrayList<Runnable>(), null, false); final IDocument document = mock(IDocument.class); assertThat(proposal.getPrefixCompletionText(document, 0)).isEqualTo("replacement"); verifyZeroInteractions(document); } @Test public void prefixCompletionOffsetIsProperlyReturned() { final RedCompletionProposal proposal = new RedCompletionProposal("", 42, 0, 0, 0, 0, null, false, null, false, new ArrayList<Runnable>(), null, false); final IDocument document = mock(IDocument.class); assertThat(proposal.getPrefixCompletionStart(document, 0)).isEqualTo(42); verifyZeroInteractions(document); } @Test public void additionalProposalInfoIsProperlyReturned() { final RedCompletionProposal proposal = new RedCompletionProposal("", 0, 0, 0, 0, 0, null, false, null, false, new ArrayList<Runnable>(), "additional", false); assertThat(proposal.getAdditionalProposalInfo()).isEqualTo("additional"); } @Test public void displayStringIsReturned_whenLabelIsProvided() { final RedCompletionProposal proposal = new RedCompletionProposal("", 0, 0, 0, 0, 0, null, false, "label", false, new ArrayList<Runnable>(), null, false); assertThat(proposal.getDisplayString()).isEqualTo("label"); } @Test public void replacementStringIsUsedAsDisplayString_whenLabelIsNull() { final RedCompletionProposal proposal = new RedCompletionProposal("replacement", 0, 0, 0, 0, 0, null, false, null, false, new ArrayList<Runnable>(), null, false); assertThat(proposal.getDisplayString()).isEqualTo("replacement"); } @Test public void styledLabelIsConstructedWithDisplayStringOnly_whenMatchingPrefixHasZeroLengthButPrefixShouldNotBeDecorated() { final RedCompletionProposal proposal = new RedCompletionProposal("", 0, 0, 0, 0, 0, null, false, "label", false, new ArrayList<Runnable>(), null, false); final StyledString label = proposal.getStyledDisplayString(); assertThat(label.getString()).isEqualTo("label"); assertThat(label.getStyleRanges()).isEmpty(); } @Test public void styledLabelIsConstructedWithDisplayStringOnly_whenMatchingPrefixHasPositiveLengthButPrefixShouldNotBeDecorated() { final RedCompletionProposal proposal = new RedCompletionProposal("", 0, 0, 3, 0, 0, null, false, "label", false, new ArrayList<Runnable>(), null, false); final StyledString label = proposal.getStyledDisplayString(); assertThat(label.getString()).isEqualTo("label"); assertThat(label.getStyleRanges()).isEmpty(); } @Test public void styledLabelHavePrefixHihglighted_whenMatchingPrefixHasPositiveLengthAndItShouldBeDecorated() { final RedCompletionProposal proposal = new RedCompletionProposal("", 0, 0, 3, 0, 0, null, true, "label", false, new ArrayList<Runnable>(), null, false); final StyledString label = proposal.getStyledDisplayString(); assertThat(label.getString()).isEqualTo("label"); final TextStyle matchStyle = new TextStyle(); Stylers.Common.MARKED_PREFIX_STYLER.applyStyles(matchStyle); final StyleRange[] ranges = label.getStyleRanges(); assertThat(ranges).hasSize(1); assertThat(ranges[0].background.getRGB()).isEqualTo(matchStyle.background.getRGB()); assertThat(ranges[0].foreground.getRGB()).isEqualTo(matchStyle.foreground.getRGB()); assertThat(ranges[0].borderColor.getRGB()).isEqualTo(matchStyle.borderColor.getRGB()); assertThat(ranges[0].borderStyle).isEqualTo(matchStyle.borderStyle); assertThat(ranges[0].strikeout).isFalse(); assertThat(ranges[0].start).isEqualTo(0); assertThat(ranges[0].length).isEqualTo(3); } @Test public void imageIsProperlyReturned() { final Image someImage = ImagesManager.getImage(RedImages.getSourceImage()); final RedCompletionProposal proposal = new RedCompletionProposal("", 0, 0, 0, 0, 0, someImage, false, null, false, new ArrayList<Runnable>(), null, false); assertThat(proposal.getImage()).isSameAs(someImage); } @Test public void selectionIsCalculatedFromCursorPositionAndReplacementOffset() { final RedCompletionProposal proposal = new RedCompletionProposal("replacement", 34, 0, 0, 56, 20, null, false, null, false, new ArrayList<Runnable>(), null, false); assertThat(proposal.getSelection(mock(IDocument.class))).isEqualTo(new Point(90, 20)); } @Test public void contextInformationIsNull() { final RedCompletionProposal proposal = new RedCompletionProposal("replacement", 34, 0, 0, 56, 20, null, false, null, false, new ArrayList<Runnable>(), null, false); assertThat(proposal.getContextInformation()).isNull(); } @Test public void completionProposalsAreComparedUsingLabel() { final RedCompletionProposal proposal1 = new RedCompletionProposal("", 34, 0, 0, 56, 20, null, false, "abc", false, new ArrayList<Runnable>(), null, false); final RedCompletionProposal proposal2 = new RedCompletionProposal("", 34, 0, 0, 56, 20, null, false, "xyz", false, new ArrayList<Runnable>(), null, false); final RedCompletionProposal proposal3 = new RedCompletionProposal("", 34, 0, 0, 56, 20, null, false, "def", false, new ArrayList<Runnable>(), null, false); assertThat(proposal1.compareTo(proposal2)).isNegative(); assertThat(proposal1.compareTo(proposal3)).isNegative(); assertThat(proposal2.compareTo(proposal3)).isPositive(); assertThat(proposal2.compareTo(proposal1)).isPositive(); assertThat(proposal3.compareTo(proposal1)).isPositive(); assertThat(proposal3.compareTo(proposal2)).isNegative(); } @Test public void informationContentCreatorIsAlwaysNew() { final RedCompletionProposal proposal = new RedCompletionProposal("", 34, 0, 0, 56, 20, null, false, null, false, new ArrayList<Runnable>(), null, false); final IInformationControlCreator creator1 = proposal.getInformationControlCreator(); final IInformationControlCreator creator2 = proposal.getInformationControlCreator(); assertThat(creator1).isNotSameAs(creator2); } @Test public void informationControlCreatorAlwaysProvidesDefaultControl() { final RedCompletionProposal proposal = new RedCompletionProposal("", 34, 0, 0, 56, 20, null, false, null, false, new ArrayList<Runnable>(), null, false); final IInformationControlCreator creator = proposal.getInformationControlCreator(); final Shell shell = new Shell(Display.getCurrent()); final IInformationControl infoControl = creator.createInformationControl(shell); assertThat(infoControl).isExactlyInstanceOf(DefaultInformationControl.class); shell.close(); shell.dispose(); } @Test public void informationControlCreatorIsNull_whenAdditionalInfoUsesHtml() { final RedCompletionProposal proposal = new RedCompletionProposal("", 34, 0, 0, 56, 20, null, false, null, false, new ArrayList<Runnable>(), null, true); assertThat(proposal.getInformationControlCreator()).isNull(); } @Test public void contentInDocumentIsProperlyReplacedByProposal() { final IDocument document = new Document("document content is here"); final RedCompletionProposal proposal = new RedCompletionProposal("stuff with suffix", 9, 7, 0, 0, 0, null, false, null, false, new ArrayList<Runnable>(), null, false); proposal.apply(document); assertThat(document).isEqualTo(new Document("document stuff with suffix is here")); } }