text: /*
   * Copyright 2019 Google Inc.
   *
   * Use of this source code is governed by a BSD-style license that can be
   * found in the LICENSE file.
   */
  
  #include "src/core/SkEnumBitMask.h"
  #include "tests/Test.h"
  
  enum class Flags {
      kNone = 0,
      kA = 1,
      kB = 2,
      kC = 4
  };
  SK_MAKE_BITMASK_OPS(Flags);
  
  DEF_TEST(skgpu_Mask, r) {
      SkEnumBitMask<Flags> flags = Flags::kNone;
      REPORTER_ASSERT(r, !flags);
      flags |= Flags::kA;
      REPORTER_ASSERT(r, flags);
      REPORTER_ASSERT(r, !(flags & Flags::kB));
      REPORTER_ASSERT(r, (flags & Flags::kA));
      flags |= (Flags::kB | Flags::kC);
      auto mask = Flags::kB | Flags::kC;
      REPORTER_ASSERT(r, (flags & mask) == mask);
      REPORTER_ASSERT(r, flags == (Flags::kA | Flags::kB | Flags::kC));
      flags &= ~Flags::kC;
      REPORTER_ASSERT(r, flags == (Flags::kA | Flags::kB));
      REPORTER_ASSERT(r, (flags & mask) != mask);
      REPORTER_ASSERT(r, (flags & mask) != Flags::kNone);
      REPORTER_ASSERT(r, (flags & mask));
      REPORTER_ASSERT(r, flags);
      flags &= ~Flags::kB;
      REPORTER_ASSERT(r, (flags & mask) == Flags::kNone);
      REPORTER_ASSERT(r, !(flags & mask));
      REPORTER_ASSERT(r, flags);
      flags = (flags | flags) ^ (flags);
      REPORTER_ASSERT(r, !flags);
      flags ^= mask;
      REPORTER_ASSERT(r, flags == mask);
      REPORTER_ASSERT(r, !(Flags::kA & Flags::kB));
      REPORTER_ASSERT(r, (Flags::kA ^ Flags::kB) == (Flags::kA | Flags::kB));
  }
  