// Copyright (c) 2015-2016 The Khronos Group Inc.
//
// 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 <vector>

#include "TestFixture.h"
#include "UnitSPIRV.h"

namespace {

using NamedIdTest = spvtest::TextToBinaryTest;

TEST_F(NamedIdTest, Default) {
  const std::string input = R"(
          OpCapability Shader
          OpMemoryModel Logical Simple
          OpEntryPoint Vertex %main "foo"
  %void = OpTypeVoid
%fnMain = OpTypeFunction %void
  %main = OpFunction %void None %fnMain
%lbMain = OpLabel
          OpReturn
          OpFunctionEnd)";
  const std::string output =
      "OpCapability Shader\n"
      "OpMemoryModel Logical Simple\n"
      "OpEntryPoint Vertex %1 \"foo\"\n"
      "%2 = OpTypeVoid\n"
      "%3 = OpTypeFunction %2\n"
      "%1 = OpFunction %2 None %3\n"
      "%4 = OpLabel\n"
      "OpReturn\n"
      "OpFunctionEnd\n";
  EXPECT_EQ(output, EncodeAndDecodeSuccessfully(input));
}

struct IdCheckCase {
  std::string id;
  bool valid;
};

using IdValidityTest =
    spvtest::TextToBinaryTestBase<::testing::TestWithParam<IdCheckCase>>;

TEST_P(IdValidityTest, IdTypes) {
  const std::string input = GetParam().id + " = OpTypeVoid";
  SetText(input);
  if (GetParam().valid) {
    CompileSuccessfully(input);
  } else {
    CompileFailure(input);
  }
}

INSTANTIATE_TEST_CASE_P(
    ValidAndInvalidIds, IdValidityTest,
    ::testing::ValuesIn(std::vector<IdCheckCase>({{"%1", true},
                                                  {"%2abc", true},
                                                  {"%3Def", true},
                                                  {"%4GHI", true},
                                                  {"%5_j_k", true},
                                                  {"%6J_M", true},
                                                  {"%n", true},
                                                  {"%O", true},
                                                  {"%p7", true},
                                                  {"%Q8", true},
                                                  {"%R_S", true},
                                                  {"%T_10_U", true},
                                                  {"%V_11", true},
                                                  {"%W_X_13", true},
                                                  {"%_A", true},
                                                  {"%_", true},
                                                  {"%__", true},
                                                  {"%A_", true},
                                                  {"%_A_", true},

                                                  {"%@", false},
                                                  {"%!", false},
                                                  {"%ABC!", false},
                                                  {"%__A__@", false},
                                                  {"%%", false},
                                                  {"%-", false},
                                                  {"%foo_@_bar", false},
                                                  {"%", false},

                                                  {"5", false},
                                                  {"32", false},
                                                  {"foo", false},
                                                  {"a%bar", false}})),);

}  // anonymous namespace
