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 2019/04/19 01:43:41 UTC

[groovy] branch GROOVY_2_5_X updated (87c09dc -> 3151547)

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

paulk pushed a change to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git.


    from 87c09dc  GROOVY-9080: MarkupTemplateEngine uses invalid XML entity for escaping double quotes
     new c599d10  fix unintended illegal access
     new b5692a1  more consistent JDK version checking in tests
     new 3b389ca  more consistent JDK version checking in tests (fix for JDK11+)
     new a1fe0d8  fix unintended illegal access
     new 9b93f95  fix unintended illegal access
     new 3d5592c  more consistent JDK version checking in tests
     new 32b6272  fix unintended illegal access
     new 6be1e3b  Allow illegal access scenarios to be tested using -Pgroovy.force.illegal.access=true property.
     new 7a774a3  fix unintended illegal access
     new 2d9b3e1  fix unintended illegal access
     new f40e42b  fix unintended illegal access
     new 5fa977a  fix unintended illegal access
     new ab951bb  fix unintended illegal access
     new a803d73  fix unintended illegal access
     new 4bc809d  fix unintended illegal access
     new 2b56a16  fix unintended illegal access
     new 3151547  avoid accessing all properties to see if frame has title set

The 17 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 gradle/test.gradle                                 |   2 +
 src/test/gls/enums/EnumTest.groovy                 |   2 +-
 ...ug.groovy => IllegalAccessScenariosTest.groovy} |  76 +-
 src/test/groovy/PrimitiveTypesTest.groovy          |  21 +-
 src/test/groovy/beans/BindableTransformTest.groovy |   7 +-
 .../bugs/BadLineNumberOnExceptionBugTest.groovy    |   4 +-
 src/test/groovy/bugs/Groovy3464Bug.groovy          |   5 +-
 src/test/groovy/bugs/Groovy8764Bug.groovy          |  12 +-
 ...SocketGMClosureParamTypeInferenceSTCTest.groovy |   2 +-
 src/test/groovy/ui/GroovyMainTest.groovy           |   4 +
 src/test/groovy/util/GroovyScriptEngineTest.groovy |   5 +-
 src/test/groovy/util/ObjectGraphBuilderTest.groovy | 788 ++++++++++-----------
 .../groovy/ast/CodeVisitorSupportTest.groovy       |   4 +-
 .../powerassert/AssertionRenderingTest.groovy      |  12 +-
 .../runtime/powerassert/EvaluationTest.groovy      |   2 +-
 .../src/main/groovy/groovy/ui/Console.groovy       |   2 +-
 .../swingui/ScriptToTreeNodeAdapterTest.groovy     |  14 +-
 .../groovy/jmx/builder/JmxBeansFactoryTest.groovy  |   2 +-
 .../src/test/groovy/groovy/sql/SqlTest.groovy      |   2 +-
 .../groovy/groovy/swing/SwingBuilderTest.groovy    |   4 +-
 20 files changed, 493 insertions(+), 477 deletions(-)
 copy src/test/groovy/{bugs/Groovy4107Bug.groovy => IllegalAccessScenariosTest.groovy} (52%)


[groovy] 04/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a1fe0d876afef4af1147da9a2eccd4b043aecc52
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 17 13:43:13 2019 +1000

    fix unintended illegal access
---
 subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlTest.groovy | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlTest.groovy b/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlTest.groovy
index e066120..9bf0b57 100644
--- a/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlTest.groovy
+++ b/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlTest.groovy
@@ -183,7 +183,7 @@ class SqlTest extends GroovyTestCase {
                 metaData.getColumnName(it).toLowerCase()
             }
         }
