/* * 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.keywords.handler; 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 static org.robotframework.ide.eclipse.main.plugin.model.ModelConditions.name; import static org.robotframework.ide.eclipse.main.plugin.model.ModelConditions.noFilePositions; import static org.robotframework.ide.eclipse.main.plugin.model.ModelConditions.nullParent; import java.util.List; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate; import org.junit.Before; import org.junit.Test; import org.robotframework.ide.eclipse.main.plugin.mockeclipse.RedClipboardMock; import org.robotframework.ide.eclipse.main.plugin.mockmodel.RobotSuiteFileCreator; import org.robotframework.ide.eclipse.main.plugin.model.RobotKeywordCall; import org.robotframework.ide.eclipse.main.plugin.model.RobotKeywordDefinition; import org.robotframework.ide.eclipse.main.plugin.model.RobotKeywordsSection; import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile; import org.robotframework.ide.eclipse.main.plugin.tableeditor.AddingToken; import org.robotframework.ide.eclipse.main.plugin.tableeditor.AddingToken.TokenState; import org.robotframework.ide.eclipse.main.plugin.tableeditor.RobotFormEditor; import org.robotframework.ide.eclipse.main.plugin.tableeditor.SelectionLayerAccessor; import org.robotframework.ide.eclipse.main.plugin.tableeditor.dnd.PositionCoordinateTransfer.PositionCoordinateSerializer; import org.robotframework.ide.eclipse.main.plugin.tableeditor.keywords.handler.CopyInKeywordTableHandler.E4CopyInKeywordTableHandler; import com.google.common.collect.Lists; public class CopyInKeywordTableHandlerTest { private final E4CopyInKeywordTableHandler handler = new E4CopyInKeywordTableHandler(); private final RobotFormEditor editor = mock(RobotFormEditor.class); private final SelectionLayerAccessor selectionLayerAccessor = mock(SelectionLayerAccessor.class); private RedClipboardMock clipboard; @Before public void beforeTest() { clipboard = new RedClipboardMock(); when(editor.getSelectionLayerAccessor()).thenReturn(selectionLayerAccessor); } @Test public void nothingIsCopied_whenNothingIsSelected() { when(selectionLayerAccessor.getSelectedPositions()).thenReturn(new PositionCoordinate[] {}); final IStructuredSelection selection = new StructuredSelection(Lists.<Object> newArrayList()); final boolean copied = handler.copyContent(editor, selection, clipboard); assertThat(copied).isFalse(); assertThat(clipboard.isEmpty()).isTrue(); } @Test public void callsWithPositionsAreCopied_whenOnlyCallsAreSelected() { final List<RobotKeywordDefinition> keywords = createKeywords(); final RobotKeywordCall selectedCall1 = keywords.get(0).getChildren().get(0); final RobotKeywordCall selectedCall2 = keywords.get(0).getChildren().get(2); final PositionCoordinate[] selectedPositions = new PositionCoordinate[] { new PositionCoordinate(null, 1, 1), new PositionCoordinate(null, 3, 3)}; final List<?> selectedElements = newArrayList(selectedCall1, selectedCall2); when(selectionLayerAccessor.getSelectedPositions()).thenReturn(selectedPositions); when(selectionLayerAccessor.getElementSelectedAt(1)).thenReturn(selectedCall1); when(selectionLayerAccessor.getElementSelectedAt(3)).thenReturn(selectedCall2); final IStructuredSelection selection = new StructuredSelection(selectedElements); final boolean copied = handler.copyContent(editor, selection, clipboard); assertThat(copied).isTrue(); assertThat(clipboard.hasKeywordDefinitions()).isFalse(); assertThat(clipboard.getKeywordCalls()).hasSize(2); assertThat(clipboard.getKeywordCalls()[0]).has(nullParent()).has(noFilePositions()).has(name("tags")); assertThat(clipboard.getKeywordCalls()[1]).has(nullParent()).has(noFilePositions()).has(name("b")); assertThat(clipboard.getPositionsCoordinates()).containsExactly( new PositionCoordinateSerializer(1, 1), new PositionCoordinateSerializer(3, 3)); } @Test public void keywordsWithPositionsAreCopied_whenOnlyCasesAreSelected() { final List<RobotKeywordDefinition> keywords = createKeywords(); final RobotKeywordDefinition selectedKeyword1 = keywords.get(0); final RobotKeywordDefinition selectedKeyword2 = keywords.get(1); final PositionCoordinate[] selectedPositions = new PositionCoordinate[] { new PositionCoordinate(null, 0, 0), new PositionCoordinate(null, 2, 5) }; final List<?> selectedElements = newArrayList(selectedKeyword1, selectedKeyword2); when(selectionLayerAccessor.getSelectedPositions()).thenReturn(selectedPositions); when(selectionLayerAccessor.getElementSelectedAt(0)).thenReturn(selectedKeyword1); when(selectionLayerAccessor.getElementSelectedAt(5)).thenReturn(selectedKeyword2); final IStructuredSelection selection = new StructuredSelection(selectedElements); final boolean copied = handler.copyContent(editor, selection, clipboard); assertThat(copied).isTrue(); assertThat(clipboard.getKeywordDefinitions()).hasSize(2); assertThat(clipboard.getKeywordDefinitions()[0]).has(nullParent()).has(noFilePositions()).has(name("kw 1")); assertThat(clipboard.getKeywordDefinitions()[1]).has(nullParent()).has(noFilePositions()).has(name("kw 2")); assertThat(clipboard.hasKeywordCalls()).isFalse(); assertThat(clipboard.getPositionsCoordinates()).containsExactly( new PositionCoordinateSerializer(0, 0), new PositionCoordinateSerializer(2, 5)); } @Test public void keywordsAndCallsWithPositionsAreCopied_whenBothAreSelected() { final List<RobotKeywordDefinition> keywords = createKeywords(); final RobotKeywordDefinition selectedKeyword = keywords.get(0); final RobotKeywordCall selectedCall = keywords.get(0).getChildren().get(1); final PositionCoordinate[] selectedPositions = new PositionCoordinate[] { new PositionCoordinate(null, 0, 0), new PositionCoordinate(null, 1, 2) }; final List<?> selectedElements = newArrayList(selectedKeyword, selectedCall); when(selectionLayerAccessor.getSelectedPositions()).thenReturn(selectedPositions); when(selectionLayerAccessor.getElementSelectedAt(0)).thenReturn(selectedKeyword); when(selectionLayerAccessor.getElementSelectedAt(2)).thenReturn(selectedCall); final IStructuredSelection selection = new StructuredSelection(selectedElements); final boolean copied = handler.copyContent(editor, selection, clipboard); assertThat(copied).isTrue(); assertThat(clipboard.getKeywordDefinitions()).hasSize(1); assertThat(clipboard.getKeywordDefinitions()[0]).has(nullParent()).has(noFilePositions()).has(name("kw 1")); assertThat(clipboard.getKeywordCalls()).hasSize(1); assertThat(clipboard.getKeywordCalls()[0]).has(nullParent()).has(noFilePositions()).has(name("a")); assertThat(clipboard.getPositionsCoordinates()).containsExactly( new PositionCoordinateSerializer(0, 0), new PositionCoordinateSerializer(1, 2)); } @Test public void nothingIsCopied_whenOnlyAddingTokensAreSelected() { final PositionCoordinate[] selectedPositions = new PositionCoordinate[] { new PositionCoordinate(null, 0, 0), new PositionCoordinate(null, 1, 1)}; final List<?> selectedElements = newArrayList( new AddingToken(null, mock(TokenState.class)), new AddingToken(null, mock(TokenState.class))); when(selectionLayerAccessor.getSelectedPositions()).thenReturn(selectedPositions); final IStructuredSelection selection = new StructuredSelection(selectedElements); final boolean copied = handler.copyContent(editor, selection, clipboard); assertThat(copied).isFalse(); assertThat(clipboard.isEmpty()).isTrue(); } @Test public void positionsOfAddingTokensAreNotCopied_whenTheyAreSelectedAmongOtherRobotElements() { final List<RobotKeywordDefinition> keywords = createKeywords(); final RobotKeywordDefinition selectedKeyword = keywords.get(0); final RobotKeywordCall selectedCall = keywords.get(0).getChildren().get(0); final AddingToken selectedToken = new AddingToken(null, mock(TokenState.class)); final PositionCoordinate[] selectedPositions = new PositionCoordinate[] { new PositionCoordinate(null, 0, 0), new PositionCoordinate(null, 1, 1), new PositionCoordinate(null, 2, 4) }; final List<?> selectedElements = newArrayList(selectedKeyword, selectedCall, selectedToken); when(selectionLayerAccessor.getSelectedPositions()).thenReturn(selectedPositions); when(selectionLayerAccessor.getElementSelectedAt(0)).thenReturn(selectedKeyword); when(selectionLayerAccessor.getElementSelectedAt(1)).thenReturn(selectedCall); when(selectionLayerAccessor.getElementSelectedAt(4)).thenReturn(selectedToken); final IStructuredSelection selection = new StructuredSelection(selectedElements); final boolean copied = handler.copyContent(editor, selection, clipboard); assertThat(copied).isTrue(); assertThat(clipboard.getKeywordDefinitions()).hasSize(1); assertThat(clipboard.getKeywordDefinitions()[0]).has(nullParent()).has(noFilePositions()).has(name("kw 1")); assertThat(clipboard.getKeywordCalls()).hasSize(1); assertThat(clipboard.getKeywordCalls()[0]).has(nullParent()).has(noFilePositions()).has(name("tags")); assertThat(clipboard.getPositionsCoordinates()).containsExactly( new PositionCoordinateSerializer(0, 0), new PositionCoordinateSerializer(1, 1)); } private static List<RobotKeywordDefinition> createKeywords() { final RobotSuiteFile model = new RobotSuiteFileCreator().appendLine("*** Keywords ***") .appendLine("kw 1") .appendLine(" [tags] tag1") .appendLine(" a 1") .appendLine(" b 2") .appendLine("kw 2") .appendLine(" [tags] tag2") .appendLine(" c 3") .appendLine(" d 4") .build(); return model.findSection(RobotKeywordsSection.class).get().getChildren(); } }