1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkEnumBitMask.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker enum class Flags {
12*c8dee2aaSAndroid Build Coastguard Worker kNone = 0,
13*c8dee2aaSAndroid Build Coastguard Worker kA = 1,
14*c8dee2aaSAndroid Build Coastguard Worker kB = 2,
15*c8dee2aaSAndroid Build Coastguard Worker kC = 4
16*c8dee2aaSAndroid Build Coastguard Worker };
17*c8dee2aaSAndroid Build Coastguard Worker SK_MAKE_BITMASK_OPS(Flags)
18*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(skgpu_Mask,r)19*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(skgpu_Mask, r) {
20*c8dee2aaSAndroid Build Coastguard Worker SkEnumBitMask<Flags> flags = Flags::kNone;
21*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !flags);
22*c8dee2aaSAndroid Build Coastguard Worker flags |= Flags::kA;
23*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, flags);
24*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !(flags & Flags::kB));
25*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, (flags & Flags::kA));
26*c8dee2aaSAndroid Build Coastguard Worker flags |= (Flags::kB | Flags::kC);
27*c8dee2aaSAndroid Build Coastguard Worker auto mask = Flags::kB | Flags::kC;
28*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, (flags & mask) == mask);
29*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, flags == (Flags::kA | Flags::kB | Flags::kC));
30*c8dee2aaSAndroid Build Coastguard Worker flags &= ~Flags::kC;
31*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, flags == (Flags::kA | Flags::kB));
32*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, (flags & mask) != mask);
33*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, (flags & mask) != Flags::kNone);
34*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, (flags & mask));
35*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, flags);
36*c8dee2aaSAndroid Build Coastguard Worker flags &= ~Flags::kB;
37*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, (flags & mask) == Flags::kNone);
38*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !(flags & mask));
39*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, flags);
40*c8dee2aaSAndroid Build Coastguard Worker flags = (flags | flags) ^ (flags);
41*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !flags);
42*c8dee2aaSAndroid Build Coastguard Worker flags ^= mask;
43*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, flags == mask);
44*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !(Flags::kA & Flags::kB));
45*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, (Flags::kA ^ Flags::kB) == (Flags::kA | Flags::kB));
46*c8dee2aaSAndroid Build Coastguard Worker }
47