// 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 {

// Tests diff of unrelated shaders (with different execution models).
constexpr char kSrc[] = R"(               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Vertex %4 "main" %8 %10
               OpSource ESSL 310
               OpName %4 "main"
               OpName %8 "v"
               OpName %10 "a"
               OpDecorate %8 Location 0
               OpDecorate %10 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypePointer Output %6
          %8 = OpVariable %7 Output
          %9 = OpTypePointer Input %6
         %10 = OpVariable %9 Input
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %11 = OpLoad %6 %10
               OpStore %8 %11
               OpReturn
               OpFunctionEnd
)";
constexpr char kDst[] = R"(               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %9 %11
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %9 "color"
               OpName %11 "v"
               OpDecorate %9 RelaxedPrecision
               OpDecorate %9 Location 0
               OpDecorate %11 RelaxedPrecision
               OpDecorate %11 Location 0
               OpDecorate %12 RelaxedPrecision
               OpDecorate %13 RelaxedPrecision
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 4
          %8 = OpTypePointer Output %7
          %9 = OpVariable %8 Output
         %10 = OpTypePointer Input %6
         %11 = OpVariable %10 Input
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %12 = OpLoad %6 %11
         %13 = OpCompositeConstruct %7 %12 %12 %12 %12
               OpStore %9 %13
               OpReturn
               OpFunctionEnd

)";

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

TEST(DiffTest, UnrelatedShadersNoDebug) {
  constexpr char kSrcNoDebug[] = R"(               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Vertex %4 "main" %8 %10
               OpSource ESSL 310
               OpDecorate %8 Location 0
               OpDecorate %10 Location 0
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypePointer Output %6
          %8 = OpVariable %7 Output
          %9 = OpTypePointer Input %6
         %10 = OpVariable %9 Input
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %11 = OpLoad %6 %10
               OpStore %8 %11
               OpReturn
               OpFunctionEnd

)";
  constexpr char kDstNoDebug[] = R"(               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main" %9 %11
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpDecorate %9 RelaxedPrecision
               OpDecorate %9 Location 0
               OpDecorate %11 RelaxedPrecision
               OpDecorate %11 Location 0
               OpDecorate %12 RelaxedPrecision
               OpDecorate %13 RelaxedPrecision
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeFloat 32
          %7 = OpTypeVector %6 4
          %8 = OpTypePointer Output %7
          %9 = OpVariable %8 Output
         %10 = OpTypePointer Input %6
         %11 = OpVariable %10 Input
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %12 = OpLoad %6 %11
         %13 = OpCompositeConstruct %7 %12 %12 %12 %12
               OpStore %9 %13
               OpReturn
               OpFunctionEnd

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

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