// 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 a diff where the src shader doesn't have OpExtImport while the
// dst shader does (and uses OpExtInst).  This test ensures that when matching,
// the OpExtImport instruction from the correct module is referenced.
constexpr char kSrc[] = R"(               OpCapability Shader
               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
)";
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
               OpDecorate %14 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 = OpExtInst %6 %1 Log2 %12
         %14 = OpCompositeConstruct %7 %13 %13 %13 %13
               OpStore %9 %14
               OpReturn
               OpFunctionEnd

)";

TEST(DiffTest, OpextinstInDstOnly) {
  constexpr char kDiff[] = R"( ; SPIR-V
 ; Version: 1.6
 ; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 14
+; Bound: 16
 ; Schema: 0
 OpCapability Shader
+%14 = 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 %15 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
+%15 = OpExtInst %6 %14 Log2 %12
-%13 = OpCompositeConstruct %7 %12 %12 %12 %12
+%13 = OpCompositeConstruct %7 %15 %15 %15 %15
 OpStore %9 %13
 OpReturn
 OpFunctionEnd
)";
  Options options;
  DoStringDiffTest(kSrc, kDst, kDiff, options);
}

TEST(DiffTest, OpextinstInDstOnlyNoDebug) {
  constexpr char kSrcNoDebug[] = R"(               OpCapability Shader
               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 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
               OpDecorate %14 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 = OpExtInst %6 %1 Log2 %12
         %14 = OpCompositeConstruct %7 %13 %13 %13 %13
               OpStore %9 %14
               OpReturn
               OpFunctionEnd

)";
  constexpr char kDiff[] = R"( ; SPIR-V
 ; Version: 1.6
 ; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 14
+; Bound: 16
 ; Schema: 0
 OpCapability Shader
+%14 = 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 %15 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
+%15 = OpExtInst %6 %14 Log2 %12
-%13 = OpCompositeConstruct %7 %12 %12 %12 %12
+%13 = OpCompositeConstruct %7 %15 %15 %15 %15
 OpStore %9 %13
 OpReturn
 OpFunctionEnd
)";
  Options options;
  DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
}

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