GROOVY-7353: Groovy should provide a MapConstructor AST transform - additional tests and mods for recent master changes (closes #20)
Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/569d68a9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/569d68a9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/569d68a9 Branch: refs/heads/master Commit: 569d68a9ba5ef7ff6cea683203a70646211fdee9 Parents: 87b6633 Author: Paul King <pa...@asert.com.au> Authored: Sat May 23 11:15:01 2015 +1000 Committer: Paul King <pa...@asert.com.au> Committed: Sat May 23 11:15:01 2015 +1000 ---------------------------------------------------------------------- .../MapConstructorASTTransformation.java | 7 +-- .../MapConstructorTransformTest.groovy | 52 +++++++++++++++++++- 2 files changed, 53 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/569d68a9/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java b/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java index ecbbd9c..c968a0c 100644 --- a/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java +++ b/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java @@ -90,12 +90,9 @@ public class MapConstructorASTTransformation extends AbstractASTTransformation { boolean useSetters = memberHasValue(anno, "useSetters", true); List<String> excludes = getMemberList(anno, "excludes"); List<String> includes = getMemberList(anno, "includes"); - if (hasAnnotation(cNode, CanonicalASTTransformation.MY_TYPE)) { - AnnotationNode canonical = cNode.getAnnotations(CanonicalASTTransformation.MY_TYPE).get(0); - if (excludes == null || excludes.isEmpty()) excludes = getMemberList(canonical, "excludes"); - if (includes == null || includes.isEmpty()) includes = getMemberList(canonical, "includes"); - } if (!checkIncludeExclude(anno, excludes, includes, MY_TYPE_NAME)) return; + if (!checkPropertyList(cNode, includes, "includes", anno, MY_TYPE_NAME, includeFields)) return; + if (!checkPropertyList(cNode, excludes, "excludes", anno, MY_TYPE_NAME, includeFields)) return; // if @Immutable is found, let it pick up options and do work so we'll skip if (hasAnnotation(cNode, ImmutableASTTransformation.MY_TYPE)) return; http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/569d68a9/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy b/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy index 22cd930..f59c26b 100644 --- a/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy +++ b/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy @@ -18,7 +18,7 @@ */ package org.codehaus.groovy.transform -class MapConstructorTransformTest extends GroovyTestCase { +class MapConstructorTransformTest extends GroovyShellTestCase { void testMapConstructorWithFinalFields() { assertScript ''' import groovy.transform.* @@ -136,4 +136,54 @@ class MapConstructorTransformTest extends GroovyTestCase { assert new Author().toString() == 'Author(null, null, null)' ''' } + + void testIncludesAndExcludesTogetherResultsInError() { + def message = shouldFail { + evaluate """ + import groovy.transform.MapConstructor + + @MapConstructor(includes='surName', excludes='surName') + class Person { + String surName + } + + new Person() + """ + } + assert message.contains("Error during @MapConstructor processing: Only one of 'includes' and 'excludes' should be supplied not both.") + } + + void testIncludesWithInvalidPropertyNameResultsInError() { + def message = shouldFail { + evaluate """ + import groovy.transform.MapConstructor + + @MapConstructor(includes='sirName') + class Person { + String firstName + String surName + } + + new Person(surname: "Doe") + """ + } + assert message.contains("Error during @MapConstructor processing: 'includes' property 'sirName' does not exist.") + } + + void testExcludesWithInvalidPropertyNameResultsInError() { + def message = shouldFail { + evaluate """ + import groovy.transform.MapConstructor + + @MapConstructor(excludes='sirName') + class Person { + String firstName + String surName + } + + new Person(surname: "Doe") + """ + } + assert message.contains("Error during @MapConstructor processing: 'excludes' property 'sirName' does not exist.") + } }