/******************************************************************************* * Copyright (c) 2015, 2017 Pivotal, Inc. * 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: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.boot.dash.test; import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.hasItemInArray; import static org.hamcrest.Matchers.hasToString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.eclipse.core.resources.IProject; import org.junit.Test; import org.springframework.ide.eclipse.boot.dash.metadata.InMemoryPropertyStore; import org.springframework.ide.eclipse.boot.dash.model.BootDashElement; import org.springframework.ide.eclipse.boot.dash.model.BootProjectDashElement; import org.springframework.ide.eclipse.boot.dash.model.LaunchConfDashElement; import org.springframework.ide.eclipse.boot.dash.model.ToggleFiltersModel; import org.springframework.ide.eclipse.boot.dash.model.ToggleFiltersModel.FilterChoice; import org.springsource.ide.eclipse.commons.livexp.util.Filter; import com.google.common.collect.ImmutableSet; @SuppressWarnings("unchecked") public class ToggleFiltersModelTest { private static final String HIDE_NON_WORKSPACE_ELEMENTS = "Hide non-workspace elements"; private static final String HIDE_SOLITARY_CONF = "Hide solitary launch configs"; private static final String HIDE_LOCAL_SERVICES = "Hide local cloud services"; private InMemoryPropertyStore propertyStore = new InMemoryPropertyStore(); @Test public void testAvailableFilters() throws Exception { ToggleFiltersModel model = new ToggleFiltersModel(propertyStore); assertThat(model.getAvailableFilters(), arrayContaining( hasToString("FilterChoice("+HIDE_NON_WORKSPACE_ELEMENTS+")"), hasToString("FilterChoice("+HIDE_SOLITARY_CONF+")"), hasToString("FilterChoice("+HIDE_LOCAL_SERVICES+")") ) ); } @Test public void testHideNonWorkspaceElementsToleratesNull() throws Exception { //Case: element == null // Basically this shouldn't happen, but if it does, the filter does // something sensible. Filter<BootDashElement> f = getFilter(HIDE_NON_WORKSPACE_ELEMENTS); assertEquals(false, f.accept(null)); } @Test public void testHideNonWorkspaceElementsNullProject() throws Exception { //Case: project == null means not associated with ws project Filter<BootDashElement> f = getFilter(HIDE_NON_WORKSPACE_ELEMENTS); BootDashElement e = mock(BootDashElement.class); when(e.getProject()).thenReturn(null); // unnessary, but just for clarity assertEquals(false, f.accept(e)); } @Test public void testHideNonWorkspaceElementsProjectNoExist() throws Exception { //Case 2" project that doesn't exist. // => may have been associated with a project, but project no longer in workspace Filter<BootDashElement> f = getFilter(HIDE_NON_WORKSPACE_ELEMENTS); BootDashElement e = mock(BootDashElement.class); IProject p = mock(IProject.class); when(e.getProject()).thenReturn(p); when(p.exists()).thenReturn(false); assertEquals(false, f.accept(e)); } @Test public void testHideNonWorkspaceElementsProjectExist() throws Exception { //Case 2" project that doesn't exist. // => may have been associated with a project, but project no longer in workspace Filter<BootDashElement> f = getFilter(HIDE_NON_WORKSPACE_ELEMENTS); BootDashElement e = mock(BootDashElement.class); IProject p = mock(IProject.class); when(e.getProject()).thenReturn(p); when(p.exists()).thenReturn(true); assertEquals(true, f.accept(e)); } @Test public void testHideSolitaryConfEnabledByDefault() throws Exception { ToggleFiltersModel model = new ToggleFiltersModel(propertyStore); assertThat(model.getAvailableFilters(), hasItemInArray( hasToString("FilterChoice("+HIDE_SOLITARY_CONF+")") ) ); } @Test public void testHideSolitaryConf() throws Exception { Filter<BootDashElement> filter = getFilter(HIDE_SOLITARY_CONF); BootProjectDashElement project = mock(BootProjectDashElement.class); LaunchConfDashElement conf1 = mock(LaunchConfDashElement.class); when(conf1.getParent()).thenReturn(project); when(project.getCurrentChildren()).thenReturn(ImmutableSet.<BootDashElement>of(conf1)); assertTrue(filter.accept(project)); assertFalse(filter.accept(conf1)); } @Test public void testShowNonSolitaryConf() throws Exception { Filter<BootDashElement> filter = getFilter(HIDE_SOLITARY_CONF); BootProjectDashElement project = mock(BootProjectDashElement.class); LaunchConfDashElement conf1 = mock(LaunchConfDashElement.class); LaunchConfDashElement conf2 = mock(LaunchConfDashElement.class); when(conf1.getParent()).thenReturn(project); when(conf2.getParent()).thenReturn(project); when(project.getCurrentChildren()).thenReturn(ImmutableSet.<BootDashElement>of(conf1, conf2)); assertTrue(filter.accept(project)); assertTrue(filter.accept(conf1)); assertTrue(filter.accept(conf2)); } @Test public void testToggleFiltersPersistAndRestore() throws Exception { ToggleFiltersModel model = new ToggleFiltersModel(propertyStore); FilterChoice nonWorkspace = getFilter(model, HIDE_NON_WORKSPACE_ELEMENTS); FilterChoice solitaryConf = getFilter(model, HIDE_SOLITARY_CONF); //initially the defaults should be set. assertEquals(ImmutableSet.of(solitaryConf), model.getSelectedFilters().getValues()); model.getSelectedFilters().remove(solitaryConf); model.getSelectedFilters().add(nonWorkspace); //Simulate model reload (i.e. just instantiate it with the same property store). model = new ToggleFiltersModel(propertyStore); assertEquals(ImmutableSet.of(nonWorkspace), model.getSelectedFilters().getValues()); } private Filter<BootDashElement> getFilter(String withLabel) { ToggleFiltersModel model = new ToggleFiltersModel(propertyStore); FilterChoice selectFilter = getFilter(model, withLabel); model.getSelectedFilters().replaceAll(ImmutableSet.of(selectFilter)); Filter<BootDashElement> effectiveFilter = model.getFilter().getValue(); return effectiveFilter; } private FilterChoice getFilter(ToggleFiltersModel model, String withLabel) { for (FilterChoice choice : model.getAvailableFilters()) { if (choice.getLabel().equals(withLabel)) { return choice; } } fail("No available filter has this label '"+withLabel+"'"); return null; } }