You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2017/10/11 14:30:50 UTC
[2/2] groovy git commit: GROOVY-8347: @AutoFinal: tweaks to tests
GROOVY-8347: @AutoFinal: tweaks to tests
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/8714484e
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/8714484e
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/8714484e
Branch: refs/heads/master
Commit: 8714484ea91a2f9770e792d140104bdefada586a
Parents: 5690a5a
Author: paulk <pa...@asert.com.au>
Authored: Thu Oct 12 00:30:39 2017 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Thu Oct 12 00:30:39 2017 +1000
----------------------------------------------------------------------
.../AutoFinalTransformBlackBoxTest.groovy | 212 +++++++++----------
.../transform/AutoFinalTransformTest.groovy | 47 ++++
2 files changed, 152 insertions(+), 107 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/8714484e/src/test/org/codehaus/groovy/transform/AutoFinalTransformBlackBoxTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/transform/AutoFinalTransformBlackBoxTest.groovy b/src/test/org/codehaus/groovy/transform/AutoFinalTransformBlackBoxTest.groovy
index 4e7bf26..b06e265 100644
--- a/src/test/org/codehaus/groovy/transform/AutoFinalTransformBlackBoxTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/AutoFinalTransformBlackBoxTest.groovy
@@ -25,132 +25,130 @@ import org.junit.runners.JUnit4
import java.util.Map.Entry
-
/**
* Tests for the {@code @AutoFinal} AST transform.
*/
-
-// Execute single test:
-// gradlew :test --build-cache --tests org.codehaus.groovy.transform.AutoFinalTransformTest
@RunWith(JUnit4)
class AutoFinalTransformBlackBoxTest extends CompilableTestSupport {
- @Test
- void testAutoFinal_Closure() {
- assertAutoFinalClassTestScript("param0", "String foo() { final cls = { String param0 -> param0 = 'abc'; param0 }; cls() }")
- }
-
- @Test
- void testAutoFinal_ClosureInClosure() {
- assertAutoFinalClassTestScript("param1", "String foo() { final cls0 = { String param0 -> final cls1 = { String param1 -> param1 = 'xyz'; param1 }; cls1() }; cls0() }")
- }
-
- @Test
- void testAutoFinal_ClassMethod_Param0() {
- assertAutoFinalClassTestScript("param0", "String foo(String param0, param1) { param0 = 'abc'; param0 }")
- }
-
- @Test
- void testAutoFinal_ClassMethod_Param1() {
- assertAutoFinalClassTestScript("param1", "String foo(String param0, param1) { param1 = new Object(); param1 }")
- }
-
- // Check default parameters are not negatively impacted by @AutoFinal
- @Test
- void testAutoFinalClassMethodDefaultParameters() {
- final String classPart = """
- String foo(String param0 = 'XyZ', param1 = Closure.IDENTITY) {
- assert param0.equals('XyZ')
- assert param1.is(Closure.IDENTITY)
- return param0
- }
- """
- final script = autoFinalTestScript(true, [:], classPart, "final foo = new $autoFinalTestClassName(); foo.foo()" )
- assert script.contains('@AutoFinal')
- assertScript(script)
- }
-
-
-
- void assertAutoFinalClassTestScript(final String paramName, final String classPart) {
- assertAutoFinalTestScriptWithAnnotation(paramName, classPart)
- assertAutoFinalTestScriptWithoutAnnotation(classPart)
- assertAutoFinalTestScriptWithDisabledAnnotation(classPart)
- }
-
- //
- // Checks Groovy compiler behavior when putting the passed classPart into an @AutoFinal annotated class
- //
-
- // @AutoFinal
- void assertAutoFinalTestScriptWithAnnotation(final String paramName, final String classPart) {
- final script = autoFinalTestScript(true, [:], classPart)
- assert script.contains('@AutoFinal')
- final result = shouldNotCompile(script)
- println "\nassertAutoFinalTestScript result: |$result|\n\n"
- assert result.contains("The parameter [$paramName] is declared final but is reassigned")
- }
-
- // @AutoFinal(enabled=false)
- void assertAutoFinalTestScriptWithDisabledAnnotation(final String classPart) {
- final script = autoFinalTestScript(true, [enabled:false], classPart)
- assert script.contains('@AutoFinal(enabled=false)')
- shouldCompile(script)
- }
-
- // No annotation
- void assertAutoFinalTestScriptWithoutAnnotation(final String classPart) {
- final script = autoFinalTestScript(false, null, classPart)
- assert !script.contains('@AutoFinal')
- shouldCompile(script)
- }
-
-
- String autoFinalTestScript(final boolean autoFinalAnnotationQ, final Map<String,Object> autoFinalAnnotationParamaters, final String classPart, final String scriptPart = '') {
- assert !autoFinalAnnotationQ || (autoFinalAnnotationParamaters != null); assert classPart
- final String autoFinalAnnotationParamatersTerm = autoFinalAnnotationParamaters ? "(${autoFinalAnnotationParamaters.collect { final Entry<String, Object> e -> "$e.key=$e.value" }.join(', ')})" : ''
- final String script = """
+ @Test
+ void testAutoFinal_Closure() {
+ assertAutoFinalClassTestScript("param0", "String foo() { final cls = { String param0 -> param0 = 'abc'; param0 }; cls() }")
+ }
+
+ @Test
+ void testAutoFinal_ClosureInClosure() {
+ assertAutoFinalClassTestScript("param1", "String foo() { final cls0 = { String param0 -> final cls1 = { String param1 -> param1 = 'xyz'; param1 }; cls1() }; cls0() }")
+ }
+
+ @Test
+ void testAutoFinal_ClassMethod_Param0() {
+ assertAutoFinalClassTestScript("param0", "String foo(String param0, param1) { param0 = 'abc'; param0 }")
+ }
+
+ @Test
+ void testAutoFinal_ClassMethod_Param1() {
+ assertAutoFinalClassTestScript("param1", "String foo(String param0, param1) { param1 = new Object(); param1 }")
+ }
+
+ // Check default parameters are not negatively impacted by @AutoFinal
+ @Test
+ void testAutoFinalClassMethodDefaultParameters() {
+ final String classPart = """
+ String foo(String param0 = 'XyZ', param1 = Closure.IDENTITY) {
+ assert param0.equals('XyZ')
+ assert param1.is(Closure.IDENTITY)
+ return param0
+ }
+ """
+ final script = autoFinalTestScript(true, [:], classPart, "final foo = new $autoFinalTestClassName(); foo.foo()")
+ assert script.contains('@AutoFinal')
+ assertScript(script)
+ }
+
+
+ void assertAutoFinalClassTestScript(final String paramName, final String classPart) {
+ assertAutoFinalTestScriptWithAnnotation(paramName, classPart)
+ assertAutoFinalTestScriptWithoutAnnotation(classPart)
+ assertAutoFinalTestScriptWithDisabledAnnotation(classPart)
+ }
+
+ //
+ // Checks Groovy compiler behavior when putting the passed classPart into an @AutoFinal annotated class
+ //
+
+ // @AutoFinal
+ void assertAutoFinalTestScriptWithAnnotation(final String paramName, final String classPart) {
+ final script = autoFinalTestScript(true, [:], classPart)
+ assert script.contains('@AutoFinal')
+ final result = shouldNotCompile(script)
+ //println "\nassertAutoFinalTestScript result: |$result|\n\n"
+ assert result.contains("The parameter [$paramName] is declared final but is reassigned")
+ }
+
+ // @AutoFinal(enabled=false)
+ void assertAutoFinalTestScriptWithDisabledAnnotation(final String classPart) {
+ final script = autoFinalTestScript(true, [enabled: false], classPart)
+ assert script.contains('@AutoFinal(enabled=false)')
+ shouldCompile(script)
+ }
+
+ // No annotation
+ void assertAutoFinalTestScriptWithoutAnnotation(final String classPart) {
+ final script = autoFinalTestScript(false, null, classPart)
+ assert !script.contains('@AutoFinal')
+ shouldCompile(script)
+ }
+
+
+ String autoFinalTestScript(
+ final boolean hasAnnotation,
+ final Map<String, Object> annotationParameters,
+ final String classPart, final String scriptPart = '') {
+ assert !hasAnnotation || (annotationParameters != null); assert classPart
+ final String annotationParametersTerm = annotationParameters ? "(${annotationParameters.collect { final Entry<String, Object> e -> "$e.key=$e.value" }.join(', ')})" : ''
+ final String script = """
import groovy.transform.AutoFinal
import groovy.transform.ASTTest
import static org.codehaus.groovy.control.CompilePhase.SEMANTIC_ANALYSIS
import static java.lang.reflect.Modifier.isFinal
- ${autoFinalAnnotationQ ? "@AutoFinal${autoFinalAnnotationParamatersTerm}" : ''}
+ ${hasAnnotation ? "@AutoFinal${annotationParametersTerm}" : ''}
class $autoFinalTestClassName {
$classPart
}
$scriptPart
"""
- println "script: |$script|"
- return script
- }
-
- String getAutoFinalTestClassName() {
- 'AutoFinalFoo'
- }
-
- /**
- * Prints better readable, unabbreviated stack trace for passed Throwable
- */
- void printStackTrace(final Throwable throwable) {
- println "${throwable.getClass().name}${throwable.message ? ": $throwable.message" : ""}"
- throwable.stackTrace.each { println it }
- final inner = throwable.cause
- if(inner != null) {
- println "Caused by........................................................................................."
- printStackTrace(inner)
+ //println "script: |$script|"
+ return script
}
- }
- Throwable shouldThrow(final String script) {
- try {
- final GroovyClassLoader gcl = new GroovyClassLoader()
- gcl.parseClass(script, getTestClassName())
+ String getAutoFinalTestClassName() {
+ 'AutoFinalFoo'
}
- catch(Throwable throwable) {
- return throwable
+
+ /**
+ * Prints better readable, unabbreviated stack trace for passed Throwable
+ */
+ void printStackTrace(final Throwable throwable) {
+ println "${throwable.getClass().name}${throwable.message ? ": $throwable.message" : ""}"
+ throwable.stackTrace.each { println it }
+ final inner = throwable.cause
+ if (inner != null) {
+ println "Caused by........................................................................................."
+ printStackTrace(inner)
+ }
+ }
+
+ Throwable shouldThrow(final String script) {
+ try {
+ final GroovyClassLoader gcl = new GroovyClassLoader()
+ gcl.parseClass(script, getTestClassName())
+ }
+ catch (Throwable throwable) {
+ return throwable
+ }
+ throw new Exception("Script was expected to throw here!")
}
- throw new Exception("Script was expected to throw here!")
- }
}
http://git-wip-us.apache.org/repos/asf/groovy/blob/8714484e/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy b/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy
index 339daa4..329af82 100644
--- a/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/AutoFinalTransformTest.groovy
@@ -61,4 +61,51 @@ class AutoFinalTransformTest extends CompilableTestSupport {
assert js.fullName(true, ', ') == 'Smith, John'
'''
}
+
+ void testAutoFinalOnClassButDisabledOnMethod() {
+ // use ASTTest here since final modifier isn't put into bytecode so not available via reflection
+ assertScript '''
+ import groovy.transform.AutoFinal
+ import groovy.transform.ASTTest
+ import static org.codehaus.groovy.control.CompilePhase.SEMANTIC_ANALYSIS
+ import static java.lang.reflect.Modifier.isFinal
+
+ @ASTTest(phase=SEMANTIC_ANALYSIS, value = {
+ assert node.methods.size() == 2
+ node.methods[0].with {
+ assert it.name == 'fullName'
+ assert it.parameters.every{ p -> isFinal(p.modifiers) }
+ }
+ node.methods[1].with {
+ assert it.name == 'initials'
+ assert it.parameters.every{ p -> !isFinal(p.modifiers) }
+ }
+ assert node.constructors.size() == 1
+ node.constructors[0].with {
+ assert it.parameters.every{ p -> isFinal(p.modifiers) }
+ }
+ })
+ @AutoFinal
+ class Person {
+ final String first, last
+ Person(String first, String last) {
+ this.first = first
+ this.last = last
+ }
+ String fullName(boolean reversed = false, String separator = ' ') {
+ "${reversed ? last : first}$separator${reversed ? first : last}"
+ }
+ @AutoFinal(enabled=false)
+ String initials(boolean lower) {
+ def raw = "${first[0]}${last[0]}"
+ lower ? raw.toLowerCase() : raw
+ }
+ }
+
+ def js = new Person('John', 'Smith')
+ assert js.fullName() == 'John Smith'
+ assert js.fullName(true, ', ') == 'Smith, John'
+ assert js.initials(true) == 'js'
+ '''
+ }
}