package org.springframework.roo.addon.layers.repository.jpa.addon.finder.parser; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.apache.commons.lang3.ArrayUtils; import org.junit.Before; import org.junit.Test; import org.springframework.roo.addon.layers.repository.jpa.addon.finder.parser.FinderParameter; import org.springframework.roo.addon.layers.repository.jpa.addon.finder.parser.PartTree; import org.springframework.roo.classpath.PhysicalTypeCategory; import org.springframework.roo.classpath.details.DefaultClassOrInterfaceTypeDetails; import org.springframework.roo.classpath.details.DefaultFieldMetadata; import org.springframework.roo.classpath.details.FieldMetadata; import org.springframework.roo.classpath.details.MemberHoldingTypeDetails; import org.springframework.roo.classpath.scanner.MemberDetailsImpl; import org.springframework.roo.model.CustomDataImpl; import org.springframework.roo.model.DataType; import org.springframework.roo.model.JavaSymbolName; import org.springframework.roo.model.JavaType; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; /** * Unit tests for {@link PartTree}. * * @author Paula Navarro * @author Juan Carlos GarcĂ­a * @since 2.0 */ public class PartTreeUnitTest { private String[] PREFIXES = {"find", "read", "query", "count"}; private String[] QUERIES = {"find", "read", "query"}; private String[] DISTINCT = {"", "Distinct"}; private String[] LIMIT = {"Top", "First"}; private String[] TEST_LIMIT = {"Top", "First", "", "Top10", "First10"}; private String[] NUMBERS = {"", "1", "5", "10", "100"}; private String[] PROPERTIES = {"Text", "Number", "Date", "Enumer", "PrimitiveInt"}; private String[] CONJUCTIONS = {"Or", "And"}; private String[] IGNORE_CASE = {"IgnoreCase", "IgnoringCase"}; private String[] ALL_IGNORE_CASE = {"AllIgnoreCase", "AllIgnoringCase"}; private String[] STRING_OP = {"Containing", "Contains", "EndingWith", "EndsWith", "Equals", "Is", "Like", "Matches", "MatchesRegex", "Not", "In", "NotIn", "NotContaining", "NotContains", "NotLike", "NotNull", "Null", "Regex", "StartingWith", "StartsWith"}; private String[] STRING_IS_OP = {"", "Containing", "EndingWith", "Like", "Not", "NotContaining", "NotLike", "NotNull", "Null", "StartingWith", "In", "NotIn"}; private String[] NUMBER_OP = {"Equals", "Is", "Not", "NotNull", "Null", "GreaterThan", "GreaterThanEqual", "In", "NotIn", "LessThan", "Between", "LessThanEqual"}; private String[] NUMBER_IS_OP = {"", "Not", "NotNull", "Null", "GreaterThan", "GreaterThanEqual", "In", "NotIn", "LessThan", "Between", "LessThanEqual"}; private String[] PRIMITE_NUMBER_OP = {"Equals", "Is", "Not", "GreaterThan", "GreaterThanEqual", "In", "NotIn", "LessThan", "LessThanEqual", "Between"}; private String[] PRIMITE_NUMBER_IS_OP = {"", "Equals", "Not", "GreaterThan", "GreaterThanEqual", "In", "NotIn", "LessThan", "LessThanEqual", "Between"}; private String[] DATE_OP = {"Equals", "In", "NotIn", "Is", "Not", "NotNull", "Null", "Before", "After", "Between"}; private String[] DATE_IS_OP = {"", "Not", "In", "NotIn", "Null", "NotNull", "Before", "After", "Between"}; private MemberDetailsImpl memberDetails; @Before public void setUp() throws IllegalArgumentException, IllegalAccessException { List<FieldMetadata> declaredFields = new ArrayList<FieldMetadata>(); declaredFields.add(new DefaultFieldMetadata(new CustomDataImpl(new HashMap<Object, Object>()), "text", 0, null, new JavaSymbolName("text"), new JavaType(String.class), null)); declaredFields.add(new DefaultFieldMetadata(new CustomDataImpl(new HashMap<Object, Object>()), "number", 0, null, new JavaSymbolName("number"), new JavaType(Integer.class), null)); declaredFields.add(new DefaultFieldMetadata(new CustomDataImpl(new HashMap<Object, Object>()), "date", 0, null, new JavaSymbolName("date"), new JavaType(Date.class), null)); declaredFields.add(new DefaultFieldMetadata(new CustomDataImpl(new HashMap<Object, Object>()), "enumer", 0, null, new JavaSymbolName("enumer"), new JavaType(Enum.class), null)); declaredFields.add(new DefaultFieldMetadata(new CustomDataImpl(new HashMap<Object, Object>()), "primitiveInt", 0, null, new JavaSymbolName("primitiveInt"), JavaType.INT_PRIMITIVE, null)); final List<MemberHoldingTypeDetails> memberHoldingTypeDetails = new ArrayList<MemberHoldingTypeDetails>(); memberHoldingTypeDetails.add(new DefaultClassOrInterfaceTypeDetails(new CustomDataImpl( new HashMap<Object, Object>()), "Example", 0, null, new JavaType("Example"), PhysicalTypeCategory.CLASS, null, declaredFields, null, null, null, null, null, null, null, null)); memberDetails = new MemberDetailsImpl(memberHoldingTypeDetails); } private void test(String prefix, String[] result) { List<String> options = new PartTree(prefix, memberDetails).getOptions(); assertEqualsList(generateOptions(prefix, result), options); } @Test(expected = NullPointerException.class) public void rejectsNullSource() throws Exception { new PartTree(null, memberDetails); } @Test(expected = NullPointerException.class) public void rejectsNullMemberDetails() throws Exception { new PartTree("test", null); } @Test public void returnsOperations() throws Exception { test("", PREFIXES); } @Test public void badQueryOperation() throws Exception { assertEquals(new PartTree("find", memberDetails).isValid(), false); assertEquals(new PartTree("findBy", memberDetails).isValid(), false); assertEquals(new PartTree("findText", memberDetails).isValid(), false); assertEquals(new PartTree("Text", memberDetails).isValid(), false); assertEquals(new PartTree("delete", memberDetails).isValid(), false); assertEquals(new PartTree("TextBy", memberDetails).isValid(), false); assertEquals(new PartTree("deleteBy", memberDetails).isValid(), false); } @Test public void badDistinct() throws Exception { assertEquals(new PartTree("Distinctfind", memberDetails).isValid(), false); assertEquals(new PartTree("findByDistinct", memberDetails).isValid(), false); assertEquals(new PartTree("findTextDistinctBy", memberDetails).isValid(), false); assertEquals(new PartTree("findTextDistinct", memberDetails).isValid(), false); assertEquals(new PartTree("DistinctBy", memberDetails).isValid(), false); assertEquals(new PartTree("findByDistinct", memberDetails).isValid(), false); } @Test public void badDistinctCount() throws Exception { assertEquals(new PartTree("countDistinctByText", memberDetails).isValid(), false); } @Test public void badLimit() throws Exception { assertFalse(new PartTree("Topfind", memberDetails).isValid()); assertFalse(new PartTree("findTopDistinctBy", memberDetails).isValid()); assertFalse(new PartTree("findTopFirstBy", memberDetails).isValid()); assertFalse(new PartTree("findTopTextTextBy", memberDetails).isValid()); assertFalse(new PartTree("findTopaTextBy", memberDetails).isValid()); assertFalse(new PartTree("findTopaBy", memberDetails).isValid()); } @Test public void badLimitCount() throws Exception { assertFalse(new PartTree("countDistinctTopByText", memberDetails).isValid()); assertFalse(new PartTree("countFirstByText", memberDetails).isValid()); assertFalse(new PartTree("countTop1ByText", memberDetails).isValid()); } @Test public void badSubjectField() throws Exception { assertFalse(new PartTree("findTBy", memberDetails).isValid()); assertFalse(new PartTree("findTeBy", memberDetails).isValid()); } @Test public void rejectsUnsupportedOperator() throws Exception { assertFalse(new PartTree("findByTextIsFalse", memberDetails).isValid()); assertFalse(new PartTree("findByTextIsFalsePrimiteIntNull", memberDetails).isValid()); } @Test public void rejectsMultipleIgnoreCase() throws Exception { assertFalse(new PartTree("findByTextIgnoreCaseIgnoreCase", memberDetails).isValid()); } @Test public void rejectsMultipleAllIgnoreCase() throws Exception { assertFalse(new PartTree("findByTextIgnoreCaseAllIgnoreCaseAllIgnoreCase", memberDetails) .isValid()); } @Test(expected = RuntimeException.class) public void rejectsMultipleOrderBy() throws Exception { assertFalse(new PartTree("findByTextOrderByTextAscOrderByNumberDesc", memberDetails).isValid()); } @Test(expected = IllegalArgumentException.class) public void rejectsMultipleOrderDirections() throws Exception { assertFalse(new PartTree("findByTextOrderByTextAscDesc", memberDetails).isValid()); } @Test(expected = RuntimeException.class) public void rejectsEmptyExpressionBeforeOr() throws Exception { assertFalse(new PartTree("findByOrText", memberDetails).isValid()); } public void rejectsEmptyExpressionAfterOr() throws Exception { assertFalse(new PartTree("findByTextOr", memberDetails).isValid()); } @Test(expected = RuntimeException.class) public void rejectsEmptyExpressionAfterBetweenOrAndOrderBy() throws Exception { assertFalse(new PartTree("findByTextOrOrderByTextDesc", memberDetails).isValid()); } @Test(expected = RuntimeException.class) public void rejectsEmptyExpressionBeforeAnd() throws Exception { assertFalse(new PartTree("findByOrAndText", memberDetails).isValid()); } public void rejectsEmptyExpressionAfterOrAnd() throws Exception { assertFalse(new PartTree("findByTextAnd", memberDetails).isValid()); } @Test(expected = RuntimeException.class) public void rejectsEmptyExpressionAfterBetweenAndAndOrderBy() throws Exception { assertFalse(new PartTree("findByTextAndOrderByTextDesc", memberDetails).isValid()); } @Test(expected = IllegalArgumentException.class) public void rejectsIgnoreCaseNumberProperty() throws Exception { assertFalse(new PartTree("findByNumberIgnoreCase", memberDetails).isValid()); } @Test(expected = IllegalArgumentException.class) public void rejectsIgnoreCaseForNumberOperator() throws Exception { assertFalse(new PartTree("findByNumberLessThanIgnoreCase", memberDetails).isValid()); } @Test(expected = IllegalArgumentException.class) public void rejectsIgnoreCaseForDateProperty() throws Exception { assertFalse(new PartTree("findByDateIgnoreCase", memberDetails).isValid()); } @Test(expected = IllegalArgumentException.class) public void rejectsIgnoreCaseForPrimiteNumberProperty() throws Exception { assertFalse(new PartTree("findByPrimitiveIntIgnoreCase", memberDetails).isValid()); } public void rejectsSeveralOrderDirections() throws Exception { assertFalse(new PartTree("findByTextOrderByTextDescAsc", memberDetails).isValid()); } @Test(expected = RuntimeException.class) public void rejectsPredicateMultipleOrderBy() throws Exception { new PartTree("findByTextOrderByTextOrderByNumber", memberDetails); } @Test(expected = IllegalArgumentException.class) public void rejectsMaxResultsLimit() throws Exception { new PartTree("findTop0ByText", memberDetails); } @Test public void parsesIgnoreCaseAndAllIgnoreCaseCorrectly() throws Exception { assertTrue(new PartTree("findByTextIgnoreCaseAllIgnoreCase", memberDetails).isValid()); } @Test public void parsesSimplePropertyCorrectly() throws Exception { assertTrue(new PartTree("findByText", memberDetails).isValid()); } @Test public void parsesAndPropertiesCorrectly() throws Exception { assertTrue(new PartTree("findByTextAndNumber", memberDetails).isValid()); } @Test public void parsesOrPropertiesCorrectly() throws Exception { assertTrue(new PartTree("findByTextOrNumber", memberDetails).isValid()); } @Test public void parsesCombinedAndAndOrPropertiesCorrectly() throws Exception { assertTrue(new PartTree("findByTextAndEnumerOrNumber", memberDetails).isValid()); } @Test public void parsesOrderBy() throws Exception { assertTrue(new PartTree("findByTextOrderByTextAsc", memberDetails).isValid()); assertTrue(new PartTree("findByTextOrderByTextAscNumberDesc", memberDetails).isValid()); } @Test public void detectsIgnoreAllCase() throws Exception { assertTrue(new PartTree("findByTextAllIgnoreCase", memberDetails).isValid()); assertTrue(new PartTree("findByTextAllIgnoreCaseOrderByTextAsc", memberDetails).isValid()); } @Test public void detectsSpecificIgnoreCase() throws Exception { assertTrue(new PartTree("findByTextIgnoreCaseAndNumber", memberDetails).isValid()); assertTrue(new PartTree("findByTextIgnoringCaseAndNumber", memberDetails).isValid()); } @Test public void parsesLessThanEqualCorrectly() { assertTrue(new PartTree("findByNumberIsLessThanEqual", memberDetails).isValid()); assertTrue(new PartTree("findByNumberLessThanEqual", memberDetails).isValid()); } @Test public void parsesGreaterThanEqualCorrectly() { assertTrue(new PartTree("findByNumberIsGreaterThanEqual", memberDetails).isValid()); assertTrue(new PartTree("findByNumberGreaterThanEqual", memberDetails).isValid()); } @Test public void parsesRegexKeywordCorrectly() { assertTrue(new PartTree("findByTextRegex", memberDetails).isValid()); assertTrue(new PartTree("findByTextMatchesRegex", memberDetails).isValid()); assertTrue(new PartTree("findByTextMatches", memberDetails).isValid()); } @Test public void parsesStartingWithKeywordCorrectly() { assertTrue(new PartTree("findByTextStartsWith", memberDetails).isValid()); assertTrue(new PartTree("findByTextStartingWith", memberDetails).isValid()); assertTrue(new PartTree("findByTextIsStartingWith", memberDetails).isValid()); } @Test public void parsesEndingWithKeywordCorrectly() { assertTrue(new PartTree("findByTextEndsWith", memberDetails).isValid()); assertTrue(new PartTree("findByTextEndingWith", memberDetails).isValid()); assertTrue(new PartTree("findByTextIsEndingWith", memberDetails).isValid()); } @Test public void parsesContainingKeywordCorrectly() { assertTrue(new PartTree("findByTextIsContaining", memberDetails).isValid()); assertTrue(new PartTree("findByTextContains", memberDetails).isValid()); assertTrue(new PartTree("findByTextContaining", memberDetails).isValid()); } @Test public void parsesAfterKeywordCorrectly() { assertTrue(new PartTree("findByDateAfter", memberDetails).isValid()); assertTrue(new PartTree("findByDateIsAfter", memberDetails).isValid()); } @Test public void parsesBeforeKeywordCorrectly() { assertTrue(new PartTree("findByDateIsBefore", memberDetails).isValid()); assertTrue(new PartTree("findByDateBefore", memberDetails).isValid()); } @Test public void parsesLikeKeywordCorrectly() { assertTrue(new PartTree("findByTextLike", memberDetails).isValid()); assertTrue(new PartTree("findByTextIsLike", memberDetails).isValid()); } @Test public void parsesNotLikeKeywordCorrectly() { assertTrue(new PartTree("findByTextNotLike", memberDetails).isValid()); assertTrue(new PartTree("findByTextIsNotLike", memberDetails).isValid()); } @Test public void parsesContainingCorrectly() { assertTrue(new PartTree("findByTextContainingOrTextContainingAllIgnoringCase", memberDetails) .isValid()); } @Test public void detectPropertyWithOrKeywordPart() { assertTrue(PartTree.isValid("findByOrder")); } @Test public void detectPropertyWithAndKeywordPart() { assertTrue(PartTree.isValid("findByAnders")); } @Test public void detectPropertyPathWithOrKeywordPart() { assertTrue(PartTree.isValid("findByOrderId")); } @Test public void disablesFindFirstKImplicitIfNotPresent() { PartTree partTree = new PartTree("findByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == null); } @Test public void identifiesCount() { PartTree partTree = new PartTree("countByText", memberDetails); assertTrue(partTree.isValid() && partTree.isCountProjection()); partTree = new PartTree("countTextByText", memberDetails); assertTrue(partTree.isValid() && partTree.isCountProjection()); } @Test public void identifiesFindFirstImplicit() { PartTree partTree = new PartTree("findFirstByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 1); partTree = new PartTree("findTopByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 1); } @Test public void identifiesFindFirst1Explicit() { PartTree partTree = new PartTree("findFirst1ByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 1); partTree = new PartTree("findTop1ByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 1); } @Test public void identifiesFindFirstKExplicit() { PartTree partTree = new PartTree("findFirst10ByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 10); partTree = new PartTree("findTop10ByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 10); } @Test public void identifiesFindFirstKUsersExplicit() { PartTree partTree = new PartTree("findFirst10NumberByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 10); partTree = new PartTree("findTop10NumberByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 10); } @Test public void identifiesFindFirstKDistinctUsersExplicit() { PartTree partTree = new PartTree("findDistinctFirst10NumberByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 10); partTree = new PartTree("findDistinctTop10NumberByText", memberDetails); assertTrue(partTree.isValid() && partTree.getMaxResults() == 10); } @Test public void parsesIsNotContainingCorrectly() throws Exception { assertTrue(new PartTree("findByTextIsNotContaining", memberDetails).isValid()); assertTrue(new PartTree("findByTextIsNotContaining", memberDetails).isValid()); assertTrue(new PartTree("findByTextNotContaining", memberDetails).isValid()); } @Test public void parsesInContainingCorrectly() { assertTrue(new PartTree("findByTextIn", memberDetails).isValid()); } @Test public void detectsDistinctCorrectly() throws Exception { for (String prefix : QUERIES) { PartTree partTree = new PartTree(prefix + "DistinctByText", memberDetails); assertTrue(partTree.isValid() && partTree.isDistinct()); partTree = new PartTree(prefix + "DistinctTextByText", memberDetails); assertTrue(partTree.isValid() && partTree.isDistinct()); partTree = new PartTree(prefix + "DistinctTop100TextByText", memberDetails); assertTrue(partTree.isValid() && partTree.isDistinct()); partTree = new PartTree(prefix + "DistinctFirstByText", memberDetails); assertTrue(partTree.isValid() && partTree.isDistinct()); partTree = new PartTree(prefix + "DistinctTopTextByText", memberDetails); assertTrue(partTree.isValid() && partTree.isDistinct()); } } @Test public void validateReturnTypeEntity() throws Exception { JavaType exampleType = new JavaType("Example"); JavaType examplePageType = new JavaType("org.springframework.data.domain.Page", 0, DataType.TYPE, null, Arrays.asList(exampleType)); assertEquals(examplePageType, new PartTree("findDistinctByText", memberDetails).getReturnType()); assertEquals(examplePageType, new PartTree("findByText", memberDetails).getReturnType()); assertEquals(examplePageType, new PartTree("findTop2ByText", memberDetails).getReturnType()); assertEquals(examplePageType, new PartTree("findDistinctTop10ByText", memberDetails).getReturnType()); assertEquals(examplePageType, new PartTree("findFirst2ByText", memberDetails).getReturnType()); assertEquals(exampleType, new PartTree("findTopByText", memberDetails).getReturnType()); assertEquals(exampleType, new PartTree("findTopFirst1ByText", memberDetails).getReturnType()); assertEquals(exampleType, new PartTree("findDistinctFirstByText", memberDetails).getReturnType()); assertEquals(exampleType, new PartTree("findDistinctTop1ByText", memberDetails).getReturnType()); } @Test public void validateReturnsTypeString() throws Exception { JavaType stringPageType = new JavaType("org.springframework.data.domain.Page", 0, DataType.TYPE, null, Arrays.asList(JavaType.STRING)); assertEquals(stringPageType, new PartTree("findDistinctTextByText", memberDetails).getReturnType()); assertEquals(stringPageType, new PartTree("findTextByText", memberDetails).getReturnType()); assertEquals(stringPageType, new PartTree("findTop2TextByText", memberDetails).getReturnType()); assertEquals(stringPageType, new PartTree("findDistinctTop10TextByText", memberDetails).getReturnType()); assertEquals(stringPageType, new PartTree("findFirst2TextByText", memberDetails).getReturnType()); assertEquals(JavaType.STRING, new PartTree("findTopTextByText", memberDetails).getReturnType()); assertEquals(JavaType.STRING, new PartTree("findFirst1TextByText", memberDetails).getReturnType()); assertEquals(JavaType.STRING, new PartTree("findDistinctFirstTextByText", memberDetails).getReturnType()); assertEquals(JavaType.STRING, new PartTree("findDistinctTop1TextByText", memberDetails).getReturnType()); } @Test public void validateReturnsTypeDate() throws Exception { JavaType dateType = new JavaType(Date.class); JavaType datePageType = new JavaType("org.springframework.data.domain.Page", 0, DataType.TYPE, null, Arrays.asList(dateType)); assertEquals(datePageType, new PartTree("findDistinctDateByText", memberDetails).getReturnType()); assertEquals(datePageType, new PartTree("findDateByText", memberDetails).getReturnType()); assertEquals(datePageType, new PartTree("findTop2DateByText", memberDetails).getReturnType()); assertEquals(datePageType, new PartTree("findDistinctTop10DateByText", memberDetails).getReturnType()); assertEquals(datePageType, new PartTree("findFirst2DateByText", memberDetails).getReturnType()); assertEquals(dateType, new PartTree("findTopDateByText", memberDetails).getReturnType()); assertEquals(dateType, new PartTree("findFirst1DateByText", memberDetails).getReturnType()); assertEquals(dateType, new PartTree("findDistinctFirstDateByText", memberDetails).getReturnType()); assertEquals(dateType, new PartTree("findDistinctTop1DateByText", memberDetails).getReturnType()); } @Test public void validateReturnsTypeInteger() throws Exception { JavaType intPageType = new JavaType("org.springframework.data.domain.Page", 0, DataType.TYPE, null, Arrays.asList(JavaType.INT_OBJECT)); assertEquals(intPageType, new PartTree("findDistinctNumberByText", memberDetails).getReturnType()); assertEquals(intPageType, new PartTree("findNumberByText", memberDetails).getReturnType()); assertEquals(intPageType, new PartTree("findTop2NumberByText", memberDetails).getReturnType()); assertEquals(intPageType, new PartTree("findDistinctTop10NumberByText", memberDetails).getReturnType()); assertEquals(intPageType, new PartTree("findFirst2NumberByText", memberDetails).getReturnType()); assertEquals(JavaType.INT_OBJECT, new PartTree("findTopNumberByText", memberDetails).getReturnType()); assertEquals(JavaType.INT_OBJECT, new PartTree("findFirst1NumberByText", memberDetails).getReturnType()); assertEquals(JavaType.INT_OBJECT, new PartTree("findDistinctFirstNumberByText", memberDetails).getReturnType()); assertEquals(JavaType.INT_OBJECT, new PartTree("findDistinctTop1NumberByText", memberDetails).getReturnType()); } @Test public void validateReturnsTypePrimitiveInteger() throws Exception { JavaType intPageType = new JavaType("org.springframework.data.domain.Page", 0, DataType.TYPE, null, Arrays.asList(JavaType.INT_OBJECT)); assertEquals(intPageType, new PartTree("findDistinctPrimitiveIntByText", memberDetails).getReturnType()); assertEquals(intPageType, new PartTree("findPrimitiveIntByText", memberDetails).getReturnType()); assertEquals(intPageType, new PartTree("findTop2PrimitiveIntByText", memberDetails).getReturnType()); assertEquals(intPageType, new PartTree("findDistinctTop10PrimitiveIntByText", memberDetails).getReturnType()); assertEquals(intPageType, new PartTree("findFirst2PrimitiveIntByText", memberDetails).getReturnType()); assertEquals(JavaType.INT_PRIMITIVE, new PartTree("findTopPrimitiveIntByText", memberDetails).getReturnType()); assertEquals(JavaType.INT_PRIMITIVE, new PartTree("findFirst1PrimitiveIntByText", memberDetails).getReturnType()); assertEquals(JavaType.INT_PRIMITIVE, new PartTree("findDistinctFirstPrimitiveIntByText", memberDetails).getReturnType()); assertEquals(JavaType.INT_PRIMITIVE, new PartTree("findDistinctTop1PrimitiveIntByText", memberDetails).getReturnType()); } @Test public void validateReturnsCount() throws Exception { assertEquals(JavaType.LONG_OBJECT, new PartTree("countPrimitiveIntByText", memberDetails).getReturnType()); assertEquals(JavaType.LONG_OBJECT, new PartTree("countNumberByText", memberDetails).getReturnType()); assertEquals(JavaType.LONG_OBJECT, new PartTree("countByText", memberDetails).getReturnType()); assertEquals(JavaType.LONG_OBJECT, new PartTree("countDateByText", memberDetails).getReturnType()); } @Test public void validateOneParameter() throws Exception { List<FinderParameter> parameters = new ArrayList<FinderParameter>(); parameters.add(new FinderParameter(JavaType.STRING, new JavaSymbolName("text"))); assertEqualsParameters(parameters, new PartTree("countByTextContaining", memberDetails).getParameters()); parameters.add(new FinderParameter(JavaType.INT_OBJECT, new JavaSymbolName("number"))); assertEqualsParameters(parameters, new PartTree("findByTextContainingAndNumberIsLessThan", memberDetails).getParameters()); assertEqualsParameters(parameters, new PartTree( "findByTextContainingAndNumberIsLessThanOrIsNull", memberDetails).getParameters()); } @Test public void validateSeveralParameters() throws Exception { List<FinderParameter> parameters = new ArrayList<FinderParameter>(); parameters.add(new FinderParameter(JavaType.INT_OBJECT, new JavaSymbolName("number1"))); parameters.add(new FinderParameter(JavaType.INT_OBJECT, new JavaSymbolName("number2"))); assertEqualsParameters(parameters, new PartTree("findByNumberBetween", memberDetails).getParameters()); parameters.add(new FinderParameter(JavaType.INT_OBJECT, new JavaSymbolName("number3"))); parameters.add(new FinderParameter(JavaType.INT_OBJECT, new JavaSymbolName("number4"))); assertEqualsParameters(parameters, new PartTree("findByNumberBetweenAndNumberBetween", memberDetails).getParameters()); parameters.add(new FinderParameter(JavaType.INT_OBJECT, new JavaSymbolName("number5"))); assertEqualsParameters(parameters, new PartTree( "countByNumberBetweenAndNumberBetweenAndNumberLessThan", memberDetails).getParameters()); } @Test public void validateEmptyOperatorParameters() throws Exception { List<FinderParameter> parameters = new ArrayList<FinderParameter>(); parameters.add(new FinderParameter(JavaType.INT_OBJECT, new JavaSymbolName("number"))); assertEqualsParameters(parameters, new PartTree("findByNumber", memberDetails).getParameters()); parameters.add(new FinderParameter(JavaType.INT_OBJECT, new JavaSymbolName("number2"))); assertEqualsParameters(parameters, new PartTree("findByNumberAndNumberOrderByNumber", memberDetails).getParameters()); } @Test public void validateInParameters() throws Exception { List<FinderParameter> parameters = new ArrayList<FinderParameter>(); parameters.add(new FinderParameter(new JavaType(List.class.getName(), 0, DataType.TYPE, null, Arrays.asList(new JavaType(Date.class.getName()))), new JavaSymbolName("dateList"))); assertEqualsParameters(parameters, new PartTree("findByDateIn", memberDetails).getParameters()); } @Test public void optionsAfterQueryPrefix() throws Exception { for (String prefix : QUERIES) { test(prefix, ArrayUtils.addAll(PROPERTIES, new String[] {"Distinct", "First", "Top", "By"})); } } @Test public void optionsAfterCountPrefix() throws Exception { test("count", ArrayUtils.addAll(PROPERTIES, "By")); } @Test public void optionsAfterDistinct() throws Exception { for (String prefix : QUERIES) { prefix += "Distinct"; test(prefix, ArrayUtils.addAll(PROPERTIES, new String[] {"First", "Top", "By"})); } } @Test public void optionsAfterLimit() throws Exception { for (String prefix : QUERIES) { for (String distinct : DISTINCT) { for (String limit : LIMIT) { String query = prefix + distinct + limit; test(query, ArrayUtils.addAll(PROPERTIES, new String[] {"[Number]", "By"})); } } } } @Test public void optionsAfterLimitNumber() throws Exception { for (String prefix : QUERIES) { for (String distinct : DISTINCT) { for (String limit : LIMIT) { for (String number : NUMBERS) { String query = prefix + distinct + limit + number; if (number == "") test(query, ArrayUtils.addAll(PROPERTIES, new String[] {"By", "[Number]"})); else test(query, ArrayUtils.addAll(PROPERTIES, new String[] {"By"})); } } } } } @Test public void optionsAfterField() throws Exception { for (String prefix : QUERIES) { for (String distinct : DISTINCT) { for (String limit : TEST_LIMIT) { for (String field : PROPERTIES) { test(prefix + distinct + limit + field, new String[] {"By"}); } } } } for (String field : PROPERTIES) { test("count" + field, new String[] {"By"}); } } @Test public void optionsAfterBy() throws Exception { for (String prefix : PREFIXES) { for (String field : ArrayUtils.addAll(PROPERTIES, "")) { test(prefix + field + "By", PROPERTIES); } } } @Test public void optionsAfterPredicateStringField() throws Exception { for (String prefix : PREFIXES) { for (String field : ArrayUtils.addAll(PROPERTIES, "")) { test(prefix + field + "ByText", ArrayUtils.addAll( ArrayUtils.addAll(STRING_OP, ArrayUtils.addAll(CONJUCTIONS, "")), ArrayUtils.addAll(ArrayUtils.addAll(IGNORE_CASE, ALL_IGNORE_CASE), "OrderBy"))); } } } @Test public void optionsAfterPredicateNumberField() throws Exception { for (String prefix : QUERIES) { for (String distinct : DISTINCT) { for (String limit : TEST_LIMIT) { for (String field : ArrayUtils.addAll(PROPERTIES, "")) { test( prefix + distinct + limit + field + "ByNumber", (String[]) ArrayUtils.addAll( ArrayUtils.addAll(NUMBER_OP, ArrayUtils.addAll(CONJUCTIONS, "")), ArrayUtils.addAll(ALL_IGNORE_CASE, "OrderBy"))); } } } } } @Test public void optionsAfterPredicateDateField() throws Exception { for (String prefix : QUERIES) { for (String distinct : DISTINCT) { for (String limit : TEST_LIMIT) { for (String field : ArrayUtils.addAll(PROPERTIES, "")) { test(prefix + distinct + limit + field + "ByDate", ArrayUtils.addAll( ArrayUtils.addAll(DATE_OP, ArrayUtils.addAll(CONJUCTIONS, "")), ArrayUtils.addAll(ALL_IGNORE_CASE, "OrderBy"))); } } } } } @Test public void optionsAfterPredicateprimitiveNumberField() throws Exception { for (String prefix : QUERIES) { for (String distinct : DISTINCT) { for (String limit : TEST_LIMIT) { for (String field : ArrayUtils.addAll(PROPERTIES, "")) { test(prefix + distinct + limit + field + "ByPrimitiveInt", ArrayUtils.addAll( ArrayUtils.addAll(PRIMITE_NUMBER_OP, ArrayUtils.addAll(CONJUCTIONS, "")), ArrayUtils.addAll(ALL_IGNORE_CASE, "OrderBy"))); } } } } } @Test public void optionsAfterOperator() throws Exception { for (String prefix : QUERIES) { for (String distinct : DISTINCT) { for (String limit : TEST_LIMIT) { for (String field : ArrayUtils.addAll(PROPERTIES, "")) { for (String fieldPred : PROPERTIES) { for (String operator : new String[] {"In", "IsIn"}) { String[] options = ArrayUtils.addAll(CONJUCTIONS, ArrayUtils.addAll(ArrayUtils.addAll(ALL_IGNORE_CASE, ""), "OrderBy")); if (fieldPred.equals("Text")) { options = ArrayUtils.addAll(options, IGNORE_CASE); } test(prefix + distinct + limit + field + "By" + fieldPred + operator, options); } } } } } } } @Test public void optionsAfterIs() throws Exception { test( "findByTextIs", ArrayUtils.addAll( this.STRING_IS_OP, ArrayUtils.addAll(CONJUCTIONS, ArrayUtils.addAll(ArrayUtils.addAll(IGNORE_CASE, ALL_IGNORE_CASE), "OrderBy")))); } @Test public void optionsAfterOrConjuction() throws Exception { for (String fieldPred : PROPERTIES) { for (String operator : new String[] {"IsNot", "In", "IsIn", ""}) { test("findBy" + fieldPred + operator + "Or", ArrayUtils.addAll(PROPERTIES, "derBy")); } } } @Test public void optionsAfterAndConjuction() throws Exception { for (String fieldPred : PROPERTIES) { for (String operator : new String[] {"IsNot", "In", "IsIn", ""}) { test("findBy" + fieldPred + operator + "And", PROPERTIES); } } } @Test public void optionsAfterIgnore() throws Exception { for (String ignore : IGNORE_CASE) { test( "findByText" + ignore, ArrayUtils.addAll( STRING_OP, ArrayUtils.addAll(ArrayUtils.addAll(CONJUCTIONS, ""), ArrayUtils.addAll(ALL_IGNORE_CASE, "OrderBy")))); } } @Test public void optionsAfterAllIgnore() throws Exception { for (String fieldPred : PROPERTIES) { for (String allIgnore : ALL_IGNORE_CASE) { test("findBy" + fieldPred + allIgnore, new String[] {"", "OrderBy"}); } } for (String ignore : ArrayUtils.addAll(IGNORE_CASE)) { for (String allIgnore : ALL_IGNORE_CASE) { test("findByText" + ignore + allIgnore, new String[] {"", "OrderBy"}); } } } @Test public void optionsAfterOrderBy() throws Exception { for (String fieldPred : PROPERTIES) { for (String operator : new String[] {"IsNot", "In", ""}) { for (String allIgnore : ALL_IGNORE_CASE) { test("findBy" + fieldPred + operator + allIgnore + "OrderBy", PROPERTIES); } } } } @Test public void optionsAfterOrderField() throws Exception { for (String fieldPred : PROPERTIES) { for (String operator : new String[] {"IsNot", "In", "IsIn", ""}) { for (String allIgnore : ALL_IGNORE_CASE) { test("findBy" + fieldPred + operator + allIgnore + "OrderBy" + fieldPred, new String[] { "Asc", "Desc"}); } } } } @Test public void optionsAfterOrderFieldDirection() throws Exception { for (String fieldPred : PROPERTIES) { for (String operator : new String[] {"IsNot", "In", "IsIn", ""}) { for (String allIgnore : ALL_IGNORE_CASE) { for (String direction : new String[] {"Asc", "Desc"}) { test("findBy" + fieldPred + operator + allIgnore + "OrderBy" + fieldPred + direction, ArrayUtils.addAll(PROPERTIES, "")); } } } } } private List<String> generateOptions(String prefix, String[] suffixes) { List<String> options = new ArrayList<String>(); for (String suffix : suffixes) { options.add(prefix + suffix); } return options; } private List<String> generateOptions(String prefix, List<String> suffixes) { List<String> options = new ArrayList<String>(); for (String suffix : suffixes) { options.add(prefix + suffix); } return options; } private void assertEqualsList(List<String> list1, List<String> list2) { Collections.sort(list1); Collections.sort(list2); assertEquals(list1, list2); } private void assertEqualsParameters(List<FinderParameter> parameters, List<FinderParameter> parameters2) { List<String> list1 = new ArrayList<String>(); List<String> list2 = new ArrayList<String>(); for (FinderParameter parameter : parameters) list1.add(parameter.toString()); for (FinderParameter parameter : parameters2) list2.add(parameter.toString()); assertEqualsList(list1, list2); } }