/*******************************************************************************
* Copyright (c) 2017 Dirk Fauth.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.extension.glazedlists.filterrow;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
import org.eclipse.nebula.widgets.nattable.data.IColumnAccessor;
import org.eclipse.nebula.widgets.nattable.data.ListDataProvider;
import org.eclipse.nebula.widgets.nattable.data.ReflectiveColumnPropertyAccessor;
import org.eclipse.nebula.widgets.nattable.dataset.person.Person;
import org.eclipse.nebula.widgets.nattable.dataset.person.PersonService;
import org.eclipse.nebula.widgets.nattable.edit.EditConstants;
import org.eclipse.nebula.widgets.nattable.extension.glazedlists.fixture.DataLayerFixture;
import org.eclipse.nebula.widgets.nattable.filterrow.FilterRowDataProvider;
import org.eclipse.nebula.widgets.nattable.filterrow.combobox.ComboBoxFilterRowConfiguration;
import org.eclipse.nebula.widgets.nattable.filterrow.combobox.FilterRowComboBoxDataProvider;
import org.eclipse.nebula.widgets.nattable.filterrow.config.DefaultFilterRowConfiguration;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.FilterList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.matchers.Matcher;
public class ComboBoxGlazedListsFilterStrategyTest {
private static FilterList<Person> filterList;
private static ConfigRegistry configRegistry;
private static DataLayerFixture columnHeaderLayer;
private static FilterRowComboBoxDataProvider<Person> comboBoxDataProvider;
private static ComboBoxGlazedListsFilterStrategy<Person> filterStrategy;
private static FilterRowDataProvider<Person> dataProvider;
private static String[] personPropertyNames = {
"firstName",
"lastName",
"gender",
"married",
"birthday" };
private static Matcher<Person> homerFilter = new Matcher<Person>() {
@Override
public boolean matches(Person item) {
return !"Homer".equals(item.getFirstName());
}
};
@BeforeClass
public static void init() {
// initialize the collection with a big amount of values
EventList<Person> baseCollection = GlazedLists.eventList(PersonService.getFixedPersons());
for (int i = 1; i < 1000; i++) {
baseCollection.addAll(PersonService.getFixedPersons());
}
filterList = new FilterList<>(GlazedLists.eventList(baseCollection));
configRegistry = new ConfigRegistry();
new DefaultNatTableStyleConfiguration().configureRegistry(configRegistry);
new DefaultFilterRowConfiguration().configureRegistry(configRegistry);
new ComboBoxFilterRowConfiguration().configureRegistry(configRegistry);
columnHeaderLayer = new DataLayerFixture(5, 2, 100, 50);
IColumnAccessor<Person> bodyDataColumnAccessor = new ReflectiveColumnPropertyAccessor<>(personPropertyNames);
comboBoxDataProvider = new GlazedListsFilterRowComboBoxDataProvider<>(
new DataLayer(new ListDataProvider<>(filterList, bodyDataColumnAccessor)),
baseCollection,
bodyDataColumnAccessor);
filterStrategy = new ComboBoxGlazedListsFilterStrategy<>(
comboBoxDataProvider,
filterList,
bodyDataColumnAccessor,
configRegistry);
dataProvider = new FilterRowDataProvider<>(
filterStrategy,
columnHeaderLayer,
columnHeaderLayer.getDataProvider(), configRegistry);
}
@Before
public void setup() {
for (int i = 0; i < dataProvider.getColumnCount(); i++) {
dataProvider.getFilterIndexToObjectMap().put(i, EditConstants.SELECT_ALL_ITEMS_VALUE);
}
filterStrategy.applyFilter(dataProvider.getFilterIndexToObjectMap());
}
@Test
public void shouldFilterForSimpsons() {
assertEquals(18000, filterList.size());
dataProvider.setDataValue(1, 1, Arrays.asList("Simpson"));
assertEquals(10000, filterList.size());
}
@Test
public void shouldFilterForMultipleCriteria() {
assertEquals(18000, filterList.size());
dataProvider.setDataValue(0, 1, Arrays.asList("Homer", "Marge", "Maude"));
assertEquals(7000, filterList.size());
dataProvider.setDataValue(1, 1, Arrays.asList("Flanders"));
assertEquals(2000, filterList.size());
}
@Test
public void shouldResetFilterinSameOrder() {
dataProvider.setDataValue(0, 1, Arrays.asList("Homer", "Marge", "Maude"));
dataProvider.setDataValue(1, 1, Arrays.asList("Flanders"));
assertEquals(2000, filterList.size());
// this will imply to select all values
dataProvider.setDataValue(1, 1, comboBoxDataProvider.getValues(1, 0));
assertEquals(7000, filterList.size());
// setting null should be the same as selecting all
dataProvider.setDataValue(0, 1, null);
assertEquals(18000, filterList.size());
}
@Test
public void shouldResetFilterinDifferentOrder() {
dataProvider.setDataValue(0, 1, Arrays.asList("Homer", "Marge", "Maude"));
dataProvider.setDataValue(1, 1, Arrays.asList("Flanders"));
assertEquals(2000, filterList.size());
dataProvider.setDataValue(0, 1, comboBoxDataProvider.getValues(0, 0));
assertEquals(8000, filterList.size());
dataProvider.setDataValue(1, 1, comboBoxDataProvider.getValues(1, 0));
assertEquals(18000, filterList.size());
}
// with static filter
@Test
public void shouldFilterForSimpsonsWithStaticHomerFilter() {
filterStrategy.addStaticFilter(homerFilter);
assertEquals(15000, filterList.size());
dataProvider.setDataValue(1, 1, Arrays.asList("Simpson"));
assertEquals(7000, filterList.size());
filterStrategy.removeStaticFilter(homerFilter);
assertEquals(10000, filterList.size());
}
@Test
public void shouldFilterForMultipleCriteriaWithStaticHomerFilter() {
filterStrategy.addStaticFilter(homerFilter);
assertEquals(15000, filterList.size());
dataProvider.setDataValue(0, 1, Arrays.asList("Homer", "Marge", "Maude"));
assertEquals(4000, filterList.size());
dataProvider.setDataValue(1, 1, Arrays.asList("Simpson"));
assertEquals(2000, filterList.size());
filterStrategy.removeStaticFilter(homerFilter);
assertEquals(5000, filterList.size());
}
@Test
public void shouldResetFilterinSameOrderWithStaticHomerFilter() {
filterStrategy.addStaticFilter(homerFilter);
dataProvider.setDataValue(0, 1, Arrays.asList("Homer", "Marge", "Maude"));
dataProvider.setDataValue(1, 1, Arrays.asList("Simpson"));
assertEquals(2000, filterList.size());
dataProvider.setDataValue(1, 1, comboBoxDataProvider.getValues(1, 0));
assertEquals(4000, filterList.size());
dataProvider.setDataValue(0, 1, comboBoxDataProvider.getValues(0, 0));
assertEquals(15000, filterList.size());
filterStrategy.removeStaticFilter(homerFilter);
assertEquals(18000, filterList.size());
}
@Test
public void shouldResetFilterinDifferentOrderWithStaticHomerFilter() {
filterStrategy.addStaticFilter(homerFilter);
dataProvider.setDataValue(0, 1, Arrays.asList("Homer", "Marge", "Maude"));
dataProvider.setDataValue(1, 1, Arrays.asList("Simpson"));
assertEquals(2000, filterList.size());
dataProvider.setDataValue(0, 1, comboBoxDataProvider.getValues(0, 0));
assertEquals(7000, filterList.size());
dataProvider.setDataValue(1, 1, comboBoxDataProvider.getValues(1, 0));
assertEquals(15000, filterList.size());
filterStrategy.removeStaticFilter(homerFilter);
assertEquals(18000, filterList.size());
}
}