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

// Use functions' `OpFunctionType` to group before grouping by return type only.
constexpr char kSrc[] = R"(                 OpCapability Shader
                 OpCapability Linkage
                 OpMemoryModel Logical GLSL450
         %bool = OpTypeBool
          %int = OpTypeInt 32 1
        %int_0 = OpConstantNull %int

       %fn_int = OpTypeFunction %bool %int
   %fn_int_int = OpTypeFunction %bool %int %int

            %f = OpFunction %bool None %fn_int
          %fp1 = OpFunctionParameter %int
   %f_prologue = OpLabel
           %fr = OpIEqual %bool %fp1 %int_0
                 OpReturnValue %fr
                 OpFunctionEnd

            %g = OpFunction %bool None %fn_int_int
          %gp1 = OpFunctionParameter %int
          %gp2 = OpFunctionParameter %int
   %g_prologue = OpLabel
           %gr = OpIEqual %bool %gp1 %int_0
                 OpReturnValue %gr
                 OpFunctionEnd)";
constexpr char kDst[] =
    R"(;; Use functions' `OpFunctionType` to group before grouping by return type only.
                 OpCapability Shader
                 OpCapability Linkage
                 OpMemoryModel Logical GLSL450
         %bool = OpTypeBool
          %int = OpTypeInt 32 1
        %int_0 = OpConstantNull %int

       %fn_int = OpTypeFunction %bool %int
   %fn_int_int = OpTypeFunction %bool %int %int

            %g = OpFunction %bool None %fn_int_int
          %gp1 = OpFunctionParameter %int
          %gp2 = OpFunctionParameter %int
   %g_prologue = OpLabel
           %gr = OpIEqual %bool %gp1 %int_0
                 OpReturnValue %gr
                 OpFunctionEnd

            %f = OpFunction %bool None %fn_int
          %fp1 = OpFunctionParameter %int
   %f_prologue = OpLabel
           %fr = OpIEqual %bool %fp1 %int_0
                 OpReturnValue %fr
                 OpFunctionEnd
)";

TEST(DiffTest, FunctionGroupByFullType) {
  constexpr char kDiff[] = R"( ; SPIR-V
 ; Version: 1.6
 ; Generator: Khronos SPIR-V Tools Assembler; 0
 ; Bound: 15
 ; Schema: 0
 OpCapability Shader
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 %1 = OpTypeBool
 %2 = OpTypeInt 32 1
 %3 = OpConstantNull %2
 %4 = OpTypeFunction %1 %2
 %5 = OpTypeFunction %1 %2 %2
 %6 = OpFunction %1 None %4
 %7 = OpFunctionParameter %2
 %8 = OpLabel
 %9 = OpIEqual %1 %7 %3
 OpReturnValue %9
 OpFunctionEnd
 %10 = OpFunction %1 None %5
 %11 = OpFunctionParameter %2
 %12 = OpFunctionParameter %2
 %13 = OpLabel
 %14 = OpIEqual %1 %11 %3
 OpReturnValue %14
 OpFunctionEnd
)";
  Options options;
  DoStringDiffTest(kSrc, kDst, kDiff, options);
}

TEST(DiffTest, FunctionGroupByFullTypeNoDebug) {
  constexpr char kSrcNoDebug[] = R"(                 OpCapability Shader
                 OpCapability Linkage
                 OpMemoryModel Logical GLSL450
         %bool = OpTypeBool
          %int = OpTypeInt 32 1
        %int_0 = OpConstantNull %int

       %fn_int = OpTypeFunction %bool %int
   %fn_int_int = OpTypeFunction %bool %int %int

            %f = OpFunction %bool None %fn_int
          %fp1 = OpFunctionParameter %int
   %f_prologue = OpLabel
           %fr = OpIEqual %bool %fp1 %int_0
                 OpReturnValue %fr
                 OpFunctionEnd

            %g = OpFunction %bool None %fn_int_int
          %gp1 = OpFunctionParameter %int
          %gp2 = OpFunctionParameter %int
   %g_prologue = OpLabel
           %gr = OpIEqual %bool %gp1 %int_0
                 OpReturnValue %gr
                 OpFunctionEnd
)";
  constexpr char kDstNoDebug[] = R"(                 OpCapability Shader
                 OpCapability Linkage
                 OpMemoryModel Logical GLSL450
         %bool = OpTypeBool
          %int = OpTypeInt 32 1
        %int_0 = OpConstantNull %int

       %fn_int = OpTypeFunction %bool %int
   %fn_int_int = OpTypeFunction %bool %int %int

            %g = OpFunction %bool None %fn_int_int
          %gp1 = OpFunctionParameter %int
          %gp2 = OpFunctionParameter %int
   %g_prologue = OpLabel
           %gr = OpIEqual %bool %gp1 %int_0
                 OpReturnValue %gr
                 OpFunctionEnd

            %f = OpFunction %bool None %fn_int
          %fp1 = OpFunctionParameter %int
   %f_prologue = OpLabel
           %fr = OpIEqual %bool %fp1 %int_0
                 OpReturnValue %fr
                 OpFunctionEnd
)";
  constexpr char kDiff[] = R"( ; SPIR-V
 ; Version: 1.6
 ; Generator: Khronos SPIR-V Tools Assembler; 0
 ; Bound: 15
 ; Schema: 0
 OpCapability Shader
 OpCapability Linkage
 OpMemoryModel Logical GLSL450
 %1 = OpTypeBool
 %2 = OpTypeInt 32 1
 %3 = OpConstantNull %2
 %4 = OpTypeFunction %1 %2
 %5 = OpTypeFunction %1 %2 %2
 %6 = OpFunction %1 None %4
 %7 = OpFunctionParameter %2
 %8 = OpLabel
 %9 = OpIEqual %1 %7 %3
 OpReturnValue %9
 OpFunctionEnd
 %10 = OpFunction %1 None %5
 %11 = OpFunctionParameter %2
 %12 = OpFunctionParameter %2
 %13 = OpLabel
 %14 = OpIEqual %1 %11 %3
 OpReturnValue %14
 OpFunctionEnd
)";
  Options options;
  DoStringDiffTest(kSrcNoDebug, kDstNoDebug, kDiff, options);
}

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