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