/*
* Copyright 2002-2017 the original author or authors.
*
* 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 org.springframework.beans.support;
import java.util.Comparator;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Unit tests for {@link PropertyComparator}.
*
* @author Keith Donald
* @author Chris Beams
*/
public class PropertyComparatorTests {
@Test
public void testPropertyComparator() {
Dog dog = new Dog();
dog.setNickName("mace");
Dog dog2 = new Dog();
dog2.setNickName("biscy");
PropertyComparator<Dog> c = new PropertyComparator<>("nickName", false, true);
assertTrue(c.compare(dog, dog2) > 0);
assertTrue(c.compare(dog, dog) == 0);
assertTrue(c.compare(dog2, dog) < 0);
}
@Test
public void testPropertyComparatorNulls() {
Dog dog = new Dog();
Dog dog2 = new Dog();
PropertyComparator<Dog> c = new PropertyComparator<>("nickName", false, true);
assertTrue(c.compare(dog, dog2) == 0);
}
@Test
public void testChainedComparators() {
Comparator<Dog> c = new PropertyComparator<>("lastName", false, true);
Dog dog1 = new Dog();
dog1.setFirstName("macy");
dog1.setLastName("grayspots");
Dog dog2 = new Dog();
dog2.setFirstName("biscuit");
dog2.setLastName("grayspots");
assertTrue(c.compare(dog1, dog2) == 0);
c = c.thenComparing(new PropertyComparator<>("firstName", false, true));
assertTrue(c.compare(dog1, dog2) > 0);
dog2.setLastName("konikk dog");
assertTrue(c.compare(dog2, dog1) > 0);
}
@Test
public void testChainedComparatorsReversed() {
Comparator<Dog> c = (new PropertyComparator<Dog>("lastName", false, true)).
thenComparing(new PropertyComparator<>("firstName", false, true));
Dog dog1 = new Dog();
dog1.setFirstName("macy");
dog1.setLastName("grayspots");
Dog dog2 = new Dog();
dog2.setFirstName("biscuit");
dog2.setLastName("grayspots");
assertTrue(c.compare(dog1, dog2) > 0);
c = c.reversed();
assertTrue(c.compare(dog1, dog2) < 0);
}
private static class Dog implements Comparable<Object> {
private String nickName;
private String firstName;
private String lastName;
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public int compareTo(Object o) {
return this.nickName.compareTo(((Dog) o).nickName);
}
}
}