diff options
author | 2018-04-09 15:43:22 -0700 | |
---|---|---|
committer | 2018-04-09 15:44:52 -0700 | |
commit | 979195edc4ad8ea7b6923f99c827a4c1ec102815 (patch) | |
tree | 09732695db9c9d5c1b64297de41b7d0ea639e17c /src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java | |
parent | 5c20c949188641db1376dd4b7ed958658ccb3670 (diff) |
Introduce extraPositonals and extraArguments to SkylarkCallable, to have parity with @SkylarkSignature.
This is necessary for several builtin functions that still use @SkylarkSignature, such as string format. These will be migrated in a future CL.
RELNOTES: None.
PiperOrigin-RevId: 192200282
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java | 183 |
1 files changed, 182 insertions, 1 deletions
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 3804a72d53..7b86d6cad4 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 @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.syntax; import static com.google.common.truth.Truth.assertThat; +import static java.util.stream.Collectors.joining; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; @@ -163,7 +164,7 @@ public class SkylarkEvaluationTest extends EvaluationTest { return ImmutableMap.of("a", ImmutableList.of("b", "c")); } - + @SkylarkCallable( name = "with_params", documented = false, @@ -365,6 +366,82 @@ public class SkylarkEvaluationTest extends EvaluationTest { return NativeProvider.STRUCT.create(builder.build(), "no native callable '%s'"); } + @SkylarkCallable( + name = "with_args_and_env", + documented = false, + parameters = { + @Param(name = "pos1", type = Integer.class), + @Param(name = "pos2", defaultValue = "False", type = Boolean.class), + @Param(name = "named", type = Boolean.class, positional = false, named = true), + }, + extraPositionals = @Param(name = "args"), + useEnvironment = true + ) + public String withArgsAndEnv( + Integer pos1, boolean pos2, boolean named, SkylarkList<?> args, Environment env) { + String argsString = + "args(" + args.stream().map(Printer::debugPrint).collect(joining(", ")) + ")"; + return "with_args_and_env(" + + pos1 + + ", " + + pos2 + + ", " + + named + + ", " + + argsString + + ", " + + env.isGlobal() + + ")"; + } + + @SkylarkCallable( + name = "with_kwargs", + documented = false, + parameters = { + @Param(name = "pos", defaultValue = "False", type = Boolean.class), + @Param(name = "named", type = Boolean.class, positional = false, named = true), + }, + extraKeywords = @Param(name = "kwargs") + ) + public String withKwargs(boolean pos, boolean named, SkylarkDict<?, ?> kwargs) + throws EvalException { + String kwargsString = + "kwargs(" + + kwargs + .getContents(String.class, Object.class, "kwargs") + .entrySet() + .stream() + .map(entry -> entry.getKey() + "=" + entry.getValue()) + .collect(joining(", ")) + + ")"; + return "with_kwargs(" + pos + ", " + named + ", " + kwargsString + ")"; + } + + @SkylarkCallable( + name = "with_args_and_kwargs", + documented = false, + parameters = { + @Param(name = "foo", named = true, positional = true, type = String.class), + }, + extraPositionals = @Param(name = "args"), + extraKeywords = @Param(name = "kwargs") + ) + public String withArgsAndKwargs(String foo, SkylarkList<?> args, SkylarkDict<?, ?> kwargs) + throws EvalException { + String argsString = + "args(" + args.stream().map(Printer::debugPrint).collect(joining(", ")) + ")"; + String kwargsString = + "kwargs(" + + kwargs + .getContents(String.class, Object.class, "kwargs") + .entrySet() + .stream() + .map(entry -> entry.getKey() + "=" + entry.getValue()) + .collect(joining(", ")) + + ")"; + return "with_args_and_kwargs(" + foo + ", " + argsString + ", " + kwargsString + ")"; + } + @Override public String toString() { return "<mock>"; @@ -1108,6 +1185,107 @@ public class SkylarkEvaluationTest extends EvaluationTest { } @Test + public void testJavaFunctionWithExtraArgsAndEnv() throws Exception { + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_args_and_env(1, True, 'extraArg1', 'extraArg2', named=True)") + .testLookup("b", "with_args_and_env(1, true, true, args(extraArg1, extraArg2), true)"); + + // Use an args list. + new SkylarkTest() + .update("mock", new Mock()) + .setUp( + "myargs = ['extraArg2']", + "b = mock.with_args_and_env(1, True, 'extraArg1', named=True, *myargs)") + .testLookup("b", "with_args_and_env(1, true, true, args(extraArg1, extraArg2), true)"); + } + + @Test + public void testJavaFunctionWithExtraKwargs() throws Exception { + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_kwargs(True, extraKey1=True, named=True, extraKey2='x')") + .testLookup("b", "with_kwargs(true, true, kwargs(extraKey1=true, extraKey2=x))"); + + // Use a kwargs dict. + new SkylarkTest() + .update("mock", new Mock()) + .setUp( + "mykwargs = {'extraKey2':'x', 'named':True}", + "b = mock.with_kwargs(True, extraKey1=True, **mykwargs)") + .testLookup("b", "with_kwargs(true, true, kwargs(extraKey1=true, extraKey2=x))"); + } + + @Test + public void testJavaFunctionWithArgsAndKwargs() throws Exception { + // Foo is used positionally + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_args_and_kwargs('foo', 'bar', 'baz', extraKey1=True, extraKey2='x')") + .testLookup( + "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey1=true, extraKey2=x))"); + + // Use an args list and a kwargs dict + new SkylarkTest() + .update("mock", new Mock()) + .setUp( + "mykwargs = {'extraKey1':True}", + "myargs = ['baz']", + "b = mock.with_args_and_kwargs('foo', 'bar', extraKey2='x', *myargs, **mykwargs)") + .testLookup( + "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey2=x, extraKey1=true))"); + + // Foo is used by name + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_args_and_kwargs(foo='foo', extraKey1=True)") + .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs(extraKey1=true))"); + + // Empty args and kwargs. + new SkylarkTest() + .update("mock", new Mock()) + .setUp("b = mock.with_args_and_kwargs('foo')") + .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs())"); + } + + @Test + public void testProxyMethodsObjectWithArgsAndKwargs() throws Exception { + // Foo is used positionally + new SkylarkTest() + .update("mock", new Mock()) + .setUp( + "m = mock.proxy_methods_object()", + "b = m.with_args_and_kwargs('foo', 'bar', 'baz', extraKey1=True, extraKey2='x')") + .testLookup( + "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey1=true, extraKey2=x))"); + + // Use an args list and a kwargs dict + new SkylarkTest() + .update("mock", new Mock()) + .setUp( + "mykwargs = {'extraKey1':True}", + "myargs = ['baz']", + "m = mock.proxy_methods_object()", + "b = m.with_args_and_kwargs('foo', 'bar', extraKey2='x', *myargs, **mykwargs)") + .testLookup( + "b", "with_args_and_kwargs(foo, args(bar, baz), kwargs(extraKey2=x, extraKey1=true))"); + + // Foo is used by name + new SkylarkTest() + .update("mock", new Mock()) + .setUp( + "m = mock.proxy_methods_object()", + "b = m.with_args_and_kwargs(foo='foo', extraKey1=True)") + .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs(extraKey1=true))"); + + // Empty args and kwargs. + new SkylarkTest() + .update("mock", new Mock()) + .setUp("m = mock.proxy_methods_object()", "b = m.with_args_and_kwargs('foo')") + .testLookup("b", "with_args_and_kwargs(foo, args(), kwargs())"); + } + + @Test public void testStructAccessOfMethod() throws Exception { new SkylarkTest() .update("mock", new Mock()) @@ -1591,7 +1769,10 @@ public class SkylarkEvaluationTest extends EvaluationTest { "struct_field_callable", "value_of", "voidfunc", + "with_args_and_env", + "with_args_and_kwargs", "with_extra", + "with_kwargs", "with_params", "with_params_and_extra"); } |