This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY-11676 in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 9adbfdc53c1909d53fe268e16f51be5470ed3be9 Author: Eric Milles <[email protected]> AuthorDate: Fri May 23 19:39:05 2025 -0500 separate class and method within `MissingMethodException` message --- .../java/groovy/lang/MissingMethodException.java | 19 +++--- .../test/typing/StaticCompilationIntroTest.groovy | 27 ++++---- .../{Groovy3645Bug.groovy => Groovy3645.groovy} | 24 +++---- .../{Groovy4857Bug.groovy => Groovy4857.groovy} | 35 +++++----- .../{Groovy6072Bug.groovy => Groovy6072.groovy} | 16 ++--- src/test/groovy/bugs/Groovy8678.groovy | 76 +++++++++++----------- src/test/groovy/bugs/Groovy9779.groovy | 9 ++- src/test/groovy/bugs/MethodClosureTest.groovy | 2 +- src/test/groovy/groovy/ThisAndSuperTest.groovy | 6 +- .../groovy/groovy/util/BuilderSupportTest.groovy | 62 +++++++++++------- .../transform/NewifyTransformBlackBoxTest.groovy | 44 ++++--------- 11 files changed, 156 insertions(+), 164 deletions(-) diff --git a/src/main/java/groovy/lang/MissingMethodException.java b/src/main/java/groovy/lang/MissingMethodException.java index 0400eff438..0efc4d1a46 100644 --- a/src/main/java/groovy/lang/MissingMethodException.java +++ b/src/main/java/groovy/lang/MissingMethodException.java @@ -54,16 +54,19 @@ public class MissingMethodException extends GroovyRuntimeException { @Override public String getMessage() { - return "No signature of method: " - + (isStatic ? "static " : "") + Class<?> type = getType(); + Object[] args = getArguments(); + return "No signature of " + + (isStatic() ? "static " : "") + + "method: " + + getMethod() + + " for class: " + (type != null ? type.getName() : "<unknown>") - + "." - + method - + "() is applicable for argument types: (" - + FormatHelper.toTypeString(arguments, 80) + + " is applicable for argument types: (" + + FormatHelper.toTypeString(args, 80) + ") values: " - + FormatHelper.toArrayString(arguments, 80, true) - + (type != null ? MethodRankHelper.getMethodSuggestionString(method, type, arguments) : ""); + + FormatHelper.toArrayString(args, 80, true) + + (type != null ? MethodRankHelper.getMethodSuggestionString(getMethod(), type, args) : ""); } /** diff --git a/src/spec/test/typing/StaticCompilationIntroTest.groovy b/src/spec/test/typing/StaticCompilationIntroTest.groovy index 1fad826411..0f6ba9062b 100644 --- a/src/spec/test/typing/StaticCompilationIntroTest.groovy +++ b/src/spec/test/typing/StaticCompilationIntroTest.groovy @@ -18,9 +18,12 @@ */ package typing -import groovy.test.GroovyTestCase +import org.junit.jupiter.api.Test -class StaticCompilationIntroTest extends GroovyTestCase { +import static groovy.test.GroovyAssert.assertScript +import static groovy.test.GroovyAssert.shouldFail + +final class StaticCompilationIntroTest { private static String TYPESAFE_PROGRAM = ''' // tag::intro_typesafe[] @@ -66,7 +69,7 @@ class StaticCompilationIntroTest extends GroovyTestCase { private static final String RUN = ''' test() -''' + ''' private static final String RUNTIME_MAGIC = ''' // tag::intro_typesafe_magic[] @@ -74,23 +77,19 @@ class StaticCompilationIntroTest extends GroovyTestCase { // end::intro_typesafe_magic[] ''' + @Test void testTypeSafeProgram() { - def shell = new GroovyShell() - shell.evaluate(TYPESAFE_PROGRAM+RUN) + assertScript(TYPESAFE_PROGRAM+RUN) } + @Test void testTypeSafeProgramBroken() { - def shell = new GroovyShell() - try { - shell.evaluate(TYPESAFE_PROGRAM+RUNTIME_MAGIC+RUN) - assert false - } catch (MissingMethodException e) { - assert e.message.contains('No signature of method: Computer.compute() is applicable for argument types: (Date)') - } + def e = shouldFail(MissingMethodException, TYPESAFE_PROGRAM+RUNTIME_MAGIC+RUN) + assert e.message.contains('No signature of method: compute for class: Computer is applicable for argument types: (Date)') } + @Test void testTypeSafeProgramFixedWithCompileStatic() { - def shell = new GroovyShell() - shell.evaluate(TYPESAFE_COMPILESTATIC_PROGRAM+RUNTIME_MAGIC+RUN) + assertScript(TYPESAFE_COMPILESTATIC_PROGRAM+RUNTIME_MAGIC+RUN) } } diff --git a/src/test/groovy/bugs/Groovy3645Bug.groovy b/src/test/groovy/bugs/Groovy3645.groovy similarity index 68% rename from src/test/groovy/bugs/Groovy3645Bug.groovy rename to src/test/groovy/bugs/Groovy3645.groovy index 18122d92ca..e64919f022 100644 --- a/src/test/groovy/bugs/Groovy3645Bug.groovy +++ b/src/test/groovy/bugs/Groovy3645.groovy @@ -18,20 +18,20 @@ */ package bugs -import groovy.test.GroovyTestCase +import org.junit.jupiter.api.Test -class Groovy3645Bug extends GroovyTestCase { +import static groovy.test.GroovyAssert.shouldFail + +final class Groovy3645 { + @Test void testMethodCallOnSuperInAStaticMethod() { - try{ - assertScript """ - class Foo3645 { - static main(args) { - super.bar() - } + def err = shouldFail MissingMethodException, ''' + class Foo3645 { + static main(args) { + super.bar() } - """ - } catch(MissingMethodException ex) { - assertTrue ex.message.contains("No signature of method: static java.lang.Object.bar()") - } + } + ''' + assert err.message.contains('No signature of static method: bar for class: java.lang.Object') } } diff --git a/src/test/groovy/bugs/Groovy4857Bug.groovy b/src/test/groovy/bugs/Groovy4857.groovy similarity index 60% rename from src/test/groovy/bugs/Groovy4857Bug.groovy rename to src/test/groovy/bugs/Groovy4857.groovy index 4ce7126b47..f20d377a01 100644 --- a/src/test/groovy/bugs/Groovy4857Bug.groovy +++ b/src/test/groovy/bugs/Groovy4857.groovy @@ -18,36 +18,35 @@ */ package bugs -import groovy.test.GroovyTestCase +import org.junit.jupiter.api.Test -class Groovy4857Bug extends GroovyTestCase { +import static groovy.test.GroovyAssert.shouldFail + +final class Groovy4857 { + + @Test void testMissingMethodNotUnsupportedOperation() { - try { - new GroovyShell().evaluate """ - interface A { def getValue() } + def err = shouldFail MissingMethodException, ''' + interface A { def getValue() } - class B { } + class B { } - def test = [ getValue: { 'getValue() called' } ] as A + def test = [ getValue: { 'getValue() called' } ] as A - def b = new B() + def b = new B() - b.call(test) - """ - fail('The compilation should have failed with No signature of method: B.call()') - } catch (e) { - assert e.message.contains('No signature of method: B.call()') - assert e.class.name == 'groovy.lang.MissingMethodException' - } + b.call(test) + ''' + assert err.message.contains('No signature of method: call for class: B') } + @Test void testTrygveAmundsensExample() { - def val = new GroovyShell().evaluate """ + def val = new GroovyShell().evaluate ''' [run: {}] as Runnable - """ + ''' assert val.toString() assert val instanceof Runnable } } - diff --git a/src/test/groovy/bugs/Groovy6072Bug.groovy b/src/test/groovy/bugs/Groovy6072.groovy similarity index 81% rename from src/test/groovy/bugs/Groovy6072Bug.groovy rename to src/test/groovy/bugs/Groovy6072.groovy index ae23c34516..058f02c883 100644 --- a/src/test/groovy/bugs/Groovy6072Bug.groovy +++ b/src/test/groovy/bugs/Groovy6072.groovy @@ -18,16 +18,19 @@ */ package bugs -import groovy.test.GroovyTestCase +import org.junit.jupiter.api.Test -class Groovy6072Bug extends GroovyTestCase { +import static groovy.test.GroovyAssert.shouldFail + +final class Groovy6072 { + @Test void testShouldNotChangeBinExpToClassExp() { - assertScript '''import groovy.transform.ASTTest + def err = shouldFail MissingMethodException, ''' + import groovy.transform.ASTTest import org.codehaus.groovy.ast.expr.BinaryExpression class OhNo {} - try { @ASTTest(phase=CANONICALIZATION, value={ def right = node.rightExpression assert right instanceof BinaryExpression @@ -39,10 +42,7 @@ class Groovy6072Bug extends GroovyTestCase { assert right instanceof BinaryExpression }) def expr2 = OhNo | [] - } catch (MissingMethodException ex) { - assert ex.message.contains('or()') - // alright, what we wanted to test has gone - } ''' + assert err.message.contains('No signature of static method: or for class: OhNo') } } diff --git a/src/test/groovy/bugs/Groovy8678.groovy b/src/test/groovy/bugs/Groovy8678.groovy index 87564a6d53..6a763527b9 100644 --- a/src/test/groovy/bugs/Groovy8678.groovy +++ b/src/test/groovy/bugs/Groovy8678.groovy @@ -18,7 +18,7 @@ */ package bugs -import org.junit.Test +import org.junit.jupiter.api.Test import static groovy.test.GroovyAssert.assertScript import static groovy.test.GroovyAssert.shouldFail @@ -79,87 +79,86 @@ final class Groovy8678 { @Test void testMissingPropertyOrMethod() { def x = new WithMethods() - def throwable = shouldFail () -> x.'42' - assert throwable.class == MissingPropertyException.class + + def throwable = shouldFail(MissingPropertyException) { x.'42' } assert throwable.message.startsWith('No such property: 42 for class: bugs.Groovy8678$WithMethods') - throwable = shouldFail () -> x.'42d' - assert throwable.class == MissingPropertyException.class + + throwable = shouldFail(MissingPropertyException) { x.'42d' } assert throwable.message.startsWith('No such property: 42d for class: bugs.Groovy8678$WithMethods') - throwable = shouldFail () -> x.'84'() - assert throwable.class == MissingMethodException.class - assert throwable.message.startsWith('No signature of method: bugs.Groovy8678$WithMethods.84() is applicable for argument types: () values: []') - throwable = shouldFail () -> x.'84f'() - assert throwable.class == MissingMethodException.class - assert throwable.message.startsWith('No signature of method: bugs.Groovy8678$WithMethods.84f() is applicable for argument types: () values: []') + + throwable = shouldFail(MissingMethodException) { x.'84'() } + assert throwable.message.startsWith('No signature of method: 84 for class: bugs.Groovy8678$WithMethods is applicable for argument types: () values: []') + + throwable = shouldFail(MissingMethodException) { x.'84f'() } + assert throwable.message.startsWith('No signature of method: 84f for class: bugs.Groovy8678$WithMethods is applicable for argument types: () values: []') } @Test - @SuppressWarnings("all") void testCompilationFailure() { shouldNotCompile('\'42\'', '\'FortyTwo\'', '42', // after GROOVY-8678 - cls -> cls == MissingMethodException.class, - msg -> msg.startsWith('No signature of method: WithMethods.call() is applicable for argument types: (BigDecimal) values: [0.42]')) + MissingMethodException, + msg -> msg.startsWith('No signature of method: call for class: WithMethods is applicable for argument types: (BigDecimal) values: [0.42]')) // before GROOVY-8678 - // cls -> cls == MultipleCompilationErrorsException.class, + // MultipleCompilationErrorsException, // msg -> msg.contains('Unexpected input: \'x.42\'')) shouldNotCompile('\'42\'', '\'FortyTwo\'', '42()', // after GROOVY-8678 - cls -> cls == MissingMethodException.class, - msg -> msg.startsWith('No signature of method: java.math.BigDecimal.call() is applicable for argument types: () values: []')) + MissingMethodException, + msg -> msg.startsWith('No signature of method: call for class: java.math.BigDecimal is applicable for argument types: () values: []')) // before GROOVY-8678 - // cls -> cls == MultipleCompilationErrorsException.class, + // MultipleCompilationErrorsException, // msg -> msg.contains('Unexpected input: \'x.42\'')) shouldNotCompile('\'42d\'', '\'FortyTwo\'', '42d', // after GROOVY-8678 - cls -> cls == MissingMethodException.class, - msg -> msg.startsWith('No signature of method: WithMethods.call() is applicable for argument types: (Double) values: [0.42]')) + MissingMethodException, + msg -> msg.startsWith('No signature of method: call for class: WithMethods is applicable for argument types: (Double) values: [0.42]')) // before GROOVY-8678 - // cls -> cls == MultipleCompilationErrorsException.class, + // MultipleCompilationErrorsException, // msg -> msg.contains('Unexpected input: \'x.42d\'')) shouldNotCompile('\'42d\'', '\'FortyTwo\'', '42d()', // after GROOVY-8678 - cls -> cls == MissingMethodException.class, - msg -> msg.startsWith('No signature of method: java.lang.Double.call() is applicable for argument types: () values: []')) + MissingMethodException, + msg -> msg.startsWith('No signature of method: call for class: java.lang.Double is applicable for argument types: () values: []')) // before GROOVY-8678 - // cls -> cls == MultipleCompilationErrorsException.class, + // MultipleCompilationErrorsException, // msg -> msg.contains('Unexpected input: \'x.42d\'')) shouldNotCompile('get84', '\'EightyFour\'', '84', // after GROOVY-8678 - cls -> cls == MissingMethodException.class, - msg -> msg.startsWith('No signature of method: WithMethods.call() is applicable for argument types: (BigDecimal) values: [0.84]')) + MissingMethodException, + msg -> msg.startsWith('No signature of method: call for class: WithMethods is applicable for argument types: (BigDecimal) values: [0.84]')) // before GROOVY-8678 - // cls -> cls == MultipleCompilationErrorsException.class, + // MultipleCompilationErrorsException, // msg -> msg.contains('Unexpected input: \'x.84\'')) shouldNotCompile('get84', '\'EightyFour\'', '84()', // after GROOVY-8678 - cls -> cls == MissingMethodException.class, - msg -> msg.startsWith('No signature of method: java.math.BigDecimal.call() is applicable for argument types: () values: []')) + MissingMethodException, + msg -> msg.startsWith('No signature of method: call for class: java.math.BigDecimal is applicable for argument types: () values: []')) // before GROOVY-8678 - // cls -> cls == MultipleCompilationErrorsException.class, + // MultipleCompilationErrorsException, // msg -> msg.contains('Unexpected input: \'x.84\'')) shouldNotCompile('get84f', '\'EightyFourEff\'', '84f', // after GROOVY-8678 - cls -> cls == MissingMethodException.class, - msg -> msg.startsWith('No signature of method: WithMethods.call() is applicable for argument types: (Float) values: [0.84]')) + MissingMethodException, + msg -> msg.startsWith('No signature of method: call for class: WithMethods is applicable for argument types: (Float) values: [0.84]')) // before GROOVY-8678 - // cls -> cls == MultipleCompilationErrorsException.class, + // MultipleCompilationErrorsException, // msg -> msg.contains('Unexpected input: \'x.84f\'')) shouldNotCompile('get84f', '\'EightyFourEff\'', '84f()', // after GROOVY-8678 - cls -> cls == MissingMethodException.class, - msg -> msg.startsWith('No signature of method: java.lang.Float.call() is applicable for argument types: () values: []')) + MissingMethodException, + msg -> msg.startsWith('No signature of method: call for class: java.lang.Float is applicable for argument types: () values: []')) // before GROOVY-8678 - // cls -> cls == MultipleCompilationErrorsException.class, + // MultipleCompilationErrorsException, // msg -> msg.contains('Unexpected input: \'x.84f\'')) } private static void shouldNotCompile(String methodName, String returnValue, String expression, - Closure<Class<? extends Exception>> exceptionAssertion, + Class<? extends Exception> exceptionType, Closure<String> messageAssertion) { - def throwable = shouldFail """ + def throwable = shouldFail exceptionType, """ class WithMethods { def ${methodName}() { ${returnValue} @@ -168,7 +167,6 @@ final class Groovy8678 { def x = new WithMethods() x.${expression} """.stripIndent() - assert exceptionAssertion(throwable.class) assert messageAssertion(throwable.message) } diff --git a/src/test/groovy/bugs/Groovy9779.groovy b/src/test/groovy/bugs/Groovy9779.groovy index 64e2506e79..5edc308f24 100644 --- a/src/test/groovy/bugs/Groovy9779.groovy +++ b/src/test/groovy/bugs/Groovy9779.groovy @@ -18,14 +18,13 @@ */ package bugs -import groovy.transform.CompileStatic -import org.junit.Test +import org.junit.jupiter.api.Test import static groovy.test.GroovyAssert.assertScript import static groovy.test.GroovyAssert.shouldFail -@CompileStatic final class Groovy9779 { + @Test void testCallOperatorOnDynamicProperties1() { assertScript ''' @@ -73,7 +72,7 @@ final class Groovy9779 { } C.x() ''' - assert err.message.contains('No signature of method: B.call() is applicable') + assert err.message.contains('No signature of method: call for class: B is applicable') } @Test // don't chain call properties together @@ -90,7 +89,7 @@ final class Groovy9779 { } assert new C() + 1 == 42 ''' - assert err.message.contains('No signature of method: C.plus() is applicable') + assert err.message.contains('No signature of method: plus for class: C is applicable') } @Test diff --git a/src/test/groovy/bugs/MethodClosureTest.groovy b/src/test/groovy/bugs/MethodClosureTest.groovy index a61ed18f41..471df3ac35 100644 --- a/src/test/groovy/bugs/MethodClosureTest.groovy +++ b/src/test/groovy/bugs/MethodClosureTest.groovy @@ -19,7 +19,7 @@ package bugs import org.codehaus.groovy.runtime.MethodClosure -import org.junit.Test +import org.junit.jupiter.api.Test import static groovy.test.GroovyAssert.assertScript import static groovy.test.GroovyAssert.shouldFail diff --git a/src/test/groovy/groovy/ThisAndSuperTest.groovy b/src/test/groovy/groovy/ThisAndSuperTest.groovy index b6efb04651..a0d5bdb570 100644 --- a/src/test/groovy/groovy/ThisAndSuperTest.groovy +++ b/src/test/groovy/groovy/ThisAndSuperTest.groovy @@ -19,7 +19,7 @@ package groovy import groovy.test.NotYetImplemented -import org.junit.Test +import org.junit.jupiter.api.Test import static groovy.test.GroovyAssert.assertScript import static groovy.test.GroovyAssert.shouldFail @@ -235,7 +235,7 @@ final class ThisAndSuperTest { } new C().test() ''' - assert err =~ /No signature of method: java\.lang\.Object\.whatever\(\) is applicable for argument types: \(\) values: \[\]/ + assert err =~ /No signature of method: whatever for class: java\.lang\.Object is applicable for argument types: \(\) values: \[\]/ } // GROOVY-9615 @@ -254,7 +254,7 @@ final class ThisAndSuperTest { } new Outer.Inner(new Outer()).test() ''' - assert err =~ /No signature of method: java\.lang\.Object\.whatever\(\) is applicable for argument types: \(\) values: \[\]/ + assert err =~ /No signature of method: whatever for class: java\.lang\.Object is applicable for argument types: \(\) values: \[\]/ } // GROOVY-6001 diff --git a/src/test/groovy/groovy/util/BuilderSupportTest.groovy b/src/test/groovy/groovy/util/BuilderSupportTest.groovy index 8011e2ddd4..a11070e8dc 100644 --- a/src/test/groovy/groovy/util/BuilderSupportTest.groovy +++ b/src/test/groovy/groovy/util/BuilderSupportTest.groovy @@ -18,24 +18,29 @@ */ package groovy.util -import groovy.test.GroovyTestCase +import org.junit.jupiter.api.Test + +import static groovy.test.GroovyAssert.shouldFail /** * Testing BuilderSupport and reveal how calling methods on it result in implementation callbacks. * Using the SpoofBuilder (see below) to call it in various ways and analyze the "spoofed" logs. * This is especially useful when designing subclasses of BuilderSupport. */ -class BuilderSupportTest extends GroovyTestCase{ +final class BuilderSupportTest { + + @Test void testSimpleNode() { def b = new SpoofBuilder() assert b.log == [] def node = b.foo() assert b.log == [ 'create_with_name','foo', - 'node_completed',null, node, + 'node_completed',null, node, 'post_node_completion',null, node ] } + @Test void testSimpleNodeWithValue() { def b = new SpoofBuilder() def node = b.foo('value') @@ -45,17 +50,19 @@ class BuilderSupportTest extends GroovyTestCase{ ] } + @Test void testSimpleNodeWithOneAttribute() { def b = new SpoofBuilder() def node = b.foo(name:'value') assert b.log == [ - 'create_with_name_and_map','foo', - 'name','value', + 'create_with_name_and_map','foo', + 'name','value', 'node_completed',null,'x', 'post_node_completion',null, 'x' ] } + @Test void testSimpleNodeWithClosure() { def b = new SpoofBuilder() b.foo(){ @@ -72,66 +79,75 @@ class BuilderSupportTest extends GroovyTestCase{ ] } + @Test void testSimpleNodeWithOneAttributeAndValue() { def b = new SpoofBuilder() def node = b.foo(bar:'baz', 'value') assert b.log == [ - 'create_with_name_map_and_value', 'foo', 'bar', 'baz','value', + 'create_with_name_map_and_value', 'foo', 'bar', 'baz','value', 'node_completed',null,node, 'post_node_completion',null, node ] } + @Test void testSimpleNodeWithValueAndOneAttribute() { def b = new SpoofBuilder() def node = b.foo('value', bar:'baz') assert b.log == [ - 'create_with_name_map_and_value', 'foo', 'bar', 'baz','value', + 'create_with_name_map_and_value', 'foo', 'bar', 'baz','value', 'node_completed',null,node, 'post_node_completion',null, node ] } + @Test void testSimpleNodeWithOneAttributeAndValueAndClosure() { def b = new SpoofBuilder() def node = b.foo(bar:'baz', 'value') { 1 } assert b.log == [ - 'create_with_name_map_and_value', 'foo', 'bar', 'baz','value', + 'create_with_name_map_and_value', 'foo', 'bar', 'baz','value', 'node_completed',null,node, 'post_node_completion',null, node ] } + @Test void testSimpleNodeWithValueAndOneAttributeAndClosure() { def b = new SpoofBuilder() def node = b.foo('value', bar:'baz') { 1 } assert b.log == [ - 'create_with_name_map_and_value', 'foo', 'bar', 'baz','value', + 'create_with_name_map_and_value', 'foo', 'bar', 'baz','value', 'node_completed',null,node, 'post_node_completion',null, node ] } + @Test void testSimpleNodeTwoValues() { def b = new SpoofBuilder() shouldFail(MissingMethodException, {def node = b.foo('arg1', 'arg2')}) } + @Test void testSimpleNodeTwoValuesClosure() { def b = new SpoofBuilder() shouldFail(MissingMethodException, {def node = b.foo('arg1', 'arg2') { 1 } }) } + @Test void testSimpleNodeThreeValues() { def b = new SpoofBuilder() shouldFail(MissingMethodException, {def node = b.foo('arg1', 'arg2', 'arg3') }) } + @Test void testSimpleNodeFourValues() { def b = new SpoofBuilder() shouldFail(MissingMethodException, {def node = b.foo('arg1', 'arg2', 'arg3', 'arg4') }) } + @Test void testNestedMethodCallsResolution() { def b = new SpoofBuilder() b.outest { @@ -139,7 +155,7 @@ class BuilderSupportTest extends GroovyTestCase{ nestedBuilderCall(b) } } - assert b.log.contains('inner') + assert b.log.contains('inner') } void nestedBuilderCall(builder) { @@ -147,49 +163,50 @@ class BuilderSupportTest extends GroovyTestCase{ } // GROOVY-3341 + @Test void testSimpleNodeWithClosureThatThrowsAMissingMethodException() { def builder = new SpoofBuilder() - String errorMessage = shouldFail(MissingMethodException, { + String errorMessage = shouldFail(MissingMethodException) { builder.a { b { error('xy'.foo()) } } - }) - assert errorMessage.contains('No signature of method: java.lang.String.foo()') + } + assert errorMessage.contains('No signature of method: foo for class: java.lang.String') } } /** - The SpoofBuilder is a sample instance of the abstract BuilderSupport class - that does nothing but logging how it was called, returning 'x' for each node. -**/ -class SpoofBuilder extends BuilderSupport{ + * The SpoofBuilder is a sample instance of the abstract BuilderSupport class + * that does nothing but logging how it was called, returning 'x' for each node. + */ +class SpoofBuilder extends BuilderSupport { def log = [] - protected void setParent(Object parent, Object child){ + protected void setParent(Object parent, Object child) { log << "set_parent" log << parent log << child } - protected Object createNode(Object name){ + protected Object createNode(Object name) { log << 'create_with_name' log << name return 'x' } - protected Object createNode(Object name, Object value){ + protected Object createNode(Object name, Object value) { log << 'create_with_name_and_value' log << name log << value return 'x' } - protected Object createNode(Object name, Map attributes){ + protected Object createNode(Object name, Map attributes) { log << 'create_with_name_and_map' log << name attributes.each{entry -> log << entry.key; log << entry.value} return 'x' } - protected Object createNode(Object name, Map attributes, Object value){ + protected Object createNode(Object name, Map attributes, Object value) { log << 'create_with_name_map_and_value' log << name attributes.each{entry -> log << entry.key; log << entry.value} @@ -201,7 +218,6 @@ class SpoofBuilder extends BuilderSupport{ log << parent log << node } - protected Object postNodeCompletion(Object parent, Object node) { log << 'post_node_completion' log << parent diff --git a/src/test/groovy/org/codehaus/groovy/transform/NewifyTransformBlackBoxTest.groovy b/src/test/groovy/org/codehaus/groovy/transform/NewifyTransformBlackBoxTest.groovy index f75213be09..0b8ad37883 100644 --- a/src/test/groovy/org/codehaus/groovy/transform/NewifyTransformBlackBoxTest.groovy +++ b/src/test/groovy/org/codehaus/groovy/transform/NewifyTransformBlackBoxTest.groovy @@ -18,18 +18,15 @@ */ package org.codehaus.groovy.transform -import gls.CompilableTestSupport -import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.JUnit4 +import org.junit.jupiter.api.Test -import java.util.Map.Entry +import static groovy.test.GroovyAssert.assertScript +import static groovy.test.GroovyAssert.shouldFail /** * Tests for the {@code @Newify} AST transform. */ -@RunWith(JUnit4) -class NewifyTransformBlackBoxTest extends CompilableTestSupport { +final class NewifyTransformBlackBoxTest { @Test void testNewifyWithoutNamePattern() { @@ -57,11 +54,10 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assertScript(script0) - final result = shouldNotCompile(script1) - assert result.contains("Cannot find matching method NewifyFoo#AB(java.lang.String)") + final result = shouldFail(script1) + assert result =~ "Cannot find matching method NewifyFoo#AB\\(java.lang.String\\)" } - @Test void testRegularClassNewifyWithNamePattern() { final String script = """ @@ -93,7 +89,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assert result.toString() == 'abc_123_13' } - @Test void testInnerScriptClassNewifyWithNamePattern() { final String script = """ @@ -124,7 +119,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assert resultList[1] == ['A(2018-04-08)', 'AB(I am, class AB)', 'ABC(A, B, C)'] } - @Test void testInnerClassesNewifyWithNamePattern() { final String script = """ @@ -158,7 +152,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assert resultList[1] == ['Foo$A(2018-04-08)', 'Foo$AB(I am, class AB)', 'Foo$ABC(A, B, C)'] } - @Test void testInnerStaticClassesNewifyWithNamePattern() { final String script = """ @@ -191,7 +184,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assert resultList[1] == ['Foo$A(2018-04-08)', 'Foo$AB(I am, class AB)', 'Foo$ABC(A, B, C)'] } - @Test void testAmbiguousInnerStaticClassesNewifyWithNamePatternFails() { final String script = """ @@ -216,11 +208,10 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { println "script=|$script|" - final String result = shouldNotCompile(script) + final String result = shouldFail(script) assert result ==~ '(?s).*Inner class name lookup is ambiguous between the following classes: Foo, Foo\\$Foo, Foo\\$Foo\\$Foo\\..*' } - @Test void testImportedClassesNewifyWithNamePattern() { final String script = """ @@ -252,7 +243,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assert resultList[1] == ['A(2018-04-08)', '*lol*', 'AB(I am, class AB)', 'ABC(A, B, C)'] } - @Test void testAlwaysExistingClassesNewifyWithNamePattern() { final String script = """ @@ -284,7 +274,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assert resultList[1] == ['A(2018-04-08)', '*lol*', 'AB(I am, class AB)', 'ABC(A, B, C)', 'java.lang.Object'] } - @Test void testNewifyWithNamePatternMixed() { final String script = """ @@ -329,7 +318,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { ] } - @Test void testAliasImportedClassesNewifyWithNamePattern() { final String script = """ @@ -354,7 +342,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assert resultList[1] == ['Discrete Reality'] } - @Test void testAliasShadowededImportedClassesNewifyWithNamePatternFails() { final String script = """ @@ -375,11 +362,10 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { println "script=|$script|" - final String result = shouldNotCompile(script) + final String result = shouldFail(script) assert result ==~ /(?s).*\[Static type checking] - Cannot find matching method TestScript[A-Za-z0-9]*#StringBuilder\(java\.lang\.String\).*/ } - @Test void testInvalidNamePatternNewifyWithNamePatternFails() { final String script = """ @@ -400,11 +386,10 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { println "script=|$script|" - final String result = shouldNotCompile(script) + final String result = shouldFail(script) assert result ==~ /(?s).*Invalid class name pattern: Illegal character range near index 3.*/ } - @Test void testStaticallyAndDynamicallyCompiledMixedClassesNewifyWithNamePattern() { final List<Boolean> compileStaticFlags = [true] @@ -433,7 +418,6 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { assertMixedClassesNewifyWithNamePatternFails("@Newify(pattern=/XXX/)", [false], standardCompileDynamiccErrorMsg) } - @Test void testExtractName() { ['', 'A', 'Bc', 'DEF'].each { String s -> @@ -446,9 +430,8 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { } } - String getStandardCompileDynamiccErrorMsg() { - "No signature of method: Foo.A() is applicable for argument types: (String) values: [2018-04-08]" + "No signature of method: A for class: Foo is applicable for argument types: (String) values: [2018-04-08]" } String getStandardCompileStaticErrorMsg() { @@ -513,14 +496,12 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { return resultList } - void assertExtractName(final String s, final String expected) { final String result = NewifyASTTransformation.extractName(s) println "|$s| -> |$result|" assert result == expected } - String classCode(final List<String> lines) { code(lines, 1) } String scriptCode(final List<String> lines) { code(lines, 0) } @@ -534,7 +515,7 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { final Map<String, Object> annotationParameters, final String classPart, final String scriptPart = '') { assert !hasAnnotation || (annotationParameters != null); assert classPart - final String annotationParametersTerm = annotationParameters ? "(${annotationParameters.collect { final Entry<String, Object> e -> "$e.key=$e.value" }.join(', ')})" : '' + final String annotationParametersTerm = annotationParameters ? "(${annotationParameters.collect { final Map.Entry<String, Object> e -> "$e.key=$e.value" }.join(', ')})" : '' final String script = """ import groovy.transform.Canonical import groovy.transform.CompileStatic @@ -560,13 +541,11 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { 'NewifyFoo' } - static def evalScript(final String script) throws Exception { GroovyShell shell = new GroovyShell(); shell.evaluate(script); } - static Throwable compileShouldThrow(final String script, final String testClassName) { try { final GroovyClassLoader gcl = new GroovyClassLoader() @@ -577,5 +556,4 @@ class NewifyTransformBlackBoxTest extends CompilableTestSupport { } throw new Exception("Script was expected to throw here!") } - }
