blob: d3f935e851e90e6b0d1f2f40d37f2ac5d691b209 [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 DifferencesFromJavaTest extends GroovyTestCase {
void testMultiMethods() {
assertScript '''import static org.junit.Assert.*
// tag::multimethods[]
int method(String arg) {
return 1;
}
int method(Object arg) {
return 2;
}
Object o = "Object";
int result = method(o);
// end::multimethods[]
/*
// With Java:
// tag::multimethods_java[]
assertEquals(2, result);
// end::multimethods_java[]
*/
// With Groovy:
// tag::multimethods_groovy[]
assertEquals(1, result);
// end::multimethods_groovy[]
'''
}
void testArrayCreation() {
shouldFail {
assertScript '''
// tag::arraycreate_fail[]
int[] array = { 1, 2, 3}
// end::arraycreate_fail[]
'''
}
assertScript '''
// tag::arraycreate_success[]
int[] array = [1,2,3]
// end::arraycreate_success[]
'''
}
void testPackagePrivate() {
assertScript '''import groovy.transform.ASTTest
import org.codehaus.groovy.control.CompilePhase
import java.lang.reflect.Modifier
@ASTTest(phase = CompilePhase.CLASS_GENERATION, value = {
def field = node.getField('name')
assert field.modifiers == Modifier.PRIVATE
})
// tag::packageprivate_property[]
class Person {
String name
}
// end::packageprivate_property[]
new Person() '''
assertScript '''import groovy.transform.ASTTest
import groovy.transform.PackageScope
import org.codehaus.groovy.control.CompilePhase
import java.lang.reflect.Modifier
@ASTTest(phase = CompilePhase.CLASS_GENERATION, value = {
def field = node.getField('name')
assert field.modifiers == 0
})
// tag::packageprivate_field[]
class Person {
@PackageScope String name
}
// end::packageprivate_field[]
new Person() '''
}
void testAnonymousAndNestedClasses() {
assertScript '''
// tag::innerclass_1[]
class A {
static class B {}
}
new A.B()
// end::innerclass_1[]
'''
assertScript '''
// tag::innerclass_2[]
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
CountDownLatch called = new CountDownLatch(1)
Timer timer = new Timer()
timer.schedule(new TimerTask() {
void run() {
called.countDown()
}
}, 0)
assert called.await(10, TimeUnit.SECONDS)
// end::innerclass_2[]
'''
assertScript '''
/*
// tag::innerclass_3_java[]
public class Y {
public class X {}
public X foo() {
return new X();
}
public static X createX(Y y) {
return y.new X();
}
}
// end::innerclass_3_java[]
*/
// tag::innerclass_3[]
public class Y {
public class X {}
public X foo() {
return new X()
}
public static X createX(Y y) {
return new X(y)
}
}
// end::innerclass_3[]
def y = new Y()
def x = Y.createX(y)
assert (x.'this$0').is(y)
'''
}
void testStringsAndCharsGotchas() {
assertScript '''
import org.codehaus.groovy.runtime.typehandling.GroovyCastException;
// tag::type_depends_on_quoting_AND_whether_we_actually_interpolate[]
assert 'c'.getClass()==String
assert "c".getClass()==String
assert "c${1}".getClass() in GString
// end::type_depends_on_quoting_AND_whether_we_actually_interpolate[]
// tag::single_char_strings_are_autocasted[]
char a='a'
assert Character.digit(a, 16)==10 : 'But Groovy does boxing'
assert Character.digit((char) 'a', 16)==10
try {
assert Character.digit('a', 16)==10
assert false: 'Need explicit cast'
} catch(MissingMethodException e) {
}
// end::single_char_strings_are_autocasted[]
// tag::chars_c_vs_groovy_cast[]
// for single char strings, both are the same
assert ((char) "c").class==Character
assert ("c" as char).class==Character
// for multi char strings they are not
try {
((char) 'cx') == 'c'
assert false: 'will fail - not castable'
} catch(GroovyCastException e) {
}
assert ('cx' as char) == 'c'
assert 'cx'.asType(char) == 'c'
// end::chars_c_vs_groovy_cast[]
'''
}
}