// 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"

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(), ast::StorageClass::kNone),
              ty.Pointer(ty.I32(), ast::StorageClass::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(ast::TextureDimension::k2d),
              ty.DepthTexture(ast::TextureDimension::k2d));
    EXPECT_EQ(ty.MultisampledTexture(ast::TextureDimension::k2d, ty.I32()),
              ty.MultisampledTexture(ast::TextureDimension::k2d, ty.I32()));
    EXPECT_EQ(ty.SampledTexture(ast::TextureDimension::k2d, ty.I32()),
              ty.SampledTexture(ast::TextureDimension::k2d, ty.I32()));
    EXPECT_EQ(ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                ast::Access::kRead),
              ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                ast::Access::kRead));
}

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

    TypeManager ty;
    EXPECT_NE(ty.Pointer(ty.I32(), ast::StorageClass::kNone),
              ty.Pointer(ty.U32(), ast::StorageClass::kNone));
    EXPECT_NE(ty.Pointer(ty.I32(), ast::StorageClass::kNone),
              ty.Pointer(ty.I32(), ast::StorageClass::kInput));
    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(ast::TextureDimension::k2d),
              ty.DepthTexture(ast::TextureDimension::k1d));
    EXPECT_NE(ty.MultisampledTexture(ast::TextureDimension::k2d, ty.I32()),
              ty.MultisampledTexture(ast::TextureDimension::k3d, ty.I32()));
    EXPECT_NE(ty.MultisampledTexture(ast::TextureDimension::k2d, ty.I32()),
              ty.MultisampledTexture(ast::TextureDimension::k2d, ty.U32()));
    EXPECT_NE(ty.SampledTexture(ast::TextureDimension::k2d, ty.I32()),
              ty.SampledTexture(ast::TextureDimension::k3d, ty.I32()));
    EXPECT_NE(ty.SampledTexture(ast::TextureDimension::k2d, ty.I32()),
              ty.SampledTexture(ast::TextureDimension::k2d, ty.U32()));
    EXPECT_NE(ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                ast::Access::kRead),
              ty.StorageTexture(ast::TextureDimension::k3d, ast::TexelFormat::kR32Uint,
                                ast::Access::kRead));
    EXPECT_NE(ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                ast::Access::kRead),
              ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Sint,
                                ast::Access::kRead));
    EXPECT_NE(ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                ast::Access::kRead),
              ty.StorageTexture(ast::TextureDimension::k2d, ast::TexelFormat::kR32Uint,
                                ast::Access::kWrite));
}

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