// 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 "gmock/gmock.h"
#include "src/tint/reader/spirv/parser_impl_test_helper.h"
#include "src/tint/reader/spirv/spirv_tools_helpers_test.h"

namespace tint {
namespace reader {
namespace spirv {
namespace {

using ::testing::HasSubstr;

TEST_F(SpvParserTest, Impl_Uint32VecEmpty) {
  std::vector<uint32_t> data;
  auto p = parser(data);
  EXPECT_FALSE(p->Parse());
  // TODO(dneto): What message?
}

TEST_F(SpvParserTest, Impl_InvalidModuleFails) {
  auto invalid_spv = test::Assemble("%ty = OpTypeInt 3 0");
  auto p = parser(invalid_spv);
  EXPECT_FALSE(p->Parse());
  EXPECT_THAT(
      p->error(),
      HasSubstr("TypeInt cannot appear before the memory model instruction"));
  EXPECT_THAT(p->error(), HasSubstr("OpTypeInt 3 0"));
}

TEST_F(SpvParserTest, Impl_GenericVulkanShader_SimpleMemoryModel) {
  auto spv = test::Assemble(R"(
  OpCapability Shader
  OpMemoryModel Logical Simple
  OpEntryPoint GLCompute %main "main"
  OpExecutionMode %main LocalSize 1 1 1
  %void = OpTypeVoid
  %voidfn = OpTypeFunction %void
  %main = OpFunction %void None %voidfn
  %entry = OpLabel
  OpReturn
  OpFunctionEnd
)");
  auto p = parser(spv);
  EXPECT_TRUE(p->Parse());
  EXPECT_TRUE(p->error().empty());
}

TEST_F(SpvParserTest, Impl_GenericVulkanShader_GLSL450MemoryModel) {
  auto spv = test::Assemble(R"(
  OpCapability Shader
  OpMemoryModel Logical GLSL450
  OpEntryPoint GLCompute %main "main"
  OpExecutionMode %main LocalSize 1 1 1
  %void = OpTypeVoid
  %voidfn = OpTypeFunction %void
  %main = OpFunction %void None %voidfn
  %entry = OpLabel
  OpReturn
  OpFunctionEnd
)");
  auto p = parser(spv);
  EXPECT_TRUE(p->Parse());
  EXPECT_TRUE(p->error().empty());
}

TEST_F(SpvParserTest, Impl_GenericVulkanShader_VulkanMemoryModel) {
  auto spv = test::Assemble(R"(
  OpCapability Shader
  OpCapability VulkanMemoryModelKHR
  OpExtension "SPV_KHR_vulkan_memory_model"
  OpMemoryModel Logical VulkanKHR
  OpEntryPoint GLCompute %main "main"
  OpExecutionMode %main LocalSize 1 1 1
  %void = OpTypeVoid
  %voidfn = OpTypeFunction %void
  %main = OpFunction %void None %voidfn
  %entry = OpLabel
  OpReturn
  OpFunctionEnd
)");
  auto p = parser(spv);
  EXPECT_TRUE(p->Parse());
  EXPECT_TRUE(p->error().empty());
}

TEST_F(SpvParserTest, Impl_OpenCLKernel_Fails) {
  auto spv = test::Assemble(R"(
  OpCapability Kernel
  OpCapability Addresses
  OpMemoryModel Physical32 OpenCL
  OpEntryPoint Kernel %main "main"
  %void = OpTypeVoid
  %voidfn = OpTypeFunction %void
  %main = OpFunction %void None %voidfn
  %entry = OpLabel
  OpReturn
  OpFunctionEnd
)");
  auto p = parser(spv);
  EXPECT_FALSE(p->Parse());
  EXPECT_THAT(p->error(), HasSubstr("Capability Kernel is not allowed"));
}

TEST_F(SpvParserTest, Impl_Source_NoOpLine) {
  auto spv = test::Assemble(R"(
  OpCapability Shader
  OpMemoryModel Logical Simple
  OpEntryPoint GLCompute %main "main"
  OpExecutionMode %main LocalSize 1 1 1
  %void = OpTypeVoid
  %voidfn = OpTypeFunction %void
  %5 = OpTypeInt 32 0
  %60 = OpConstantNull %5
  %main = OpFunction %void None %voidfn
  %1 = OpLabel
  OpReturn
  OpFunctionEnd
)");
  auto p = parser(spv);
  EXPECT_TRUE(p->Parse());
  EXPECT_TRUE(p->error().empty());
  // Use instruction counting.
  auto s5 = p->GetSourceForResultIdForTest(5);
  EXPECT_EQ(7u, s5.range.begin.line);
  EXPECT_EQ(0u, s5.range.begin.column);
  auto s60 = p->GetSourceForResultIdForTest(60);
  EXPECT_EQ(8u, s60.range.begin.line);
  EXPECT_EQ(0u, s60.range.begin.column);
  auto s1 = p->GetSourceForResultIdForTest(1);
  EXPECT_EQ(10u, s1.range.begin.line);
  EXPECT_EQ(0u, s1.range.begin.column);
}

TEST_F(SpvParserTest, Impl_Source_WithOpLine_WithOpNoLine) {
  auto spv = test::Assemble(R"(
  OpCapability Shader
  OpMemoryModel Logical Simple
  OpEntryPoint GLCompute %main "main"
  OpExecutionMode %main LocalSize 1 1 1
  %15 = OpString "myfile"
  %void = OpTypeVoid
  %voidfn = OpTypeFunction %void
  OpLine %15 42 53
  %5 = OpTypeInt 32 0
  %60 = OpConstantNull %5
  OpNoLine
  %main = OpFunction %void None %voidfn
  %1 = OpLabel
  OpReturn
  OpFunctionEnd
)");
  auto p = parser(spv);
  EXPECT_TRUE(p->Parse());
  EXPECT_TRUE(p->error().empty());
  // Use the information from the OpLine that is still in scope.
  auto s5 = p->GetSourceForResultIdForTest(5);
  EXPECT_EQ(42u, s5.range.begin.line);
  EXPECT_EQ(53u, s5.range.begin.column);
  auto s60 = p->GetSourceForResultIdForTest(60);
  EXPECT_EQ(42u, s60.range.begin.line);
  EXPECT_EQ(53u, s60.range.begin.column);
  // After OpNoLine, revert back to instruction counting.
  auto s1 = p->GetSourceForResultIdForTest(1);
  EXPECT_EQ(14u, s1.range.begin.line);
  EXPECT_EQ(0u, s1.range.begin.column);
}

TEST_F(SpvParserTest, Impl_Source_InvalidId) {
  auto spv = test::Assemble(R"(
  OpCapability Shader
  OpMemoryModel Logical Simple
  OpEntryPoint GLCompute %main "main"
  OpExecutionMode %main LocalSize 1 1 1
  %15 = OpString "myfile"
  %void = OpTypeVoid
  %voidfn = OpTypeFunction %void
  %main = OpFunction %void None %voidfn
  %1 = OpLabel
  OpReturn
  OpFunctionEnd
)");
  auto p = parser(spv);
  EXPECT_TRUE(p->Parse());
  EXPECT_TRUE(p->error().empty());
  auto s99 = p->GetSourceForResultIdForTest(99);
  EXPECT_EQ(0u, s99.range.begin.line);
  EXPECT_EQ(0u, s99.range.begin.column);
}

TEST_F(SpvParserTest, Impl_IsValidIdentifier) {
  EXPECT_FALSE(ParserImpl::IsValidIdentifier(""));  // empty
  EXPECT_FALSE(ParserImpl::IsValidIdentifier("_"));
  EXPECT_FALSE(ParserImpl::IsValidIdentifier("__"));
  EXPECT_TRUE(ParserImpl::IsValidIdentifier("_x"));
  EXPECT_FALSE(
      ParserImpl::IsValidIdentifier("9"));  // leading digit, but ok later
  EXPECT_FALSE(ParserImpl::IsValidIdentifier(" "));    // leading space
  EXPECT_FALSE(ParserImpl::IsValidIdentifier("a "));   // trailing space
  EXPECT_FALSE(ParserImpl::IsValidIdentifier("a 1"));  // space in the middle
  EXPECT_FALSE(ParserImpl::IsValidIdentifier("."));    // weird character

  // a simple identifier
  EXPECT_TRUE(ParserImpl::IsValidIdentifier("A"));
  // each upper case letter
  EXPECT_TRUE(ParserImpl::IsValidIdentifier("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
  // each lower case letter
  EXPECT_TRUE(ParserImpl::IsValidIdentifier("abcdefghijklmnopqrstuvwxyz"));
  EXPECT_TRUE(ParserImpl::IsValidIdentifier("a0123456789"));  // each digit
  EXPECT_TRUE(ParserImpl::IsValidIdentifier("x_"));           // has underscore
}

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