package org.tests.unitinternal; import io.ebean.BaseTestCase; import io.ebean.OrderBy; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertTrue; /** * Test the OrderBy object and especially its parsing. */ public class TestOrderByParse extends BaseTestCase { @Test public void testParseRaw() { OrderBy o1 = new OrderBy<>("case when status='N' then 1 when status='F' then 2 else 99 end"); assertEquals(1, o1.getProperties().size()); assertTrue(o1.getProperties().get(0).isAscending()); assertThat(o1.toStringFormat()).isEqualTo("case when status='N' then 1 when status='F' then 2 else 99 end"); assertThat(o1.getProperties().get(0).getProperty()).isEqualTo("case when status='N' then 1 when status='F' then 2 else 99 end"); assertTrue(o1.supportsSelect()); } @Test public void testParsingOne() { OrderBy o1 = new OrderBy<>("id"); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("id", o1.toStringFormat()); assertTrue(o1.supportsSelect()); o1 = new OrderBy<>("id asc"); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("id", o1.toStringFormat()); o1 = new OrderBy<>("id desc"); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertEquals("id desc", o1.toStringFormat()); o1 = new OrderBy<>(" id asc "); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("id", o1.toStringFormat()); assertTrue(o1.containsProperty("id")); assertFalse(o1.containsProperty("junk")); } @Test public void parseNullsHigh() { OrderBy o1 = new OrderBy<>("id desc nulls high"); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertEquals("id desc nulls high", o1.toStringFormat()); assertFalse(o1.supportsSelect()); } @Test public void add_parse() { OrderBy o1 = new OrderBy<>(); o1.add("id desc nulls high"); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertEquals("id desc nulls high", o1.toStringFormat()); } @Test public void parseNullsHigh_with_second() { OrderBy o1 = new OrderBy<>("id desc nulls high, name"); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertEquals("id desc nulls high, name", o1.toStringFormat()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertTrue(o1.getProperties().get(1).isAscending()); } @Test public void testParsingTwo() { OrderBy o1 = new OrderBy<>("id,name"); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertTrue(o1.getProperties().get(1).isAscending()); assertEquals("id, name", o1.toStringFormat()); assertTrue(o1.supportsSelect()); o1 = new OrderBy<>(" id , name "); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertTrue(o1.getProperties().get(1).isAscending()); assertEquals("id, name", o1.toStringFormat()); o1 = new OrderBy<>(" id desc , name desc "); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertFalse(o1.getProperties().get(1).isAscending()); assertEquals("id desc, name desc", o1.toStringFormat()); o1 = new OrderBy<>(" id ascending, name asc"); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertTrue(o1.getProperties().get(1).isAscending()); assertEquals("id, name", o1.toStringFormat()); } @Test public void testAddMethods() { OrderBy o1 = new OrderBy<>(); o1.asc("id"); o1.asc("name"); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertTrue(o1.getProperties().get(1).isAscending()); assertEquals("id, name", o1.toStringFormat()); o1 = new OrderBy<>(); o1.desc("id"); o1.desc("name"); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertFalse(o1.getProperties().get(1).isAscending()); assertEquals("id desc, name desc", o1.toStringFormat()); o1.reverse(); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertTrue(o1.getProperties().get(1).isAscending()); assertEquals("id, name", o1.toStringFormat()); OrderBy copy = o1.copy(); assertNotSame(copy, o1); assertEquals(2, copy.getProperties().size()); assertEquals("id", copy.getProperties().get(0).getProperty()); assertTrue(copy.getProperties().get(0).isAscending()); assertEquals("name", copy.getProperties().get(1).getProperty()); assertTrue(copy.getProperties().get(1).isAscending()); assertEquals("id, name", copy.toStringFormat()); } @Test public void testParsingWithCollation() { OrderBy o1 = new OrderBy<>(); o1.asc("id", "latin_1"); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertTrue(o1.getProperties().get(0).isAscending()); assertEquals("id collate latin_1", o1.toStringFormat()); assertTrue(o1.supportsSelect()); o1 = new OrderBy<>(); o1.desc("id", "latin_1"); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertEquals("id collate latin_1 desc", o1.toStringFormat()); assertTrue(o1.supportsSelect()); o1 = new OrderBy<>(); o1.desc("id", "latin_1"); o1.asc("date"); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertEquals("date", o1.getProperties().get(1).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertTrue(o1.getProperties().get(1).isAscending()); assertEquals("id collate latin_1 desc, date", o1.toStringFormat()); assertTrue(o1.supportsSelect()); o1 = new OrderBy<>(); o1.desc("id", "latin_1"); o1.asc("name", "latin_2"); assertEquals(2, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertEquals("name", o1.getProperties().get(1).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertTrue(o1.getProperties().get(1).isAscending()); assertEquals("id collate latin_1 desc, name collate latin_2", o1.toStringFormat()); assertTrue(o1.supportsSelect()); // functional (DB2) syntax o1 = new OrderBy<>(); o1.desc("id", "COLLATION_KEY(${}, 'latin_1')"); assertEquals(1, o1.getProperties().size()); assertEquals("id", o1.getProperties().get(0).getProperty()); assertFalse(o1.getProperties().get(0).isAscending()); assertEquals("COLLATION_KEY(id, 'latin_1') desc", o1.toStringFormat()); assertTrue(o1.supportsSelect()); } @Test public void equals_with_nulls() { OrderBy o1 = new OrderBy<>("id desc nulls high"); OrderBy o2 = new OrderBy<>("id desc nulls high"); OrderBy o3 = new OrderBy<>(); o3.add("id desc nulls high"); assertEquals(o1, o2); assertEquals(o1, o3); OrderBy o4 = new OrderBy<>("id desc"); OrderBy o5 = new OrderBy<>("oid desc nulls high"); OrderBy o6 = new OrderBy<>("id desc nulls low"); assertNotEquals(o1, o4); assertNotEquals(o1, o5); assertNotEquals(o1, o6); } @Test public void equals_with_collation() { OrderBy o1 = new OrderBy<>(); o1.asc("name", "latin_1"); OrderBy o2 = new OrderBy<>(); o2.asc("name", null); OrderBy o3 = new OrderBy<>(); o2.asc("name", "bar"); assertNotEquals(o1, o2); assertNotEquals(o1, o3); OrderBy o4 = new OrderBy<>(); o4.asc("name", "latin_1"); assertEquals(o1, o4); } }