From 17214ac78ffaec369d5d5bafe62a39730473cfaa Mon Sep 17 00:00:00 2001 From: dslomov Date: Wed, 20 Sep 2017 14:35:11 +0200 Subject: Check parameter types for methods when multiple types are allowed. Fixes #3714 RELNOTES: None. PiperOrigin-RevId: 169382686 --- .../SkylarkRuleImplementationFunctionsTest.java | 3 +- .../build/lib/syntax/SkylarkEvaluationTest.java | 52 +++++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) (limited to 'src/test/java/com') diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java index 0add5edade..983539a49a 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java @@ -297,7 +297,8 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase { public void testCreateSpawnActionArgumentsBadExecutable() throws Exception { checkErrorContains( createRuleContext("//foo:foo"), - "expected file or string for executable but got int instead", + "Cannot convert parameter 'executable' to type File or string, in method " + + "run(list inputs, list outputs, list arguments, int executable) of 'actions'", "ruleContext.actions.run(", " inputs = ruleContext.files.srcs,", " outputs = ruleContext.files.srcs,", diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java index 1febef33f9..175aedad67 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.skylarkinterface.Param; +import com.google.devtools.build.lib.skylarkinterface.ParamType; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature; @@ -155,6 +156,18 @@ public class SkylarkEvaluationTest extends EvaluationTest { positional = false, named = true ), + @Param( + name = "multi", + allowedTypes = { + @ParamType(type = String.class), + @ParamType(type = Integer.class), + @ParamType(type = SkylarkList.class, generic1 = Integer.class), + }, + defaultValue = "None", + noneable = true, + positional = false, + named = true + ) } ) public String withParams( @@ -164,7 +177,8 @@ public class SkylarkEvaluationTest extends EvaluationTest { boolean named, boolean optionalNamed, Object nonNoneable, - Object noneable) { + Object noneable, + Object multi) { return "with_params(" + pos1 + ", " @@ -177,6 +191,8 @@ public class SkylarkEvaluationTest extends EvaluationTest { + optionalNamed + ", " + nonNoneable.toString() + + (noneable != Runtime.NONE ? ", " + noneable : "") + + (multi != Runtime.NONE ? ", " + multi : "") + ")"; } @@ -742,6 +758,21 @@ public class SkylarkEvaluationTest extends EvaluationTest { .update("mock", new Mock()) .setUp("b = mock.with_params(1, True, named=True)") .testLookup("b", "with_params(1, true, false, true, false, a)"); + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_params(1, True, named=True, multi=1)") + .testLookup("b", "with_params(1, true, false, true, false, a, 1)"); + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_params(1, True, named=True, multi='abc')") + .testLookup("b", "with_params(1, true, false, true, false, a, abc)"); + + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_params(1, True, named=True, multi=[1,2,3])") + .testLookup("b", "with_params(1, true, false, true, false, a, [1, 2, 3])"); + + new SkylarkTest() .update("mock", new Mock()) .setUp("") @@ -781,6 +812,25 @@ public class SkylarkEvaluationTest extends EvaluationTest { "parameter 'nonNoneable' cannot be None, in method with_params(int, bool, bool, " + "bool named, bool optionalNamed, NoneType nonNoneable) of 'Mock'", "mock.with_params(1, True, True, named=True, optionalNamed=False, nonNoneable=None)"); + + new SkylarkTest() + .update("mock", new Mock()) + .setUp("") + .testIfExactError( + "Cannot convert parameter 'multi' to type string or int or sequence of ints or" + + " NoneType, in method with_params(int, bool, bool named, bool multi) of 'Mock'", + "mock.with_params(1, True, named=True, multi=False)" + ); + + // We do not enforce list item parameter type constraints. + // Test for this behavior. + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_params(1, True, named=True, multi=['a', 'b'])") + .testLookup( + "b", "with_params(1, true, false, true, false, a, [\"a\", \"b\"])" + ); + } @Test -- cgit v1.2.3