package test.compare import java.util.* import kotlin.test.* import org.junit.Test data class Item(val name: String, val rating: Int) : Comparable { public override fun compareTo(other: Item): Int { return compareValuesBy(this, other, { it.rating }, { it.name }) } } class OrderingTest { val v1 = Item("wine", 9) val v2 = Item("beer", 10) Test fun compareByCompareTo() { val diff = v1.compareTo(v2) assertTrue(diff < 0) } Test fun compareByNameFirst() { val diff = compareValuesBy(v1, v2, { it.name }, { it.rating }) assertTrue(diff > 0) } Test fun compareByRatingFirst() { val diff = compareValuesBy(v1, v2, { it.rating }, { it.name }) assertTrue(diff < 0) } Test fun compareSameObjectsByRatingFirst() { val diff = compareValuesBy(v1, v1, { it.rating }, { it.name }) assertTrue(diff == 0) } Test fun sortComparatorThenComparator() { val comparator = comparator { a, b -> a.name.compareTo(b.name) } thenComparator { a, b -> a.rating.compareTo(b.rating) } val diff = comparator.compare(v1, v2) assertTrue(diff > 0) val items = arrayListOf(v1, v2).sortBy(comparator) assertEquals(v2, items[0]) assertEquals(v1, items[1]) } Test fun sortByThenBy() { val comparator = compareBy { it.rating } thenBy { it.name } val diff = comparator.compare(v1, v2) assertTrue(diff < 0) val items = arrayListOf(v1, v2).sortBy(comparator) assertEquals(v1, items[0]) assertEquals(v2, items[1]) } Test fun sortByThenByDescending() { val comparator = compareBy { it.rating } thenByDescending { it.name } val diff = comparator.compare(v1, v2) assertTrue(diff < 0) val items = arrayListOf(v1, v2).sortBy(comparator) assertEquals(v1, items[0]) assertEquals(v2, items[1]) } Test fun sortUsingFunctionalComparator() { val comparator = compareBy({ it.name }, { it.rating }) val diff = comparator.compare(v1, v2) assertTrue(diff > 0) val items = arrayListOf(v1, v2).sortBy(comparator) assertEquals(v2, items[0]) assertEquals(v1, items[1]) } Test fun sortUsingCustomComparator() { val comparator = object : Comparator { override fun compare(o1: Item, o2: Item): Int { return compareValuesBy(o1, o2, { it.name }, { it.rating }) } override fun equals(other: Any?): Boolean { return this == other } } val diff = comparator.compare(v1, v2) assertTrue(diff > 0) val items = arrayListOf(v1, v2).sortBy(comparator) assertEquals(v2, items[0]) assertEquals(v1, items[1]) } }