blob: efa27b055fc7a01ffe495eb2b481de9679fe9bad [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Dirk Fauth and others.
* 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.groupby;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
import org.eclipse.nebula.widgets.nattable.data.IColumnAccessor;
import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsEventLayer;
import org.eclipse.nebula.widgets.nattable.extension.glazedlists.fixture.NatTableFixture;
import org.eclipse.nebula.widgets.nattable.extension.glazedlists.groupBy.GroupByDataLayer;
import org.eclipse.nebula.widgets.nattable.extension.glazedlists.groupBy.GroupByModel;
import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
import org.eclipse.nebula.widgets.nattable.layer.CompositeLayer;
import org.eclipse.nebula.widgets.nattable.layer.ILayerListener;
import org.eclipse.nebula.widgets.nattable.layer.event.CellVisualChangeEvent;
import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent;
import org.eclipse.nebula.widgets.nattable.layer.stack.DefaultBodyLayerStack;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.summaryrow.DefaultSummaryRowConfiguration;
import org.eclipse.nebula.widgets.nattable.summaryrow.FixedSummaryRowLayer;
import org.eclipse.nebula.widgets.nattable.summaryrow.SummaryRowConfigAttributes;
import org.eclipse.nebula.widgets.nattable.summaryrow.SummaryRowLayer;
import org.eclipse.nebula.widgets.nattable.summaryrow.SummationSummaryProvider;
import org.junit.Before;
import org.junit.Test;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.TransformedList;
public class GroupByDataLayerSummaryRowConcurrencyTest {
private FixedSummaryRowLayer summaryRowLayer;
private int calcCount = 0;
class Value {
int value;
Value(int value) {
this.value = value;
}
}
@Before
public void setup() {
List<Value> values = new ArrayList<Value>();
values.add(new Value(1));
values.add(new Value(2));
values.add(new Value(3));
values.add(new Value(4));
values.add(new Value(5));
values.add(new Value(6));
values.add(new Value(7));
values.add(new Value(8));
values.add(new Value(9));
values.add(new Value(10));
IColumnAccessor<Value> columnAccessor = new IColumnAccessor<Value>() {
@Override
public Object getDataValue(Value rowObject, int columnIndex) {
if (columnIndex % 2 == 0) {
try {
Thread.sleep(80);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return rowObject.value;
}
@Override
public void setDataValue(Value rowObject, int columnIndex, Object newValue) {}
@Override
public int getColumnCount() {
return 10;
}
};
EventList<Value> eventList = GlazedLists.eventList(values);
TransformedList<Value, Value> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList);
ConfigRegistry configRegistry = new ConfigRegistry();
final GroupByDataLayer<Value> dataLayer = new GroupByDataLayer<Value>(new GroupByModel(), eventList, columnAccessor);
// DataLayer dataLayer = new DataLayer(dataProvider);
GlazedListsEventLayer<Value> glazedListsEventLayer = new GlazedListsEventLayer<Value>(dataLayer, rowObjectsGlazedList);
DefaultBodyLayerStack bodyLayerStack = new DefaultBodyLayerStack(glazedListsEventLayer);
this.summaryRowLayer = new FixedSummaryRowLayer(dataLayer, bodyLayerStack, configRegistry, false);
this.summaryRowLayer.setHorizontalCompositeDependency(false);
CompositeLayer composite = new CompositeLayer(1, 2);
composite.setChildLayer("SUMMARY", this.summaryRowLayer, 0, 0);
composite.setChildLayer(GridRegion.BODY, bodyLayerStack, 0, 1);
NatTable natTable = new NatTableFixture(composite, false);
natTable.addConfiguration(new DefaultSummaryRowConfiguration() {
@Override
protected void addSummaryProviderConfig(IConfigRegistry configRegistry) {
configRegistry.registerConfigAttribute(
SummaryRowConfigAttributes.SUMMARY_PROVIDER,
new SummationSummaryProvider(dataLayer.getDataProvider(), false),
DisplayMode.NORMAL,
SummaryRowLayer.DEFAULT_SUMMARY_ROW_CONFIG_LABEL);
}
});
natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
natTable.setConfigRegistry(configRegistry);
natTable.configure();
}
// summary value == 55
@Test
public void shouldCorrectlyCalculateSummaryValues() {
this.summaryRowLayer.addLayerListener(new ILayerListener() {
@Override
public synchronized void handleLayerEvent(ILayerEvent event) {
if (event instanceof CellVisualChangeEvent) {
GroupByDataLayerSummaryRowConcurrencyTest.this.calcCount++;
}
}
});
assertNull(this.summaryRowLayer.getDataValueByPosition(0, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(1, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(2, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(3, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(4, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(5, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(6, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(7, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(8, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(9, 0));
assertNull(this.summaryRowLayer.getDataValueByPosition(10, 0));
while (this.calcCount < 11) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(0, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(1, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(2, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(3, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(4, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(5, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(6, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(7, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(8, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(9, 0));
assertEquals(55.0, this.summaryRowLayer.getDataValueByPosition(10, 0));
}
}