xref: /aosp_15_r20/external/pigweed/pw_fuzzer/domain_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2023 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker 
15*61c4878aSAndroid Build Coastguard Worker #include <cctype>
16*61c4878aSAndroid Build Coastguard Worker 
17*61c4878aSAndroid Build Coastguard Worker #include "pw_fuzzer/fuzztest.h"
18*61c4878aSAndroid Build Coastguard Worker #include "pw_result/result.h"
19*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
20*61c4878aSAndroid Build Coastguard Worker 
21*61c4878aSAndroid Build Coastguard Worker // Most of the tests in this file only validate that the domains provided by
22*61c4878aSAndroid Build Coastguard Worker // Pigweed build, both with and without FuzzTest. Each domain comprises one or
23*61c4878aSAndroid Build Coastguard Worker // more FuzzTest domains, so the validation of the distribution of values
24*61c4878aSAndroid Build Coastguard Worker // produced by domains is left to and assumed from FuzzTest's own domain tests.
25*61c4878aSAndroid Build Coastguard Worker 
26*61c4878aSAndroid Build Coastguard Worker namespace pw::fuzzer {
27*61c4878aSAndroid Build Coastguard Worker namespace {
28*61c4878aSAndroid Build Coastguard Worker 
29*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
30*61c4878aSAndroid Build Coastguard Worker // Constants, macros, and types used by the domain tests below.
31*61c4878aSAndroid Build Coastguard Worker 
32*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSize = 8;
33*61c4878aSAndroid Build Coastguard Worker constexpr char kMin = 4;
34*61c4878aSAndroid Build Coastguard Worker constexpr char kMax = 16;
35*61c4878aSAndroid Build Coastguard Worker 
36*61c4878aSAndroid Build Coastguard Worker /// Generates a target function and fuzz test for a specific type.
37*61c4878aSAndroid Build Coastguard Worker ///
38*61c4878aSAndroid Build Coastguard Worker /// The generated test simply checks that the provided domain can produce values
39*61c4878aSAndroid Build Coastguard Worker /// of the appropriate type. Generally, explicitly providing a target function
40*61c4878aSAndroid Build Coastguard Worker /// is preferred for readability, but this macro can be useful for templated
41*61c4878aSAndroid Build Coastguard Worker /// domains that are tested for many repetitive numerical types.
42*61c4878aSAndroid Build Coastguard Worker ///
43*61c4878aSAndroid Build Coastguard Worker /// This macro should not be used directly. Instead, use
44*61c4878aSAndroid Build Coastguard Worker /// `FUZZ_TEST_FOR_INTEGRAL`, `FUZZ_TEST_FOR_FLOATING_POINT`, or
45*61c4878aSAndroid Build Coastguard Worker /// `FUZZ_TEST_FOR_ARITHMETIC`.
46*61c4878aSAndroid Build Coastguard Worker #define FUZZ_TEST_FOR_TYPE(Suite, Target, Domain, Type, ...) \
47*61c4878aSAndroid Build Coastguard Worker   void Target(Type t) { Take##Domain<Type>(t); }             \
48*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST(Suite, Target).WithDomains(Domain<Type>(__VA_ARGS__))
49*61c4878aSAndroid Build Coastguard Worker 
50*61c4878aSAndroid Build Coastguard Worker /// Generates target functions and fuzz tests for a integral types.
51*61c4878aSAndroid Build Coastguard Worker #define FUZZ_TEST_FOR_INTEGRAL(Suite, Target, Domain, ...)                     \
52*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(Suite, Target##_Char, Domain, char, __VA_ARGS__);         \
53*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(                                                          \
54*61c4878aSAndroid Build Coastguard Worker       Suite, Target##_UChar, Domain, unsigned char, __VA_ARGS__);              \
55*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(Suite, Target##_Short, Domain, short, __VA_ARGS__);       \
56*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(                                                          \
57*61c4878aSAndroid Build Coastguard Worker       Suite, Target##_UShort, Domain, unsigned short, __VA_ARGS__);            \
58*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(Suite, Target##_Int, Domain, int, __VA_ARGS__);           \
59*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(Suite, Target##_UInt, Domain, unsigned int, __VA_ARGS__); \
60*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(Suite, Target##_Long, Domain, long, __VA_ARGS__);         \
61*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(Suite, Target##_ULong, Domain, unsigned long, __VA_ARGS__)
62*61c4878aSAndroid Build Coastguard Worker 
63*61c4878aSAndroid Build Coastguard Worker /// Generates target functions and fuzz tests for a floating point types.
64*61c4878aSAndroid Build Coastguard Worker #define FUZZ_TEST_FOR_FLOATING_POINT(Suite, Target, Domain, ...)         \
65*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(Suite, Target##_Float, Domain, float, __VA_ARGS__); \
66*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_TYPE(Suite, Target##_Double, Domain, double, __VA_ARGS__)
67*61c4878aSAndroid Build Coastguard Worker 
68*61c4878aSAndroid Build Coastguard Worker /// Generates target functions and fuzz tests for a all arithmetic types.
69*61c4878aSAndroid Build Coastguard Worker #define FUZZ_TEST_FOR_ARITHMETIC(Suite, Target, Domain, ...)  \
70*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_INTEGRAL(Suite, Target, Domain, __VA_ARGS__); \
71*61c4878aSAndroid Build Coastguard Worker   FUZZ_TEST_FOR_FLOATING_POINT(Suite, Target, Domain, __VA_ARGS__)
72*61c4878aSAndroid Build Coastguard Worker 
73*61c4878aSAndroid Build Coastguard Worker // Test struct that can be produced by FuzzTest.
74*61c4878aSAndroid Build Coastguard Worker struct StructForTesting {
75*61c4878aSAndroid Build Coastguard Worker   int a;
76*61c4878aSAndroid Build Coastguard Worker   long b;
77*61c4878aSAndroid Build Coastguard Worker };
78*61c4878aSAndroid Build Coastguard Worker 
79*61c4878aSAndroid Build Coastguard Worker // Test class that can be produced by FuzzTest.
80*61c4878aSAndroid Build Coastguard Worker class ClassForTesting {
81*61c4878aSAndroid Build Coastguard Worker  public:
ClassForTesting(unsigned char c,short d)82*61c4878aSAndroid Build Coastguard Worker   ClassForTesting(unsigned char c, short d) : c_(c), d_(d) {}
c() const83*61c4878aSAndroid Build Coastguard Worker   unsigned char c() const { return c_; }
d() const84*61c4878aSAndroid Build Coastguard Worker   short d() const { return d_; }
85*61c4878aSAndroid Build Coastguard Worker 
86*61c4878aSAndroid Build Coastguard Worker  private:
87*61c4878aSAndroid Build Coastguard Worker   unsigned char c_;
88*61c4878aSAndroid Build Coastguard Worker   short d_;
89*61c4878aSAndroid Build Coastguard Worker };
90*61c4878aSAndroid Build Coastguard Worker 
91*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
92*61c4878aSAndroid Build Coastguard Worker // Arbitrary domains forwarded or stubbed from FuzzTest
93*61c4878aSAndroid Build Coastguard Worker 
94*61c4878aSAndroid Build Coastguard Worker template <typename T>
TakeArbitrary(T)95*61c4878aSAndroid Build Coastguard Worker void TakeArbitrary(T) {}
96*61c4878aSAndroid Build Coastguard Worker 
TakeArbitraryBool(bool b)97*61c4878aSAndroid Build Coastguard Worker void TakeArbitraryBool(bool b) { TakeArbitrary<bool>(b); }
98*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeArbitraryBool).WithDomains(Arbitrary<bool>());
99*61c4878aSAndroid Build Coastguard Worker 
100*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST_FOR_ARITHMETIC(ArbitraryTest, TakeArbitrary, Arbitrary);
101*61c4878aSAndroid Build Coastguard Worker 
TakeArbitraryStruct(const StructForTesting & s)102*61c4878aSAndroid Build Coastguard Worker void TakeArbitraryStruct(const StructForTesting& s) {
103*61c4878aSAndroid Build Coastguard Worker   TakeArbitrary<StructForTesting>(s);
104*61c4878aSAndroid Build Coastguard Worker }
105*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeArbitraryStruct)
106*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<StructForTesting>());
107*61c4878aSAndroid Build Coastguard Worker 
TakeArbitraryTuple(const std::tuple<int,long> & t)108*61c4878aSAndroid Build Coastguard Worker void TakeArbitraryTuple(const std::tuple<int, long>& t) {
109*61c4878aSAndroid Build Coastguard Worker   TakeArbitrary<std::tuple<int, long>>(t);
110*61c4878aSAndroid Build Coastguard Worker }
111*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeArbitraryTuple)
112*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<std::tuple<int, long>>());
113*61c4878aSAndroid Build Coastguard Worker 
TakeArbitraryOptional(const std::optional<int> & o)114*61c4878aSAndroid Build Coastguard Worker void TakeArbitraryOptional(const std::optional<int>& o) {
115*61c4878aSAndroid Build Coastguard Worker   TakeArbitrary<std::optional<int>>(o);
116*61c4878aSAndroid Build Coastguard Worker }
117*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeArbitraryOptional)
118*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<std::optional<int>>());
119*61c4878aSAndroid Build Coastguard Worker 
120*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
121*61c4878aSAndroid Build Coastguard Worker // Numerical domains forwarded or stubbed from FuzzTest
122*61c4878aSAndroid Build Coastguard Worker 
123*61c4878aSAndroid Build Coastguard Worker template <typename Arithmetic>
TakeInRange(Arithmetic x)124*61c4878aSAndroid Build Coastguard Worker void TakeInRange(Arithmetic x) {
125*61c4878aSAndroid Build Coastguard Worker   EXPECT_GE(x, Arithmetic(kMin));
126*61c4878aSAndroid Build Coastguard Worker   EXPECT_LE(x, Arithmetic(kMax));
127*61c4878aSAndroid Build Coastguard Worker }
128*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST_FOR_ARITHMETIC(DomainTest, TakeInRange, InRange, kMin, kMax);
129*61c4878aSAndroid Build Coastguard Worker 
130*61c4878aSAndroid Build Coastguard Worker template <typename Arithmetic>
TakeNonZero(Arithmetic x)131*61c4878aSAndroid Build Coastguard Worker void TakeNonZero(Arithmetic x) {
132*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(x, Arithmetic(0));
133*61c4878aSAndroid Build Coastguard Worker }
134*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST_FOR_ARITHMETIC(DomainTest, TakeNonZero, NonZero);
135*61c4878aSAndroid Build Coastguard Worker 
136*61c4878aSAndroid Build Coastguard Worker template <typename Arithmetic>
TakePositive(Arithmetic x)137*61c4878aSAndroid Build Coastguard Worker void TakePositive(Arithmetic x) {
138*61c4878aSAndroid Build Coastguard Worker   EXPECT_GT(x, Arithmetic(0));
139*61c4878aSAndroid Build Coastguard Worker }
140*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST_FOR_ARITHMETIC(DomainTest, TakePositive, Positive);
141*61c4878aSAndroid Build Coastguard Worker 
142*61c4878aSAndroid Build Coastguard Worker template <typename Arithmetic>
TakeNonNegative(Arithmetic x)143*61c4878aSAndroid Build Coastguard Worker void TakeNonNegative(Arithmetic x) {
144*61c4878aSAndroid Build Coastguard Worker   EXPECT_GE(x, Arithmetic(0));
145*61c4878aSAndroid Build Coastguard Worker }
146*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST_FOR_ARITHMETIC(DomainTest, TakeNonNegative, NonNegative);
147*61c4878aSAndroid Build Coastguard Worker 
148*61c4878aSAndroid Build Coastguard Worker template <typename Arithmetic>
TakeNegative(Arithmetic x)149*61c4878aSAndroid Build Coastguard Worker void TakeNegative(Arithmetic x) {
150*61c4878aSAndroid Build Coastguard Worker   EXPECT_LT(x, Arithmetic(0));
151*61c4878aSAndroid Build Coastguard Worker }
152*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST_FOR_ARITHMETIC(DomainTest, TakeNegative, Positive);
153*61c4878aSAndroid Build Coastguard Worker 
154*61c4878aSAndroid Build Coastguard Worker template <typename Arithmetic>
TakeNonPositive(Arithmetic x)155*61c4878aSAndroid Build Coastguard Worker void TakeNonPositive(Arithmetic x) {
156*61c4878aSAndroid Build Coastguard Worker   EXPECT_LE(x, Arithmetic(0));
157*61c4878aSAndroid Build Coastguard Worker }
158*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST_FOR_ARITHMETIC(DomainTest, TakeNonPositive, NonNegative);
159*61c4878aSAndroid Build Coastguard Worker 
160*61c4878aSAndroid Build Coastguard Worker template <typename FloatingPoint>
TakeFinite(FloatingPoint f)161*61c4878aSAndroid Build Coastguard Worker void TakeFinite(FloatingPoint f) {
162*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isfinite(f));
163*61c4878aSAndroid Build Coastguard Worker }
164*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST_FOR_FLOATING_POINT(DomainTest, TakeFinite, Finite);
165*61c4878aSAndroid Build Coastguard Worker 
166*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
167*61c4878aSAndroid Build Coastguard Worker // Character domains forwarded or stubbed from FuzzTest
168*61c4878aSAndroid Build Coastguard Worker 
TakeNonZeroChar(char c)169*61c4878aSAndroid Build Coastguard Worker void TakeNonZeroChar(char c) { EXPECT_NE(c, 0); }
170*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeNonZeroChar).WithDomains(NonZeroChar());
171*61c4878aSAndroid Build Coastguard Worker 
TakeNumericChar(char c)172*61c4878aSAndroid Build Coastguard Worker void TakeNumericChar(char c) { EXPECT_TRUE(std::isdigit(c)); }
173*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeNumericChar).WithDomains(NumericChar());
174*61c4878aSAndroid Build Coastguard Worker 
TakeLowerChar(char c)175*61c4878aSAndroid Build Coastguard Worker void TakeLowerChar(char c) { EXPECT_TRUE(std::islower(c)); }
176*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeLowerChar).WithDomains(LowerChar());
177*61c4878aSAndroid Build Coastguard Worker 
TakeUpperChar(char c)178*61c4878aSAndroid Build Coastguard Worker void TakeUpperChar(char c) { EXPECT_TRUE(std::isupper(c)); }
179*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeUpperChar).WithDomains(UpperChar());
180*61c4878aSAndroid Build Coastguard Worker 
TakeAlphaChar(char c)181*61c4878aSAndroid Build Coastguard Worker void TakeAlphaChar(char c) { EXPECT_TRUE(std::isalpha(c)); }
182*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeAlphaChar).WithDomains(AlphaChar());
183*61c4878aSAndroid Build Coastguard Worker 
TakeAlphaNumericChar(char c)184*61c4878aSAndroid Build Coastguard Worker void TakeAlphaNumericChar(char c) { EXPECT_TRUE(std::isalnum(c)); }
185*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeAlphaNumericChar).WithDomains(AlphaNumericChar());
186*61c4878aSAndroid Build Coastguard Worker 
TakePrintableAsciiChar(char c)187*61c4878aSAndroid Build Coastguard Worker void TakePrintableAsciiChar(char c) { EXPECT_TRUE(std::isprint(c)); }
188*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakePrintableAsciiChar).WithDomains(PrintableAsciiChar());
189*61c4878aSAndroid Build Coastguard Worker 
TakeAsciiChar(char c)190*61c4878aSAndroid Build Coastguard Worker void TakeAsciiChar(char c) {
191*61c4878aSAndroid Build Coastguard Worker   EXPECT_GE(c, 0);
192*61c4878aSAndroid Build Coastguard Worker   EXPECT_LE(c, 127);
193*61c4878aSAndroid Build Coastguard Worker }
194*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeAsciiChar).WithDomains(AsciiChar());
195*61c4878aSAndroid Build Coastguard Worker 
196*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
197*61c4878aSAndroid Build Coastguard Worker // Regular expression domains forwarded or stubbed from FuzzTest
198*61c4878aSAndroid Build Coastguard Worker 
199*61c4878aSAndroid Build Coastguard Worker // TODO: b/285775246 - Add support for `fuzztest::InRegexp`.
200*61c4878aSAndroid Build Coastguard Worker // void TakeMatch(std::string_view sv) {
201*61c4878aSAndroid Build Coastguard Worker //   ASSERT_EQ(sv.size(), 3U);
202*61c4878aSAndroid Build Coastguard Worker //   EXPECT_EQ(sv[0], 'a');
203*61c4878aSAndroid Build Coastguard Worker //   EXPECT_EQ(sv[2], 'c');
204*61c4878aSAndroid Build Coastguard Worker // }
205*61c4878aSAndroid Build Coastguard Worker // FUZZ_TEST(DomainTest, TakeMatch).WithDomains(InRegexp("a.c"));
206*61c4878aSAndroid Build Coastguard Worker 
207*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
208*61c4878aSAndroid Build Coastguard Worker // Enumerated domains forwarded or stubbed from FuzzTest
209*61c4878aSAndroid Build Coastguard Worker 
TakeSingleDigitEvenNumber(int n)210*61c4878aSAndroid Build Coastguard Worker void TakeSingleDigitEvenNumber(int n) {
211*61c4878aSAndroid Build Coastguard Worker   EXPECT_LT(n, 10);
212*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(n % 2, 0);
213*61c4878aSAndroid Build Coastguard Worker }
214*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeSingleDigitEvenNumber)
215*61c4878aSAndroid Build Coastguard Worker     .WithDomains(ElementOf({0, 2, 4, 6, 8}));
216*61c4878aSAndroid Build Coastguard Worker 
217*61c4878aSAndroid Build Coastguard Worker enum Flags : uint8_t {
218*61c4878aSAndroid Build Coastguard Worker   kFlag1 = 1 << 0,
219*61c4878aSAndroid Build Coastguard Worker   kFlag2 = 1 << 1,
220*61c4878aSAndroid Build Coastguard Worker   kFlag3 = 1 << 2,
221*61c4878aSAndroid Build Coastguard Worker };
TakeFlagCombination(uint8_t flags)222*61c4878aSAndroid Build Coastguard Worker void TakeFlagCombination(uint8_t flags) { EXPECT_FALSE(flags & Flags::kFlag2); }
223*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeFlagCombination)
224*61c4878aSAndroid Build Coastguard Worker     .WithDomains(BitFlagCombinationOf({Flags::kFlag1, Flags::kFlag3}));
225*61c4878aSAndroid Build Coastguard Worker 
226*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
227*61c4878aSAndroid Build Coastguard Worker // Aggregate domains forwarded or stubbed from FuzzTest
228*61c4878aSAndroid Build Coastguard Worker 
TakeStructForTesting(const StructForTesting & obj)229*61c4878aSAndroid Build Coastguard Worker void TakeStructForTesting(const StructForTesting& obj) {
230*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(obj.a, 0);
231*61c4878aSAndroid Build Coastguard Worker   EXPECT_LT(obj.b, 0);
232*61c4878aSAndroid Build Coastguard Worker }
233*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeStructForTesting)
234*61c4878aSAndroid Build Coastguard Worker     .WithDomains(StructOf<StructForTesting>(NonZero<int>(), Negative<long>()));
235*61c4878aSAndroid Build Coastguard Worker 
TakeClassForTesting(const ClassForTesting & obj)236*61c4878aSAndroid Build Coastguard Worker void TakeClassForTesting(const ClassForTesting& obj) {
237*61c4878aSAndroid Build Coastguard Worker   EXPECT_GE(obj.c(), kMin);
238*61c4878aSAndroid Build Coastguard Worker   EXPECT_LE(obj.c(), kMax);
239*61c4878aSAndroid Build Coastguard Worker   EXPECT_GE(obj.d(), 0);
240*61c4878aSAndroid Build Coastguard Worker }
241*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeClassForTesting)
242*61c4878aSAndroid Build Coastguard Worker     .WithDomains(ConstructorOf<ClassForTesting>(InRange<unsigned char>(kMin,
243*61c4878aSAndroid Build Coastguard Worker                                                                        kMax),
244*61c4878aSAndroid Build Coastguard Worker                                                 NonNegative<short>()));
245*61c4878aSAndroid Build Coastguard Worker 
TakePair(const std::pair<char,float> & p)246*61c4878aSAndroid Build Coastguard Worker void TakePair(const std::pair<char, float>& p) {
247*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::islower(p.first));
248*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isfinite(p.second));
249*61c4878aSAndroid Build Coastguard Worker }
250*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakePair)
251*61c4878aSAndroid Build Coastguard Worker     .WithDomains(PairOf(LowerChar(), Finite<float>()));
252*61c4878aSAndroid Build Coastguard Worker 
TakeTuple(std::tuple<short,int> a,long b)253*61c4878aSAndroid Build Coastguard Worker void TakeTuple(std::tuple<short, int> a, long b) {
254*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(std::get<short>(a), 0);
255*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(std::get<int>(a), 0);
256*61c4878aSAndroid Build Coastguard Worker   EXPECT_NE(b, 0);
257*61c4878aSAndroid Build Coastguard Worker }
258*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeTuple)
259*61c4878aSAndroid Build Coastguard Worker     .WithDomains(TupleOf(NonZero<short>(), NonZero<int>()), NonZero<long>());
260*61c4878aSAndroid Build Coastguard Worker 
TakeVariant(const std::variant<int,long> &)261*61c4878aSAndroid Build Coastguard Worker void TakeVariant(const std::variant<int, long>&) {}
262*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeVariant)
263*61c4878aSAndroid Build Coastguard Worker     .WithDomains(VariantOf(Arbitrary<int>(), Arbitrary<long>()));
264*61c4878aSAndroid Build Coastguard Worker 
TakeOptional(const std::optional<int> &)265*61c4878aSAndroid Build Coastguard Worker void TakeOptional(const std::optional<int>&) {}
266*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeOptional).WithDomains(OptionalOf(Arbitrary<int>()));
267*61c4878aSAndroid Build Coastguard Worker 
TakeNullOpt(const std::optional<int> & option)268*61c4878aSAndroid Build Coastguard Worker void TakeNullOpt(const std::optional<int>& option) { EXPECT_FALSE(option); }
269*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeNullOpt).WithDomains(NullOpt<int>());
270*61c4878aSAndroid Build Coastguard Worker 
TakeNonNull(const std::optional<int> & option)271*61c4878aSAndroid Build Coastguard Worker void TakeNonNull(const std::optional<int>& option) { EXPECT_TRUE(option); }
272*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeNonNull)
273*61c4878aSAndroid Build Coastguard Worker     .WithDomains(NonNull(OptionalOf(Arbitrary<int>())));
274*61c4878aSAndroid Build Coastguard Worker 
275*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
276*61c4878aSAndroid Build Coastguard Worker // Other miscellaneous domains forwarded or stubbed from FuzzTest
277*61c4878aSAndroid Build Coastguard Worker 
TakePositiveOrMinusOne(int n)278*61c4878aSAndroid Build Coastguard Worker void TakePositiveOrMinusOne(int n) {
279*61c4878aSAndroid Build Coastguard Worker   if (n != -1) {
280*61c4878aSAndroid Build Coastguard Worker     EXPECT_GT(n, 0);
281*61c4878aSAndroid Build Coastguard Worker   }
282*61c4878aSAndroid Build Coastguard Worker }
283*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakePositiveOrMinusOne)
284*61c4878aSAndroid Build Coastguard Worker     .WithDomains(OneOf(Just(-1), Positive<int>()));
285*61c4878aSAndroid Build Coastguard Worker 
TakePackedValue(uint32_t value)286*61c4878aSAndroid Build Coastguard Worker void TakePackedValue(uint32_t value) {
287*61c4878aSAndroid Build Coastguard Worker   EXPECT_GE(value & 0xFFFF, 1000U);
288*61c4878aSAndroid Build Coastguard Worker   EXPECT_LT(value >> 16, 2048U);
289*61c4878aSAndroid Build Coastguard Worker }
290*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakePackedValue)
291*61c4878aSAndroid Build Coastguard Worker     .WithDomains(
292*61c4878aSAndroid Build Coastguard Worker         Map([](uint16_t lower,
__anon5cadf3610202(uint16_t lower, uint16_t upper) 293*61c4878aSAndroid Build Coastguard Worker                uint16_t upper) { return (uint32_t(upper) << 16) | lower; },
294*61c4878aSAndroid Build Coastguard Worker             InRange<uint16_t>(1000U, std::numeric_limits<uint16_t>::max()),
295*61c4878aSAndroid Build Coastguard Worker             InRange<uint16_t>(0U, 2047U)));
296*61c4878aSAndroid Build Coastguard Worker 
TakeOrdered(size_t x,size_t y)297*61c4878aSAndroid Build Coastguard Worker void TakeOrdered(size_t x, size_t y) { EXPECT_LT(x, y); }
FlatMapAdapter(const std::pair<size_t,size_t> & p)298*61c4878aSAndroid Build Coastguard Worker void FlatMapAdapter(const std::pair<size_t, size_t>& p) {
299*61c4878aSAndroid Build Coastguard Worker   TakeOrdered(p.first, p.second);
300*61c4878aSAndroid Build Coastguard Worker }
301*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, FlatMapAdapter)
302*61c4878aSAndroid Build Coastguard Worker     .WithDomains(FlatMap(
__anon5cadf3610302(size_t x) 303*61c4878aSAndroid Build Coastguard Worker         [](size_t x) {
304*61c4878aSAndroid Build Coastguard Worker           return PairOf(
305*61c4878aSAndroid Build Coastguard Worker               Just(x),
306*61c4878aSAndroid Build Coastguard Worker               InRange<size_t>(x + 1, std::numeric_limits<size_t>::max()));
307*61c4878aSAndroid Build Coastguard Worker         },
308*61c4878aSAndroid Build Coastguard Worker         InRange<size_t>(0, std::numeric_limits<size_t>::max() - 1)));
309*61c4878aSAndroid Build Coastguard Worker 
TakeEven(unsigned int n)310*61c4878aSAndroid Build Coastguard Worker void TakeEven(unsigned int n) { EXPECT_EQ(n % 2, 0U); }
311*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeEven)
__anon5cadf3610402(unsigned int n) 312*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Filter([](unsigned int n) { return n % 2 == 0; },
313*61c4878aSAndroid Build Coastguard Worker                         Arbitrary<unsigned int>()));
314*61c4878aSAndroid Build Coastguard Worker 
315*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
316*61c4878aSAndroid Build Coastguard Worker // pw_status-related types
317*61c4878aSAndroid Build Coastguard Worker 
TakeStatus(const Status &)318*61c4878aSAndroid Build Coastguard Worker void TakeStatus(const Status&) {}
319*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeStatus).WithDomains(Arbitrary<Status>());
320*61c4878aSAndroid Build Coastguard Worker 
TakeStatusWithSize(const StatusWithSize &)321*61c4878aSAndroid Build Coastguard Worker void TakeStatusWithSize(const StatusWithSize&) {}
322*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeStatusWithSize)
323*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<StatusWithSize>());
324*61c4878aSAndroid Build Coastguard Worker 
TakeNonOkStatus(const Status & status)325*61c4878aSAndroid Build Coastguard Worker void TakeNonOkStatus(const Status& status) { EXPECT_FALSE(status.ok()); }
326*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(FilterTest, TakeNonOkStatus).WithDomains(NonOkStatus());
327*61c4878aSAndroid Build Coastguard Worker 
328*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
329*61c4878aSAndroid Build Coastguard Worker // pw_result-related types
330*61c4878aSAndroid Build Coastguard Worker 
TakeResult(const Result<int> &)331*61c4878aSAndroid Build Coastguard Worker void TakeResult(const Result<int>&) {}
332*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeResult).WithDomains(ResultOf(Arbitrary<int>()));
333*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeResult).WithDomains(Arbitrary<Result<int>>());
334*61c4878aSAndroid Build Coastguard Worker 
335*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
336*61c4878aSAndroid Build Coastguard Worker // pw_containers-related types
337*61c4878aSAndroid Build Coastguard Worker 
TakeVector(const Vector<int> & vector)338*61c4878aSAndroid Build Coastguard Worker void TakeVector(const Vector<int>& vector) {
339*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.max_size(), kSize);
340*61c4878aSAndroid Build Coastguard Worker }
341*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeVector)
342*61c4878aSAndroid Build Coastguard Worker     .WithDomains(VectorOf<kSize>(Arbitrary<int>()));
343*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeVector)
344*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<Vector<int, kSize>>());
345*61c4878aSAndroid Build Coastguard Worker 
TakeVectorAsContainer(const Vector<int> &)346*61c4878aSAndroid Build Coastguard Worker void TakeVectorAsContainer(const Vector<int>&) {}
347*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeVectorAsContainer)
348*61c4878aSAndroid Build Coastguard Worker     .WithDomains(ContainerOf<Vector<int, kSize>>(Arbitrary<int>()));
349*61c4878aSAndroid Build Coastguard Worker 
TakeVectorNonEmpty(const Vector<int> & vector)350*61c4878aSAndroid Build Coastguard Worker void TakeVectorNonEmpty(const Vector<int>& vector) {
351*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(vector.empty());
352*61c4878aSAndroid Build Coastguard Worker }
353*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeVectorNonEmpty)
354*61c4878aSAndroid Build Coastguard Worker     .WithDomains(NonEmpty(ContainerOf<Vector<int, kSize>>(Arbitrary<int>())));
355*61c4878aSAndroid Build Coastguard Worker 
TakeVectorLessThan3(const Vector<int> & vector)356*61c4878aSAndroid Build Coastguard Worker void TakeVectorLessThan3(const Vector<int>& vector) {
357*61c4878aSAndroid Build Coastguard Worker   EXPECT_LT(vector.size(), 3U);
358*61c4878aSAndroid Build Coastguard Worker }
359*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeVectorLessThan3)
360*61c4878aSAndroid Build Coastguard Worker     .WithDomains(
361*61c4878aSAndroid Build Coastguard Worker         ContainerOf<Vector<int, kSize>>(Arbitrary<int>()).WithMaxSize(2));
362*61c4878aSAndroid Build Coastguard Worker 
TakeVectorAtLeast3(const Vector<int> & vector)363*61c4878aSAndroid Build Coastguard Worker void TakeVectorAtLeast3(const Vector<int>& vector) {
364*61c4878aSAndroid Build Coastguard Worker   EXPECT_GE(vector.size(), 3U);
365*61c4878aSAndroid Build Coastguard Worker }
366*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeVectorAtLeast3)
367*61c4878aSAndroid Build Coastguard Worker     .WithDomains(
368*61c4878aSAndroid Build Coastguard Worker         ContainerOf<Vector<int, kSize>>(Arbitrary<int>()).WithMinSize(3));
369*61c4878aSAndroid Build Coastguard Worker 
TakeVectorExactly3(const Vector<int> & vector)370*61c4878aSAndroid Build Coastguard Worker void TakeVectorExactly3(const Vector<int>& vector) {
371*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(vector.size(), 3U);
372*61c4878aSAndroid Build Coastguard Worker }
373*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeVectorExactly3)
374*61c4878aSAndroid Build Coastguard Worker     .WithDomains(ContainerOf<Vector<int, kSize>>(Arbitrary<int>()).WithSize(3));
375*61c4878aSAndroid Build Coastguard Worker 
TakeVectorUnique(const Vector<int> & vector)376*61c4878aSAndroid Build Coastguard Worker void TakeVectorUnique(const Vector<int>& vector) {
377*61c4878aSAndroid Build Coastguard Worker   for (auto i = vector.begin(); i != vector.end(); ++i) {
378*61c4878aSAndroid Build Coastguard Worker     for (auto j = i + 1; j != vector.end(); ++j) {
379*61c4878aSAndroid Build Coastguard Worker       EXPECT_NE(*i, *j);
380*61c4878aSAndroid Build Coastguard Worker     }
381*61c4878aSAndroid Build Coastguard Worker   }
382*61c4878aSAndroid Build Coastguard Worker }
383*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeVectorUnique)
384*61c4878aSAndroid Build Coastguard Worker     .WithDomains(
385*61c4878aSAndroid Build Coastguard Worker         UniqueElementsContainerOf<Vector<int, kSize>>(Arbitrary<int>()));
386*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeVectorUnique)
387*61c4878aSAndroid Build Coastguard Worker     .WithDomains(UniqueElementsVectorOf<kSize>(Arbitrary<int>()));
388*61c4878aSAndroid Build Coastguard Worker 
TakeFlatMap(const containers::FlatMap<int,size_t,kSize> &)389*61c4878aSAndroid Build Coastguard Worker void TakeFlatMap(const containers::FlatMap<int, size_t, kSize>&) {}
390*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeFlatMap)
391*61c4878aSAndroid Build Coastguard Worker     .WithDomains(FlatMapOf<kSize>(Arbitrary<int>(), Arbitrary<size_t>()));
392*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeFlatMap)
393*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<containers::FlatMap<int, size_t, kSize>>());
394*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeFlatMap)
395*61c4878aSAndroid Build Coastguard Worker     .WithDomains(ContainerOf<containers::FlatMap<int, size_t, kSize>>(
396*61c4878aSAndroid Build Coastguard Worker         FlatMapPairOf(Arbitrary<int>(), Arbitrary<size_t>())));
397*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(MapToTest, TakeFlatMap)
398*61c4878aSAndroid Build Coastguard Worker     .WithDomains(MapToFlatMap<kSize>(
399*61c4878aSAndroid Build Coastguard Worker         UniqueElementsVectorOf<kSize>(Arbitrary<int>()).WithSize(kSize),
400*61c4878aSAndroid Build Coastguard Worker         ArrayOf<kSize>(Arbitrary<size_t>())));
401*61c4878aSAndroid Build Coastguard Worker 
TakeDeque(const InlineDeque<int,kSize> & deque)402*61c4878aSAndroid Build Coastguard Worker void TakeDeque(const InlineDeque<int, kSize>& deque) {
403*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(deque.max_size(), kSize);
404*61c4878aSAndroid Build Coastguard Worker }
405*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeDeque).WithDomains(DequeOf<kSize>(Arbitrary<int>()));
406*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeDeque)
407*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<InlineDeque<int, kSize>>());
408*61c4878aSAndroid Build Coastguard Worker 
TakeBasicDeque(const BasicInlineDeque<int,unsigned short,kSize> & deque)409*61c4878aSAndroid Build Coastguard Worker void TakeBasicDeque(const BasicInlineDeque<int, unsigned short, kSize>& deque) {
410*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(deque.max_size(), kSize);
411*61c4878aSAndroid Build Coastguard Worker }
412*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeBasicDeque)
413*61c4878aSAndroid Build Coastguard Worker     .WithDomains(BasicDequeOf<unsigned short, kSize>(Arbitrary<int>()));
414*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeBasicDeque)
415*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<BasicInlineDeque<int, unsigned short, kSize>>());
416*61c4878aSAndroid Build Coastguard Worker 
TakeQueue(const InlineQueue<int,kSize> & queue)417*61c4878aSAndroid Build Coastguard Worker void TakeQueue(const InlineQueue<int, kSize>& queue) {
418*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(queue.max_size(), kSize);
419*61c4878aSAndroid Build Coastguard Worker }
420*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeQueue).WithDomains(QueueOf<kSize>(Arbitrary<int>()));
421*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeQueue)
422*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<InlineQueue<int, kSize>>());
423*61c4878aSAndroid Build Coastguard Worker 
TakeBasicQueue(const BasicInlineQueue<int,unsigned short,kSize> & queue)424*61c4878aSAndroid Build Coastguard Worker void TakeBasicQueue(const BasicInlineQueue<int, unsigned short, kSize>& queue) {
425*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(queue.max_size(), kSize);
426*61c4878aSAndroid Build Coastguard Worker }
427*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeBasicQueue)
428*61c4878aSAndroid Build Coastguard Worker     .WithDomains(BasicQueueOf<unsigned short, kSize>(Arbitrary<int>()));
429*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeBasicQueue)
430*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<BasicInlineQueue<int, unsigned short, kSize>>());
431*61c4878aSAndroid Build Coastguard Worker 
432*61c4878aSAndroid Build Coastguard Worker // Test item that can be added to an intrusive list.
433*61c4878aSAndroid Build Coastguard Worker class TestItem : public IntrusiveList<TestItem>::Item {
434*61c4878aSAndroid Build Coastguard Worker  private:
435*61c4878aSAndroid Build Coastguard Worker  public:
TestItem(long value)436*61c4878aSAndroid Build Coastguard Worker   constexpr explicit TestItem(long value) : value_(value) {}
value() const437*61c4878aSAndroid Build Coastguard Worker   long value() const { return value_; }
438*61c4878aSAndroid Build Coastguard Worker 
TestItem(TestItem && other)439*61c4878aSAndroid Build Coastguard Worker   TestItem(TestItem&& other) { *this = std::move(other); }
operator =(TestItem && other)440*61c4878aSAndroid Build Coastguard Worker   TestItem& operator=(TestItem&& other) {
441*61c4878aSAndroid Build Coastguard Worker     value_ = other.value_;
442*61c4878aSAndroid Build Coastguard Worker     return *this;
443*61c4878aSAndroid Build Coastguard Worker   }
444*61c4878aSAndroid Build Coastguard Worker 
445*61c4878aSAndroid Build Coastguard Worker  private:
446*61c4878aSAndroid Build Coastguard Worker   long value_;
447*61c4878aSAndroid Build Coastguard Worker };
448*61c4878aSAndroid Build Coastguard Worker 
449*61c4878aSAndroid Build Coastguard Worker // IntrusiveLists cannot be generated directly, but ScopedLists can.
TakeIntrusiveList(const IntrusiveList<TestItem> & list)450*61c4878aSAndroid Build Coastguard Worker void TakeIntrusiveList(const IntrusiveList<TestItem>& list) {
451*61c4878aSAndroid Build Coastguard Worker   EXPECT_LE(list.size(), kSize);
452*61c4878aSAndroid Build Coastguard Worker }
ScopedListAdapter(const ScopedList<TestItem,kSize> & scoped)453*61c4878aSAndroid Build Coastguard Worker void ScopedListAdapter(const ScopedList<TestItem, kSize>& scoped) {
454*61c4878aSAndroid Build Coastguard Worker   TakeIntrusiveList(scoped.list());
455*61c4878aSAndroid Build Coastguard Worker }
456*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, ScopedListAdapter)
457*61c4878aSAndroid Build Coastguard Worker     .WithDomains(ScopedListOf<TestItem, kSize>(Arbitrary<long>()));
458*61c4878aSAndroid Build Coastguard Worker 
459*61c4878aSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////
460*61c4878aSAndroid Build Coastguard Worker // pw_string-related types
461*61c4878aSAndroid Build Coastguard Worker 
TakeString(const InlineString<> & string)462*61c4878aSAndroid Build Coastguard Worker void TakeString(const InlineString<>& string) {
463*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(string.max_size(), kSize);
464*61c4878aSAndroid Build Coastguard Worker }
465*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(DomainTest, TakeString)
466*61c4878aSAndroid Build Coastguard Worker     .WithDomains(StringOf<kSize>(Arbitrary<char>()));
467*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ArbitraryTest, TakeString)
468*61c4878aSAndroid Build Coastguard Worker     .WithDomains(Arbitrary<InlineString<kSize>>());
469*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(FilterTest, TakeString).WithDomains(String<kSize>());
470*61c4878aSAndroid Build Coastguard Worker 
TakeStringAsContainer(const InlineString<> &)471*61c4878aSAndroid Build Coastguard Worker void TakeStringAsContainer(const InlineString<>&) {}
472*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeStringAsContainer)
473*61c4878aSAndroid Build Coastguard Worker     .WithDomains(ContainerOf<InlineString<kSize>>(Arbitrary<char>()));
474*61c4878aSAndroid Build Coastguard Worker 
TakeStringNonEmpty(const InlineString<> & string)475*61c4878aSAndroid Build Coastguard Worker void TakeStringNonEmpty(const InlineString<>& string) {
476*61c4878aSAndroid Build Coastguard Worker   EXPECT_FALSE(string.empty());
477*61c4878aSAndroid Build Coastguard Worker }
478*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeStringNonEmpty)
479*61c4878aSAndroid Build Coastguard Worker     .WithDomains(NonEmpty(ContainerOf<InlineString<kSize>>(Arbitrary<char>())));
480*61c4878aSAndroid Build Coastguard Worker 
TakeStringLessThan3(const InlineString<> & string)481*61c4878aSAndroid Build Coastguard Worker void TakeStringLessThan3(const InlineString<>& string) {
482*61c4878aSAndroid Build Coastguard Worker   EXPECT_LT(string.size(), 3U);
483*61c4878aSAndroid Build Coastguard Worker }
484*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeStringLessThan3)
485*61c4878aSAndroid Build Coastguard Worker     .WithDomains(
486*61c4878aSAndroid Build Coastguard Worker         ContainerOf<InlineString<kSize>>(Arbitrary<char>()).WithMaxSize(2));
487*61c4878aSAndroid Build Coastguard Worker 
TakeStringAtLeast3(const InlineString<> & string)488*61c4878aSAndroid Build Coastguard Worker void TakeStringAtLeast3(const InlineString<>& string) {
489*61c4878aSAndroid Build Coastguard Worker   EXPECT_GE(string.size(), 3U);
490*61c4878aSAndroid Build Coastguard Worker }
491*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeStringAtLeast3)
492*61c4878aSAndroid Build Coastguard Worker     .WithDomains(
493*61c4878aSAndroid Build Coastguard Worker         ContainerOf<InlineString<kSize>>(Arbitrary<char>()).WithMinSize(3));
494*61c4878aSAndroid Build Coastguard Worker 
TakeStringExactly3(const InlineString<> & string)495*61c4878aSAndroid Build Coastguard Worker void TakeStringExactly3(const InlineString<>& string) {
496*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(string.size(), 3U);
497*61c4878aSAndroid Build Coastguard Worker }
498*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(ContainerTest, TakeStringExactly3)
499*61c4878aSAndroid Build Coastguard Worker     .WithDomains(
500*61c4878aSAndroid Build Coastguard Worker         ContainerOf<InlineString<kSize>>(Arbitrary<char>()).WithSize(3));
501*61c4878aSAndroid Build Coastguard Worker 
TakeAsciiString(const InlineString<> & string)502*61c4878aSAndroid Build Coastguard Worker void TakeAsciiString(const InlineString<>& string) {
503*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(
504*61c4878aSAndroid Build Coastguard Worker       string.begin(), string.end(), [](int c) { return c < 0x80; }));
505*61c4878aSAndroid Build Coastguard Worker }
506*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(FilterTest, TakeAsciiString).WithDomains(AsciiString<kSize>());
507*61c4878aSAndroid Build Coastguard Worker 
TakePrintableAsciiString(const InlineString<> & string)508*61c4878aSAndroid Build Coastguard Worker void TakePrintableAsciiString(const InlineString<>& string) {
509*61c4878aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::all_of(string.begin(), string.end(), isprint));
510*61c4878aSAndroid Build Coastguard Worker }
511*61c4878aSAndroid Build Coastguard Worker FUZZ_TEST(FilterTest, TakePrintableAsciiString)
512*61c4878aSAndroid Build Coastguard Worker     .WithDomains(PrintableAsciiString<kSize>());
513*61c4878aSAndroid Build Coastguard Worker 
514*61c4878aSAndroid Build Coastguard Worker }  // namespace
515*61c4878aSAndroid Build Coastguard Worker }  // namespace pw::fuzzer
516