1# Copyright 2018 The Bazel Authors. All rights reserved. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15"""Unit tests for partial.bzl.""" 16 17load("//lib:partial.bzl", "partial") 18load("//lib:unittest.bzl", "asserts", "unittest") 19 20def _make_noargs_nokwargs(): 21 """Test utility for no args no kwargs case""" 22 return 1 23 24def _make_args_nokwargs(arg1, arg2, arg3): 25 """Test utility for args no kwargs case""" 26 return arg1 + arg2 + arg3 27 28def _make_args_kwargs(arg1, arg2, arg3, **kwargs): 29 """Test utility for args and kwargs case""" 30 return arg1 + arg2 + arg3 + kwargs["x"] + kwargs["y"] 31 32def _call_noargs_nokwargs(call_arg1): 33 """Test utility no args no kwargs case where values passed from call site""" 34 return call_arg1 35 36def _call_args_nokwargs(func_arg1, call_arg1): 37 """Test utility for args no kwargs case where values passed from call site""" 38 return func_arg1 + call_arg1 39 40def _call_args_kwargs(func_arg1, call_arg1, func_mult, call_mult): 41 """Test utility for args and kwargs case where values passed from call site""" 42 return (func_arg1 + call_arg1) * func_mult * call_mult 43 44def _make_call_test(ctx): 45 """Unit tests for partial.make and partial.call.""" 46 env = unittest.begin(ctx) 47 48 # Test cases where there are no args (or kwargs) at the make site, only 49 # at the call site. 50 foo = partial.make(_make_noargs_nokwargs) 51 asserts.equals(env, 1, partial.call(foo)) 52 53 foo = partial.make(_make_args_nokwargs) 54 asserts.equals(env, 6, partial.call(foo, 1, 2, 3)) 55 56 foo = partial.make(_make_args_kwargs) 57 asserts.equals(env, 15, partial.call(foo, 1, 2, 3, x = 4, y = 5)) 58 59 # Test cases where there are args (and/or kwargs) at the make site and the 60 # call site. 61 foo = partial.make(_call_noargs_nokwargs, 100) 62 asserts.equals(env, 100, partial.call(foo)) 63 64 foo = partial.make(_call_args_nokwargs, 100) 65 asserts.equals(env, 112, partial.call(foo, 12)) 66 67 foo = partial.make(_call_args_kwargs, 100, func_mult = 10) 68 asserts.equals(env, 2240, partial.call(foo, 12, call_mult = 2)) 69 70 # Test case where there are args and kwargs ath the make site, and the call 71 # site overrides some make site args. 72 foo = partial.make(_call_args_kwargs, 100, func_mult = 10) 73 asserts.equals(env, 1120, partial.call(foo, 12, func_mult = 5, call_mult = 2)) 74 75 return unittest.end(env) 76 77make_call_test = unittest.make(_make_call_test) 78 79def _is_instance_test(ctx): 80 """Unit test for partial.is_instance.""" 81 env = unittest.begin(ctx) 82 83 # We happen to use make_call_test here, but it could be any valid test rule. 84 asserts.true(env, partial.is_instance(partial.make(make_call_test))) 85 asserts.true(env, partial.is_instance(partial.make(make_call_test, timeout = "short"))) 86 asserts.true(env, partial.is_instance(partial.make(make_call_test, timeout = "short", tags = ["foo"]))) 87 asserts.false(env, partial.is_instance(None)) 88 asserts.false(env, partial.is_instance({})) 89 asserts.false(env, partial.is_instance(struct(foo = 1))) 90 asserts.false(env, partial.is_instance(struct(function = "not really function"))) 91 92 return unittest.end(env) 93 94is_instance_test = unittest.make(_is_instance_test) 95 96def partial_test_suite(): 97 """Creates the test targets and test suite for partial.bzl tests.""" 98 unittest.suite( 99 "partial_tests", 100 make_call_test, 101 is_instance_test, 102 ) 103