/* * Copyright 2017 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.dashbuilder.renderer.client.selector; import java.util.Date; import org.dashbuilder.dataset.DataSet; import org.dashbuilder.dataset.client.engine.ClientDateFormatter; import org.dashbuilder.dataset.filter.CoreFunctionFilter; import org.dashbuilder.dataset.filter.CoreFunctionType; import org.dashbuilder.dataset.filter.DataSetFilter; import org.dashbuilder.dataset.filter.FilterFactory; import org.dashbuilder.displayer.DisplayerSettings; import org.dashbuilder.displayer.DisplayerSettingsFactory; import org.dashbuilder.displayer.client.AbstractDisplayerTest; import org.dashbuilder.displayer.client.DisplayerListener; import org.dashbuilder.displayer.client.widgets.filter.DateParameterEditor; import org.dashbuilder.displayer.client.widgets.filter.NumberParameterEditor; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import static org.dashbuilder.dataset.ExpenseReportsData.*; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class SelectorSliderDisplayerTest extends AbstractDisplayerTest { @Mock ClientDateFormatter clientDateFormatter; @Mock DateParameterEditor minDateInputEditor; @Mock DateParameterEditor maxDateInputEditor; @Mock NumberParameterEditor minNumberInputEditor; @Mock NumberParameterEditor maxNumberInputEditor; DisplayerSettings dateSelectorSettings = DisplayerSettingsFactory.newSelectorSettings() .dataset(EXPENSES) .column(COLUMN_DATE) .width(200) .filterOn(false, true, false) .buildSettings(); DisplayerSettings numberSelectorSettings = DisplayerSettingsFactory.newSelectorSettings() .dataset(EXPENSES) .column(COLUMN_AMOUNT) .width(200) .filterOn(false, true, false) .buildSettings(); public SelectorSliderDisplayer createSelectorDisplayer(DisplayerSettings settings) { return initDisplayer(new SelectorSliderDisplayer(mock(SelectorSliderDisplayer.View.class), minDateInputEditor, maxDateInputEditor, minNumberInputEditor, maxNumberInputEditor), settings); } @Test public void testDateSelector() { SelectorSliderDisplayer presenter = createSelectorDisplayer(dateSelectorSettings); SelectorSliderDisplayer.View view = presenter.getView(); DisplayerListener listener = mock(DisplayerListener.class); presenter.addListener(listener); presenter.draw(); verify(view).showSlider(anyDouble(), anyDouble(), anyDouble(), anyDouble(), anyDouble()); verify(view).margins(anyInt(), anyInt(), anyInt(), anyInt()); verify(view).setWidth(anyInt()); // Ensure no filter is executed if the range does not change presenter.onSliderChange(1, 6); reset(listener); presenter.onSliderChange(1, 6); verify(listener, never()).onFilterUpdate(eq(presenter), any(DataSetFilter.class), any(DataSetFilter.class)); } @Test public void testNumberSelector() { SelectorSliderDisplayer presenter = createSelectorDisplayer(numberSelectorSettings); SelectorSliderDisplayer.View view = presenter.getView(); DisplayerListener listener = mock(DisplayerListener.class); presenter.addListener(listener); presenter.draw(); verify(view).showSlider(1, 1101, 1, 1, 1101); verify(view).margins(anyInt(), anyInt(), anyInt(), anyInt()); verify(view).setWidth(anyInt()); // Ensure no filter is executed if the range does not change presenter.onSliderChange(1, 6); reset(listener); presenter.onSliderChange(1, 6); verify(listener, never()).onFilterUpdate(eq(presenter), any(DataSetFilter.class), any(DataSetFilter.class)); } @Test public void testNoData() { DisplayerSettings dateSelectorSettings = DisplayerSettingsFactory.newSelectorSettings() .dataset(EXPENSES) .filter(COLUMN_DATE, FilterFactory.isNull()) .column(COLUMN_DATE) .buildSettings(); SelectorSliderDisplayer presenter = createSelectorDisplayer(dateSelectorSettings); SelectorSliderDisplayer.View view = presenter.getView(); presenter.draw(); verify(view).noData(); verify(view, never()).showSlider(anyInt(), anyInt(), anyInt(), anyInt(), anyInt()); } @Test public void testSelectDisabled() { dateSelectorSettings.setFilterEnabled(false); SelectorSliderDisplayer presenter = createSelectorDisplayer(dateSelectorSettings); DisplayerListener listener = mock(DisplayerListener.class); SelectorSliderDisplayer.View view = presenter.getView(); presenter.draw(); reset(view); presenter.addListener(listener); presenter.onSliderChange(0, 1); // Check filter notifications verify(listener, never()).onFilterEnabled(eq(presenter), any(DataSetFilter.class)); verify(listener, never()).onRedraw(presenter); // Ensure data does not change verify(view, never()).showSlider(anyInt(), anyInt(), anyInt(), anyInt(), anyInt()); } @Test public void testDateRangeSelection() { SelectorSliderDisplayer presenter = createSelectorDisplayer(dateSelectorSettings); SelectorSliderDisplayer.View view = presenter.getView(); DisplayerListener listener = mock(DisplayerListener.class); presenter.draw(); // Select a range reset(view); presenter.addListener(listener); presenter.onSliderChange(1328050800000d, 1333231200000d); // Ensure data does not change verify(view, never()).showSlider(anyInt(), anyInt(), anyInt(), anyInt(), anyInt()); // Verify the item selected is correct ArgumentCaptor<DataSetFilter> argument = ArgumentCaptor.forClass(DataSetFilter.class); verify(listener).onFilterUpdate(eq(presenter), any(), argument.capture()); verify(listener, never()).onRedraw(presenter); DataSetFilter dataSetFilter = argument.getValue(); CoreFunctionFilter columnFilter = (CoreFunctionFilter) dataSetFilter.getColumnFilterList().get(0); assertEquals(columnFilter.getColumnId(), COLUMN_DATE); assertEquals(columnFilter.getType(), CoreFunctionType.BETWEEN); assertEquals(columnFilter.getParameters().size(), 2); assertEquals(columnFilter.getParameters().get(0), new Date(1328050800000L)); assertEquals(columnFilter.getParameters().get(1), new Date(1333231200000L)); // Select another range reset(listener); presenter.onSliderChange(1328050800000d, 1335823200000d); verify(listener).onFilterUpdate(eq(presenter), any(), argument.capture()); dataSetFilter = argument.getValue(); columnFilter = (CoreFunctionFilter) dataSetFilter.getColumnFilterList().get(0); assertEquals(columnFilter.getParameters().get(0), new Date(1328050800000L)); assertEquals(columnFilter.getParameters().get(1), new Date(1335823200000L)); } @Test public void testNumberRangeSelection() { SelectorSliderDisplayer presenter = createSelectorDisplayer(numberSelectorSettings); SelectorSliderDisplayer.View view = presenter.getView(); DisplayerListener listener = mock(DisplayerListener.class); presenter.draw(); // Select a range reset(view); presenter.addListener(listener); presenter.onSliderChange(1, 101); // Ensure data does not change verify(view, never()).showSlider(anyInt(), anyInt(), anyInt(), anyInt(), anyInt()); // Verify the item selected is correct ArgumentCaptor<DataSetFilter> argument = ArgumentCaptor.forClass(DataSetFilter.class); verify(listener).onFilterUpdate(eq(presenter), any(), argument.capture()); verify(listener, never()).onRedraw(presenter); DataSetFilter dataSetFilter = argument.getValue(); CoreFunctionFilter columnFilter = (CoreFunctionFilter) dataSetFilter.getColumnFilterList().get(0); assertEquals(columnFilter.getColumnId(), COLUMN_AMOUNT); assertEquals(columnFilter.getType(), CoreFunctionType.BETWEEN); assertEquals(columnFilter.getParameters().size(), 2); assertEquals(columnFilter.getParameters().get(0), 1d); assertEquals(columnFilter.getParameters().get(1), 101d); // Select another range reset(listener); presenter.onSliderChange(51, 101); verify(listener).onFilterUpdate(eq(presenter), any(), argument.capture()); dataSetFilter = argument.getValue(); columnFilter = (CoreFunctionFilter) dataSetFilter.getColumnFilterList().get(0); assertEquals(columnFilter.getParameters().get(0), 51d); assertEquals(columnFilter.getParameters().get(1), 101d); } @Test public void testIgnoreNullDates() { expensesDataSet.setValueAt(0, 4, null); expensesDataSet.setValueAt(49, 4, null); SelectorSliderDisplayer presenter = createSelectorDisplayer(dateSelectorSettings); presenter.draw(); DataSet dataSet = presenter.getDataSetHandler().getLastDataSet(); Object min = dataSet.getValueAt(0, 0); Object max = dataSet.getValueAt(0, 1); assertEquals(min, expensesDataSet.getValueAt(48, 4)); assertEquals(max, expensesDataSet.getValueAt(1, 4)); } @Test public void testIgnoreNullNumbers() { expensesDataSet.setValueAt(0, 5, null); SelectorSliderDisplayer presenter = createSelectorDisplayer(numberSelectorSettings); presenter.draw(); DataSet dataSet = presenter.getDataSetHandler().getLastDataSet(); Object min = dataSet.getValueAt(0, 0); Object max = dataSet.getValueAt(0, 1); assertEquals(min, 1.1d); assertEquals(max, 1100.1d); } @Test public void testDateAllNullNoData() { for (int i = 0; i < 50; i++) { expensesDataSet.setValueAt(i, 4, null); } SelectorSliderDisplayer presenter = createSelectorDisplayer(dateSelectorSettings); presenter.draw(); verify(presenter.getView()).noData(); } @Test public void testNumberAllNullNoData() { for (int i = 0; i < 50; i++) { expensesDataSet.setValueAt(i, 5, null); } SelectorSliderDisplayer presenter = createSelectorDisplayer(numberSelectorSettings); presenter.draw(); verify(presenter.getView()).noData(); } }