blob: 5d8c5bd8360929d5ebfa1a2a4568c84da2cdc0f8 [file] [log] [blame]
import groovy.test.GroovyTestCase
/*
* 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.
*/
class CompilerDirectivesASTTransformsTest extends GroovyTestCase {
void testFieldXForm() {
shouldFail(MissingPropertyException) {
assertScript '''
// tag::field_missing_property[]
def x
String line() {
"="*x
}
x=3
assert "===" == line()
x=5
assert "=====" == line()
// end::field_missing_property[]
'''
}
shouldFail(MissingPropertyException) {
assertScript '''
// tag::field_missing_property_equiv[]
class MyScript extends Script {
String line() {
"="*x
}
public def run() {
def x
x=3
assert "===" == line()
x=5
assert "=====" == line()
}
}
// end::field_missing_property_equiv[]
new MyScript().run()
'''
}
assertScript '''import groovy.transform.Field
// tag::field_fixed[]
@Field def x
String line() {
"="*x
}
x=3
assert "===" == line()
x=5
assert "=====" == line()
// end::field_fixed[]
'''
assertScript '''
// tag::field_fixed_equiv[]
class MyScript extends Script {
def x
String line() {
"="*x
}
public def run() {
x=3
assert "===" == line()
x=5
assert "=====" == line()
}
}
// end::field_fixed_equiv[]
new MyScript().run()
'''
}
void testAutoFinalClass() {
assertScript '''
// tag::autofinal_class[]
import groovy.transform.AutoFinal
@AutoFinal
class Person {
private String first, last
Person(String first, String last) {
this.first = first
this.last = last
}
String fullName(String separator) {
"$first$separator$last"
}
String greeting(String salutation) {
"$salutation, $first"
}
}
// end::autofinal_class[]
def john = new Person('John', 'Smith')
assert john.fullName(' ') == 'John Smith'
assert john.greeting('Hello') == 'Hello, John'
'''
}
void testAutoFinalMethod() {
assertScript '''
import groovy.transform.AutoFinal
// tag::autofinal_method[]
class Calc {
@AutoFinal
int add(int a, int b) { a + b }
int mult(int a, int b) { a * b }
}
// end::autofinal_method[]
def calc = new Calc()
assert calc.add(3, 6) == 9
assert calc.mult(3, 6) == 18
'''
}
void testPackageScope() {
assertScript '''import java.lang.reflect.Modifier
// tag::packagescope_property[]
class Person {
String name // this is a property
}
// end::packagescope_property[]
assert Modifier.toString(Person.getDeclaredField('name').modifiers)=='private'
'''
assertScript '''import groovy.transform.PackageScope
import java.lang.reflect.Modifier
// tag::packagescope_property_javalike[]
class Person {
@PackageScope String name // not a property anymore
}
// end::packagescope_property_javalike[]
assert Modifier.toString(Person.getDeclaredField('name').modifiers)==''
'''
assertScript '''import groovy.transform.PackageScope
import java.lang.reflect.Modifier
// tag::packagescope_property_usingtarget[]
import static groovy.transform.PackageScopeTarget.FIELDS
@PackageScope(FIELDS)
class Person {
String name // not a property, package protected
Date dob // not a property, package protected
private int age // explicit modifier, so won't be touched
}
// end::packagescope_property_usingtarget[]
assert Modifier.toString(Person.getDeclaredField('name').modifiers)==''
assert Modifier.toString(Person.getDeclaredField('dob').modifiers)==''
assert Modifier.toString(Person.getDeclaredField('age').modifiers)=='private'
'''
}
}