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/17 01:05:55 UTC
[groovy] 01/02: fix unintended illegal access
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit e1a9721d475f3ed4b47e33cd9a32bcf1a6dec0c5
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 a092574..9102f04 100644
--- a/src/test/groovy/bugs/Groovy8764Bug.groovy
+++ b/src/test/groovy/bugs/Groovy8764Bug.groovy
@@ -44,8 +44,9 @@ class Groovy8764Bug extends GroovyTestCase {
void testDgmMethodInClosureInInnerClass() {
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 {
@@ -62,7 +63,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 79c1a33..471a6fe 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
}