// Copyright 2017 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "gtest/gtest.h"

#include "dawn/EnumClassBitmasks.h"

namespace dawn {

    enum class Color : uint32_t {
        R = 1,
        G = 2,
        B = 4,
        A = 8,
    };

    template <>
    struct IsDawnBitmask<Color> {
        static constexpr bool enable = true;
    };

    TEST(BitmaskTests, BasicOperations) {
        Color test1 = Color::R | Color::G;
        ASSERT_EQ(1u | 2u, static_cast<uint32_t>(test1));

        Color test2 = test1 ^ (Color::R | Color::A);
        ASSERT_EQ(2u | 8u, static_cast<uint32_t>(test2));

        Color test3 = test2 & Color::A;
        ASSERT_EQ(8u, static_cast<uint32_t>(test3));

        Color test4 = ~test3;
        ASSERT_EQ(~uint32_t(8), static_cast<uint32_t>(test4));
    }

    TEST(BitmaskTests, AssignOperations) {
        Color test1 = Color::R;
        test1 |= Color::G;
        ASSERT_EQ(1u | 2u, static_cast<uint32_t>(test1));

        Color test2 = test1;
        test2 ^= (Color::R | Color::A);
        ASSERT_EQ(2u | 8u, static_cast<uint32_t>(test2));

        Color test3 = test2;
        test3 &= Color::A;
        ASSERT_EQ(8u, static_cast<uint32_t>(test3));
    }

    TEST(BitmaskTests, BoolConversion) {
        bool test1 = Color::R | Color::G;
        ASSERT_TRUE(test1);

        bool test2 = Color::R & Color::G;
        ASSERT_FALSE(test2);

        bool test3 = Color::R ^ Color::G;
        ASSERT_TRUE(test3);

        if (Color::R & ~Color::R) {
            ASSERT_TRUE(false);
        }
    }

    TEST(BitmaskTests, ThreeOrs) {
        Color c = Color::R | Color::G | Color::B;
        ASSERT_EQ(7u, static_cast<uint32_t>(c));
    }

    TEST(BitmaskTests, ZeroOrOneBits) {
        Color zero = static_cast<Color>(0);
        ASSERT_TRUE(HasZeroOrOneBits(zero));
        ASSERT_TRUE(HasZeroOrOneBits(Color::R));
        ASSERT_TRUE(HasZeroOrOneBits(Color::G));
        ASSERT_TRUE(HasZeroOrOneBits(Color::B));
        ASSERT_TRUE(HasZeroOrOneBits(Color::A));
        ASSERT_FALSE(HasZeroOrOneBits(static_cast<Color>(Color::R | Color::G)));
        ASSERT_FALSE(HasZeroOrOneBits(static_cast<Color>(Color::G | Color::B)));
        ASSERT_FALSE(HasZeroOrOneBits(static_cast<Color>(Color::B | Color::A)));
    }

}  // namespace dawn
