/**
*
* Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); You may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at:
*
* 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 com.speedment.runtime.core.internal.field;
import org.junit.Test;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import static com.speedment.runtime.core.internal.field.Entity.ID;
import static com.speedment.runtime.core.internal.field.Entity.NAME;
import static com.speedment.runtime.field.predicate.Inclusion.*;
import static java.util.Comparator.*;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
import static org.junit.Assert.assertEquals;
/**
*
* @author pemi
*/
public class ComparableFieldTest extends BaseFieldTest {
@Test
public void testReferenceFieldComparatorNullFieldsFirst() throws Exception {
final List<Entity> result = entities.stream().sorted(NAME.comparatorNullFieldsFirst().thenComparing(ID.comparator())).collect(toList());
final List<Entity> expected = entities.stream()
.sorted(
comparing(Entity::getName, nullsFirst(String::compareTo))
.thenComparing(comparing(Entity::getId, nullsFirst(Integer::compareTo)))
)
.collect(toList());
assertEquals(expected, result);
}
@Test
public void testReferenceFieldComparatorNullFieldsLast() throws Exception {
final List<Entity> result = entities.stream().sorted(NAME.comparatorNullFieldsLast().thenComparing(ID.comparator())).collect(toList());
final List<Entity> expected = entities.stream()
.sorted(
comparing(Entity::getName, nullsLast(String::compareTo))
.thenComparing(comparing(Entity::getId, nullsLast(Integer::compareTo)))
)
.collect(toList());
assertEquals(expected, result);
}
@Test
public void testEqual() throws Exception {
assertEquals(collect(e -> "a".equals(e.getName())).size(), collect(NAME.equal("a")).size());
assertEquals(collect(e -> e.getName() == null).size(), collect(NAME.equal(null)).size());
}
@Test
public void testNotEqual() throws Exception {
assertEquals(collect(e -> !"a".equals(e.getName())).size(), collect(NAME.notEqual("a")).size());
assertEquals(collect(e -> e.getName() != null).size(), collect(NAME.notEqual(null)).size());
}
@Test
public void lessThan() throws Exception {
assertEquals(
collect(e -> e.getName() != null && "f".compareTo(e.getName()) > 0),
collect(NAME.lessThan("f"))
);
assertEquals(0, collect(NAME.lessThan(null)).size());
}
@Test
public void lessOrEqual() throws Exception {
assertEquals(
collect(e -> e.getName() != null && "f".compareTo(e.getName()) >= 0),
collect(NAME.lessOrEqual("f"))
);
assertEquals(collect(e -> e.getName() == null).size(), collect(NAME.lessOrEqual(null)).size());
}
@Test
public void greaterThan() throws Exception {
assertEquals(
collect(e -> e.getName() != null && "f".compareTo(e.getName()) < 0),
collect(NAME.greaterThan("f"))
);
assertEquals(0, collect(NAME.lessThan(null)).size());
}
@Test
public void greaterOrEqual() throws Exception {
assertEquals(
collect(e -> e.getName() != null && "f".compareTo(e.getName()) <= 0),
collect(NAME.greaterOrEqual("f"))
);
assertEquals(collect(e -> e.getName() == null).size(), collect(NAME.greaterOrEqual(null)).size());
}
@Test
public void between2Arg() throws Exception {
final List<Entity> expected = collect(e -> e.getId() != null && e.getId() >= 2 && e.getId() < 6);
final List<Entity> result = collect(ID.between(2, 6));
assertEquals(
expected,
result
);
// These tests appear to be errenous. If the start is inclusive and end is inclusive,
// passing the same argument as both start and stop will return 0 hits. It is also not
// allowed to set either start or stop to null.
// assertEquals(0, collect(ID.between(2, null)).size());
// assertEquals(0, collect(ID.between(null, 6)).size());
assertEquals(0, collect(ID.between(6, 2)).size());
assertEquals(0, collect(ID.between(2, 2)).size());
}
@Test
public void between3ArgInclIncl() throws Exception {
final List<Entity> expected = collect(e -> e.getId() != null && e.getId() >= 2 && e.getId() <= 6);
final List<Entity> result = collect(ID.between(2, 6, START_INCLUSIVE_END_INCLUSIVE));
assertEquals(
expected,
result
);
// assertEquals(0, collect(ID.between(2, null, START_INCLUSIVE_END_INCLUSIVE)).size());
// assertEquals(0, collect(ID.between(null, 6, START_INCLUSIVE_END_INCLUSIVE)).size());
assertEquals(0, collect(ID.between(6, 2, START_INCLUSIVE_END_INCLUSIVE)).size());
assertEquals(1, collect(ID.between(2, 2, START_INCLUSIVE_END_INCLUSIVE)).size());
}
@Test
public void between3ArgExclIncl() throws Exception {
final List<Entity> expected = collect(e -> e.getId() != null && e.getId() > 2 && e.getId() <= 6);
final List<Entity> result = collect(ID.between(2, 6, START_EXCLUSIVE_END_INCLUSIVE));
assertEquals(
expected,
result
);
// assertEquals(0, collect(ID.between(2, null, START_EXCLUSIVE_END_INCLUSIVE)).size());
// assertEquals(0, collect(ID.between(null, 6, START_EXCLUSIVE_END_INCLUSIVE)).size());
assertEquals(0, collect(ID.between(6, 2, START_EXCLUSIVE_END_INCLUSIVE)).size());
assertEquals(0, collect(ID.between(2, 2, START_EXCLUSIVE_END_INCLUSIVE)).size());
}
@Test
public void between3ArgExclExcl() throws Exception {
final List<Entity> expected = collect(e -> e.getId() != null && e.getId() > 2 && e.getId() < 6);
final List<Entity> result = collect(ID.between(2, 6, START_EXCLUSIVE_END_EXCLUSIVE));
//System.out.println("Expected");
//expected.forEach(System.out::println);
//System.out.println("Result");
//result.forEach(System.out::println);
assertEquals(
expected,
result
);
// assertEquals(0, collect(ID.between(2, null, START_EXCLUSIVE_END_EXCLUSIVE)).size());
// assertEquals(0, collect(ID.between(null, 6, START_EXCLUSIVE_END_EXCLUSIVE)).size());
assertEquals(0, collect(ID.between(6, 2, START_EXCLUSIVE_END_EXCLUSIVE)).size());
assertEquals(0, collect(ID.between(2, 2, START_EXCLUSIVE_END_EXCLUSIVE)).size());
}
@Test
public void in() throws Exception {
final Integer[] ints = {2, 3, 5, 7, 11, 13, 16};
final Set<Integer> intSet = Stream.of(ints).collect(toSet());
final List<Entity> expected = collect(e -> intSet.contains(e.getId()));
assertEquals(expected, collect(ID.in(intSet)));
assertEquals(expected, collect(ID.in(ints)));
assertEquals(0, collect(ID.in()).size());
assertEquals(1, collect(ID.in(1)).size());
assertEquals(0, collect(ID.in((Integer) null)).size());
}
}