// 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},
    {"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},
    {"inyerpolae", Attribute::kUndefined},
    {"rrnterpolll77Ge", Attribute::kUndefined},
    {"inte4pol00te", Attribute::kUndefined},
    {"inoornt", Attribute::kUndefined},
    {"inzzriat", Attribute::kUndefined},
    {"n11pariiin", Attribute::kUndefined},
    {"XXocation", Attribute::kUndefined},
    {"lIIc9955nnon", Attribute::kUndefined},
    {"aaoHHatioYSS", Attribute::kUndefined},
    {"mkksue", Attribute::kUndefined},
    {"gjs_RRs", Attribute::kUndefined},
    {"msb_se", Attribute::kUndefined},
    {"jize", Attribute::kUndefined},
    {"sze", Attribute::kUndefined},
    {"qz", Attribute::kUndefined},
    {"vNNtex", Attribute::kUndefined},
    {"vevvx", Attribute::kUndefined},
    {"veQQex", Attribute::kUndefined},
    {"workgrrupffie", Attribute::kUndefined},
    {"workgroup_sije", Attribute::kUndefined},
    {"workgoupNNwsiz8", 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
