// Copyright (c) 2018 LunarG 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 <sstream>
#include <string>

#include "gmock/gmock.h"
#include "test/unit_spirv.h"
#include "test/val/val_fixtures.h"

namespace spvtools {
namespace val {
namespace {

using ::testing::HasSubstr;
using ::testing::Not;

using ValidateAdjacency = spvtest::ValidateBase<bool>;

TEST_F(ValidateAdjacency, OpPhiBeginsModuleFail) {
  const std::string module = R"(
%result = OpPhi %bool %true %true_label %false %false_label
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft
%void = OpTypeVoid
%bool = OpTypeBool
%true = OpConstantTrue %bool
%false = OpConstantFalse %bool
%func = OpTypeFunction %void
%main = OpFunction %void None %func
%main_entry = OpLabel
OpBranch %true_label
%true_label = OpLabel
OpBranch %false_label
%false_label = OpLabel
OpBranch %end_label
OpReturn
OpFunctionEnd
)";

  CompileSuccessfully(module);
  EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("ID 1[%bool] has not been defined"));
}

TEST_F(ValidateAdjacency, OpLoopMergeEndsModuleFail) {
  const std::string module = R"(
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft
%void = OpTypeVoid
%func = OpTypeFunction %void
%main = OpFunction %void None %func
%main_entry = OpLabel
OpBranch %loop
%loop = OpLabel
OpLoopMerge %end %loop None
)";

  CompileSuccessfully(module);
  EXPECT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("Missing OpFunctionEnd at end of module"));
}

TEST_F(ValidateAdjacency, OpSelectionMergeEndsModuleFail) {
  const std::string module = R"(
OpCapability Shader
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft
%void = OpTypeVoid
%func = OpTypeFunction %void
%main = OpFunction %void None %func
%main_entry = OpLabel
OpBranch %merge
%merge = OpLabel
OpSelectionMerge %merge None
)";

  CompileSuccessfully(module);
  EXPECT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("Missing OpFunctionEnd at end of module"));
}

std::string GenerateShaderCode(
    const std::string& body,
    const std::string& capabilities_and_extensions = "OpCapability Shader",
    const std::string& execution_model = "Fragment") {
  std::ostringstream ss;
  ss << capabilities_and_extensions << "\n";
  ss << "OpMemoryModel Logical GLSL450\n";
  ss << "OpEntryPoint " << execution_model << " %main \"main\"\n";
  if (execution_model == "Fragment") {
    ss << "OpExecutionMode %main OriginUpperLeft\n";
  }

  ss << R"(
%string = OpString ""
%void = OpTypeVoid
%bool = OpTypeBool
%int = OpTypeInt 32 0
%true = OpConstantTrue %bool
%false = OpConstantFalse %bool
%zero = OpConstant %int 0
%int_1 = OpConstant %int 1
%func = OpTypeFunction %void
%func_int = OpTypePointer Function %int
%main = OpFunction %void None %func
%main_entry = OpLabel
)";

  ss << body;

  ss << R"(
OpReturn
OpFunctionEnd)";

  return ss.str();
}

TEST_F(ValidateAdjacency, OpPhiPreceededByOpLabelSuccess) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
OpLine %string 0 0
%result = OpPhi %bool %true %true_label %false %false_label
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpPhiPreceededByOpPhiSuccess) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
%1 = OpPhi %bool %true %true_label %false %false_label
%2 = OpPhi %bool %true %true_label %false %false_label
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpPhiPreceededByOpLineSuccess) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
OpLine %string 0 0
%result = OpPhi %bool %true %true_label %false %false_label
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpPhiPreceededByBadOpFail) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
OpNop
%result = OpPhi %bool %true %true_label %false %false_label
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("OpPhi must appear within a non-entry block before all "
                        "non-OpPhi instructions"));
}

TEST_F(ValidateAdjacency, OpPhiPreceededByOpLineAndBadOpFail) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
OpNop
OpLine %string 1 1
%result = OpPhi %bool %true %true_label %false %false_label
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("OpPhi must appear within a non-entry block before all "
                        "non-OpPhi instructions"));
}

TEST_F(ValidateAdjacency, OpPhiFollowedByOpLineGood) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
%result = OpPhi %bool %true %true_label %false %false_label
OpLine %string 1 1
OpNop
OpNop
OpLine %string 2 1
OpNop
OpLine %string 3 1
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpPhiMultipleOpLineAndOpPhiFail) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
OpLine %string 1 1
%value = OpPhi %int %zero %true_label %int_1 %false_label
OpNop
OpLine %string 2 1
OpNop
OpLine %string 3 1
%result = OpPhi %bool %true %true_label %false %false_label
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("OpPhi must appear within a non-entry block before all "
                        "non-OpPhi instructions"));
}

