// Copyright 2020 The Tint 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 "src/tint/reader/spirv/parser_type.h"
#include "src/tint/type/texture_dimension.h"

namespace tint::reader::spirv {
namespace {

TEST(SpvParserTypeTest, SameArgumentsGivesSamePointer) {
    Symbol sym(Symbol(1, {}));

    TypeManager ty;
    EXPECT_EQ(ty.Void(), ty.Void());
    EXPECT_EQ(ty.Bool(), ty.Bool());
    EXPECT_EQ(ty.U32(), ty.U32());
    EXPECT_EQ(ty.F32(), ty.F32());
    EXPECT_EQ(ty.I32(), ty.I32());
    EXPECT_EQ(ty.Pointer(ty.I32(), type::AddressSpace::kNone),
              ty.Pointer(ty.I32(), type::AddressSpace::kNone));
    EXPECT_EQ(ty.Vector(ty.I32(), 3), ty.Vector(ty.I32(), 3));
    EXPECT_EQ(ty.Matrix(ty.I32(), 3, 2), ty.Matrix(ty.I32(), 3, 2));
    EXPECT_EQ(ty.Array(ty.I32(), 3, 2), ty.Array(ty.I32(), 3, 2));
    EXPECT_EQ(ty.Alias(sym, ty.I32()), ty.Alias(sym, ty.I32()));
    EXPECT_EQ(ty.Struct(sym, {ty.I32()}), ty.Struct(sym, {ty.I32()}));
    EXPECT_EQ(ty.Sampler(ast::SamplerKind::kSampler), ty.Sampler(ast::SamplerKind::kSampler));
    EXPECT_EQ(ty.DepthTexture(type::TextureDimension::k2d),
              ty.DepthTexture(type::TextureDimension::k2d));
    EXPECT_EQ(ty.MultisampledTexture(type::TextureDimension::k2d, ty.I32()),
              ty.MultisampledTexture(type::TextureDimension::k2d, ty.I32()));
    EXPECT_EQ(ty.SampledTexture(type::TextureDimension::k2d, ty.I32()),
              ty.SampledTexture(type::TextureDimension::k2d, ty.I32()));
    EXPECT_EQ(ty.StorageTexture(type::TextureDimension::k2d, type::TexelFormat::kR32Uint,
                                type::Access::kRead),
              ty.StorageTexture(type::TextureDimension::k2d, type::TexelFormat::kR32Uint,
                                type::Access::kRead));
}

TEST(SpvParserTypeTest, DifferentArgumentsGivesDifferentPointer) {
    Symbol sym_a(Symbol(1, {}));
    Symbol sym_b(Symbol(2, {}));

    TypeManager ty;
    EXPECT_NE(ty.Pointer(ty.I32(), type::AddressSpace::kNone),
              ty.Pointer(ty.U32(), type::AddressSpace::kNone));
    EXPECT_NE(ty.Pointer(ty.I32(), type::AddressSpace::kNone),
              ty.Pointer(ty.I32(), type::AddressSpace::kIn));
    EXPECT_NE(ty.Vector(ty.I32(), 3), ty.Vector(ty.U32(), 3));
    EXPECT_NE(ty.Vector(ty.I32(), 3), ty.Vector(ty.I32(), 2));
    EXPECT_NE(ty.Matrix(ty.I32(), 3, 2), ty.Matrix(ty.U32(), 3, 2));
    EXPECT_NE(ty.Matrix(ty.I32(), 3, 2), ty.Matrix(ty.I32(), 2, 2));
    EXPECT_NE(ty.Matrix(ty.I32(), 3, 2), ty.Matrix(ty.I32(), 3, 3));
    EXPECT_NE(ty.Array(ty.I32(), 3, 2), ty.Array(ty.U32(), 3, 2));
    EXPECT_NE(ty.Array(ty.I32(), 3, 2), ty.Array(ty.I32(), 2, 2));
    EXPECT_NE(ty.Array(ty.I32(), 3, 2), ty.Array(ty.I32(), 3, 3));
    EXPECT_NE(ty.Alias(sym_a, ty.I32()), ty.Alias(sym_b, ty.I32()));
    EXPECT_NE(ty.Struct(sym_a, {ty.I32()}), ty.Struct(sym_b, {ty.I32()}));
    EXPECT_NE(ty.Sampler(ast::SamplerKind::kSampler),
              ty.Sampler(ast::SamplerKind::kComparisonSampler));
    EXPECT_NE(ty.DepthTexture(type::TextureDimension::k2d),
              ty.DepthTexture(type::TextureDimension::k1d));
    EXPECT_NE(ty.MultisampledTexture(type::TextureDimension::k2d, ty.I32()),
              ty.MultisampledTexture(type::TextureDimension::k3d, ty.I32()));
    EXPECT_NE(ty.MultisampledTexture(type::TextureDimension::k2d, ty.I32()),
              ty.MultisampledTexture(type::TextureDimension::k2d, ty.U32()));
    EXPECT_NE(ty.SampledTexture(type::TextureDimension::k2d, ty.I32()),
              ty.SampledTexture(type::TextureDimension::k3d, ty.I32()));
    EXPECT_NE(ty.SampledTexture(type::TextureDimension::k2d, ty.I32()),
              ty.SampledTexture(type::TextureDimension::k2d, ty.U32()));
    EXPECT_NE(ty.StorageTexture(type::TextureDimension::k2d, type::TexelFormat::kR32Uint,
                                type::Access::kRead),
              ty.StorageTexture(type::TextureDimension::k3d, type::TexelFormat::kR32Uint,
                                type::Access::kRead));
    EXPECT_NE(ty.StorageTexture(type::TextureDimension::k2d, type::TexelFormat::kR32Uint,
                                type::Access::kRead),
              ty.StorageTexture(type::TextureDimension::k2d, type::TexelFormat::kR32Sint,
                                type::Access::kRead));
    EXPECT_NE(ty.StorageTexture(type::TextureDimension::k2d, type::TexelFormat::kR32Uint,
                                type::Access::kRead),
              ty.StorageTexture(type::TextureDimension::k2d, type::TexelFormat::kR32Uint,
                                type::Access::kWrite));
}

}  // namespace
}  // namespace tint::reader::spirv
