// 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 dst shader doesn't have OpExtImport while the
// src 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
          %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
)";
constexpr char kDst[] = 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

)";

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

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

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