package com.getbase.android.db.fluentsqlite; import static com.getbase.android.db.fluentsqlite.Expressions.arg; import static com.getbase.android.db.fluentsqlite.Expressions.cases; import static com.getbase.android.db.fluentsqlite.Expressions.coalesce; import static com.getbase.android.db.fluentsqlite.Expressions.column; import static com.getbase.android.db.fluentsqlite.Expressions.concat; import static com.getbase.android.db.fluentsqlite.Expressions.count; import static com.getbase.android.db.fluentsqlite.Expressions.expr; import static com.getbase.android.db.fluentsqlite.Expressions.ifNull; import static com.getbase.android.db.fluentsqlite.Expressions.join; import static com.getbase.android.db.fluentsqlite.Expressions.length; import static com.getbase.android.db.fluentsqlite.Expressions.literal; import static com.getbase.android.db.fluentsqlite.Expressions.max; import static com.getbase.android.db.fluentsqlite.Expressions.min; import static com.getbase.android.db.fluentsqlite.Expressions.not; import static com.getbase.android.db.fluentsqlite.Expressions.nul; import static com.getbase.android.db.fluentsqlite.Expressions.nullIf; import static com.getbase.android.db.fluentsqlite.Expressions.sum; import static com.getbase.android.db.fluentsqlite.Query.select; import static com.google.common.truth.Truth.assertThat; import com.getbase.android.db.fluentsqlite.Expressions.CollatingSequence; import com.getbase.android.db.fluentsqlite.Expressions.Expression; import com.google.common.base.Function; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableMap; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; import org.robolectric.annotation.Config; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; @RunWith(ParameterizedRobolectricTestRunner.class) @Config(manifest = Config.NONE) public class ExpressionsBuilderTest { private String mActual; private String mExpected; public ExpressionsBuilderTest(String actual, String expected) { mActual = actual; mExpected = expected; } private static final Map<Expression, String> TEST_CASES = ImmutableMap.<Expression, String>builder() .put(column("col_a"), "col_a") .put(not().column("col_a"), "NOT col_a") .put(column("col_a").eq().column("col_b"), "col_a == col_b") .put(column("col_a").eq().not().column("col_b"), "col_a == NOT col_b") .put(column("col_a").eq(column("col_b")), "col_a == (col_b)") .put(column("table_a", "col_a"), "table_a.col_a") .put(arg().eq().column("table_a", "col_a"), "? == table_a.col_a") .put(nul(), "NULL") .put(column("col_a").is().nul(), "col_a IS NULL") .put(column("col_a").is(nul()), "col_a IS (NULL)") .put(literal("WAT?").eq().column("col_a"), "'WAT?' == col_a") .put(literal(2900), "2900") .put(column("col_a").eq().literal(1500), "col_a == 1500") .put(sum(column("col_a")), "SUM(col_a)") .put(min(column("col_a")), "MIN(col_a)") .put(max(column("col_a")), "MAX(col_a)") .put(count(column("col_a")), "COUNT(col_a)") .put(count(), "COUNT(*)") .put(ifNull(column("col_a"), literal("unknown")), "ifnull(col_a, 'unknown')") .put(nullIf(column("col_a"), literal("")), "nullif(col_a, '')") .put(coalesce(column("col_a"), column("col_b"), literal("unknown")), "coalesce(col_a, col_b, 'unknown')") .put(length(column("col_a")), "length(col_a)") .put(concat(column("col_a"), literal(" at "), column("col_b")), "col_a || ' at ' || col_b") .put(join(" ", column("col_a"), column("col_b")), "col_a || ' ' || col_b") .put(column("col_a").ne().column("col_b"), "col_a != col_b") .put(column("col_a").ne(column("col_b")), "col_a != (col_b)") .put(column("col_a").gt().column("col_b"), "col_a > col_b") .put(column("col_a").gt(column("col_b")), "col_a > (col_b)") .put(column("col_a").ge().column("col_b"), "col_a >= col_b") .put(column("col_a").ge(column("col_b")), "col_a >= (col_b)") .put(column("col_a").lt().column("col_b"), "col_a < col_b") .put(column("col_a").lt(column("col_b")), "col_a < (col_b)") .put(column("col_a").le().column("col_b"), "col_a <= col_b") .put(column("col_a").le(column("col_b")), "col_a <= (col_b)") .put(column("col_a").or().column("col_b"), "col_a OR col_b") .put(column("col_a").or(column("col_b")), "col_a OR (col_b)") .put(column("col_a").and().column("col_b"), "col_a AND col_b") .put(column("col_a").and(column("col_b")), "col_a AND (col_b)") .put(column("col_a").in(literal(1), literal(2), literal(3)), "col_a IN (1, 2, 3)") .put(column("col_a").in(select().column("id").from("table_a").build()), "col_a IN (SELECT id FROM table_a)") .put(column("col_a").notIn(literal(1), literal(2), literal(3)), "col_a NOT IN (1, 2, 3)") .put(column("col_a").notIn(select().column("id").from("table_a").build()), "col_a NOT IN (SELECT id FROM table_a)") .put(cases().when(column("col_a").eq().column("col_b")).then(literal(1)).otherwise(literal(0)), "CASE WHEN (col_a == col_b) THEN (1) ELSE (0) END") .put(cases().when(column("col_a").eq().column("col_b")).then(literal(1)).when(column("col_a").eq().column("col_c")).then(literal(2)).end(), "CASE WHEN (col_a == col_b) THEN (1) WHEN (col_a == col_c) THEN (2) END") .put(cases(column("col_a")).when(column("col_b")).then(literal(1)).end(), "CASE (col_a) WHEN (col_b) THEN (1) END") .put(column("timestamp").lt().expr("strftime('%s', 'now')"), "timestamp < strftime('%s', 'now')") .put(column("col_a").collate(CollatingSequence.LOCALIZED), "col_a COLLATE LOCALIZED") .put(expr(column("col_a").eq().literal(0)).or(column("col_b").eq().literal(1)), "(col_a == 0) OR (col_b == 1)") .build(); @Parameters public static Collection<Object[]> data() { return FluentIterable .from(TEST_CASES.entrySet()) .transform(new Function<Entry<Expression, String>, Object[]>() { @Override public Object[] apply(Entry<Expression, String> input) { return new Object[] { input.getKey().getSql(), input.getValue() }; } }) .toList(); } @Test public void shouldBuildCorrectSql() throws Exception { assertThat(mActual).isEqualTo(mExpected); } }