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