blob: 45e61f591a65666fc495205e020d2f5447930ce7 [file] [log] [blame]
/*
* Copyright (c) 2010-2020 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
*/
package org.eclipse.scout.rt.dataobject.lookup;
import static org.eclipse.scout.rt.testing.platform.util.ScoutAssert.assertThrows;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.eclipse.scout.rt.dataobject.fixture.FixtureEnum;
import org.eclipse.scout.rt.platform.BEANS;
import org.eclipse.scout.rt.platform.util.Assertions.AssertionException;
import org.eclipse.scout.rt.testing.platform.runner.PlatformTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.eclipse.scout.rt.dataobject.lookup.fixture.FixtureData;
import org.eclipse.scout.rt.dataobject.lookup.fixture.FixtureDataLookupRestrictionDo;
import org.eclipse.scout.rt.dataobject.lookup.fixture.FixtureDataLookupRowDo;
import org.eclipse.scout.rt.dataobject.lookup.fixture.FixtureEnumLookupRestrictionDo;
import org.eclipse.scout.rt.dataobject.lookup.fixture.FixtureEnumLookupRowDo;
@RunWith(PlatformTestRunner.class)
public class LookupHelperTest {
protected final Map<Long, FixtureData> m_testData = new LinkedHashMap<>();
private LookupHelper m_helper;
@Before
public void before() {
m_helper = new LookupHelper();
m_testData.clear();
m_testData.put(1L, new FixtureData(1L, "foo", "additional foo data", true));
m_testData.put(2L, new FixtureData(2L, "bar", "additional bar data", false));
m_testData.put(3L, new FixtureData(3L, "baz", "additional baz data", null));
}
@Test
public void testFilterData() {
LongLookupRestrictionDo restriction = BEANS.get(LongLookupRestrictionDo.class);
// get all, no restrictions
LookupResponse<LongLookupRowDo> lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 2L, 3L, 1L);
// get by id
restriction = BEANS.get(LongLookupRestrictionDo.class).withIds(1L, 3L);
lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 3L, 1L);
// get by text (full)
restriction = BEANS.get(LongLookupRestrictionDo.class).withText("bar");
lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 2L);
// get by text (b*)
restriction = BEANS.get(LongLookupRestrictionDo.class).withText("b*");
lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 2L, 3L);
// get by text (*a*)
restriction = BEANS.get(LongLookupRestrictionDo.class).withText("*a*");
lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 2L, 3L);
// get by text (*o)
restriction = BEANS.get(LongLookupRestrictionDo.class).withText("*o");
lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 1L);
// get by text (*)
restriction = BEANS.get(LongLookupRestrictionDo.class).withText("*");
lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 2L, 3L, 1L);
// get by active true
restriction = BEANS.get(LongLookupRestrictionDo.class).withActive(true);
lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 1L);
// get by active false
restriction = BEANS.get(LongLookupRestrictionDo.class).withActive(false);
lookupResponse = m_helper.filterData(restriction, m_testData.values().stream(), FixtureData::getId, FixtureData::getText, FixtureData::getActive, LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 2L);
}
@Test
public void testFilterData_additionalFilter() {
LookupHelper helper = new LookupHelper();
FixtureDataLookupRestrictionDo restriction = BEANS.get(FixtureDataLookupRestrictionDo.class);
restriction.withStartsWith("f");
// get all, custom filter for text start with "f"
LookupResponse<LongLookupRowDo> lookupResponse = helper.filterData(restriction,
m_testData.values().stream(),
FixtureData::getId,
FixtureData::getText,
FixtureData::getActive,
data -> data.getText().startsWith(restriction.getStartsWith()),
LongLookupRowDo.class);
assertLookupResponse(lookupResponse, 1L);
}
@Test
public void testFilterData_additionalMapperAndComparator() {
LookupHelper helper = new LookupHelper();
FixtureDataLookupRestrictionDo restriction = BEANS.get(FixtureDataLookupRestrictionDo.class);
// get all, no restrictions, custom additional data mapper
LookupResponse<FixtureDataLookupRowDo> lookupResponse = helper.filterData(restriction,
m_testData.values().stream(),
FixtureData::getId,
FixtureData::getText,
FixtureData::getActive,
LookupHelper.truePredicate(),
FixtureDataLookupRowDo.class,
(row, data) -> row.withAdditionalData(data.getAdditionalData()),
Comparator.comparing(AbstractLookupRowDo::getText, Comparator.reverseOrder())); // alphabetically in reverse order
assertLookupResponse(lookupResponse, 1L, 3L, 2L);
assertEquals("additional foo data", lookupResponse.getRows().get(0).getAdditionalData());
assertEquals("additional baz data", lookupResponse.getRows().get(1).getAdditionalData());
assertEquals("additional bar data", lookupResponse.getRows().get(2).getAdditionalData());
}
protected void assertLookupResponse(LookupResponse<LongLookupRowDo> lookupResponse, boolean expectAdditionalData, Long... expectedIds) {
for (int i = 0; i < expectedIds.length; i++) {
Long id = expectedIds[i];
assertEquals(id, lookupResponse.getRows().get(i).getId());
assertEquals(m_testData.get(id).getText(), lookupResponse.getRows().get(i).getText());
}
}
@Test
@SuppressWarnings("ResultOfMethodCallIgnored")
public void testLookupRowDoComparatorByText() {
assertThrows(NullPointerException.class, () -> LookupHelper.lookupRowDoComparatorByText().compare(null, null));
FixtureEnumLookupRowDo r1 = BEANS.get(FixtureEnumLookupRowDo.class);
FixtureEnumLookupRowDo r2 = BEANS.get(FixtureEnumLookupRowDo.class);
assertThrows(NullPointerException.class, () -> LookupHelper.lookupRowDoComparatorByText().compare(r1, r2));
r1.withText("a");
assertThrows(NullPointerException.class, () -> LookupHelper.lookupRowDoComparatorByText().compare(r1, r2));
r2.withText("b");
assertEquals(-1, LookupHelper.lookupRowDoComparatorByText().compare(r1, r2));
assertEquals(0, LookupHelper.lookupRowDoComparatorByText().compare(r1, r1));
assertEquals(1, LookupHelper.lookupRowDoComparatorByText().compare(r2, r1));
}
@Test
public void testEnumTextResolver() {
assertNull(LookupHelper.enumTextResolver().apply(null));
}
@Test
public void testFilterEnum() {
LookupHelper helper = new LookupHelper();
// get all
FixtureEnumLookupRestrictionDo restriction = BEANS.get(FixtureEnumLookupRestrictionDo.class);
assertLookupResponse(helper.filterEnumKeepSorting(restriction, FixtureEnum.class, FixtureEnumLookupRowDo.class),
FixtureEnum.ONE, FixtureEnum.TWO, FixtureEnum.THREE);
// get by id
restriction = BEANS.get(FixtureEnumLookupRestrictionDo.class).withIds(FixtureEnum.THREE);
assertLookupResponse(helper.filterEnumKeepSorting(restriction, FixtureEnum.class, FixtureEnumLookupRowDo.class),
FixtureEnum.THREE);
// get by text
restriction = BEANS.get(FixtureEnumLookupRestrictionDo.class).withText("non-existing fixture enum text");
assertLookupResponse(helper.filterEnumKeepSorting(restriction, FixtureEnum.class, FixtureEnumLookupRowDo.class));
// get by text using wildcard
restriction = BEANS.get(FixtureEnumLookupRestrictionDo.class).withText("*");
assertLookupResponse(helper.filterEnumKeepSorting(restriction, FixtureEnum.class, FixtureEnumLookupRowDo.class),
FixtureEnum.ONE, FixtureEnum.TWO, FixtureEnum.THREE);
}
@Test
public void testTextPatternPredicate() {
Predicate<Object> nullTextPatternPredicate = m_helper.textPatternPredicate(null, null);
assertTrue(nullTextPatternPredicate.test(null));
assertTrue(nullTextPatternPredicate.test(new Object()));
assertTrue(nullTextPatternPredicate.test("foo"));
assertThrows(AssertionException.class, () -> m_helper.textPatternPredicate("a*", null));
Predicate<String> textPatternPredicateWithIdentity = m_helper.textPatternPredicate("a*", Function.identity());
assertFalse(textPatternPredicateWithIdentity.test(null));
assertFalse(textPatternPredicateWithIdentity.test(""));
assertFalse(textPatternPredicateWithIdentity.test("b"));
assertTrue(textPatternPredicateWithIdentity.test("a"));
assertTrue(textPatternPredicateWithIdentity.test("aa"));
assertTrue(textPatternPredicateWithIdentity.test("ab"));
Predicate<FixtureData> textPatternPredicateFixtureData = m_helper.textPatternPredicate("a*", FixtureData::getText);
assertFalse(textPatternPredicateFixtureData.test(null));
assertFalse(textPatternPredicateFixtureData.test(new FixtureData(1L, null, null, null)));
assertFalse(textPatternPredicateFixtureData.test(new FixtureData(1L, "b", null, null)));
assertTrue(textPatternPredicateFixtureData.test(new FixtureData(1L, "a", null, null)));
assertTrue(textPatternPredicateFixtureData.test(new FixtureData(1L, "aa", null, null)));
assertTrue(textPatternPredicateFixtureData.test(new FixtureData(1L, "ab", null, null)));
}
@SafeVarargs
protected final <ID, LOOKUP_ROW extends AbstractLookupRowDo<LOOKUP_ROW, ID>> void assertLookupResponse(LookupResponse<LOOKUP_ROW> response, @SuppressWarnings("unchecked") ID... expectedIds) {
assertNotNull(response);
List<ID> actualIds = response.rows().stream()
.map(AbstractLookupRowDo::getId)
.collect(Collectors.toList());
assertEquals(Arrays.asList(expectedIds), actualIds);
}
@Test
public void testMaxRowCount() {
assertEquals(LookupHelper.DEFAULT_MAX_ROWS, m_helper.maxRowCount(BEANS.get(FixtureEnumLookupRestrictionDo.class)));
assertEquals(LookupHelper.DEFAULT_MAX_ROWS, m_helper.maxRowCount(BEANS.get(FixtureEnumLookupRestrictionDo.class).withMaxRowCount(null)));
assertEquals(42, m_helper.maxRowCount(BEANS.get(FixtureEnumLookupRestrictionDo.class).withMaxRowCount(42)));
}
}