You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2019/11/24 01:50:47 UTC

[groovy] branch master updated: GROOVY-9317: record field expression value for assert

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new 9d75b17  GROOVY-9317: record field expression value for assert
9d75b17 is described below

commit 9d75b171be28d3f33033ac3fa13b1296d5028cb0
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Nov 23 19:50:08 2019 -0600

    GROOVY-9317: record field expression value for assert
---
 .../groovy/classgen/AsmClassGenerator.java         |  33 +--
 src/spec/test/semantics/PowerAssertTest.groovy     |  24 +-
 .../powerassert/AssertionRenderingTest.groovy      | 290 +++++++++++++--------
 .../runtime/powerassert/ValueRenderingTest.groovy  | 121 +++++----
 4 files changed, 291 insertions(+), 177 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index bcc140f..2c688f8 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -962,18 +962,17 @@ public class AsmClassGenerator extends ClassGenerator {
                             && controller.isStaticContext()) {
                         // GROOVY-6183
                         ClassNode current = classNode.getSuperClass();
-                        while (field==null && current!=null) {
+                        while (field == null && current != null) {
                             field = current.getDeclaredField(name);
                             current = current.getSuperClass();
                         }
-                        if (field!=null && (field.isProtected() || field.isPublic())) {
+                        if (field != null && (field.isProtected() || field.isPublic())) {
                             visitFieldExpression(new FieldExpression(field));
                             return;
                         }
                     }
                 }
-                if (field != null && !privateSuperField) {
-                    // GROOVY-4497: don't visit super field if it is private
+                if (field != null && !privateSuperField) { // GROOVY-4497: don't visit super field if it is private
                     visitFieldExpression(new FieldExpression(field));
                     return;
                 }
@@ -1157,9 +1156,9 @@ public class AsmClassGenerator extends ClassGenerator {
             if (name != null) {
                 FieldNode field = getDeclaredFieldOfCurrentClassOrAccessibleFieldOfSuper(classNode, classNode, name, isSuperExpression(objectExpression));
                 if (field != null) {
-                    FieldExpression exp = new FieldExpression(field);
-                    exp.setSourcePosition(expression);
-                    visitFieldExpression(exp);
+                    FieldExpression fldExp = new FieldExpression(field);
+                    fldExp.setSourcePosition(expression.getProperty());
+                    visitFieldExpression(fldExp);
                     return;
                 }
             }
@@ -1178,17 +1177,17 @@ public class AsmClassGenerator extends ClassGenerator {
             if (usesSuper(expression)) adapter = getFieldOnSuper;
         }
         visitAttributeOrProperty(expression, adapter);
-        if (!controller.getCompileStack().isLHS()) {
-            controller.getAssertionWriter().record(expression.getProperty());
-        } else {
+        if (controller.getCompileStack().isLHS()) {
             operandStack.remove(operandStack.getStackLength() - mark);
+        } else {
+            controller.getAssertionWriter().record(expression.getProperty());
         }
     }
 
     private static boolean usesSuper(PropertyExpression pe) {
-        Expression expression = pe.getObjectExpression();
-        if (expression instanceof VariableExpression) {
-            VariableExpression varExp = (VariableExpression) expression;
+        Expression objExp = pe.getObjectExpression();
+        if (objExp instanceof VariableExpression) {
+            VariableExpression varExp = (VariableExpression) objExp;
             String variable = varExp.getName();
             return variable.equals("super");
         }
@@ -1211,7 +1210,9 @@ public class AsmClassGenerator extends ClassGenerator {
                 loadInstanceField(expression);
             }
         }
-        if (controller.getCompileStack().isLHS()) controller.getAssertionWriter().record(expression);
+        if (!controller.getCompileStack().isLHS()) {
+            controller.getAssertionWriter().record(expression);
+        }
     }
 
     public void loadStaticField(FieldExpression fldExp) {
@@ -1348,7 +1349,9 @@ public class AsmClassGenerator extends ClassGenerator {
         } else {
             controller.getOperandStack().loadOrStoreVariable(variable, expression.isUseReferenceDirectly());
         }
-        if (!controller.getCompileStack().isLHS()) controller.getAssertionWriter().record(expression);
+        if (!controller.getCompileStack().isLHS()) {
+            controller.getAssertionWriter().record(expression);
+        }
     }
 
     private void loadThis(VariableExpression thisExpression) {
diff --git a/src/spec/test/semantics/PowerAssertTest.groovy b/src/spec/test/semantics/PowerAssertTest.groovy
index 5e42027..85d5b6c 100644
--- a/src/spec/test/semantics/PowerAssertTest.groovy
+++ b/src/spec/test/semantics/PowerAssertTest.groovy
@@ -18,17 +18,21 @@
  */
 package semantics
 
-import asciidoctor.Utils
-import groovy.test.GroovyTestCase
+import org.junit.Test
 
-class PowerAssertTest extends GroovyTestCase {
+import static asciidoctor.Utils.stripAsciidocMarkup
+import static groovy.test.GroovyAssert.shouldFail
+
+final class PowerAssertTest {
+
+    @Test
     void testPowerAssert() {
-        def msg = shouldFail {
+        def err = shouldFail {
             //tag::assert_code_1[]
             assert 1+1 == 3
             //end::assert_code_1[]
         }
-        assert msg == Utils.stripAsciidocMarkup('''
+        assert err.message == stripAsciidocMarkup('''
 //tag::assert_error_1[]
 assert 1+1 == 3
         |  |
@@ -37,8 +41,9 @@ assert 1+1 == 3
 ''')
     }
 
+    @Test
     void testPowerAssert2() {
-        def msg = shouldFail {
+        def err = shouldFail {
             //tag::assert_code_2[]
             def x = 2
             def y = 7
@@ -47,7 +52,7 @@ assert 1+1 == 3
             assert calc(x,y) == [x,z].sum()
             //end::assert_code_2[]
         }
-        assert msg == Utils.stripAsciidocMarkup('''
+        assert err.message == stripAsciidocMarkup('''
 //tag::assert_error_2[]
 assert calc(x,y) == [x,z].sum()
        |    | |  |   | |  |
@@ -57,8 +62,9 @@ assert calc(x,y) == [x,z].sum()
 ''')
     }
 
+    @Test
     void testCustomAssertMessage() {
-        def msg = shouldFail {
+        def err = shouldFail {
             //tag::assert_code_3[]
             def x = 2
             def y = 7
@@ -67,7 +73,7 @@ assert calc(x,y) == [x,z].sum()
             assert calc(x,y) == z*z : 'Incorrect computation result'
             //end::assert_code_3[]
         }
-        assert msg == Utils.stripAsciidocMarkup('''
+        assert err.message == stripAsciidocMarkup('''
 //tag::assert_error_3[]
 Incorrect computation result. Expression: (calc.call(x, y) == (z * z)). Values: z = 5, z = 5
 //end::assert_error_3[]
diff --git a/src/test/org/codehaus/groovy/runtime/powerassert/AssertionRenderingTest.groovy b/src/test/org/codehaus/groovy/runtime/powerassert/AssertionRenderingTest.groovy
index 9ce3a7c..f34d762 100644
--- a/src/test/org/codehaus/groovy/runtime/powerassert/AssertionRenderingTest.groovy
+++ b/src/test/org/codehaus/groovy/runtime/powerassert/AssertionRenderingTest.groovy
@@ -18,34 +18,42 @@
  */
 package org.codehaus.groovy.runtime.powerassert
 
-import groovy.test.GroovyTestCase
+import org.junit.Test
 
-import static AssertionTestUtil.*
 import static java.lang.Math.min
+import static org.codehaus.groovy.runtime.powerassert.AssertionTestUtil.isRendered
 
 /**
  * Tests rendering of whole assertions.
  */
+final class AssertionRenderingTest {
 
-class AssertionRenderingTest extends GroovyTestCase {
+    private one(x) { 0 }
+
+    private two(a, b) { 0 }
+
+    private three(a, b, c) { 0 }
+
+    @Test
     void testSimpleAssertion() {
-        isRendered """
+        isRendered '''
 assert x == 1
        | |
        2 false
-        """, {
+        ''', { ->
             def x = 2
             assert x == 1
         }
     }
 
+    @Test
     void testMultiLineAssertion() {
-        isRendered """
+        isRendered '''
 assert 1 + 2 == 4 - 2
          |   |    |
          3   |    2
              false
-        """, {
+        ''', { ->
             assert 1 +
                 2 ==
 
@@ -58,118 +66,125 @@ assert 1 + 2 == 4 - 2
         }
     }
 
-    private one(x) { 0 }
-
+    @Test
     void testMethodCallExpressionWithImplicitTarget() {
-        isRendered """
+        isRendered '''
 assert one(a)
        |   |
        0   1
-        """, {
+        ''', { ->
             def a = 1
             assert one(a)
         }
     }
 
+    @Test
     void testMethodCallExpressionWithExplicitTarget() {
-        isRendered """
+        isRendered '''
 assert a.get(b) == null
        | |   |  |
        | 1   0  false
        [1]
-        """, {
+        ''', { ->
             def a = [1]
             def b = 0
             assert a.get(b) == null
         }
     }
 
+    @Test
     void testMethodCallExpressionWithGStringMethod() {
-        isRendered """
+        isRendered '''
 assert [1]."\$x"(0) == null
            | |     |
            1 'get' false
-        """, {
+        ''', { ->
             def x = "get"
             assert [1]."$x"(0) == null
         }
     }
 
+    @Test
     void testMethodCallExpressionCallingStaticMethod() {
-        isRendered """
+        isRendered '''
 assert Math.max(a,b) == null
             |   | |  |
             2   1 2  false
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             assert Math.max(a,b) == null
         }
     }
 
+    @Test
     void testMethodCallExpressionSpreadDot() {
-        isRendered """
+        isRendered '''
 assert ["1", "22"]*.size() == null
                     |      |
                     [1, 2] false
-        """, {
+        ''', { ->
             assert ["1", "22"]*.size() == null
         }
     }
 
+    @Test
     void testMethodCallExpressionSafe() {
-        isRendered """
+        isRendered '''
 assert a?.foo()
        |  |
        |  null
        null
-        """, {
+        ''', { ->
             def a = null
             assert a?.foo()
         }
     }
 
+    @Test
     void testStaticMethodCallExpression() {
-        isRendered """
+        isRendered '''
 assert min(a,b) == null
        |   | |  |
        1   1 2  false
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             assert min(a,b) == null
         }
     }
 
+    @Test
     void testConstructorCallExpression() {
-        isRendered """
+        isRendered '''
 assert new ArrayList(a) == null
        |             |  |
        []            1  false
-        """, {
+        ''', { ->
             def a = 1
             assert new ArrayList(a) == null
         }
 
     }
 
+    @Test
     void testTernaryExpression() {
-        isRendered """
+        isRendered '''
 assert a ? b : c
        |   |
        1   0
-        """, {
+        ''', { ->
             def a = 1
             def b = 0
             def c = 1
             assert a ? b : c
         }
 
-        isRendered """
+        isRendered '''
 assert a ? b : c
        |       |
        0       0
-        """, {
+        ''', { ->
             def a = 0
             def b = 1
             def c = 0
@@ -177,126 +192,134 @@ assert a ? b : c
         }
     }
 
+    @Test
     void testShortTernaryExpression() {
-        isRendered """
+        isRendered '''
 assert (a ?: b) == null
         |       |
         1       false
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             assert (a ?: b) == null
         }
 
-        isRendered """
+        isRendered '''
 assert a ?: b
        |    |
        0    0
-        """, {
+        ''', { ->
             def a = 0
             def b = 0
             assert a ?: b
         }
     }
 
+    @Test
     void testBinaryExpression() {
-        isRendered """
+        isRendered '''
 assert a * b
        | | |
        0 0 1
-        """, {
+        ''', { ->
             def a = 0
             def b = 1
             assert a * b
         }
 
-        isRendered """
+        isRendered '''
 assert a[b]
        |||
        ||0
        |false
        [false]
-        """, {
+        ''', { ->
             def a = [false]
             def b = 0
             assert a[b]
         }
     }
 
+    @Test
     void testPrefixExpression() {
-        isRendered """
+        isRendered '''
 assert ++x == null
        | | |
        1 0 false
-        """, {
+        ''', { ->
             def x = 0
             assert ++x == null
         }
     }
 
+    @Test
     void testPostfixExpression() {
-        isRendered """
+        isRendered '''
 assert x++ == null
        ||  |
        |0  false
        0
-        """, {
+        ''', { ->
             def x = 0
             assert x++ == null
         }
     }
 
+    @Test
     void testBooleanExpression() {
-        isRendered """
+        isRendered '''
 assert a
        |
        null
-        """, {
+        ''', { ->
             def a = null
             assert a
         }
     }
 
+    @Test
     void testClosureExpression() {
-        isRendered """
+        isRendered '''
 assert { 1 + 2 } == null
                  |
                  false
-        """, {
+        ''', { ->
             assert { 1 + 2 } == null
         }
     }
 
+    @Test
     void testTupleExpression() {
         // TupleExpression is only used on LHS of (multi-)assignment,
         // but LHS of assignment is not rewritten
-        isRendered """
+        isRendered '''
 assert ((a,b) = [1,2]) && false
               |        |
               [1, 2]   false
-        """, {
+        ''', { ->
           def a
           def b
           assert ((a,b) = [1,2]) && false
         }
     }
 
+    @Test
     void testMapExpression() {
-        isRendered """
+        isRendered '''
 assert [a:b, c:d] == null
           |    |  |
           2    4  false
-        """, {
+        ''', { ->
             def b = 2
             def d = 4
             assert [a:b, c:d] == null
         }
 
-        isRendered """
+        isRendered '''
 assert [(a):b, (c):d] == null
         |   |  |   |  |
         1   2  3   4  false
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             def c = 3
@@ -305,12 +328,13 @@ assert [(a):b, (c):d] == null
         }
     }
 
+    @Test
     void testListExpression() {
-        isRendered """
+        isRendered '''
 assert [a,b,c] == null
         | | |  |
         1 2 3  false
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             def c = 3
@@ -318,111 +342,165 @@ assert [a,b,c] == null
         }
     }
 
+    @Test
     void testRangeExpression() {
-        isRendered """
+        isRendered '''
 assert (a..b) == null
         |  |  |
         1  2  false
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             assert (a..b) == null
         }
 
-        isRendered """
+        isRendered '''
 assert (a..<b) == null
         |   |  |
         1   2  false
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             assert (a..<b) == null
         }
     }
 
+    @Test
     void testPropertyExpression() {
-        isRendered """
+        isRendered '''
 assert a.bytes == null
        | |     |
        | [65]  false
        'A'
-
-        """, {
+        ''', { ->
             def a = 'A'
             assert a.bytes == null
         }
 
-        isRendered """
+        isRendered '''
 assert Integer.MIN_VALUE == null
                |         |
                |         false
                -2147483648
-        """, {
+        ''', { ->
             assert Integer.MIN_VALUE == null
         }
     }
 
+    @Test
     void testAttributeExpression() {
-        isRendered """
+        isRendered '''
 assert holder.@x
        |       |
        h       0
-        """, {
+        ''', { ->
             def holder = new Holder()
             assert holder.@x
         }
+
+        isRendered '''
+assert holder.@x != 0
+       |       | |
+       h       0 false
+        ''', { ->
+            def holder = new Holder()
+            assert holder.@x != 0
+        }
+
+        isRendered '''
+assert 0 != holder.@x
+         |  |       |
+         |  h       0
+         false
+        ''', { ->
+            def holder = new Holder()
+            assert 0 != holder.@x
+        }
+
+        isRendered '''
+assert this.@field == 0
+             |     |
+             1     false
+        ''', { ->
+            new Runnable() {
+                private int field = 1
+                @Override
+                public void run() {
+                    assert this.@field == 0
+                }
+            }.run()
+        }
+
+        isRendered '''
+assert 0 == this.@field
+         |        |
+         false    1
+        ''', { ->
+            new Runnable() {
+                private int field = 1
+                @Override
+                public void run() {
+                    assert 0 == this.@field
+                }
+            }.run()
+        }
     }
 
+    @Test
     void testMethodPointerExpression() {
-        isRendered """
+        isRendered '''
 assert a.&"\$b" == null
        |    |  |
        []   |  false
             'get'
-        """, {
+        ''', { ->
             def a = []
             def b = "get"
             assert a.&"$b" == null
         }
     }
 
+    @Test
     void testConstantExpression() {
-        isRendered """
+        isRendered '''
 assert 1 == "abc"
          |
          false
-        """, {
+        ''', { ->
             assert 1 == "abc"
         }
     }
 
+    @Test
     void testClassExpression() {
-        isRendered """
+        isRendered '''
 assert List == String
             |
             false
-        """, {
+        ''', { ->
             assert List == String
         }
     }
 
+    @Test
     void testVariableExpression() {
-        isRendered """
+        isRendered '''
 assert x
        |
        0
-        """, {
+        ''', { ->
             def x = 0
             assert x
         }
     }
 
+    @Test
     void testGStringExpression() {
         isRendered '''
 assert "$a and ${b + c}" == null
          |       | | |   |
          1       2 5 3   false
-        ''', {
+        ''', { ->
             def a = 1
             def b = 2
             def c = 3
@@ -430,138 +508,143 @@ assert "$a and ${b + c}" == null
         }
     }
 
+    @Test
     void testArrayExpression() {
-        isRendered """
+        isRendered '''
 assert new int[a][b] == null
                |  |  |
                1  2  false
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             assert new int[a][b] == null
         }
     }
 
-    private two(a, b) { 0 }
-
+    @Test
     void testSpreadExpression() {
-        isRendered """
+        isRendered '''
 assert two(*a)
        |    |
        0    [1, 2]
-        """, {
+        ''', { ->
             def a = [1, 2]
             assert two(*a)
         }
 
-        isRendered """
+        isRendered '''
 assert [1, *a] == null
             |  |
             |  false
             [2, 3]
-        """, {
+        ''', { ->
             def a = [2, 3]
             assert [1, *a] == null
         }
     }
 
+    @Test
     void testSpreadMapExpression() {
-        isRendered """
+        isRendered '''
 assert one(*:m)
        |     |
        0     ['a':1, 'b':2]
-        """, {
+        ''', { ->
             def m = [a:1, b:2]
             assert one(*:m)
         }
 
-        isRendered """
+        isRendered '''
 assert [a:1, *:m] == null
                |  |
                |  false
                ['b':2, 'c':3]
-        """, {
+        ''', { ->
             def m = [b:2, c:3]
             assert [a:1, *:m] == null
         }
     }
 
+    @Test
     void testNotExpression() {
-        isRendered """
+        isRendered '''
 assert !a
        ||
        |true
        false
-        """, {
+        ''', { ->
             def a = true
             assert !a
         }
     }
 
+    @Test
     void testUnaryMinusExpression() {
-        isRendered """
+        isRendered '''
 assert -a == null
        || |
        |1 false
        -1
-        """, {
+        ''', { ->
             def a = 1
             assert -a == null
         }
     }
 
+    @Test
     void testUnaryPlusExpression() {
-        isRendered """
+        isRendered '''
 assert +a == null
        || |
        |1 false
        1
-        """, {
+        ''', { ->
             def a = 1
             assert +a == null
         }
     }
 
+    @Test
     void testBitwiseNegationExpression() {
-        isRendered """
+        isRendered '''
 assert ~a == null
        || |
        |1 false
        -2
-        """, {
+        ''', { ->
             def a = 1
             assert ~a == null
         }
     }
 
+    @Test
     void testCastExpression() {
-        isRendered """
+        isRendered '''
 assert (List)a
              |
              null
-        """, {
+        ''', { ->
             def a = null
             assert (List)a
         }
 
-        isRendered """
+        isRendered '''
 assert a as int[]
        |
        null
-        """, {
+        ''', { ->
             def a = null
             assert a as int[]
         }
     }
 
-    private three(a,b,c) { 0 }
-
+    @Test
     void testArgumentListExpression() {
-        isRendered """
+        isRendered '''
 assert three(a, b,c)
        |     |  | |
        0     1  2 3
-        """, {
+        ''', { ->
             def a = 1
             def b = 2
             def c = 3
@@ -569,6 +652,7 @@ assert three(a, b,c)
         }
     }
 
+    @Test
     void testExplicitClosureCall() {
         def func = { it }
 
@@ -577,7 +661,7 @@ assert func.call(42) == null
        |    |        |
        |    42       false
        ${func.toString()}
-        """, {
+        """, { ->
             assert func.call(42) == null
         }
     }
@@ -612,5 +696,5 @@ assert func.call(42) == null
 @groovy.transform.PackageScope class Holder {
     public x = 0
     def getX() { 9 }
-    String toString() { "h" }
+    String toString() { 'h' }
 }
diff --git a/src/test/org/codehaus/groovy/runtime/powerassert/ValueRenderingTest.groovy b/src/test/org/codehaus/groovy/runtime/powerassert/ValueRenderingTest.groovy
index 3c69d96..7f08416 100644
--- a/src/test/org/codehaus/groovy/runtime/powerassert/ValueRenderingTest.groovy
+++ b/src/test/org/codehaus/groovy/runtime/powerassert/ValueRenderingTest.groovy
@@ -18,85 +18,92 @@
  */
 package org.codehaus.groovy.runtime.powerassert
 
-import groovy.test.GroovyTestCase
+import org.junit.Test
 
-import static AssertionTestUtil.*
+import static org.codehaus.groovy.runtime.powerassert.AssertionTestUtil.isRendered
 
 /**
  * Tests rendering of individual values.
  */
+final class ValueRenderingTest {
 
-class ValueRenderingTest extends GroovyTestCase {
+    @Test
     void testNullValue() {
-        isRendered """
+        isRendered '''
 assert x
        |
        null
-        """, {
+        ''', { ->
             def x = null
             assert x
         }
     }
 
+    @Test
     void testCharValue() {
-        isRendered """
+        isRendered '''
 assert x == null
        | |
        c false
-        """, {
+        ''', { ->
             def x = "c" as char
             assert x == null
         }
     }
 
+    @Test
     void testStringValue() {
-        isRendered """
+        isRendered '''
 assert x == null
        | |
        | false
        'foo'
-        """, {
+        ''', { ->
             def x = "foo"
             assert x == null
         }
     }
 
+    @Test
     void testMultiLineStringValue() {
-        isRendered """
+        isRendered '''
 assert null == x
             |  |
             |  'one\\ntwo\\rthree\\r\\nfour'
             false
-        """, {
+        ''', { ->
             def x = "one\ntwo\rthree\r\nfour"
             assert null == x
         }
     }
 
+    @Test
     void testPrimitiveArrayValue() {
-        isRendered """
+        isRendered '''
 assert x == null
        | |
        | false
        [1, 2]
-        """, {
+        ''', { ->
             def x = [1, 2] as int[]
             assert x == null
         }
     }
 
+    @Test
     void testObjectArrayValue() {
-        isRendered """
+        isRendered '''
 assert x == null
        | |
        | false
        ['one', 'two']
-        """, {
+        ''', { ->
             def x = ["one", "two"] as String[]
             assert x == null
         }
     }
 
+    @Test
     void testEmptyStringValue() {
         def x = new String()
 
@@ -105,11 +112,12 @@ assert x == null
        | |
        | false
        ''
-        ''', {
+        ''', { ->
             assert x == null
         }
     }
 
+    @Test
     void testEmptyStringBuilderValue() {
         def x = new StringBuilder()
 
@@ -118,11 +126,12 @@ assert x == null
        | |
        | false
        ""
-        ''', {
+        ''', { ->
             assert x == null
         }
     }
 
+    @Test
     void testEmptyStringBufferValue() {
         def x = new StringBuffer()
 
@@ -131,37 +140,40 @@ assert x == null
        | |
        | false
        ""
-        ''', {
+        ''', { ->
             assert x == null
         }
     }
 
+    @Test
     void testSingleLineToString() {
-        isRendered """
+        isRendered '''
 assert x == null
        | |
        | false
        single line
-        """, {
+        ''', { ->
             def x = new SingleLineToString()
             assert x == null
         }
     }
 
+    @Test
     void testMultiLineToString() {
-        isRendered """
+        isRendered '''
 assert x == null
        | |
        | false
        mul
        tiple
           lines
-        """, {
+        ''', { ->
             def x = new MultiLineToString()
             assert x == null
         }
     }
 
+    @Test
     void testNullToString() {
         def x = new NullToString()
 
@@ -170,11 +182,12 @@ assert x == null
        | |
        | false
        ${x.objectToString()} (toString() == null)
-        """, {
+        """, { ->
             assert x == null
         }
     }
 
+    @Test
     void testEmptyToString() {
         def x = new EmptyToString()
 
@@ -183,11 +196,12 @@ assert x == null
        | |
        | false
        ${x.objectToString()} (toString() == \"\")
-        """, {
+        """, { ->
             assert x == null
         }
     }
 
+    @Test
     void testThrowingToString() {
         def x = new ThrowingToString()
 
@@ -196,46 +210,53 @@ assert x == null
        | |
        | false
        ${x.objectToString()} (toString() threw java.lang.UnsupportedOperationException)
-        """, {
+        """, { ->
             assert x == null
         }
     }
-}
 
-@groovy.transform.PackageScope class SingleLineToString {
-    String toString() {
-        "single line"
-    }
-}
+    //--------------------------------------------------------------------------
 
-@groovy.transform.PackageScope class MultiLineToString {
-    String toString() {
-        "mul\ntiple\n   lines"
+    private static class SingleLineToString {
+        @Override
+        String toString() {
+            'single line'
+        }
     }
-}
 
-@groovy.transform.PackageScope class NullToString {
-    String objectToString() {
-        super.toString()
+    private static class MultiLineToString {
+        @Override
+        String toString() {
+            'mul\ntiple\n   lines'
+        }
     }
 
-    String toString() { null }
-}
+    private static class NullToString {
+        String objectToString() {
+            super.toString()
+        }
 
-@groovy.transform.PackageScope class EmptyToString {
-    String objectToString() {
-        super.toString()
+        @Override
+        String toString() { null }
     }
 
-    String toString() { "" }
-}
+    private static class EmptyToString {
+        String objectToString() {
+            super.toString()
+        }
 
-@groovy.transform.PackageScope class ThrowingToString {
-    String objectToString() {
-        super.toString()
+        @Override
+        String toString() { '' }
     }
 
-    String toString() {
-        throw new UnsupportedOperationException()
+    private static class ThrowingToString {
+        String objectToString() {
+            super.toString()
+        }
+
+        @Override
+        String toString() {
+            throw new UnsupportedOperationException()
+        }
     }
 }