/***************************************************************************** * Copyright (c) 2015 CEA LIST. * * 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.formula; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.math.BigDecimal; import org.eclipse.nebula.widgets.nattable.copy.InternalCellClipboard; import org.eclipse.nebula.widgets.nattable.data.IDataProvider; import org.eclipse.nebula.widgets.nattable.formula.command.DisableFormulaCachingCommand; import org.eclipse.nebula.widgets.nattable.formula.command.DisableFormulaEvaluationCommand; import org.eclipse.nebula.widgets.nattable.formula.command.EnableFormulaCachingCommand; import org.eclipse.nebula.widgets.nattable.formula.command.EnableFormulaEvaluationCommand; import org.eclipse.nebula.widgets.nattable.formula.config.DefaultFormulaConfiguration; import org.eclipse.nebula.widgets.nattable.layer.DataLayer; 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.DummyGridLayerStack; import org.eclipse.nebula.widgets.nattable.test.fixture.NatTableFixture; import org.eclipse.nebula.widgets.nattable.test.fixture.layer.LayerListenerFixture; import org.junit.Before; import org.junit.Test; public class FormulaIntegrationTest { IDataProvider dataProvider = new TwoDimensionalArrayDataProvider(new Object[10][10]); FormulaDataProvider formulaDataProvider = new FormulaDataProvider(this.dataProvider); DummyGridLayerStack gridLayerStack = new DummyGridLayerStack(this.formulaDataProvider); NatTableFixture natTable = new NatTableFixture(this.gridLayerStack, false); LayerListenerFixture listenerFixture = new LayerListenerFixture(); @Before public void setup() { this.natTable.addConfiguration(new DefaultFormulaConfiguration( this.formulaDataProvider, this.gridLayerStack.getBodyLayer().getSelectionLayer(), new InternalCellClipboard())); this.natTable.configure(); this.natTable.addLayerListener(this.listenerFixture); // enable caching this.formulaDataProvider.configureCaching(this.gridLayerStack.getBodyDataLayer()); this.dataProvider.setDataValue(0, 0, "5"); this.dataProvider.setDataValue(1, 0, "3"); this.dataProvider.setDataValue(2, 0, "=A1*B1"); this.dataProvider.setDataValue(0, 2, "5"); this.dataProvider.setDataValue(0, 3, "5"); this.dataProvider.setDataValue(0, 4, "=SUM(A3:A4)"); this.dataProvider.setDataValue(1, 2, "3"); this.dataProvider.setDataValue(1, 3, "3"); this.dataProvider.setDataValue(1, 4, "=SUM(B3:B4)"); this.dataProvider.setDataValue(2, 4, "=SUM(A5;B5)"); } @Test public void testResultCaching() throws InterruptedException { assertNull(this.natTable.getDataValueByPosition(3, 1)); // wait until calculation is processed Thread.sleep(50); assertEquals(new BigDecimal("15"), this.natTable.getDataValueByPosition(3, 1)); ILayerEvent receivedEvent = this.listenerFixture.getReceivedEvent(CellVisualChangeEvent.class); assertNotNull(receivedEvent); } @Test public void testResultCachingDisabled() throws InterruptedException { this.natTable.doCommand(new DisableFormulaCachingCommand()); assertNotNull(this.natTable.getDataValueByPosition(3, 1)); assertEquals(new BigDecimal("15"), this.natTable.getDataValueByPosition(3, 1)); ILayerEvent receivedEvent = this.listenerFixture.getReceivedEvent(CellVisualChangeEvent.class); assertNull(receivedEvent); this.natTable.doCommand(new EnableFormulaCachingCommand()); assertNull(this.natTable.getDataValueByPosition(3, 1)); // wait until calculation is processed Thread.sleep(50); assertEquals(new BigDecimal("15"), this.natTable.getDataValueByPosition(3, 1)); receivedEvent = this.listenerFixture.getReceivedEvent(CellVisualChangeEvent.class); assertNotNull(receivedEvent); } @Test public void testCacheUpdate() throws InterruptedException { assertNull(this.natTable.getDataValueByPosition(3, 5)); // wait until calculation is processed Thread.sleep(50); assertEquals(new BigDecimal("16"), this.natTable.getDataValueByPosition(3, 5)); ILayerEvent receivedEvent = this.listenerFixture.getReceivedEvent(CellVisualChangeEvent.class); assertNotNull(receivedEvent); // update a value in the first sum ((DataLayer) this.gridLayerStack.getBodyDataLayer()).setDataValue(0, 2, 20); // right after the update we still get the old value from the cache assertEquals(new BigDecimal("16"), this.natTable.getDataValueByPosition(3, 5)); // wait until calculation is processed Thread.sleep(50); assertEquals(new BigDecimal("31"), this.natTable.getDataValueByPosition(3, 5)); assertEquals(2, this.listenerFixture.getEventsCount()); } @Test public void testDisableFormulaResolution() throws InterruptedException { this.natTable.doCommand(new DisableFormulaEvaluationCommand()); assertNotNull(this.natTable.getDataValueByPosition(3, 1)); assertEquals("=A1*B1", this.natTable.getDataValueByPosition(3, 1)); this.natTable.doCommand(new EnableFormulaEvaluationCommand()); assertNull(this.natTable.getDataValueByPosition(3, 1)); // wait until calculation is processed Thread.sleep(50); assertEquals(new BigDecimal("15"), this.natTable.getDataValueByPosition(3, 1)); } }