// Copyright 2023 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/builtin/attribute_test.cc.tmpl
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#include "src/tint/builtin/attribute.h"

#include <gtest/gtest.h>

#include <string>

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

namespace tint::builtin {
namespace {

namespace parse_print_tests {

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

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

static constexpr Case kValidCases[] = {
    {"align", Attribute::kAlign},           {"binding", Attribute::kBinding},
    {"builtin", Attribute::kBuiltin},       {"compute", Attribute::kCompute},
    {"diagnostic", Attribute::kDiagnostic}, {"fragment", Attribute::kFragment},
    {"group", Attribute::kGroup},           {"id", Attribute::kId},
    {"index", Attribute::kIndex},           {"interpolate", Attribute::kInterpolate},
    {"invariant", Attribute::kInvariant},   {"location", Attribute::kLocation},
    {"must_use", Attribute::kMustUse},      {"size", Attribute::kSize},
    {"vertex", Attribute::kVertex},         {"workgroup_size", Attribute::kWorkgroupSize},
};

static constexpr Case kInvalidCases[] = {
    {"alccn", Attribute::kUndefined},
    {"3g", Attribute::kUndefined},
    {"aVign", Attribute::kUndefined},
    {"bind1ng", Attribute::kUndefined},
    {"bqnJing", Attribute::kUndefined},
    {"bindin7ll", Attribute::kUndefined},
    {"ppqqiliHH", Attribute::kUndefined},
    {"bucv", Attribute::kUndefined},
    {"biltGn", Attribute::kUndefined},
    {"compiive", Attribute::kUndefined},
    {"8WWmpute", Attribute::kUndefined},
    {"cxxpute", Attribute::kUndefined},
    {"dXagnosigg", Attribute::kUndefined},
    {"dagnXuVc", Attribute::kUndefined},
    {"diagnosti3", Attribute::kUndefined},
    {"fraEment", Attribute::kUndefined},
    {"PPagTTent", Attribute::kUndefined},
    {"xxragddnt", Attribute::kUndefined},
    {"g44oup", Attribute::kUndefined},
    {"grVVSSp", Attribute::kUndefined},
    {"22RRp", Attribute::kUndefined},
    {"d", Attribute::kUndefined},
    {"i", Attribute::kUndefined},
    {"OVd", Attribute::kUndefined},
    {"ndyx", Attribute::kUndefined},
    {"n77rrldGx", Attribute::kUndefined},
    {"inde40", Attribute::kUndefined},
    {"itooolate", Attribute::kUndefined},
    {"intezplate", Attribute::kUndefined},
    {"ppnerii1olat", Attribute::kUndefined},
    {"invarianXX", Attribute::kUndefined},
    {"inv55ria99nII", Attribute::kUndefined},
    {"irrvariaSSaHH", Attribute::kUndefined},
    {"lkkcin", Attribute::kUndefined},
    {"gjctRRo", Attribute::kUndefined},
    {"lcbton", Attribute::kUndefined},
    {"mustjuse", Attribute::kUndefined},
    {"must_se", Attribute::kUndefined},
    {"muquse", Attribute::kUndefined},
    {"szNN", Attribute::kUndefined},
    {"zvv", Attribute::kUndefined},
    {"QQze", Attribute::kUndefined},
    {"eterf", Attribute::kUndefined},
    {"vertjx", Attribute::kUndefined},
    {"v82wNNx", Attribute::kUndefined},
    {"worgroup_size", Attribute::kUndefined},
    {"workgrourr_size", Attribute::kUndefined},
    {"workgroGp_size", Attribute::kUndefined},
};

using AttributeParseTest = testing::TestWithParam<Case>;

TEST_P(AttributeParseTest, Parse) {
    const char* string = GetParam().string;
    Attribute expect = GetParam().value;
    EXPECT_EQ(expect, ParseAttribute(string));
}

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

using AttributePrintTest = testing::TestWithParam<Case>;

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

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

}  // namespace parse_print_tests

}  // namespace
}  // namespace tint::builtin
