// Copyright 2022 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.

////////////////////////////////////////////////////////////////////////////////
// File generated by tools/src/cmd/gen
// using the template:
//   src/tint/resolver/type_alias_test.cc.tmpl
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#include "src/tint/resolver/type_alias.h"

#include <string>

#include "gtest/gtest.h"

#include "src/tint/utils/string.h"

namespace tint::resolver {
namespace {

namespace parse_print_tests {

struct Case {
    const char* string;
    TypeAlias value;
};

inline std::ostream& operator<<(std::ostream& out, Case c) {
    return out << "'" << std::string(c.string) << "'";
}

static constexpr Case kValidCases[] = {
    {"vec2f", TypeAlias::kVec2F}, {"vec2h", TypeAlias::kVec2H}, {"vec2i", TypeAlias::kVec2I},
    {"vec2u", TypeAlias::kVec2U}, {"vec3f", TypeAlias::kVec3F}, {"vec3h", TypeAlias::kVec3H},
    {"vec3i", TypeAlias::kVec3I}, {"vec3u", TypeAlias::kVec3U}, {"vec4f", TypeAlias::kVec4F},
    {"vec4h", TypeAlias::kVec4H}, {"vec4i", TypeAlias::kVec4I}, {"vec4u", TypeAlias::kVec4U},
};

static constexpr Case kInvalidCases[] = {
    {"veccf", TypeAlias::kUndefined},     {"32", TypeAlias::kUndefined},
    {"vVc2f", TypeAlias::kUndefined},     {"vec21", TypeAlias::kUndefined},
    {"qqeJh", TypeAlias::kUndefined},     {"vecll7h", TypeAlias::kUndefined},
    {"veqH2pp", TypeAlias::kUndefined},   {"vi", TypeAlias::kUndefined},
    {"Gebi", TypeAlias::kUndefined},      {"vevi2u", TypeAlias::kUndefined},
    {"ve8WWu", TypeAlias::kUndefined},    {"Mxxc2", TypeAlias::kUndefined},
    {"vgg3f", TypeAlias::kUndefined},     {"V3X", TypeAlias::kUndefined},
    {"vec33", TypeAlias::kUndefined},     {"vec3E", TypeAlias::kUndefined},
    {"TTeP3h", TypeAlias::kUndefined},    {"vxxcdd", TypeAlias::kUndefined},
    {"v44c3i", TypeAlias::kUndefined},    {"veVVSSi", TypeAlias::kUndefined},
    {"22RRi", TypeAlias::kUndefined},     {"vF3u", TypeAlias::kUndefined},
    {"vecu", TypeAlias::kUndefined},      {"ROOHVu", TypeAlias::kUndefined},
    {"ecyf", TypeAlias::kUndefined},      {"n77rrlcGf", TypeAlias::kUndefined},
    {"vec440", TypeAlias::kUndefined},    {"ooh", TypeAlias::kUndefined},
    {"vezz", TypeAlias::kUndefined},      {"1ipp4h", TypeAlias::kUndefined},
    {"XXec4i", TypeAlias::kUndefined},    {"ve9IInn5i", TypeAlias::kUndefined},
    {"HHreSSaYi", TypeAlias::kUndefined}, {"kk4", TypeAlias::kUndefined},
    {"jgRR", TypeAlias::kUndefined},      {"veb", TypeAlias::kUndefined},
};

using TypeAliasParseTest = testing::TestWithParam<Case>;

TEST_P(TypeAliasParseTest, Parse) {
    const char* string = GetParam().string;
    TypeAlias expect = GetParam().value;
    EXPECT_EQ(expect, ParseTypeAlias(string));
}

INSTANTIATE_TEST_SUITE_P(ValidCases, TypeAliasParseTest, testing::ValuesIn(kValidCases));
INSTANTIATE_TEST_SUITE_P(InvalidCases, TypeAliasParseTest, testing::ValuesIn(kInvalidCases));

using TypeAliasPrintTest = testing::TestWithParam<Case>;

TEST_P(TypeAliasPrintTest, Print) {
    TypeAlias value = GetParam().value;
    const char* expect = GetParam().string;
    EXPECT_EQ(expect, utils::ToString(value));
}

INSTANTIATE_TEST_SUITE_P(ValidCases, TypeAliasPrintTest, testing::ValuesIn(kValidCases));

}  // namespace parse_print_tests

}  // namespace
}  // namespace tint::resolver
