| # Copyright 2023 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. |
| |
| """Utilities for testing rules_testing code.""" |
| |
| # buildifier: disable=bzl-visibility |
| load("//lib/private:expect_meta.bzl", "ExpectMeta") |
| load("//lib:truth.bzl", "matching") |
| |
| def _fake_meta(real_env): |
| """Create a fake ExpectMeta object for testing. |
| |
| The fake ExpectMeta object copies a real ExpectMeta object, except: |
| * Failures are only recorded and don't cause a failure in `real_env`. |
| * `failures` attribute is added; this is a list of failures seen. |
| * `reset` attribute is added; this clears the failures list. |
| |
| Args: |
| real_env: A real env object from the rules_testing framework. |
| |
| Returns: |
| struct, a fake ExpectMeta object. |
| """ |
| failures = [] |
| fake_env = struct( |
| ctx = real_env.ctx, |
| fail = lambda msg: failures.append(msg), |
| failures = failures, |
| ) |
| meta_impl = ExpectMeta.new(fake_env) |
| meta_impl_kwargs = { |
| attr: getattr(meta_impl, attr) |
| for attr in dir(meta_impl) |
| if attr not in ("to_json", "to_proto") |
| } |
| fake_meta = struct( |
| failures = failures, |
| reset = lambda: failures.clear(), |
| **meta_impl_kwargs |
| ) |
| return fake_meta |
| |
| def _expect_no_failures(env, fake_meta, case): |
| """Check that a fake meta object had no failures. |
| |
| NOTE: This clears the list of failures after checking. This is done |
| so that an earlier failure is only reported once. |
| |
| Args: |
| env: Real `Expect` object to perform asserts. |
| fake_meta: A fake meta object that had failures recorded. |
| case: str, a description of the case that was tested. |
| """ |
| env.expect.that_collection( |
| fake_meta.failures, |
| expr = case, |
| ).contains_exactly([]) |
| fake_meta.reset() |
| |
| def _expect_failures(env, fake_meta, case, *errors): |
| """Check that a fake meta object has matching error strings. |
| |
| NOTE: This clears the list of failures after checking. This is done |
| so that an earlier failure is only reported once. |
| |
| Args: |
| env: Real `Expect` object to perform asserts. |
| fake_meta: A fake meta object that had failures recorded. |
| case: str, a description of the case that was tested. |
| *errors: list of strings. These are patterns to match, as supported |
| by `matching.str_matches` (e.g. `*`-style patterns) |
| """ |
| env.expect.that_collection( |
| fake_meta.failures, |
| expr = case, |
| ).contains_at_least_predicates( |
| [matching.str_matches(e) for e in errors], |
| ) |
| fake_meta.reset() |
| |
| test_util = struct( |
| fake_meta = _fake_meta, |
| expect_no_failures = _expect_no_failures, |
| expect_failures = _expect_failures, |
| ) |