xref: /aosp_15_r20/external/bazelbuild-rules_testing/lib/truth.bzl (revision d605057434dcabba796c020773aab68d9790ff9f)
1*d6050574SRomain Jobredeaux# Copyright 2023 The Bazel Authors. All rights reserved.
2*d6050574SRomain Jobredeaux#
3*d6050574SRomain Jobredeaux# Licensed under the Apache License, Version 2.0 (the "License");
4*d6050574SRomain Jobredeaux# you may not use this file except in compliance with the License.
5*d6050574SRomain Jobredeaux# You may obtain a copy of the License at
6*d6050574SRomain Jobredeaux#
7*d6050574SRomain Jobredeaux#     http://www.apache.org/licenses/LICENSE-2.0
8*d6050574SRomain Jobredeaux#
9*d6050574SRomain Jobredeaux# Unless required by applicable law or agreed to in writing, software
10*d6050574SRomain Jobredeaux# distributed under the License is distributed on an "AS IS" BASIS,
11*d6050574SRomain Jobredeaux# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*d6050574SRomain Jobredeaux# See the License for the specific language governing permissions and
13*d6050574SRomain Jobredeaux# limitations under the License.
14*d6050574SRomain Jobredeaux
15*d6050574SRomain Jobredeaux"""# Truth
16*d6050574SRomain Jobredeaux
17*d6050574SRomain JobredeauxTruth-style asserts for Bazel's Starlark.
18*d6050574SRomain Jobredeaux
19*d6050574SRomain JobredeauxThese asserts follow the Truth-style way of performing assertions. This
20*d6050574SRomain Jobredeauxbasically means the actual value is wrapped in a type-specific object that
21*d6050574SRomain Jobredeauxprovides type-specific assertion methods. This style provides several benefits:
22*d6050574SRomain Jobredeaux    * A fluent API that more directly expresses the assertion
23*d6050574SRomain Jobredeaux    * More egonomic assert functions
24*d6050574SRomain Jobredeaux    * Error messages with more informative context
25*d6050574SRomain Jobredeaux    * Promotes code reuses at the type-level.
26*d6050574SRomain Jobredeaux
27*d6050574SRomain JobredeauxFor more detailed documentation, see the docs on GitHub.
28*d6050574SRomain Jobredeaux
29*d6050574SRomain Jobredeaux## Basic usage
30*d6050574SRomain Jobredeaux
31*d6050574SRomain JobredeauxNOTE: This example assumes usage of [`rules_testing`]'s [`analysis_test`]
32*d6050574SRomain Jobredeauxframework, but that framework is not required.
33*d6050574SRomain Jobredeaux
34*d6050574SRomain Jobredeaux```
35*d6050574SRomain Jobredeauxdef foo_test(env, target):
36*d6050574SRomain Jobredeaux    subject = env.expect.that_target(target)
37*d6050574SRomain Jobredeaux    subject.runfiles().contains_at_least(["foo.txt"])
38*d6050574SRomain Jobredeaux    subject.executable().equals("bar.exe")
39*d6050574SRomain Jobredeaux
40*d6050574SRomain Jobredeaux    subject = env.expect.that_action(...)
41*d6050574SRomain Jobredeaux    subject.contains_at_least_args(...)
42*d6050574SRomain Jobredeaux```
43*d6050574SRomain Jobredeaux"""
44*d6050574SRomain Jobredeaux
45*d6050574SRomain Jobredeauxload("//lib/private:bool_subject.bzl", "BoolSubject")
46*d6050574SRomain Jobredeauxload("//lib/private:collection_subject.bzl", "CollectionSubject")
47*d6050574SRomain Jobredeauxload("//lib/private:default_info_subject.bzl", "DefaultInfoSubject")
48*d6050574SRomain Jobredeauxload("//lib/private:depset_file_subject.bzl", "DepsetFileSubject")
49*d6050574SRomain Jobredeauxload("//lib/private:dict_subject.bzl", "DictSubject")
50*d6050574SRomain Jobredeauxload("//lib/private:expect.bzl", "Expect")
51*d6050574SRomain Jobredeauxload("//lib/private:file_subject.bzl", "FileSubject")
52*d6050574SRomain Jobredeauxload("//lib/private:int_subject.bzl", "IntSubject")
53*d6050574SRomain Jobredeauxload("//lib/private:label_subject.bzl", "LabelSubject")
54*d6050574SRomain Jobredeauxload("//lib/private:runfiles_subject.bzl", "RunfilesSubject")
55*d6050574SRomain Jobredeauxload("//lib/private:str_subject.bzl", "StrSubject")
56*d6050574SRomain Jobredeauxload("//lib/private:target_subject.bzl", "TargetSubject")
57*d6050574SRomain Jobredeauxload("//lib/private:matching.bzl", _matching = "matching")
58*d6050574SRomain Jobredeauxload("//lib/private:struct_subject.bzl", "StructSubject")
59*d6050574SRomain Jobredeaux
60*d6050574SRomain Jobredeaux# Rather than load many symbols, just load this symbol, and then all the
61*d6050574SRomain Jobredeaux# asserts will be available.
62*d6050574SRomain Jobredeauxtruth = struct(
63*d6050574SRomain Jobredeaux    expect = Expect.new_from_env,
64*d6050574SRomain Jobredeaux)
65*d6050574SRomain Jobredeaux
66*d6050574SRomain Jobredeaux# For the definition of a `Matcher` object, see `_match_custom`.
67*d6050574SRomain Jobredeauxmatching = _matching
68*d6050574SRomain Jobredeaux
69*d6050574SRomain Jobredeauxsubjects = struct(
70*d6050574SRomain Jobredeaux    # keep sorted start
71*d6050574SRomain Jobredeaux    bool = BoolSubject.new,
72*d6050574SRomain Jobredeaux    collection = CollectionSubject.new,
73*d6050574SRomain Jobredeaux    default_info = DefaultInfoSubject.new,
74*d6050574SRomain Jobredeaux    depset_file = DepsetFileSubject.new,
75*d6050574SRomain Jobredeaux    dict = DictSubject.new,
76*d6050574SRomain Jobredeaux    file = FileSubject.new,
77*d6050574SRomain Jobredeaux    int = IntSubject.new,
78*d6050574SRomain Jobredeaux    label = LabelSubject.new,
79*d6050574SRomain Jobredeaux    runfiles = RunfilesSubject.new,
80*d6050574SRomain Jobredeaux    str = StrSubject.new,
81*d6050574SRomain Jobredeaux    struct = StructSubject.new,
82*d6050574SRomain Jobredeaux    target = TargetSubject.new,
83*d6050574SRomain Jobredeaux    # keep sorted end
84*d6050574SRomain Jobredeaux)
85