| # Copyright 2018 The Bazel Authors. All rights reserved. |
| # |
| # Licensed 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. |
| |
| """Unit tests for partial.bzl.""" |
| |
| load("//lib:partial.bzl", "partial") |
| load("//lib:unittest.bzl", "asserts", "unittest") |
| |
| def _make_noargs_nokwargs(): |
| """Test utility for no args no kwargs case""" |
| return 1 |
| |
| def _make_args_nokwargs(arg1, arg2, arg3): |
| """Test utility for args no kwargs case""" |
| return arg1 + arg2 + arg3 |
| |
| def _make_args_kwargs(arg1, arg2, arg3, **kwargs): |
| """Test utility for args and kwargs case""" |
| return arg1 + arg2 + arg3 + kwargs["x"] + kwargs["y"] |
| |
| def _call_noargs_nokwargs(call_arg1): |
| """Test utility no args no kwargs case where values passed from call site""" |
| return call_arg1 |
| |
| def _call_args_nokwargs(func_arg1, call_arg1): |
| """Test utility for args no kwargs case where values passed from call site""" |
| return func_arg1 + call_arg1 |
| |
| def _call_args_kwargs(func_arg1, call_arg1, func_mult, call_mult): |
| """Test utility for args and kwargs case where values passed from call site""" |
| return (func_arg1 + call_arg1) * func_mult * call_mult |
| |
| def _make_call_test(ctx): |
| """Unit tests for partial.make and partial.call.""" |
| env = unittest.begin(ctx) |
| |
| # Test cases where there are no args (or kwargs) at the make site, only |
| # at the call site. |
| foo = partial.make(_make_noargs_nokwargs) |
| asserts.equals(env, 1, partial.call(foo)) |
| |
| foo = partial.make(_make_args_nokwargs) |
| asserts.equals(env, 6, partial.call(foo, 1, 2, 3)) |
| |
| foo = partial.make(_make_args_kwargs) |
| asserts.equals(env, 15, partial.call(foo, 1, 2, 3, x = 4, y = 5)) |
| |
| # Test cases where there are args (and/or kwargs) at the make site and the |
| # call site. |
| foo = partial.make(_call_noargs_nokwargs, 100) |
| asserts.equals(env, 100, partial.call(foo)) |
| |
| foo = partial.make(_call_args_nokwargs, 100) |
| asserts.equals(env, 112, partial.call(foo, 12)) |
| |
| foo = partial.make(_call_args_kwargs, 100, func_mult = 10) |
| asserts.equals(env, 2240, partial.call(foo, 12, call_mult = 2)) |
| |
| # Test case where there are args and kwargs ath the make site, and the call |
| # site overrides some make site args. |
| foo = partial.make(_call_args_kwargs, 100, func_mult = 10) |
| asserts.equals(env, 1120, partial.call(foo, 12, func_mult = 5, call_mult = 2)) |
| |
| return unittest.end(env) |
| |
| make_call_test = unittest.make(_make_call_test) |
| |
| def _is_instance_test(ctx): |
| """Unit test for partial.is_instance.""" |
| env = unittest.begin(ctx) |
| |
| # We happen to use make_call_test here, but it could be any valid test rule. |
| asserts.true(env, partial.is_instance(partial.make(make_call_test))) |
| asserts.true(env, partial.is_instance(partial.make(make_call_test, timeout = "short"))) |
| asserts.true(env, partial.is_instance(partial.make(make_call_test, timeout = "short", tags = ["foo"]))) |
| asserts.false(env, partial.is_instance(None)) |
| asserts.false(env, partial.is_instance({})) |
| asserts.false(env, partial.is_instance(struct(foo = 1))) |
| asserts.false(env, partial.is_instance(struct(function = "not really function"))) |
| |
| return unittest.end(env) |
| |
| is_instance_test = unittest.make(_is_instance_test) |
| |
| def partial_test_suite(): |
| """Creates the test targets and test suite for partial.bzl tests.""" |
| unittest.suite( |
| "partial_tests", |
| make_call_test, |
| is_instance_test, |
| ) |