package com.novoda.downloadmanager.lib; import java.util.Arrays; import org.junit.Test; public class CriteriaTest { private static final String SORT_COLUMN = "sort_column"; private static final String SORT_COLUMN_ASCENDING = "sort_column ASC "; private static final String SORT_COLUMN_DESCENDING = "sort_column DESC "; private static final String SELECTION_COLUMN = "selection1"; private static final String SELECTION_QUERY = "selection1=?"; private static final String ARGUMENT = "arg1"; private static final String ANOTHER_SELECTION_COLUMN = "selection2"; private static final String ANOTHER_SELECTION_COLUMN_QUERY = "selection2=?"; private static final String AND = " AND "; private static final String OR = " OR "; private static final String SELECTION_COLUMN_AND_ANOTHER_SELECTION_COLUMN_QUERY = SELECTION_QUERY + AND + ANOTHER_SELECTION_COLUMN_QUERY; private static final String SELECTION_COLUMN_OR_ANOTHER_SELECTION_COLUMN_QUERY = SELECTION_QUERY + OR + ANOTHER_SELECTION_COLUMN_QUERY; @Test public void givenASelectionWhenBuildingThenTheWildcardIsAdded() { Criteria criteria = new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .build(); CriteriaAssert.assertThat(criteria).hasSelection(SELECTION_QUERY); } @Test public void givenASelectionWithArgumentsWhenBuildingThenTheArgumentIsAdded() { Criteria criteria = new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .build(); CriteriaAssert.assertThat(criteria) .hasSelection(SELECTION_QUERY) .hasArguments(new String[]{ARGUMENT}); } @Test public void givenACriteriaWithSortAscendingWhenBuildingThenTheSortIsAdded() { Criteria criteria = new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .sortBy(SORT_COLUMN) .ascending() .build(); CriteriaAssert.assertThat(criteria) .hasSort(SORT_COLUMN_ASCENDING) .hasArguments(new String[]{ARGUMENT}); } @Test public void givenACriteriaWithSortDescendingWhenBuildingThenTheSortIsAdded() { Criteria criteria = new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .sortBy(SORT_COLUMN) .descending() .build(); CriteriaAssert.assertThat(criteria) .hasSort(SORT_COLUMN_DESCENDING) .hasArguments(new String[]{ARGUMENT}); } @Test public void givenTwoSelectionsWhenWeBuildWithAndThenTheSelectionQueryIsCorrect() { Criteria criteria = new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .and() .withSelection(ANOTHER_SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .build(); CriteriaAssert.assertThat(criteria) .hasSelection(SELECTION_COLUMN_AND_ANOTHER_SELECTION_COLUMN_QUERY) .hasArguments(new String[]{ARGUMENT, ARGUMENT}); } @Test public void givenTwoSelectionsWhenWeBuildWithOrThenTheSelectionQueryIsCorrect() { Criteria criteria = new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .or() .withSelection(ANOTHER_SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .build(); CriteriaAssert.assertThat(criteria) .hasSelection(SELECTION_COLUMN_OR_ANOTHER_SELECTION_COLUMN_QUERY) .hasArguments(new String[]{ARGUMENT, ARGUMENT}); } @Test public void givenMultipleSelectionsWhenWeBuildThenTheSelectionQueryIsCorrect() { Criteria criteria = new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .or() .withSelection(ANOTHER_SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .and() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .build(); CriteriaAssert.assertThat(criteria) .hasSelection(SELECTION_COLUMN_OR_ANOTHER_SELECTION_COLUMN_QUERY + AND + SELECTION_QUERY) .hasArguments(new String[]{ARGUMENT, ARGUMENT, ARGUMENT}); } @Test public void givenMultipleSelectionsWithInnerCriteriaWhenWeBuildThenTheSelectionQueryIsCorrect() { Criteria criteria = new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .or() .withInnerCriteria( new Criteria.Builder() .withSelection(ANOTHER_SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .and() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .build()) .build(); CriteriaAssert.assertThat(criteria) .hasSelection(SELECTION_QUERY + OR + "(" + ANOTHER_SELECTION_COLUMN_QUERY + AND + SELECTION_QUERY + ")") .hasArguments(new String[]{ARGUMENT, ARGUMENT, ARGUMENT}); } @Test public void givenMultipleSelectionsWithMultipleInnerCriteriaWhenBuildingThenTheSelectionQueryIsCorrect() { Criteria criteria = new Criteria.Builder() .withInnerCriteria( new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .or() .withSelection(ANOTHER_SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .build()) .and() .withInnerCriteria( new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .or() .withSelection(ANOTHER_SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .or() .withInnerCriteria( new Criteria.Builder() .withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .and() .withSelection(ANOTHER_SELECTION_COLUMN, Criteria.Wildcard.EQUALS) .withArgument(ARGUMENT) .build()) .build()) .sortBy(SORT_COLUMN) .ascending() .build(); CriteriaAssert.assertThat(criteria) .hasSelection("(" + SELECTION_COLUMN_OR_ANOTHER_SELECTION_COLUMN_QUERY + ")" + AND + "(" + SELECTION_COLUMN_OR_ANOTHER_SELECTION_COLUMN_QUERY + OR + "(" + SELECTION_COLUMN_AND_ANOTHER_SELECTION_COLUMN_QUERY + "))") .hasArguments(new String[]{ARGUMENT, ARGUMENT, ARGUMENT, ARGUMENT, ARGUMENT, ARGUMENT}); } @Test public void givenMultipleCriteriaWhenApplyingOrThenTheResultingCriteriaIsCorrect() { Criteria firstCriteria = new Criteria.Builder().withSelection(SELECTION_COLUMN, Criteria.Wildcard.EQUALS).withArgument(ARGUMENT).build(); Criteria secondCriteria = new Criteria.Builder().withSelection(ANOTHER_SELECTION_COLUMN, Criteria.Wildcard.EQUALS).withArgument(ARGUMENT).build(); Criteria orCriteria = new Criteria.Builder().joinWithOr(Arrays.asList(firstCriteria, secondCriteria)).build(); CriteriaAssert.assertThat(orCriteria) .hasSelection(SELECTION_QUERY + OR + ANOTHER_SELECTION_COLUMN_QUERY) .hasArguments(new String[]{ARGUMENT, ARGUMENT}); } }