/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2015 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ package org.pentaho.di.ui.spoon; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Test; import org.mockito.AdditionalMatchers; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.pentaho.di.core.gui.GUIPositionInterface; import org.pentaho.di.job.JobMeta; import org.pentaho.di.job.entry.JobEntryCopy; import org.pentaho.di.trans.step.StepMeta; import org.pentaho.di.ui.spoon.job.JobGraph; import org.pentaho.di.ui.spoon.trans.TransGraph; public class GraphTest { @Test public void testRightClickStepSelection() { TransGraph graph = mock( TransGraph.class ); StepMeta meta1 = mock( StepMeta.class ); StepMeta meta2 = mock( StepMeta.class ); StepMeta meta3 = mock( StepMeta.class ); wireSelected( meta1, meta2, meta3 ); List<StepMeta> selected = new ArrayList<>( 2 ); meta2.setSelected( true ); meta3.setSelected( true ); selected.add( meta2 ); selected.add( meta3 ); doCallRealMethod().when( graph ).doRightClickSelection( meta1, selected ); graph.doRightClickSelection( meta1, selected ); assertTrue( meta1.isSelected() ); assertEquals( meta1, selected.get( 0 ) ); assertEquals( 1, selected.size() ); assertFalse( meta2.isSelected() || meta3.isSelected() ); } @Test public void testRightClickAlreadySelected() { TransGraph graph = mock( TransGraph.class ); StepMeta meta1 = mock( StepMeta.class ); StepMeta meta2 = mock( StepMeta.class ); wireSelected( meta1, meta2 ); List<StepMeta> selected = new ArrayList<>( 2 ); meta1.setSelected( true ); meta2.setSelected( true ); selected.add( meta1 ); selected.add( meta2 ); doCallRealMethod().when( graph ).doRightClickSelection( meta1, selected ); graph.doRightClickSelection( meta1, selected ); assertEquals( 2, selected.size() ); assertTrue( selected.contains( meta1 ) ); assertTrue( selected.contains( meta2 ) ); assertTrue( meta1.isSelected() && meta2.isSelected() ); } @Test public void testRightClickNoSelection() { TransGraph graph = mock( TransGraph.class ); StepMeta meta1 = mock( StepMeta.class ); wireSelected( meta1 ); List<StepMeta> selected = new ArrayList<>(); doCallRealMethod().when( graph ).doRightClickSelection( meta1, selected ); graph.doRightClickSelection( meta1, selected ); assertEquals( 1, selected.size() ); assertTrue( selected.contains( meta1 ) ); assertTrue( meta1.isSelected() ); } @Test public void testDelJobNoSelections() { JobMeta jobMeta = mock( JobMeta.class ); Spoon spoon = mock( Spoon.class ); when( jobMeta.getSelectedEntries() ).thenReturn( Collections.<JobEntryCopy>emptyList() ); JobEntryCopy je = mock( JobEntryCopy.class ); JobGraph jobGraph = mock( JobGraph.class ); doCallRealMethod().when( jobGraph ).setJobMeta( any( JobMeta.class ) ); doCallRealMethod().when( jobGraph ).setSpoon( any( Spoon.class ) ); doCallRealMethod().when( jobGraph ).delSelected( any( JobEntryCopy.class ) ); jobGraph.setJobMeta( jobMeta ); jobGraph.setSpoon( spoon ); jobGraph.delSelected( je ); verify( spoon ).deleteJobEntryCopies( jobMeta, je ); } @Test public void testDelSelectionsJob() { JobMeta jobMeta = mock( JobMeta.class ); Spoon spoon = mock( Spoon.class ); JobEntryCopy selected1 = mock( JobEntryCopy.class ); JobEntryCopy selected2 = mock( JobEntryCopy.class ); when( jobMeta.getSelectedEntries() ).thenReturn( Arrays.asList( selected1, selected2 ) ); JobGraph jobGraph = mock( JobGraph.class ); doCallRealMethod().when( jobGraph ).setJobMeta( any( JobMeta.class ) ); doCallRealMethod().when( jobGraph ).setSpoon( any( Spoon.class ) ); doCallRealMethod().when( jobGraph ).delSelected( any( JobEntryCopy.class ) ); jobGraph.setJobMeta( jobMeta ); jobGraph.setSpoon( spoon ); jobGraph.delSelected( null ); verify( spoon ).deleteJobEntryCopies( eq( jobMeta ), AdditionalMatchers.aryEq( new JobEntryCopy[] { selected1, selected2 } ) ); } private boolean[] wireSelected( GUIPositionInterface... mockedElements ) { final boolean[] selections = new boolean[mockedElements.length]; Arrays.fill( selections, false ); for ( int i = 0; i < mockedElements.length; i++ ) { final int j = i; when( mockedElements[i].isSelected() ).then( new Answer<Boolean>() { public Boolean answer( InvocationOnMock invocation ) throws Throwable { return selections[j]; } } ); doAnswer( new Answer<Void>() { public Void answer( InvocationOnMock invocation ) throws Throwable { selections[j] = (boolean) invocation.getArguments()[0]; return null; } } ).when( mockedElements[i] ).setSelected( any( Boolean.class ) ); } return selections; } }