// GENERATED FILE - DO NOT EDIT.
// Generated by generate_tests.py
//
// Copyright (c) 2022 Google LLC.
//
// 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 "../diff_test_utils.h"

#include "gtest/gtest.h"

namespace spvtools {
namespace diff {
namespace {

// Basic test for multiple entry points.  The entry points have different
// execution models and so can be trivially matched.
constexpr char kSrc[] = R"(               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Vertex %mainv "mainv" %vo %a
               OpEntryPoint Fragment %mainf "mainf" %color %vi
	       OpExecutionMode %mainf OriginUpperLeft
               OpSource ESSL 310
               OpName %mainv "mainv"
               OpName %mainf "mainf"
               OpName %a "a"
               OpName %vo "v"
               OpName %vi "v"
               OpName %color "color"
               OpDecorate %a Location 0
               OpDecorate %vo Location 0
               OpDecorate %vi Location 0
               OpDecorate %color Location 0
	       OpDecorate %color RelaxedPrecision
	       OpDecorate %vi RelaxedPrecision
               OpDecorate %12 RelaxedPrecision
               OpDecorate %13 RelaxedPrecision

       %void = OpTypeVoid
          %3 = OpTypeFunction %void
      %float = OpTypeFloat 32
    %v4float = OpTypeVector %float 4

%_ptr_Input_float = OpTypePointer Input %float
          %a = OpVariable %_ptr_Input_float Input
%_ptr_Output_float = OpTypePointer Output %float
         %vo = OpVariable %_ptr_Output_float Output
         %vi = OpVariable %_ptr_Input_float Input
%_ptr_Output_v4float = OpTypePointer Output %v4float
      %color = OpVariable %_ptr_Output_v4float Output

      %mainv = OpFunction %void None %3
          %5 = OpLabel
         %11 = OpLoad %float %a
               OpStore %vo %11
               OpReturn
               OpFunctionEnd

      %mainf = OpFunction %void None %3
          %6 = OpLabel
         %12 = OpLoad %float %vi
	 %13 = OpCompositeConstruct %v4float %12 %12 %12 %12
               OpStore %color %13
               OpReturn
               OpFunctionEnd)";
constexpr char kDst[] = R"(               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %frag "frag" %vi %color
               OpEntryPoint Vertex %vert "vert" %a %vo
	       OpExecutionMode %frag OriginUpperLeft
               OpSource ESSL 310
               OpName %frag "frag"
               OpName %vert "vert"
               OpName %vo "v"
               OpName %a "a"
               OpName %color "color"
               OpName %vi "v"
               OpDecorate %vi Location 0
               OpDecorate %color Location 0
               OpDecorate %a Location 0
               OpDecorate %vo Location 0
	       OpDecorate %color RelaxedPrecision
	       OpDecorate %vi RelaxedPrecision
               OpDecorate %14 RelaxedPrecision
               OpDecorate %17 RelaxedPrecision

      %float = OpTypeFloat 32
    %v4float = OpTypeVector %float 4
       %void = OpTypeVoid
          %3 = OpTypeFunction %void

%_ptr_Output_float = OpTypePointer Output %float
         %vo = OpVariable %_ptr_Output_float Output
%_ptr_Input_float = OpTypePointer Input %float
          %a = OpVariable %_ptr_Input_float Input
         %vi = OpVariable %_ptr_Input_float Input
%_ptr_Output_v4float = OpTypePointer Output %v4float
      %color = OpVariable %_ptr_Output_v4float Output

       %frag = OpFunction %void None %3
          %7 = OpLabel
         %14 = OpLoad %float %vi
	 %17 = OpCompositeConstruct %v4float %14 %14 %14 %14
               OpStore %color %17
               OpReturn
               OpFunctionEnd

       %vert = OpFunction %void None %3
          %8 = OpLabel
         %13 = OpLoad %float %a
               OpStore %vo %13
               OpReturn
               OpFunctionEnd
)";

TEST(DiffTest, MultipleDifferentEntryPoints) {
  constexpr char kDiff[] = R"( ; SPIR-V
 ; Version: 1.6
 ; Generator: Khronos SPIR-V Tools Assembler; 0
 ; Bound: 20
 ; Schema: 0
 OpCapability Shader
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
-OpEntryPoint Vertex %2 "mainv" %4 %7
+OpEntryPoint Vertex %2 "vert" %7 %4
-OpEntryPoint Fragment %8 "mainf" %9 %10
+OpEntryPoint Fragment %8 "frag" %10 %9
 OpExecutionMode %8 OriginUpperLeft
 OpSource ESSL 310
-OpName %2 "mainv"
+OpName %2 "vert"
-OpName %8 "mainf"
+OpName %8 "frag"
 OpName %7 "a"
 OpName %4 "v"
 OpName %10 "v"
 OpName %9 "color"
 OpDecorate %7 Location 0
 OpDecorate %4 Location 0
 OpDecorate %10 Location 0
 OpDecorate %9 Location 0
 OpDecorate %9 RelaxedPrecision
 OpDecorate %10 RelaxedPrecision
 OpDecorate %12 RelaxedPrecision
 OpDecorate %13 RelaxedPrecision
 %14 = OpTypeVoid
 %3 = OpTypeFunction %14
 %15 = OpTypeFloat 32
 %16 = OpTypeVector %15 4
 %17 = OpTypePointer Input %15
 %7 = OpVariable %17 Input
 %18 = OpTypePointer Output %15
 %4 = OpVariable %18 Output
 %10 = OpVariable %17 Input
 %19 = OpTypePointer Output %16
 %9 = OpVariable %19 Output
 %2 = OpFunction %14 None %3
 %5 = OpLabel
 %11 = OpLoad %15 %7
 OpStore %4 %11
 OpReturn
 OpFunctionEnd
 %8 = OpFunction %14 None %3
 %6 = OpLabel
 %12 = OpLoad %15 %10
 %13 = OpCompositeConstruct %16 %12 %12 %12 %12
 OpStore %9 %13
 OpReturn
 OpFunctionEnd
)";
  Options options;
  DoStringDiffTest(kSrc, kDst, kDiff, options);
}