-        assert data.size == 2 && !(data - ['firstname', 'lastname'])
+        assert data.size() == 2 && !(data - ['firstname', 'lastname'])
     }
 
     void testCallMethodFromObjectOnGroovyResultSet() {


[groovy] 12/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5fa977a770755c29a8d74fa0e62344e90837b8d3
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 21:44:33 2019 +1000

    fix unintended illegal access
---
 src/test/groovy/ui/GroovyMainTest.groovy           | 4 ++++
 src/test/groovy/util/GroovyScriptEngineTest.groovy | 5 ++++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/test/groovy/ui/GroovyMainTest.groovy b/src/test/groovy/ui/GroovyMainTest.groovy
index 018bc41..6b8ed29 100644
--- a/src/test/groovy/ui/GroovyMainTest.groovy
+++ b/src/test/groovy/ui/GroovyMainTest.groovy
@@ -18,6 +18,8 @@
  */
 package groovy.ui
 
+import static groovy.test.GroovyAssert.isAtLeastJdk
+
 class GroovyMainTest extends GroovyTestCase {
     private baos = new ByteArrayOutputStream()
     private ps = new PrintStream(baos)
@@ -138,6 +140,8 @@ assert new MyConcreteClass() != null"""
     }
 
     void testGroovyASTDump() {
+        // current xstream causes illegal access errors on JDK9+ - skip on those JDK versions, get coverage on older versions
+        if (isAtLeastJdk('9.0')) return
 
         def temporaryDirectory = new File("target/tmp/testGroovyXMLAstGeneration/")
         temporaryDirectory.mkdirs()
diff --git a/src/test/groovy/util/GroovyScriptEngineTest.groovy b/src/test/groovy/util/GroovyScriptEngineTest.groovy
index b62e589..568173e 100644
--- a/src/test/groovy/util/GroovyScriptEngineTest.groovy
+++ b/src/test/groovy/util/GroovyScriptEngineTest.groovy
@@ -30,6 +30,8 @@ import org.junit.rules.TemporaryFolder
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 
+import static groovy.test.GroovyAssert.isAtLeastJdk
+
 @RunWith(JUnit4)
 class GroovyScriptEngineTest extends GroovyTestCase {
 
@@ -38,9 +40,10 @@ class GroovyScriptEngineTest extends GroovyTestCase {
 
     @Test
     void createASTDumpWhenScriptIsLoadedByName() {
+        // current xstream causes illegal access errors on JDK9+ - skip on those JDK versions, get coverage on older versions
+        if (isAtLeastJdk('9.0')) return
 
         def scriptFile = temporaryFolder.newFile('Script1.groovy')
-
         scriptFile << "assert 1 + 1 == 2" // the script just has to have _some_ content
 
         try {


[groovy] 09/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 7a774a313dbd8be9b221e54a74a3c5a860d0fc07
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 13:32:28 2019 +1000

    fix unintended illegal access
---
 .../groovy-swing/src/test/groovy/groovy/swing/SwingBuilderTest.groovy | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/subprojects/groovy-swing/src/test/groovy/groovy/swing/SwingBuilderTest.groovy b/subprojects/groovy-swing/src/test/groovy/groovy/swing/SwingBuilderTest.groovy
index 9e6e1b1..61537dd 100644
--- a/subprojects/groovy-swing/src/test/groovy/groovy/swing/SwingBuilderTest.groovy
+++ b/subprojects/groovy-swing/src/test/groovy/groovy/swing/SwingBuilderTest.groovy
@@ -379,8 +379,8 @@ class SwingBuilderTest extends GroovySwingTestCase {
 
             def swing = new SwingBuilder()
             swing.panel(layout: new BorderLayout()) {
-                label(id: 'label0', text: 'Name0', mnemonic: 48)
-                label(id: 'label1', text: 'Name1', mnemonic: 'N')
+                label(id: 'label0', text: 'Name0', displayedMnemonic: 48)
+                label(id: 'label1', text: 'Name1', displayedMnemonic: 'N' as char)
             }
             int expected0 = '0'
             int expected1 = 'N'


[groovy] 10/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2d9b3e1f8eb1a064154924f263ef28b574015234
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 20:57:51 2019 +1000

    fix unintended illegal access
---
 src/test/gls/enums/EnumTest.groovy | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/gls/enums/EnumTest.groovy b/src/test/gls/enums/EnumTest.groovy
index 684f55e..4f538d2 100644
--- a/src/test/gls/enums/EnumTest.groovy
+++ b/src/test/gls/enums/EnumTest.groovy
@@ -182,7 +182,7 @@ class EnumTest extends CompilableTestSupport {
     // the fix for GROOVY-3161
     def void testStaticEnumFieldWithEnumValues() {
         def allColors = GroovyColors3161.ALL_COLORS
-        assert allColors.size == 3
+        assert allColors.size() == 3
         assert allColors[0] == GroovyColors3161.red
         assert allColors[1] == GroovyColors3161.blue
         assert allColors[2] == GroovyColors3161.green


[groovy] 03/17: more consistent JDK version checking in tests (fix for JDK11+)

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3b389caeb60b9d13fe2b4054e90eead837c82e74
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 17 12:17:59 2019 +1000

    more consistent JDK version checking in tests (fix for JDK11+)


[groovy] 14/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a803d73a53cc27194b252b7ac85abe2c10ee3bc6
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 22:19:32 2019 +1000

    fix unintended illegal access
---
 src/test/groovy/beans/BindableTransformTest.groovy | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/test/groovy/beans/BindableTransformTest.groovy b/src/test/groovy/beans/BindableTransformTest.groovy
index 9424450..a91fbb4 100644
--- a/src/test/groovy/beans/BindableTransformTest.groovy
+++ b/src/test/groovy/beans/BindableTransformTest.groovy
@@ -23,7 +23,6 @@ import org.codehaus.groovy.control.CompilationFailedException
 import java.beans.PropertyChangeListener
 
 import static java.lang.reflect.Modifier.isPublic
-import static java.lang.reflect.Modifier.isSynthetic
 
 class BindableTransformTest extends GroovyShellTestCase {
 
@@ -352,9 +351,9 @@ class BindableTransformTest extends GroovyShellTestCase {
 
     void testPropertyChangeMethodsNotSynthetic() {
         def clazz = new GroovyClassLoader().parseClass('class MyBean { @groovy.beans.Bindable String dummy }', 'dummyName')
-        def modifiers = clazz.getMethod('addPropertyChangeListener', PropertyChangeListener).modifiers
-        assert isPublic(modifiers)
-        assert !isSynthetic(modifiers)
+        def method = clazz.getMethod('addPropertyChangeListener', PropertyChangeListener)
+        assert isPublic(method.modifiers)
+        assert !method.isSynthetic()
     }
 
     void testPropertyChangeMethodWithCompileStatic() {


[groovy] 11/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f40e42b9073ab82ef113df305470f6cc2ce69f39
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 21:25:58 2019 +1000

    fix unintended illegal access
---
 .../inspect/swingui/ScriptToTreeNodeAdapterTest.groovy     | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
index 29dff39..2e64fea 100644
--- a/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
+++ b/subprojects/groovy-console/src/test/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapterTest.groovy
@@ -84,9 +84,10 @@ class ScriptToTreeNodeAdapterTest extends GroovyTestCase {
      */
     private assertMapEntry(mapEntry, expectedKey, expectedValue) {
         assertNotNull('Could not locate 1st MapEntryExpression in AST', mapEntry)
-        assertEquals('Wrong # map entries', 2, mapEntry.children.size())
-        assertEquals('Wrong key', expectedKey, mapEntry.children[0].toString())
-        assertEquals('Wrong value', expectedValue, mapEntry.children[1].toString())
+        def children = mapEntry.children().toList()
+        assertEquals('Wrong # map entries', 2, children.size())
+        assertEquals('Wrong key', expectedKey, children[0].toString())
+        assertEquals('Wrong value', expectedValue, children[1].toString())
     }
 
     /**
@@ -222,10 +223,11 @@ class ScriptToTreeNodeAdapterTest extends GroovyTestCase {
         }
         assertNotNull('Could not locate NamedArgumentListExpression in AST', namedArgList)
 
-        assertEquals('Wrong # named arguments', 2, namedArgList.children.size())
+        def children = namedArgList.children().toList()
+        assertEquals('Wrong # named arguments', 2, children.size())
 
-        assertMapEntry(namedArgList.children[0], 'Constant - foo : java.lang.String', 'Constant - bar : java.lang.String')
-        assertMapEntry(namedArgList.children[1], 'Constant - baz : java.lang.String', 'Constant - qux : java.lang.String')
+        assertMapEntry(children[0], 'Constant - foo : java.lang.String', 'Constant - bar : java.lang.String')
+        assertMapEntry(children[1], 'Constant - baz : java.lang.String', 'Constant - qux : java.lang.String')
     }
 
     void testDynamicVariable() {


[groovy] 17/17: avoid accessing all properties to see if frame has title set

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 31515477bb2bf991bf1e0f2f0d05e09c2714c6ad
Author: Paul King <pa...@asert.com.au>
AuthorDate: Fri Apr 19 09:43:42 2019 +1000

    avoid accessing all properties to see if frame has title set
---
 subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy b/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy
index 3d0e976..0a63822 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/ui/Console.groovy
@@ -1516,7 +1516,7 @@ class Console implements CaretListener, HyperlinkListener, ComponentListener, Fo
     }
 
     void updateTitle() {
-        if (frame.properties.containsKey('title')) {
+        if (frame.title) {
             String title = 'GroovyConsole'
             if (indy) {
                 title += ' (Indy)'


[groovy] 15/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4bc809d9a101232c1300bd0aa74fcf84314258ce
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 23:56:42 2019 +1000

    fix unintended illegal access
---
 src/test/groovy/bugs/Groovy3464Bug.groovy | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/test/groovy/bugs/Groovy3464Bug.groovy b/src/test/groovy/bugs/Groovy3464Bug.groovy
index 1171285..83ca9bf 100644
--- a/src/test/groovy/bugs/Groovy3464Bug.groovy
+++ b/src/test/groovy/bugs/Groovy3464Bug.groovy
@@ -40,8 +40,8 @@ class Groovy3464Bug extends GroovyTestCase {
             jointCompilationOptions = [stubDir: createTempDir()]
         }
 
-        def groovyFile = new File('GroovyThing.groovy', config.targetDirectory)
-        def javaFile = new File('JavaThing.java', config.targetDirectory)
+        def groovyFile = new File(config.targetDirectory, 'GroovyThing.groovy')
+        def javaFile = new File(config.targetDirectory, 'JavaThing.java')
 
         groovyFile << '''
             class GroovyThing {
@@ -110,4 +110,3 @@ class Groovy3464Bug extends GroovyTestCase {
         return tempDirectory
     }
 }
-


[groovy] 16/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2b56a16cd6ceb5e92b1eb1d4aa9b249243040661
Author: Paul King <pa...@asert.com.au>
AuthorDate: Fri Apr 19 00:02:39 2019 +1000

    fix unintended illegal access
---
 src/test/groovy/bugs/BadLineNumberOnExceptionBugTest.groovy | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/test/groovy/bugs/BadLineNumberOnExceptionBugTest.groovy b/src/test/groovy/bugs/BadLineNumberOnExceptionBugTest.groovy
index 4be9613..667852a 100644
--- a/src/test/groovy/bugs/BadLineNumberOnExceptionBugTest.groovy
+++ b/src/test/groovy/bugs/BadLineNumberOnExceptionBugTest.groovy
@@ -45,7 +45,7 @@ class BadLineNumberOnExceptionBugTest extends GroovyTestCase {
 
                 assert false
             } catch (MissingMethodException e) {
-                def scriptTraceElement = e.stackTrace.find { it.declaringClass.startsWith(GroovyTestCase.TEST_SCRIPT_NAME_PREFIX) }
+                def scriptTraceElement = e.stackTrace.find { it.className.startsWith(GroovyTestCase.TEST_SCRIPT_NAME_PREFIX) }
                 assert 9 == scriptTraceElement.lineNumber
             }
         """
@@ -65,7 +65,7 @@ class BadLineNumberOnExceptionBugTest extends GroovyTestCase {
 
                 assert false
             } catch (MissingPropertyException e) {
-                def scriptTraceElement = e.stackTrace.find { it.declaringClass.startsWith(GroovyTestCase.TEST_SCRIPT_NAME_PREFIX) }
+                def scriptTraceElement = e.stackTrace.find { it.className.startsWith(GroovyTestCase.TEST_SCRIPT_NAME_PREFIX) }
                 assert 3 == scriptTraceElement.lineNumber
             }
         """


[groovy] 02/17: more consistent JDK version checking in tests

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b5692a1a17c2956264feefaeb5917069a3f32d3e
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 17 11:28:35 2019 +1000

    more consistent JDK version checking in tests


[groovy] 06/17: more consistent JDK version checking in tests

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3d5592c9dad61ba52ff221e58e415b2d7cebf08d
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 17 20:44:59 2019 +1000

    more consistent JDK version checking in tests


[groovy] 01/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c599d10fbc24d052e7952197885b255e8ba5c2f8
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 17 09:32:23 2019 +1000

    fix unintended illegal access
---
 src/test/groovy/bugs/Groovy8764Bug.groovy          |  12 +-
 src/test/groovy/util/ObjectGraphBuilderTest.groovy | 788 ++++++++++-----------
 .../groovy/ast/CodeVisitorSupportTest.groovy       |   4 +-
 .../powerassert/AssertionRenderingTest.groovy      |  12 +-
 .../runtime/powerassert/EvaluationTest.groovy      |   2 +-
 5 files changed, 412 insertions(+), 406 deletions(-)

diff --git a/src/test/groovy/bugs/Groovy8764Bug.groovy b/src/test/groovy/bugs/Groovy8764Bug.groovy
index 5a842f2..a3589b4 100644
--- a/src/test/groovy/bugs/Groovy8764Bug.groovy
+++ b/src/test/groovy/bugs/Groovy8764Bug.groovy
@@ -45,8 +45,9 @@ class Groovy8764Bug extends GroovyTestCase {
     void testDgmMethodInClosureInInnerClass() {
         if (System.getProperty('java.specification.version') < '1.8') return
         assertScript '''
-        import groovy.transform.*
-        import java.util.function.Function
+            import groovy.transform.*
+            import java.util.function.Function
+            import static groovy.test.GroovyAssert.isAtLeastJdk
 
             @CompileStatic
             class Outer {
@@ -63,7 +64,12 @@ class Groovy8764Bug extends GroovyTestCase {
 
             def oi = new Outer.Inner()
             assert !oi.test(0)
-            assert oi.test(1).value == 1
+            if (isAtLeastJdk('9.0')) {
+                assert oi.test(1).get() == 1
+            } else {
+                // confirm accessing private field okay on older JDK versions
+                assert oi.test(1).value == 1
+            }
         '''
     }
 }
diff --git a/src/test/groovy/util/ObjectGraphBuilderTest.groovy b/src/test/groovy/util/ObjectGraphBuilderTest.groovy
index 44f594a..3ba08fd 100644
--- a/src/test/groovy/util/ObjectGraphBuilderTest.groovy
+++ b/src/test/groovy/util/ObjectGraphBuilderTest.groovy
@@ -1,395 +1,395 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package groovy.util
-
-class ObjectGraphBuilderTest extends GroovyTestCase {
-   ObjectGraphBuilder builder
-   ObjectGraphBuilder reflectionBuilder
-
-   void testCompany() {
-      def expected = new Company( name: 'ACME', employees: [] )
-      def actual = builder.company( name: 'ACME', employees: [] )
-      assert actual != null
-      //assert actual.class == Company
-      assert actual.name == expected.name
-      assert actual.address == expected.address
-      assert actual.employees == expected.employees
-   }
-
-   void testCompanyAndAddress() {
-      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      def expectedCompany = new Company( name: 'ACME', employees: [], address: expectedAddress )
-      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
-         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      }
-      assert actualCompany != null
-      //assert actualCompany.class == Company
-      assert actualCompany.name == expectedCompany.name
-      assert actualCompany.employees == expectedCompany.employees
-      def actualAddress = actualCompany.address
-      assert actualAddress != null
-      //assert actualAddress.class == Address
-      assert actualAddress.line1 == expectedAddress.line1
-      assert actualAddress.line2 == expectedAddress.line2
-      assert actualAddress.zip == expectedAddress.zip
-      assert actualAddress.state == expectedAddress.state
-   }
-
-   void testCompanyAndEmployeeAndAddress() {
-      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      def expectedEmployee = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
-      def expectedCompany = new Company( name: 'ACME' )
-      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
-         employee(  name: 'Duke', employeeId: 1 ) {
-            address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-         }
-      }
-      assert actualCompany != null
-      //assert actualCompany.class == Company
-      assert actualCompany.name == expectedCompany.name
-      assert actualCompany.employees.size() == 1
-      def actualEmployee = actualCompany.employees[0]
-      //assert actualEmployee.class == Employee
-      assert actualEmployee.name == expectedEmployee.name
-      assert actualEmployee.employeeId == expectedEmployee.employeeId
-      def actualAddress = actualEmployee.address
-      assert actualAddress != null
-      //assert actualAddress.class == Address
-      assert actualAddress.line1 == expectedAddress.line1
-      assert actualAddress.line2 == expectedAddress.line2
-      assert actualAddress.zip == expectedAddress.zip
-      assert actualAddress.state == expectedAddress.state
-   }
-
-   void testCompanyAndEmployeeSameAddress() {
-      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      def expectedEmployee = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
-      def expectedCompany = new Company( name: 'ACME' )
-      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
-         address( id: 'a1', line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-         employee(  name: 'Duke', employeeId: 1, address: a1 )
-      }
-      assert actualCompany != null
-      //assert actualCompany.class == Company
-      assert actualCompany.name == expectedCompany.name
-      assert actualCompany.employees.size() == 1
-      def actualEmployee = actualCompany.employees[0]
-      //assert actualEmployee.class == Employee
-      assert actualEmployee.name == expectedEmployee.name
-      assert actualEmployee.employeeId == expectedEmployee.employeeId
-      assert actualCompany.address == actualEmployee.address
-   }
-
-   void testCompanyAndEmployeeSameAddressWithRef() {
-      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      def expectedEmployee = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
-      def expectedCompany = new Company( name: 'ACME' )
-      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
-         address( id: 'a1', line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-         employee(  name: 'Duke', employeeId: 1 ){
-            address( refId: 'a1' )
-         }
-      }
-      assert actualCompany != null
-      //assert actualCompany.class == Company
-      assert actualCompany.name == expectedCompany.name
-      assert actualCompany.employees.size() == 1
-      def actualEmployee = actualCompany.employees[0]
-      //assert actualEmployee.class == Employee
-      assert actualEmployee.name == expectedEmployee.name
-      assert actualEmployee.employeeId == expectedEmployee.employeeId
-      assert actualCompany.address == actualEmployee.address
-      assert actualEmployee.company == actualCompany
-   }
-
-   void testCompanyAndManyEmployees() {
-      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
-         3.times {
-            employee(  name: "Duke $it", employeeId: it )
-         }
-      }
-      assert actualCompany != null
-      assert actualCompany.employees.size() == 3
-      3.times {
-         assert actualCompany.employees[it].name == "Duke $it"
-      }
-      //assert actualCompany.employees*.getClass() == [Employee,Employee,Employee]
-   }
-
-   void testStringfiedIdentifierResolver() {
-      builder.identifierResolver = "uid"
-      def company = builder.company( name: 'ACME', employees: [], uid: 'acme' )
-      assert company != null
-      assert builder.acme != null
-      assert builder.acme == company
-   }
-
-   void testStringfiedReferenceResolver() {
-      builder.referenceResolver = "ref_id"
-      def company = builder.company( name: 'ACME', employees: [] ) {
-         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
-         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
-            address( ref_id: 'a1' )
-         }
-      }
-      assert company != null
-      assert company.employees.size() == 1
-      assert builder.e1 == company.employees[0]
-      assert builder.a1 == company.address
-      assert builder.a1 == builder.e1.address
-   }
-
-   void testReferenceResolver() {
-      def company = builder.company( name: 'ACME', employees: [] ) {
-         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
-         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
-            address( refId: 'a1' )
-         }
-      }
-      assert company != null
-      assert company.employees.size() == 1
-      assert builder.e1 == company.employees[0]
-      assert builder.a1 == company.address
-      assert builder.a1 == builder.e1.address
-   }
-
-   void testReferenceResolver_referenceIsLiveObject() {
-      def company = builder.company( name: 'ACME', employees: [] ) {
-         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
-         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
-            address( refId: a1 )
-         }
-      }
-      assert company != null
-      assert company.employees.size() == 1
-      assert builder.e1 == company.employees[0]
-      assert builder.a1 == company.address
-      assert builder.a1 == builder.e1.address
-   }
-
-   void testDirectReference() {
-      def company = builder.company( name: 'ACME', employees: [] ) {
-         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
-         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
-            address( a1 )
-         }
-      }
-      assert company != null
-      assert company.employees.size() == 1
-      assert builder.e1 == company.employees[0]
-      assert builder.a1 == company.address
-      assert builder.a1 == builder.e1.address
-   }
-
-   void testLazyReferences() {
-      def company = builder.company( name: 'ACME', employees: [] ) {
-         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
-            address( refId: 'a1' )
-         }
-         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
-      }
-      assert company != null
-      assert company.employees.size() == 1
-      assert builder.e1 == company.employees[0]
-      assert builder.a1 == company.address
-      assert builder.a1 == builder.e1.address
-   }
-
-   void testReflectionCompany() {
-      def expected = new ReflectionCompany( name: 'ACME' )
-      def actual = reflectionBuilder.reflectionCompany( name: 'ACME' )
-      assert actual != null
-      assert actual.name == expected.name
-   }
-
-   void testReflectionCompanyAndAddress() {
-      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      def expectedCompany = new ReflectionCompany( name: 'ACME', addr: expectedAddress )
-      def actualCompany = reflectionBuilder.reflectionCompany( name: 'ACME' ) {
-         addr( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      }
-      assert actualCompany != null
-      assert actualCompany.name == expectedCompany.name
-      def actualAddress = actualCompany.addr
-      assert actualAddress != null
-      assert actualAddress.line1 == expectedAddress.line1
-      assert actualAddress.line2 == expectedAddress.line2
-      assert actualAddress.zip == expectedAddress.zip
-      assert actualAddress.state == expectedAddress.state
-   }
-
-    void testReflectionCompanyAddressAndEmployees() {
-      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      def expectedCompany = new ReflectionCompany( name: 'ACME', addr: expectedAddress )
-      def expectedDirector = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
-      def expectedFinancialController = new Employee( name: 'Craig', employeeId: 2, address: expectedAddress )
-      def expectedDrone0 = new Employee( name: 'Drone0', employeeId: 3, address: expectedAddress )
-      def expectedDrone1 = new Employee( name: 'Drone1', employeeId: 4, address: expectedAddress )
-
-      def actualCompany = reflectionBuilder.reflectionCompany( name: 'ACME', drones: [] ) {
-         addr( id: 'a1', line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-         director(  name: expectedDirector.name, employeeId: expectedDirector.employeeId ){
-            address( refId: 'a1' )
-         }
-         financialController(  name: expectedFinancialController.name, employeeId: expectedFinancialController.employeeId ){
-            address( refId: 'a1' )
-         }
-         drones(  name: expectedDrone0.name, employeeId: expectedDrone0.employeeId ){
-            address( refId: 'a1' )
-         }
-         drones(  name: expectedDrone1.name, employeeId: expectedDrone1.employeeId ){
-            address( refId: 'a1' )
-         }
-      }
-      
-      assert actualCompany != null
-      assert actualCompany.name == expectedCompany.name
-      def actualAddress = actualCompany.addr
-      assert actualAddress != null
-      assert actualAddress.line1 == expectedAddress.line1
-      assert actualAddress.line2 == expectedAddress.line2
-      assert actualAddress.zip == expectedAddress.zip
-      assert actualAddress.state == expectedAddress.state
-
-      assert actualCompany.director != null
-      assert actualCompany.director.name == expectedDirector.name
-      assert actualCompany.director.employeeId == expectedDirector.employeeId
-      assert actualCompany.director.address.line1 == expectedAddress.line1
-
-      assert actualCompany.financialController != null
-      assert actualCompany.financialController.name == expectedFinancialController.name
-      assert actualCompany.financialController.employeeId == expectedFinancialController.employeeId
-      assert actualCompany.financialController.address.line1 == expectedAddress.line1
-
-      assert actualCompany.drones != null
-      assert actualCompany.drones.size == 2
-      assert actualCompany.drones[0].name == expectedDrone0.name
-      assert actualCompany.drones[0].employeeId == expectedDrone0.employeeId
-      assert actualCompany.drones[0].address != null
-      assert actualCompany.drones[0].address.line1 == expectedAddress.line1
-      assert actualCompany.drones[1].name == expectedDrone1.name
-      assert actualCompany.drones[1].address != null
-      assert actualCompany.drones[1].employeeId == expectedDrone1.employeeId
-      assert actualCompany.drones[1].address.line1 == expectedAddress.line1
-   }
-
-   void testPlural() {
-       def dracula = builder.person(name: 'Dracula') {
-           allergy(name: 'garlic', reaction: 'moderate burns')
-           allergy(name: 'cross', reaction: 'aversion')
-           allergy(name: 'wood stake', reaction: 'death')
-           allergy(name: 'sunlight', reaction: 'burst into flames')
-           petMonkey(name: 'La-la')
-           petMonkey(name: 'Ampersand')
-       }
-
-       assert dracula.allergies.size() == 4
-       assert dracula.petMonkeys.size() == 2
-   }
-
-   void testCompanyAndEmployeeAndAddressUsingBeanFactory() {
-      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-      def expectedEmployee = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
-      def expectedCompany = new Company( name: 'ACME' )
-      def actualCompany = builder.bean(new Company(), name: 'ACME', employees: [] ) {
-         bean(Employee, name: 'Duke', employeeId: 1 ) {
-            bean(Address, line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
-         }
-      }
-      assert actualCompany != null
-      // assert actualCompany.class == Company
-      assert actualCompany.name == expectedCompany.name
-      assert actualCompany.employees.size() == 1
-      def actualEmployee = actualCompany.employees[0]
-      // assert actualEmployee.class == Employee
-      assert actualEmployee.name == expectedEmployee.name
-      assert actualEmployee.employeeId == expectedEmployee.employeeId
-      def actualAddress = actualEmployee.address
-      assert actualAddress != null
-      // assert actualAddress.class == Address
-      assert actualAddress.line1 == expectedAddress.line1
-      assert actualAddress.line2 == expectedAddress.line2
-      assert actualAddress.zip == expectedAddress.zip
-      assert actualAddress.state == expectedAddress.state
-   }
-
-   void setUp() {
-      builder = new ObjectGraphBuilder()
-      builder.classNameResolver = "groovy.util"
-      reflectionBuilder = new ObjectGraphBuilder()
-      reflectionBuilder.classNameResolver = [ name: 'reflection', root: "groovy.util" ]
-   }
-}
-
-class Company {
-   String name
-   Address address
-   List employees = []
-
-   String toString() { "Company=[name:${name}, address:${address}, employees:${employees}]" }
-}
-
-class Address {
-   String line1
-   String line2
-   int zip
-   String state
-
-   String toString() { "Address=[line1:${line1}, line2:${line2}, zip:${zip}, state:${state}]" }
-}
-
-class Employee {
-   String name
-   int employeeId
-   Address address
-   Company company
-
-   String toString() { "Employee=[name:${name}, employeeId:${employeeId}, address:${address}, company:${company.name}]" }
-}
-
-class ReflectionCompany {
-   String name
-   Address addr
-   Employee director
-   Employee financialController
-   List<Employee> drones
-
-   String toString() { "Company=[name:${name}, address:${address}, director:${md}, financialController:${cio}, drones:${drones}]" }
-}
-
-class Person {
-    String name
-    List allergies = []
-    List petMonkeys = []
-
-    String toString() { "Person=[name:${name}, allergies:${allergies}, petMonkeys:${petMonkeys}]" }
-}
-
-class Allergy {
-    String name
-    String reaction
-
-    String toString() { "Allergy=[name:${name}, reaction:${reaction}]" }
-}
-
-class PetMonkey {
-    String name
-
-    String toString() { "PetMonkey=[name:${name}]" }
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package groovy.util
+
+class ObjectGraphBuilderTest extends GroovyTestCase {
+   ObjectGraphBuilder builder
+   ObjectGraphBuilder reflectionBuilder
+
+   void testCompany() {
+      def expected = new Company( name: 'ACME', employees: [] )
+      def actual = builder.company( name: 'ACME', employees: [] )
+      assert actual != null
+      //assert actual.class == Company
+      assert actual.name == expected.name
+      assert actual.address == expected.address
+      assert actual.employees == expected.employees
+   }
+
+   void testCompanyAndAddress() {
+      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      def expectedCompany = new Company( name: 'ACME', employees: [], address: expectedAddress )
+      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
+         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      }
+      assert actualCompany != null
+      //assert actualCompany.class == Company
+      assert actualCompany.name == expectedCompany.name
+      assert actualCompany.employees == expectedCompany.employees
+      def actualAddress = actualCompany.address
+      assert actualAddress != null
+      //assert actualAddress.class == Address
+      assert actualAddress.line1 == expectedAddress.line1
+      assert actualAddress.line2 == expectedAddress.line2
+      assert actualAddress.zip == expectedAddress.zip
+      assert actualAddress.state == expectedAddress.state
+   }
+
+   void testCompanyAndEmployeeAndAddress() {
+      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      def expectedEmployee = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
+      def expectedCompany = new Company( name: 'ACME' )
+      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
+         employee(  name: 'Duke', employeeId: 1 ) {
+            address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+         }
+      }
+      assert actualCompany != null
+      //assert actualCompany.class == Company
+      assert actualCompany.name == expectedCompany.name
+      assert actualCompany.employees.size() == 1
+      def actualEmployee = actualCompany.employees[0]
+      //assert actualEmployee.class == Employee
+      assert actualEmployee.name == expectedEmployee.name
+      assert actualEmployee.employeeId == expectedEmployee.employeeId
+      def actualAddress = actualEmployee.address
+      assert actualAddress != null
+      //assert actualAddress.class == Address
+      assert actualAddress.line1 == expectedAddress.line1
+      assert actualAddress.line2 == expectedAddress.line2
+      assert actualAddress.zip == expectedAddress.zip
+      assert actualAddress.state == expectedAddress.state
+   }
+
+   void testCompanyAndEmployeeSameAddress() {
+      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      def expectedEmployee = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
+      def expectedCompany = new Company( name: 'ACME' )
+      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
+         address( id: 'a1', line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+         employee(  name: 'Duke', employeeId: 1, address: a1 )
+      }
+      assert actualCompany != null
+      //assert actualCompany.class == Company
+      assert actualCompany.name == expectedCompany.name
+      assert actualCompany.employees.size() == 1
+      def actualEmployee = actualCompany.employees[0]
+      //assert actualEmployee.class == Employee
+      assert actualEmployee.name == expectedEmployee.name
+      assert actualEmployee.employeeId == expectedEmployee.employeeId
+      assert actualCompany.address == actualEmployee.address
+   }
+
+   void testCompanyAndEmployeeSameAddressWithRef() {
+      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      def expectedEmployee = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
+      def expectedCompany = new Company( name: 'ACME' )
+      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
+         address( id: 'a1', line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+         employee(  name: 'Duke', employeeId: 1 ){
+            address( refId: 'a1' )
+         }
+      }
+      assert actualCompany != null
+      //assert actualCompany.class == Company
+      assert actualCompany.name == expectedCompany.name
+      assert actualCompany.employees.size() == 1
+      def actualEmployee = actualCompany.employees[0]
+      //assert actualEmployee.class == Employee
+      assert actualEmployee.name == expectedEmployee.name
+      assert actualEmployee.employeeId == expectedEmployee.employeeId
+      assert actualCompany.address == actualEmployee.address
+      assert actualEmployee.company == actualCompany
+   }
+
+   void testCompanyAndManyEmployees() {
+      def actualCompany = builder.company( name: 'ACME', employees: [] ) {
+         3.times {
+            employee(  name: "Duke $it", employeeId: it )
+         }
+      }
+      assert actualCompany != null
+      assert actualCompany.employees.size() == 3
+      3.times {
+         assert actualCompany.employees[it].name == "Duke $it"
+      }
+      //assert actualCompany.employees*.getClass() == [Employee,Employee,Employee]
+   }
+
+   void testStringfiedIdentifierResolver() {
+      builder.identifierResolver = "uid"
+      def company = builder.company( name: 'ACME', employees: [], uid: 'acme' )
+      assert company != null
+      assert builder.acme != null
+      assert builder.acme == company
+   }
+
+   void testStringfiedReferenceResolver() {
+      builder.referenceResolver = "ref_id"
+      def company = builder.company( name: 'ACME', employees: [] ) {
+         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
+         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
+            address( ref_id: 'a1' )
+         }
+      }
+      assert company != null
+      assert company.employees.size() == 1
+      assert builder.e1 == company.employees[0]
+      assert builder.a1 == company.address
+      assert builder.a1 == builder.e1.address
+   }
+
+   void testReferenceResolver() {
+      def company = builder.company( name: 'ACME', employees: [] ) {
+         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
+         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
+            address( refId: 'a1' )
+         }
+      }
+      assert company != null
+      assert company.employees.size() == 1
+      assert builder.e1 == company.employees[0]
+      assert builder.a1 == company.address
+      assert builder.a1 == builder.e1.address
+   }
+
+   void testReferenceResolver_referenceIsLiveObject() {
+      def company = builder.company( name: 'ACME', employees: [] ) {
+         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
+         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
+            address( refId: a1 )
+         }
+      }
+      assert company != null
+      assert company.employees.size() == 1
+      assert builder.e1 == company.employees[0]
+      assert builder.a1 == company.address
+      assert builder.a1 == builder.e1.address
+   }
+
+   void testDirectReference() {
+      def company = builder.company( name: 'ACME', employees: [] ) {
+         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
+         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
+            address( a1 )
+         }
+      }
+      assert company != null
+      assert company.employees.size() == 1
+      assert builder.e1 == company.employees[0]
+      assert builder.a1 == company.address
+      assert builder.a1 == builder.e1.address
+   }
+
+   void testLazyReferences() {
+      def company = builder.company( name: 'ACME', employees: [] ) {
+         employee(  name: 'Duke', employeeId: 1, id: 'e1' ) {
+            address( refId: 'a1' )
+         }
+         address( line1: '123 Groovy Rd', zip: 12345, state: 'JV', id: 'a1' )
+      }
+      assert company != null
+      assert company.employees.size() == 1
+      assert builder.e1 == company.employees[0]
+      assert builder.a1 == company.address
+      assert builder.a1 == builder.e1.address
+   }
+
+   void testReflectionCompany() {
+      def expected = new ReflectionCompany( name: 'ACME' )
+      def actual = reflectionBuilder.reflectionCompany( name: 'ACME' )
+      assert actual != null
+      assert actual.name == expected.name
+   }
+
+   void testReflectionCompanyAndAddress() {
+      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      def expectedCompany = new ReflectionCompany( name: 'ACME', addr: expectedAddress )
+      def actualCompany = reflectionBuilder.reflectionCompany( name: 'ACME' ) {
+         addr( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      }
+      assert actualCompany != null
+      assert actualCompany.name == expectedCompany.name
+      def actualAddress = actualCompany.addr
+      assert actualAddress != null
+      assert actualAddress.line1 == expectedAddress.line1
+      assert actualAddress.line2 == expectedAddress.line2
+      assert actualAddress.zip == expectedAddress.zip
+      assert actualAddress.state == expectedAddress.state
+   }
+
+    void testReflectionCompanyAddressAndEmployees() {
+      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      def expectedCompany = new ReflectionCompany( name: 'ACME', addr: expectedAddress )
+      def expectedDirector = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
+      def expectedFinancialController = new Employee( name: 'Craig', employeeId: 2, address: expectedAddress )
+      def expectedDrone0 = new Employee( name: 'Drone0', employeeId: 3, address: expectedAddress )
+      def expectedDrone1 = new Employee( name: 'Drone1', employeeId: 4, address: expectedAddress )
+
+      def actualCompany = reflectionBuilder.reflectionCompany( name: 'ACME', drones: [] ) {
+         addr( id: 'a1', line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+         director(  name: expectedDirector.name, employeeId: expectedDirector.employeeId ){
+            address( refId: 'a1' )
+         }
+         financialController(  name: expectedFinancialController.name, employeeId: expectedFinancialController.employeeId ){
+            address( refId: 'a1' )
+         }
+         drones(  name: expectedDrone0.name, employeeId: expectedDrone0.employeeId ){
+            address( refId: 'a1' )
+         }
+         drones(  name: expectedDrone1.name, employeeId: expectedDrone1.employeeId ){
+            address( refId: 'a1' )
+         }
+      }
+      
+      assert actualCompany != null
+      assert actualCompany.name == expectedCompany.name
+      def actualAddress = actualCompany.addr
+      assert actualAddress != null
+      assert actualAddress.line1 == expectedAddress.line1
+      assert actualAddress.line2 == expectedAddress.line2
+      assert actualAddress.zip == expectedAddress.zip
+      assert actualAddress.state == expectedAddress.state
+
+      assert actualCompany.director != null
+      assert actualCompany.director.name == expectedDirector.name
+      assert actualCompany.director.employeeId == expectedDirector.employeeId
+      assert actualCompany.director.address.line1 == expectedAddress.line1
+
+      assert actualCompany.financialController != null
+      assert actualCompany.financialController.name == expectedFinancialController.name
+      assert actualCompany.financialController.employeeId == expectedFinancialController.employeeId
+      assert actualCompany.financialController.address.line1 == expectedAddress.line1
+
+      assert actualCompany.drones != null
+      assert actualCompany.drones.size() == 2
+      assert actualCompany.drones[0].name == expectedDrone0.name
+      assert actualCompany.drones[0].employeeId == expectedDrone0.employeeId
+      assert actualCompany.drones[0].address != null
+      assert actualCompany.drones[0].address.line1 == expectedAddress.line1
+      assert actualCompany.drones[1].name == expectedDrone1.name
+      assert actualCompany.drones[1].address != null
+      assert actualCompany.drones[1].employeeId == expectedDrone1.employeeId
+      assert actualCompany.drones[1].address.line1 == expectedAddress.line1
+   }
+
+   void testPlural() {
+       def dracula = builder.person(name: 'Dracula') {
+           allergy(name: 'garlic', reaction: 'moderate burns')
+           allergy(name: 'cross', reaction: 'aversion')
+           allergy(name: 'wood stake', reaction: 'death')
+           allergy(name: 'sunlight', reaction: 'burst into flames')
+           petMonkey(name: 'La-la')
+           petMonkey(name: 'Ampersand')
+       }
+
+       assert dracula.allergies.size() == 4
+       assert dracula.petMonkeys.size() == 2
+   }
+
+   void testCompanyAndEmployeeAndAddressUsingBeanFactory() {
+      def expectedAddress = new Address( line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+      def expectedEmployee = new Employee( name: 'Duke', employeeId: 1, address: expectedAddress )
+      def expectedCompany = new Company( name: 'ACME' )
+      def actualCompany = builder.bean(new Company(), name: 'ACME', employees: [] ) {
+         bean(Employee, name: 'Duke', employeeId: 1 ) {
+            bean(Address, line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
+         }
+      }
+      assert actualCompany != null
+      // assert actualCompany.class == Company
+      assert actualCompany.name == expectedCompany.name
+      assert actualCompany.employees.size() == 1
+      def actualEmployee = actualCompany.employees[0]
+      // assert actualEmployee.class == Employee
+      assert actualEmployee.name == expectedEmployee.name
+      assert actualEmployee.employeeId == expectedEmployee.employeeId
+      def actualAddress = actualEmployee.address
+      assert actualAddress != null
+      // assert actualAddress.class == Address
+      assert actualAddress.line1 == expectedAddress.line1
+      assert actualAddress.line2 == expectedAddress.line2
+      assert actualAddress.zip == expectedAddress.zip
+      assert actualAddress.state == expectedAddress.state
+   }
+
+   void setUp() {
+      builder = new ObjectGraphBuilder()
+      builder.classNameResolver = "groovy.util"
+      reflectionBuilder = new ObjectGraphBuilder()
+      reflectionBuilder.classNameResolver = [ name: 'reflection', root: "groovy.util" ]
+   }
+}
+
+class Company {
+   String name
+   Address address
+   List employees = []
+
+   String toString() { "Company=[name:${name}, address:${address}, employees:${employees}]" }
+}
+
+class Address {
+   String line1
+   String line2
+   int zip
+   String state
+
+   String toString() { "Address=[line1:${line1}, line2:${line2}, zip:${zip}, state:${state}]" }
+}
+
+class Employee {
+   String name
+   int employeeId
+   Address address
+   Company company
+
+   String toString() { "Employee=[name:${name}, employeeId:${employeeId}, address:${address}, company:${company.name}]" }
+}
+
+class ReflectionCompany {
+   String name
+   Address addr
+   Employee director
+   Employee financialController
+   List<Employee> drones
+
+   String toString() { "Company=[name:${name}, address:${address}, director:${md}, financialController:${cio}, drones:${drones}]" }
+}
+
+class Person {
+    String name
+    List allergies = []
+    List petMonkeys = []
+
+    String toString() { "Person=[name:${name}, allergies:${allergies}, petMonkeys:${petMonkeys}]" }
+}
+
+class Allergy {
+    String name
+    String reaction
+
+    String toString() { "Allergy=[name:${name}, reaction:${reaction}]" }
+}
+
+class PetMonkey {
+    String name
+
+    String toString() { "PetMonkey=[name:${name}]" }
 }
diff --git a/src/test/org/codehaus/groovy/ast/CodeVisitorSupportTest.groovy b/src/test/org/codehaus/groovy/ast/CodeVisitorSupportTest.groovy
index e3843eb..b9cc2e3 100644
--- a/src/test/org/codehaus/groovy/ast/CodeVisitorSupportTest.groovy
+++ b/src/test/org/codehaus/groovy/ast/CodeVisitorSupportTest.groovy
@@ -42,7 +42,7 @@ class CodeVisitorSupportTest extends GroovyTestCase {
         assert visitor.history[2] == BooleanExpression
         assert visitor.history[3] == BlockStatement
         assert visitor.history[4] == BlockStatement
-        assert visitor.history.size == 5
+        assert visitor.history.size() == 5
     }
 
     void testEmptyStatementsOnIfElse() {
@@ -57,7 +57,7 @@ class CodeVisitorSupportTest extends GroovyTestCase {
         assert visitor.history[2] == BooleanExpression
         assert visitor.history[3] == BlockStatement
         assert visitor.history[4] == EmptyStatement
-        assert visitor.history.size == 5
+        assert visitor.history.size() == 5
     }
 
     void testTryCatchFinally() {
diff --git a/src/test/org/codehaus/groovy/runtime/powerassert/AssertionRenderingTest.groovy b/src/test/org/codehaus/groovy/runtime/powerassert/AssertionRenderingTest.groovy
index 60983fd..37e4f7a 100644
--- a/src/test/org/codehaus/groovy/runtime/powerassert/AssertionRenderingTest.groovy
+++ b/src/test/org/codehaus/groovy/runtime/powerassert/AssertionRenderingTest.groovy
@@ -340,14 +340,14 @@ assert (a..<b) == null
 
     void testPropertyExpression() {
         isRendered """
-assert a.size == null
-       | |    |
-       | 1    false
-       [9]
+assert a.bytes == null
+       | |     |
+       | [65]  false
+       'A'
 
         """, {
-            def a = [9]
-            assert a.size == null
+            def a = 'A'
+            assert a.bytes == null
         }
 
         isRendered """
diff --git a/src/test/org/codehaus/groovy/runtime/powerassert/EvaluationTest.groovy b/src/test/org/codehaus/groovy/runtime/powerassert/EvaluationTest.groovy
index cec4851..467dacc 100644
--- a/src/test/org/codehaus/groovy/runtime/powerassert/EvaluationTest.groovy
+++ b/src/test/org/codehaus/groovy/runtime/powerassert/EvaluationTest.groovy
@@ -156,7 +156,7 @@ class EvaluationTest extends GroovyTestCase {
     }
 
     void testPropertyExpression() {
-        assert [1,2,3].size == 3
+        assert 'A'.bytes == [65] as byte[]
         assert (new Properties().next.next.next.x = 10) == 10
         assert Integer.MIN_VALUE < Integer.MAX_VALUE
     }


[groovy] 07/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 32b627291a4e7d6809b93c3911e403acdcec8a66
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 12:35:22 2019 +1000

    fix unintended illegal access
---
 .../src/test/groovy/groovy/jmx/builder/JmxBeansFactoryTest.groovy       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/subprojects/groovy-jmx/src/test/groovy/groovy/jmx/builder/JmxBeansFactoryTest.groovy b/subprojects/groovy-jmx/src/test/groovy/groovy/jmx/builder/JmxBeansFactoryTest.groovy
index 0340419..ddca2fe 100644
--- a/subprojects/groovy-jmx/src/test/groovy/groovy/jmx/builder/JmxBeansFactoryTest.groovy
+++ b/subprojects/groovy-jmx/src/test/groovy/groovy/jmx/builder/JmxBeansFactoryTest.groovy
@@ -33,7 +33,7 @@ class JmxBeansFactoryTest extends GroovyTestCase {
         def maps = builder.beans(obj1, obj2)
 
         assert maps
-        assert maps.size == 2
+        assert maps.size() == 2
 
         // test MockManagedObject map
         def map = maps[0]


[groovy] 13/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ab951bba9e1849af7f86403f27cf39ccd992fc52
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 22:12:36 2019 +1000

    fix unintended illegal access
---
 src/test/groovy/PrimitiveTypesTest.groovy | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/test/groovy/PrimitiveTypesTest.groovy b/src/test/groovy/PrimitiveTypesTest.groovy
index eacd6d8..15cf1b7 100644
--- a/src/test/groovy/PrimitiveTypesTest.groovy
+++ b/src/test/groovy/PrimitiveTypesTest.groovy
@@ -21,35 +21,35 @@ package groovy
 class PrimitiveTypesTest extends GroovyTestCase {
 
     int getInt() {
-        return 1;
+        return 1
     }
     
     short getShort() {
-        return 1;
+        return 1
     }
     
     boolean getBoolean() {
-        return true;
+        return true
     }
     
     double getDouble() {
-        return 1.0;
+        return 1.0
     }
     
     float getFloat() {
-        return 1.0;
+        return 1.0
     }
     
     byte getByte() {
-        return 1;
+        return 1
     }
     
     long getLong() {
-        return 1;
+        return 1
     }
 
     char getChar() {
-        return 'a';
+        return 'a'
     }
     
     int getNextInt(int i) {
@@ -85,15 +85,14 @@ class PrimitiveTypesTest extends GroovyTestCase {
     }
 
     void testBigInteger2BigDecimal() {
-        BigInteger big = new BigInteger(Long.MAX_VALUE)
+        BigInteger big = BigInteger.valueOf(Long.MAX_VALUE)
         assert big.longValue() == testMethod(big).longValueExact()
     }
 
     private testMethod(BigDecimal bd) {
-        return bd;
+        return bd
     }
 
-
     static void main(args) {
         new PrimitiveTypesTest().testPrimitiveTypes()
     }


[groovy] 08/17: Allow illegal access scenarios to be tested using -Pgroovy.force.illegal.access=true property.

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6be1e3ba12141e09e943ce15397cf3574441e218
Author: Paul King <pa...@asert.com.au>
AuthorDate: Thu Apr 18 13:09:10 2019 +1000

    Allow illegal access scenarios to be tested using -Pgroovy.force.illegal.access=true property.
    
    This doesn't affect the groovy runtime/compiler, it is just a system property which decides
    whether the tests will be run or not. We will try to have the build as warning free as possible
    but still want the ability to test any still supported functionality which generates warnings.
    We may evolve this approach over time.
---
 gradle/test.gradle                                |  2 ++
 src/test/groovy/IllegalAccessScenariosTest.groovy | 39 +++++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/gradle/test.gradle b/gradle/test.gradle
index a2dae8a..d121b37 100644
--- a/gradle/test.gradle
+++ b/gradle/test.gradle
@@ -20,9 +20,11 @@ allprojects {
     tasks.withType(Test) {
         def jdk8 = ['-XX:+UseConcMarkSweepGC']
         def jdk9 = ['-Djava.locale.providers=COMPAT,SPI']
+//        def jdk9 = ['-Djava.locale.providers=COMPAT,SPI', '--illegal-access=debug']
         def common = ['-ea', "-Xms${groovyJUnit_ms}", "-Xmx${groovyJUnit_mx}", "-Duser.language=en" ]
         if (JavaVersion.current().isJava9Compatible()) {
             jvmArgs (*common, *jdk9)
+            systemProperty "groovy.force.illegal.access", findProperty("groovy.force.illegal.access")
         } else if (JavaVersion.current().isJava8Compatible()) {
             jvmArgs (*common, *jdk8)
         } else {
diff --git a/src/test/groovy/IllegalAccessScenariosTest.groovy b/src/test/groovy/IllegalAccessScenariosTest.groovy
new file mode 100644
index 0000000..44096b0
--- /dev/null
+++ b/src/test/groovy/IllegalAccessScenariosTest.groovy
@@ -0,0 +1,39 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package groovy
+
+import static groovy.test.GroovyAssert.isAtLeastJdk
+import static org.apache.groovy.util.SystemUtil.getBooleanSafe
+
+/**
+ * Tests for permissive member access. Typically such access is only allowed in Java via means such
+ * as reflection.
+ *
+ * In JDK versions < 9, Groovy supports permissive access and no warnings are given by the JDK.
+ * In JDK versions >= 9, Groovy supports permissive access but the JDK gives illegal access warnings.
+ * At some point, the JDK may further restrict permissive access and Groovy's support for this feature may be limited.
+ */
+class IllegalAccessScenariosTest extends GroovyTestCase {
+    void testPrivateFieldAccess() {
+        if (isAtLeastJdk('9.0') && !getBooleanSafe('groovy.force.illegal.access')) return
+        def items = [1, 2, 3]
+        // size is a private field in ArrayList
+        assert items.size == 3
+    }
+} 


[groovy] 05/17: fix unintended illegal access

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 9b93f95232ca27629554445fc37bba2f72e3d178
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Apr 17 14:16:51 2019 +1000

    fix unintended illegal access
---
 .../transform/stc/SocketGMClosureParamTypeInferenceSTCTest.groovy       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/groovy/transform/stc/SocketGMClosureParamTypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/SocketGMClosureParamTypeInferenceSTCTest.groovy
index aca978a..ddd1c4a 100644
--- a/src/test/groovy/transform/stc/SocketGMClosureParamTypeInferenceSTCTest.groovy
+++ b/src/test/groovy/transform/stc/SocketGMClosureParamTypeInferenceSTCTest.groovy
@@ -34,7 +34,7 @@ class SocketGMClosureParamTypeInferenceSTCTest extends StaticTypeCheckingTestCas
                     assert !it.closed
                 }
             }
-            ServerSocket s = [bound:{true}, accept: {[:] as Socket}] as ServerSocket
+            ServerSocket s = [isBound:{true}, accept: {[:] as Socket}] as ServerSocket
             foo(s)
             bar(s)
         '''