TEST_F(ValidateAdjacency, OpPhiMultipleOpLineAndOpPhiGood) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
OpLine %string 1 1
%value = OpPhi %int %zero %true_label %int_1 %false_label
OpLine %string 2 1
%result = OpPhi %bool %true %true_label %false %false_label
OpLine %string 3 1
OpNop
OpNop
OpLine %string 4 1
OpNop
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpPhiInEntryBlockBad) {
  const std::string body = R"(
OpLine %string 1 1
%value = OpPhi %int
OpLine %string 2 1
OpNop
OpLine %string 3 1
OpNop
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("OpPhi must appear within a non-entry block before all "
                        "non-OpPhi instructions"));
}

TEST_F(ValidateAdjacency, NonSemanticBeforeOpPhiBad) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
%placeholder = OpExtInst %void %extinst 123 %int_1
%result = OpPhi %bool %true %true_label %false %false_label
)";

  const std::string extra = R"(OpCapability Shader
OpExtension "SPV_KHR_non_semantic_info"
%extinst = OpExtInstImport "NonSemantic.Testing.Set"
)";

  CompileSuccessfully(GenerateShaderCode(body, extra));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("OpPhi must appear within a non-entry block before all "
                        "non-OpPhi instructions"));
}

TEST_F(ValidateAdjacency, NonSemanticBetweenOpPhiBad) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
%result1 = OpPhi %bool %true %true_label %false %false_label
%placeholder = OpExtInst %void %extinst 123 %int_1
%result2 = OpPhi %bool %true %true_label %false %false_label
)";

  const std::string extra = R"(OpCapability Shader
OpExtension "SPV_KHR_non_semantic_info"
%extinst = OpExtInstImport "NonSemantic.Testing.Set"
)";

  CompileSuccessfully(GenerateShaderCode(body, extra));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("OpPhi must appear within a non-entry block before all "
                        "non-OpPhi instructions"));
}

TEST_F(ValidateAdjacency, NonSemanticAfterOpPhiGood) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
OpLine %string 0 0
%result = OpPhi %bool %true %true_label %false %false_label
%placeholder = OpExtInst %void %extinst 123 %int_1
)";

  const std::string extra = R"(OpCapability Shader
OpExtension "SPV_KHR_non_semantic_info"
%extinst = OpExtInstImport "NonSemantic.Testing.Set"
)";

  CompileSuccessfully(GenerateShaderCode(body, extra));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, NonSemanticBeforeOpFunctionParameterBad) {
  const std::string body = R"(
OpCapability Shader
OpExtension "SPV_KHR_non_semantic_info"
%extinst = OpExtInstImport "NonSemantic.Testing.Set"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft

%string = OpString ""
%void = OpTypeVoid
%bool = OpTypeBool
%int = OpTypeInt 32 0
%true = OpConstantTrue %bool
%false = OpConstantFalse %bool
%zero = OpConstant %int 0
%int_1 = OpConstant %int 1
%func = OpTypeFunction %void
%func_int = OpTypePointer Function %int
%paramfunc_type = OpTypeFunction %void %int %int

%paramfunc = OpFunction %void None %paramfunc_type
%placeholder = OpExtInst %void %extinst 123 %int_1
%a = OpFunctionParameter %int
%b = OpFunctionParameter %int
%paramfunc_entry = OpLabel
OpReturn
OpFunctionEnd

%main = OpFunction %void None %func
%main_entry = OpLabel
OpReturn
OpFunctionEnd
)";

  CompileSuccessfully(body);
  EXPECT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("Non-semantic OpExtInst within function definition "
                        "must appear in a block"));
}

TEST_F(ValidateAdjacency, NonSemanticBetweenOpFunctionParameterBad) {
  const std::string body = R"(
OpCapability Shader
OpExtension "SPV_KHR_non_semantic_info"
%extinst = OpExtInstImport "NonSemantic.Testing.Set"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft

%string = OpString ""
%void = OpTypeVoid
%bool = OpTypeBool
%int = OpTypeInt 32 0
%true = OpConstantTrue %bool
%false = OpConstantFalse %bool
%zero = OpConstant %int 0
%int_1 = OpConstant %int 1
%func = OpTypeFunction %void
%func_int = OpTypePointer Function %int
%paramfunc_type = OpTypeFunction %void %int %int

%paramfunc = OpFunction %void None %paramfunc_type
%a = OpFunctionParameter %int
%placeholder = OpExtInst %void %extinst 123 %int_1
%b = OpFunctionParameter %int
%paramfunc_entry = OpLabel
OpReturn
OpFunctionEnd

%main = OpFunction %void None %func
%main_entry = OpLabel
OpReturn
OpFunctionEnd
)";

  CompileSuccessfully(body);
  EXPECT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("Non-semantic OpExtInst within function definition "
                        "must appear in a block"));
}