TEST(DiffTest, MultipleDifferentEntryPointsNoDebug) {
  constexpr char kSrcNoDebug[] = R"(               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Vertex %mainv "mainv" %vo %a
               OpEntryPoint Fragment %mainf "mainf" %color %vi
	       OpExecutionMode %mainf OriginUpperLeft
               OpSource ESSL 310
               OpDecorate %a Location 0
               OpDecorate %vo Location 0
               OpDecorate %vi Location 0
               OpDecorate %color Location 0
	       OpDecorate %color RelaxedPrecision
	       OpDecorate %vi RelaxedPrecision
               OpDecorate %12 RelaxedPrecision
               OpDecorate %13 RelaxedPrecision

       %void = OpTypeVoid
          %3 = OpTypeFunction %void
      %float = OpTypeFloat 32
    %v4float = OpTypeVector %float 4

%_ptr_Input_float = OpTypePointer Input %float
          %a = OpVariable %_ptr_Input_float Input
%_ptr_Output_float = OpTypePointer Output %float
         %vo = OpVariable %_ptr_Output_float Output
         %vi = OpVariable %_ptr_Input_float Input
%_ptr_Output_v4float = OpTypePointer Output %v4float
      %color = OpVariable %_ptr_Output_v4float Output

      %mainv = OpFunction %void None %3
          %5 = OpLabel
         %11 = OpLoad %float %a
               OpStore %vo %11
               OpReturn
               OpFunctionEnd

      %mainf = OpFunction %void None %3
          %6 = OpLabel
         %12 = OpLoad %float %vi
	 %13 = OpCompositeConstruct %v4float %12 %12 %12 %12
               OpStore %color %13
               OpReturn
               OpFunctionEnd
)";
  constexpr char kDstNoDebug[] = R"(               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %frag "frag" %vi %color
               OpEntryPoint Vertex %vert "vert" %a %vo
	       OpExecutionMode %frag OriginUpperLeft
               OpSource ESSL 310
               OpDecorate %vi Location 0
               OpDecorate %color Location 0
               OpDecorate %a Location 0
               OpDecorate %vo Location 0
	       OpDecorate %color RelaxedPrecision
	       OpDecorate %vi RelaxedPrecision
               OpDecorate %14 RelaxedPrecision
               OpDecorate %17 RelaxedPrecision

      %float = OpTypeFloat 32
    %v4float = OpTypeVector %float 4
       %void = OpTypeVoid
          %3 = OpTypeFunction %void

%_ptr_Output_float = OpTypePointer Output %float
         %vo = OpVariable %_ptr_Output_float Output
%_ptr_Input_float = OpTypePointer Input %float
          %a = OpVariable %_ptr_Input_float Input
         %vi = OpVariable %_ptr_Input_float Input
%_ptr_Output_v4float = OpTypePointer Output %v4float
      %color = OpVariable %_ptr_Output_v4float Output

       %frag = OpFunction %void None %3
          %7 = OpLabel
         %14 = OpLoad %float %vi
	 %17 = OpCompositeConstruct %v4float %14 %14 %14 %14
               OpStore %color %17
               OpReturn
               OpFunctionEnd

       %vert = OpFunction %void None %3
          %8 = OpLabel
         %13 = OpLoad %float %a
               OpStore %vo %13
               OpReturn
               OpFunctionEnd
)";
  constexpr char kDiff[] = R"( ; SPIR-V
 ; Version: 1.6
 ; Generator: Khronos SPIR-V Tools Assembler; 0
 ; Bound: 20
 ; Schema: 0
 OpCapability Shader
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical GLSL450
-OpEntryPoint Vertex %2 "mainv" %4 %7
+OpEntryPoint Vertex %2 "vert" %7 %4
-OpEntryPoint Fragment %8 "mainf" %9 %10
+OpEntryPoint Fragment %8 "frag" %10 %9
 OpExecutionMode %8 OriginUpperLeft
 OpSource ESSL 310
 OpDecorate %7 Location 0
 OpDecorate %4 Location 0
 OpDecorate %10 Location 0
 OpDecorate %9 Location 0
 OpDecorate %9 RelaxedPrecision
 OpDecorate %10 RelaxedPrecision
 OpDecorate %12 RelaxedPrecision
 OpDecorate %13 RelaxedPrecision
 %14 = OpTypeVoid
 %3 = OpTypeFunction %14
 %15 = OpTypeFloat 32
 %16 = OpTypeVector %15 4
 %17 = OpTypePointer Input %15
 %7 = OpVariable %17 Input
 %18 = OpTypePointer Output %15
 %4 = OpVariable %18 Output
 %10 = OpVariable %17 Input
 %19 = OpTypePointer Output %16
 %9 = OpVariable %19 Output
 %2 = OpFunction %14 None %3
 %5 = OpLabel
 %11 = OpLoad %15 %7
 OpStore %4 %11
 OpReturn
 OpFunctionEnd
 %8 = OpFunction %14 None %3
 %6 = OpLabel
 %12 = OpLoad %15 %10
 %13 = OpCompositeConstruct %16 %12 %12 %12 %12
 OpStore %9 %13
 OpReturn
 OpFunctionEnd
)";
  Options options;
  DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
}

}  // namespace
}  // namespace diff
}  // namespace spvtools
