/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.red.viewers;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.junit.Rule;
import org.junit.Test;
import org.robotframework.red.junit.ShellProvider;
public class ViewersCombiningSelectionProviderTest {
@Rule
public ShellProvider shellProvider = new ShellProvider();
@Test(expected = NullPointerException.class)
public void npeIsThrown_whenTryingToCreateProviderFromNullArray() {
final TableViewer[] viewers = null;
new ViewersCombiningSelectionProvider(viewers);
}
@Test
public void selectionListenerIsInformed_whenSelectionInAnyViewerChanges() {
final TableViewer viewer1 = createViewer(shellProvider.getShell(), "viewer1_a", "viewer1_b");
final TableViewer viewer2 = createViewer(shellProvider.getShell(), "viewer2_x", "viewer2_y");
final ViewersCombiningSelectionProvider provider = new ViewersCombiningSelectionProvider(viewer1, viewer2);
final List<String> allSelected = new ArrayList<>();
final ISelectionChangedListener listener = new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
final List<String> selected = Selections.getElements((IStructuredSelection) event.getSelection(), String.class);
allSelected.addAll(selected);
}
};
provider.addSelectionChangedListener(listener);
viewer1.setSelection(newSelection("viewer1_a"));
viewer2.setSelection(newSelection("viewer2_y"));
provider.removeSelectionChangedListener(listener);
viewer1.setSelection(newSelection("viewer1_b"));
viewer2.setSelection(newSelection("viewer2_x"));
assertThat(allSelected).containsExactly("viewer1_a", "viewer2_y");
}
@Test
public void whenSelectionIsSet_itIsChangedInActiveViewer() {
final TableViewer viewer1 = createViewer(shellProvider.getShell(), "viewer1_a", "viewer1_b");
final TableViewer viewer2 = createViewer(shellProvider.getShell(), "viewer2_x", "viewer2_y");
final ViewersCombiningSelectionProvider provider = new ViewersCombiningSelectionProvider(viewer1, viewer2);
provider.setSelection(newSelection("viewer1_a"));
provider.setSelection(newSelection("viewer2_x"));
assertThat(viewer1.getSelection()).isEqualTo(StructuredSelection.EMPTY);
assertThat(viewer2.getSelection()).isEqualTo(StructuredSelection.EMPTY);
viewer1.getTable().notifyListeners(SWT.FocusIn, new Event());
provider.setSelection(newSelection("viewer1_a"));
assertThat(viewer1.getSelection()).isEqualTo(newSelection("viewer1_a"));
assertThat(viewer2.getSelection()).isEqualTo(StructuredSelection.EMPTY);
}
@Test
public void whenThereIsNoActiveViewer_selectionIsEmpty() {
final TableViewer viewer1 = createViewer(shellProvider.getShell(), "viewer1_a", "viewer1_b");
final TableViewer viewer2 = createViewer(shellProvider.getShell(), "viewer2_x", "viewer2_y");
final ViewersCombiningSelectionProvider provider = new ViewersCombiningSelectionProvider(viewer1, viewer2);
viewer1.setSelection(newSelection());
viewer2.setSelection(newSelection("viewer2_y"));
assertThat(viewer1.getTable().isFocusControl()).isFalse();
assertThat(viewer2.getTable().isFocusControl()).isFalse();
assertThat(provider.getSelection()).isEqualTo(StructuredSelection.EMPTY);
}
@Test
public void selectionFromFocusedViewerIsReturned_1() {
final TableViewer viewer1 = createViewer(shellProvider.getShell(), "viewer1_a", "viewer1_b");
final TableViewer viewer2 = createViewer(shellProvider.getShell(), "viewer2_x", "viewer2_y");
final ViewersCombiningSelectionProvider provider = new ViewersCombiningSelectionProvider(viewer1, viewer2);
viewer1.setSelection(newSelection("viewer1_a"));
viewer2.setSelection(newSelection("viewer2_y"));
viewer1.getTable().notifyListeners(SWT.FocusIn, new Event());
assertThat(provider.getSelection()).isEqualTo(newSelection("viewer1_a"));
}
@Test
public void selectionFromFocusedViewerIsReturned_2() {
final TableViewer viewer1 = createViewer(shellProvider.getShell(), "viewer1_a", "viewer1_b");
final TableViewer viewer2 = createViewer(shellProvider.getShell(), "viewer2_x", "viewer2_y");
final ViewersCombiningSelectionProvider provider = new ViewersCombiningSelectionProvider(viewer1, viewer2);
viewer1.setSelection(newSelection("viewer1_a"));
viewer2.setSelection(newSelection("viewer2_y"));
viewer2.getTable().notifyListeners(SWT.FocusIn, new Event());
assertThat(provider.getSelection()).isEqualTo(newSelection("viewer2_y"));
}
private static StructuredSelection newSelection(final String... elements) {
return new StructuredSelection(elements);
}
private TableViewer createViewer(final Composite parent, final String... inputElements) {
final TableViewer viewer = new TableViewer(parent);
viewer.setContentProvider(new StructuredContentProvider() {
@Override
public Object[] getElements(final Object inputElement) {
return (Object[]) inputElement;
}
});
viewer.setInput(inputElements);
return viewer;
}
}