You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/07/07 16:38:48 UTC
[groovy] branch master updated: GROOVY-7971, GROOVY-8965, GROOVY-10096, GROOVY-10668: add test cases
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 6a4dab1109 GROOVY-7971, GROOVY-8965, GROOVY-10096, GROOVY-10668: add test cases
6a4dab1109 is described below
commit 6a4dab1109174e0eefd088d49380caccd32b82d9
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Jul 7 11:38:36 2022 -0500
GROOVY-7971, GROOVY-8965, GROOVY-10096, GROOVY-10668: add test cases
---
build.gradle | 20 +-
.../transform/stc/TypeInferenceSTCTest.groovy | 251 ++++++++++++++++-----
.../asm/sc/TypeInferenceStaticCompileTest.groovy | 31 +++
3 files changed, 235 insertions(+), 67 deletions(-)
diff --git a/build.gradle b/build.gradle
index 363e09e664..42ec23aca3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -132,14 +132,25 @@ dependencies {
exclude(group: 'org.codehaus.groovy', module: 'groovy-all')
}
+ testImplementation project(':groovy-ant')
+ testImplementation project(':groovy-xml')
+ testImplementation project(':groovy-json')
+ testImplementation project(':groovy-test')
+ testImplementation project(':groovy-macro')
+ testImplementation project(':groovy-dateutil')
testImplementation "jmock:jmock:${versions.jmock}"
testImplementation "jmock:jmock-cglib:${versions.jmock}"
+ testImplementation "net.jcip:jcip-annotations:${versions.jcipAnnotations}"
testImplementation "ch.qos.logback:logback-classic:${versions.logback}"
testImplementation "log4j:log4j:${versions.log4j}"
testImplementation "org.apache.logging.log4j:log4j-core:${versions.log4j2}"
testImplementation "org.slf4j:jcl-over-slf4j:${versions.slf4j}"
testImplementation "com.thoughtworks.qdox:qdox:${versions.qdox}"
+ testFixturesImplementation project(':groovy-xml')
+ testFixturesImplementation project(':groovy-test')
+ testFixturesImplementation "xmlunit:xmlunit:${versions.xmlunit}"
+
tools "com.eed3si9n.jarjar:jarjar:${versions.jarjar}"
tools "org.jboss.bridger:bridger:${versions.bridger}"
@@ -151,16 +162,7 @@ dependencies {
tools "org.ow2.asm:asm:${versions.asm}"
tools "com.thoughtworks.qdox:qdox:${versions.qdox}"
- testImplementation project(':groovy-ant')
- testImplementation project(':groovy-xml')
- testImplementation project(':groovy-dateutil')
- testImplementation project(':groovy-test')
- testImplementation project(':groovy-macro')
- testFixturesImplementation "xmlunit:xmlunit:${versions.xmlunit}"
- testFixturesImplementation project(':groovy-test')
- testFixturesImplementation project(':groovy-xml')
spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.12.0'
- testImplementation "net.jcip:jcip-annotations:${versions.jcipAnnotations}"
testRuntimeOnly(project(":")) {
because "Tests are using Grapes"
diff --git a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
index e06715b4f9..93d67cd829 100644
--- a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
+++ b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy
@@ -18,6 +18,7 @@
*/
package groovy.transform.stc
+import groovy.test.NotYetImplemented
import org.codehaus.groovy.ast.ClassHelper
import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.ast.MethodNode
@@ -94,7 +95,9 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
void testInstanceOf1() {
assertScript '''
Object o
- if (o instanceof String) o.toUpperCase()
+ if (o instanceof String) {
+ o.toUpperCase()
+ }
'''
}
@@ -115,8 +118,9 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
if (o instanceof String) {
o.toUpperCase()
}
- o.toUpperCase() // ensure that type information is lost after if()
- ''', 'Cannot find matching method java.lang.Object#toUpperCase()'
+ o.toUpperCase() // ensure that type information is reset
+ ''',
+ 'Cannot find matching method java.lang.Object#toUpperCase()'
}
void testInstanceOf4() {
@@ -134,40 +138,41 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
void testInstanceOf5() {
assertScript '''
class A {
- int foo() { 1 }
+ void bar() {
+ }
}
class B {
- int foo2() { 2 }
+ void bar() {
+ }
}
- def o = new A()
- int result = o instanceof A?o.foo():(o instanceof B?o.foo2():3)
+
+ void test(o) {
+ if (o instanceof A) {
+ o.bar()
+ }
+ if (o instanceof B) {
+ o.bar()
+ }
+ }
+ test(new A())
+ test(new B())
'''
}
+ // GROOVY-9953
void testInstanceOf6() {
assertScript '''
class A {
- void foo() { println 'ok' }
}
-
- class B {
- void foo() { println 'ok' }
- void foo2() { println 'ok 2' }
- }
-
- def o = new A()
-
- if (o instanceof A) {
- o.foo()
- }
-
- if (o instanceof B) {
- o.foo()
- }
-
- if (o instanceof A || o instanceof B) {
- o.foo()
+ A test(Object x) {
+ if (x instanceof A) {
+ def y = x
+ return y
+ } else {
+ new A()
+ }
}
+ new A().with { assert test(it) === it }
'''
}
@@ -220,6 +225,41 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-7971
+ void testInstanceOf9() {
+ assertScript '''
+ import groovy.json.JsonOutput
+ def test(value) {
+ def out = new StringBuilder()
+ def isString = value.class == String
+ if (isString || value instanceof Map) {
+ out.append(JsonOutput.toJson(value))
+ }
+ return out.toString()
+ }
+ def string = test('two')
+ assert string == '"two"'
+ '''
+ }
+
+ @NotYetImplemented // GROOVY-10096
+ void testInstanceOf10() {
+ shouldFailWithMessages '''
+ class Foo {
+ void foo() {
+ }
+ }
+ class Bar extends Foo {
+ void bar() {
+ }
+ }
+ static Bar baz(Foo foo) {
+ (false || foo instanceof Bar) ? foo : new Bar()
+ }
+ ''',
+ 'Cannot return value of type Foo for method returning Bar'
+ }
+
void testNestedInstanceOf1() {
assertScript '''
Object o
@@ -239,7 +279,119 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
o.toUpperCase()
}
}
- ''', 'Cannot find matching method java.lang.Object#toUpperCase()'
+ ''',
+ 'Cannot find matching method java.lang.Object#toUpperCase()'
+ }
+
+ void testNestedInstanceOf3() {
+ assertScript '''
+ class A {
+ int foo() { 1 }
+ }
+ class B {
+ int foo2() { 2 }
+ }
+ def o = new A()
+ int result = o instanceof A ? o.foo() : (o instanceof B ? o.foo2() : 3)
+ '''
+ }
+
+ void testMultipleInstanceOf1() {
+ assertScript '''
+ class A {
+ void bar() {
+ }
+ }
+ class B {
+ void bar() {
+ }
+ }
+
+ void test(o) {
+ if (o instanceof A || o instanceof B) {
+ o.bar()
+ }
+ }
+ test(new A())
+ test(new B())
+ '''
+ }
+
+ void testMultipleInstanceOf2() {
+ assertScript '''
+ int cardinality(o) {
+ (o instanceof List || o instanceof Map ? o.size() : 1)
+ }
+ assert cardinality('') == 1
+ assert cardinality(['foo','bar']) == 2
+ assert cardinality([foo:'',bar:'']) == 2
+ '''
+ }
+
+ void testMultipleInstanceOf3() {
+ assertScript '''
+ boolean empty(o) {
+ (o instanceof List || o instanceof Map) && o.isEmpty()
+ }
+ assert !empty('')
+ assert empty([])
+ assert empty([:])
+ assert !empty(['foo'])
+ assert !empty([foo:null])
+ '''
+ }
+
+ // GROOVY-8965
+ void testMultipleInstanceOf4() {
+ ['o', '((Number) o)'].each {
+ assertScript """
+ def foo(o) {
+ if (o instanceof Integer || o instanceof Double) {
+ ${it}.floatValue() // CCE: Double cannot be cast to Integer
+ }
+ }
+ def bar = foo(1.1d)
+ assert bar == 1.1f
+ """
+ }
+ }
+
+ void testMultipleInstanceOf5() {
+ assertScript '''
+ void test(thing) {
+ if (thing instanceof Deque) {
+ thing.addFirst(1) // 'addFirst' only in Deque
+ } else if (thing instanceof Stack) {
+ thing.addElement(2) // 'addElement' only in Stack
+ }
+ if (thing instanceof Deque || thing instanceof Stack) {
+ assert thing.peek() in 1..2 // 'peek' in ArrayDeque and Stack but not LUB
+ }
+ }
+ test(new Stack())
+ test(new ArrayDeque())
+ '''
+ }
+
+ // GROOVY-10668
+ void testMultipleInstanceOf6() {
+ ['(value as String)', 'value.toString()'].each { string ->
+ assertScript """
+ def toArray(Object value) {
+ def array
+ if (value instanceof List)
+ array = value.toArray()
+ else if (value instanceof String || value instanceof GString)
+ array = ${string}.split(',')
+ else
+ throw new Exception('not supported')
+
+ return array
+ }
+ toArray([1,2,3])
+ toArray('1,2,3')
+ """
+ }
}
// GROOVY-8523
@@ -375,6 +527,20 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
''', 'Cannot find matching method java.lang.Object#toUpperCase()'
}
+ // GROOVY-10217
+ void testInstanceOfThenSubscriptOperator() {
+ assertScript '''
+ void test(Object o) {
+ if (o instanceof List) {
+ assert o[0] == 1
+ def x = (List) o
+ assert x[0] == 1
+ }
+ }
+ test([1])
+ '''
+ }
+
void testInstanceOfInferenceWithImplicitIt() {
assertScript '''
['a', 'b', 'c'].each {
@@ -486,37 +652,6 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
'''
}
- // GROOVY-9953
- void testInstanceOfPropagatesToLocalVariable() {
- assertScript '''
- class A {
- }
- A test(Object x) {
- if (x instanceof A) {
- def y = x
- return y
- } else {
- new A()
- }
- }
- new A().with { assert test(it) === it }
- '''
- }
-
- // GROOVY-10217
- void testInstanceOfThenSubscriptOperator() {
- assertScript '''
- void test(Object o) {
- if (o instanceof List) {
- assert o[0] == 1
- def x = (List) o
- assert x[0] == 1
- }
- }
- test([1])
- '''
- }
-
void testShouldNotAllowDynamicVariable() {
shouldFailWithMessages '''
String name = 'Guillaume'
diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/TypeInferenceStaticCompileTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/TypeInferenceStaticCompileTest.groovy
index afe168980f..b1ff1521c5 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/TypeInferenceStaticCompileTest.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/TypeInferenceStaticCompileTest.groovy
@@ -18,10 +18,41 @@
*/
package org.codehaus.groovy.classgen.asm.sc
+import groovy.test.NotYetImplemented
import groovy.transform.stc.TypeInferenceSTCTest
/**
* Unit tests for static compilation : type inference.
*/
class TypeInferenceStaticCompileTest extends TypeInferenceSTCTest implements StaticCompilationTestSupport {
+
+ @Override @NotYetImplemented
+ void testInstanceOf9() {
+ super.testInstanceOf9()
+ }
+
+ @Override @NotYetImplemented
+ void testMultipleInstanceOf1() {
+ super.testMultipleInstanceOf1()
+ }
+
+ @Override @NotYetImplemented
+ void testMultipleInstanceOf2() {
+ super.testMultipleInstanceOf2()
+ }
+
+ @Override @NotYetImplemented
+ void testMultipleInstanceOf3() {
+ super.testMultipleInstanceOf3()
+ }
+
+ @Override @NotYetImplemented
+ void testMultipleInstanceOf4() {
+ super.testMultipleInstanceOf4()
+ }
+
+ @Override @NotYetImplemented
+ void testMultipleInstanceOf5() {
+ super.testMultipleInstanceOf5()
+ }
}