TEST_F(ValidateAdjacency, NonSemanticAfterOpFunctionParameterGood) {
  const std::string body = R"(
OpCapability Shader
OpExtension "SPV_KHR_non_semantic_info"
%extinst = OpExtInstImport "NonSemantic.Testing.Set"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft

%string = OpString ""
%void = OpTypeVoid
%bool = OpTypeBool
%int = OpTypeInt 32 0
%true = OpConstantTrue %bool
%false = OpConstantFalse %bool
%zero = OpConstant %int 0
%int_1 = OpConstant %int 1
%func = OpTypeFunction %void
%func_int = OpTypePointer Function %int
%paramfunc_type = OpTypeFunction %void %int %int

%paramfunc = OpFunction %void None %paramfunc_type
%a = OpFunctionParameter %int
%b = OpFunctionParameter %int
%paramfunc_entry = OpLabel
%placeholder = OpExtInst %void %extinst 123 %int_1
OpReturn
OpFunctionEnd

%main = OpFunction %void None %func
%main_entry = OpLabel
OpReturn
OpFunctionEnd
)";

  CompileSuccessfully(body);
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, NonSemanticBetweenFunctionsGood) {
  const std::string body = R"(
OpCapability Shader
OpExtension "SPV_KHR_non_semantic_info"
%extinst = OpExtInstImport "NonSemantic.Testing.Set"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main"
OpExecutionMode %main OriginUpperLeft

%string = OpString ""
%void = OpTypeVoid
%bool = OpTypeBool
%int = OpTypeInt 32 0
%true = OpConstantTrue %bool
%false = OpConstantFalse %bool
%zero = OpConstant %int 0
%int_1 = OpConstant %int 1
%func = OpTypeFunction %void
%func_int = OpTypePointer Function %int
%paramfunc_type = OpTypeFunction %void %int %int

%paramfunc = OpFunction %void None %paramfunc_type
%a = OpFunctionParameter %int
%b = OpFunctionParameter %int
%paramfunc_entry = OpLabel
OpReturn
OpFunctionEnd

%placeholder = OpExtInst %void %extinst 123 %int_1

%main = OpFunction %void None %func
%main_entry = OpLabel
OpReturn
OpFunctionEnd
)";

  CompileSuccessfully(body);
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpVariableInFunctionGood) {
  const std::string body = R"(
OpLine %string 1 1
%var = OpVariable %func_int Function
OpLine %string 2 1
OpNop
OpLine %string 3 1
OpNop
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpVariableInFunctionMultipleGood) {
  const std::string body = R"(
OpLine %string 1 1
%1 = OpVariable %func_int Function
OpLine %string 2 1
%2 = OpVariable %func_int Function
%3 = OpVariable %func_int Function
OpNop
OpLine %string 3 1
OpNop
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpVariableInFunctionBad) {
  const std::string body = R"(
%1 = OpUndef %int
%2 = OpVariable %func_int Function
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("All OpVariable instructions in a function must be the "
                        "first instructions"));
}

TEST_F(ValidateAdjacency, OpVariableInFunctionMultipleBad) {
  const std::string body = R"(
OpNop
%1 = OpVariable %func_int Function
OpLine %string 1 1
%2 = OpVariable %func_int Function
OpNop
OpNop
OpLine %string 2 1
%3 = OpVariable %func_int Function
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("All OpVariable instructions in a function must be the "
                        "first instructions"));
}

TEST_F(ValidateAdjacency, OpLoopMergePreceedsOpBranchSuccess) {
  const std::string body = R"(
OpBranch %loop
%loop = OpLabel
OpLoopMerge %end %loop None
OpBranch %loop
%end = OpLabel
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpLoopMergePreceedsOpBranchConditionalSuccess) {
  const std::string body = R"(
OpBranch %loop
%loop = OpLabel
OpLoopMerge %end %loop None
OpBranchConditional %true %loop %end
%end = OpLabel
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpLoopMergePreceedsBadOpFail) {
  const std::string body = R"(
OpBranch %loop
%loop = OpLabel
OpLoopMerge %end %loop None
OpNop
OpBranchConditional %true %loop %end
%end = OpLabel
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("OpLoopMerge must immediately precede either an "
                        "OpBranch or OpBranchConditional instruction."));
}

TEST_F(ValidateAdjacency, OpSelectionMergePreceedsOpBranchConditionalSuccess) {
  const std::string body = R"(
OpSelectionMerge %end_label None
OpBranchConditional %true %true_label %false_label
%true_label = OpLabel
OpBranch %end_label
%false_label = OpLabel
OpBranch %end_label
%end_label = OpLabel
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpSelectionMergePreceedsOpSwitchSuccess) {
  const std::string body = R"(
OpSelectionMerge %merge None
OpSwitch %zero %merge 0 %label
%label = OpLabel
OpBranch %merge
%merge = OpLabel
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
}

TEST_F(ValidateAdjacency, OpSelectionMergePreceedsBadOpFail) {
  const std::string body = R"(
OpSelectionMerge %merge None
OpNop
OpSwitch %zero %merge 0 %label
%label = OpLabel
OpBranch %merge
%merge = OpLabel
)";

  CompileSuccessfully(GenerateShaderCode(body));
  EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  EXPECT_THAT(getDiagnosticString(),
              HasSubstr("OpSelectionMerge must immediately precede either an "
                        "OpBranchConditional or OpSwitch instruction"));
}

}  // namespace
}  // namespace val
}  // namespace spvtools
