/*
 * 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/base/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));
}
