// Copyright (c) 2020 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 "source/fuzz/transformation_compute_data_synonym_fact_closure.h"

#include "gtest/gtest.h"
#include "source/fuzz/fuzzer_util.h"
#include "test/fuzz/fuzz_test_util.h"

namespace spvtools {
namespace fuzz {
namespace {

TEST(TransformationComputeDataSynonymFactClosureTest, DataSynonymFacts) {
  // The SPIR-V types and constants come from the following code.  The body of
  // the SPIR-V function then constructs a composite that is synonymous with
  // myT.
  //
  // #version 310 es
  //
  // precision highp float;
  //
  // struct S {
  //   int a;
  //   uvec2 b;
  // };
  //
  // struct T {
  //   bool c[5];
  //   mat4x2 d;
  //   S e;
  // };
  //
  // void main() {
  //   T myT = T(bool[5](true, false, true, false, true),
  //             mat4x2(vec2(1.0, 2.0), vec2(3.0, 4.0),
  // 	           vec2(5.0, 6.0), vec2(7.0, 8.0)),
  //             S(10, uvec2(100u, 200u)));
  // }

  std::string shader = R"(
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %4 "main"
               OpExecutionMode %4 OriginUpperLeft
               OpSource ESSL 310
               OpName %4 "main"
               OpName %15 "S"
               OpMemberName %15 0 "a"
               OpMemberName %15 1 "b"
               OpName %16 "T"
               OpMemberName %16 0 "c"
               OpMemberName %16 1 "d"
               OpMemberName %16 2 "e"
               OpName %18 "myT"
               OpMemberDecorate %15 0 RelaxedPrecision
               OpMemberDecorate %15 1 RelaxedPrecision
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeBool
          %7 = OpTypeInt 32 0
          %8 = OpConstant %7 5
          %9 = OpTypeArray %6 %8
         %10 = OpTypeFloat 32
         %11 = OpTypeVector %10 2
         %12 = OpTypeMatrix %11 4
         %13 = OpTypeInt 32 1
         %14 = OpTypeVector %7 2
         %15 = OpTypeStruct %13 %14
         %16 = OpTypeStruct %9 %12 %15
         %17 = OpTypePointer Function %16
         %19 = OpConstantTrue %6
         %20 = OpConstantFalse %6
         %21 = OpConstantComposite %9 %19 %20 %19 %20 %19
         %22 = OpConstant %10 1
         %23 = OpConstant %10 2
         %24 = OpConstantComposite %11 %22 %23
         %25 = OpConstant %10 3
         %26 = OpConstant %10 4
         %27 = OpConstantComposite %11 %25 %26
         %28 = OpConstant %10 5
         %29 = OpConstant %10 6
         %30 = OpConstantComposite %11 %28 %29
         %31 = OpConstant %10 7
         %32 = OpConstant %10 8
         %33 = OpConstantComposite %11 %31 %32
         %34 = OpConstantComposite %12 %24 %27 %30 %33
         %35 = OpConstant %13 10
         %36 = OpConstant %7 100
         %37 = OpConstant %7 200
         %38 = OpConstantComposite %14 %36 %37
         %39 = OpConstantComposite %15 %35 %38
         %40 = OpConstantComposite %16 %21 %34 %39
          %4 = OpFunction %2 None %3
          %5 = OpLabel
         %18 = OpVariable %17 Function
               OpStore %18 %40
        %100 = OpCompositeConstruct %9 %19 %20 %19 %20 %19
        %101 = OpCompositeConstruct %11 %22 %23
        %102 = OpCompositeConstruct %11 %25 %26
        %103 = OpCompositeConstruct %11 %28 %29
        %104 = OpCompositeConstruct %11 %31 %32
        %105 = OpCompositeConstruct %12 %101 %102 %103 %104
        %106 = OpCompositeConstruct %14 %36 %37
        %107 = OpCompositeConstruct %15 %35 %106
        %108 = OpCompositeConstruct %16 %100 %105 %107
               OpReturn
               OpFunctionEnd
  )";

  const auto env = SPV_ENV_UNIVERSAL_1_3;
  const auto consumer = nullptr;
  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
  spvtools::ValidatorOptions validator_options;
  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
                                               kConsoleMessageConsumer));
  TransformationContext transformation_context(
      MakeUnique<FactManager>(context.get()), validator_options);
  ASSERT_TRUE(TransformationComputeDataSynonymFactClosure(100).IsApplicable(
      context.get(), transformation_context));

  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(24, {}), MakeDataDescriptor(101, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(24, {0}), MakeDataDescriptor(101, {0})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(24, {1}), MakeDataDescriptor(101, {1})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(24, {0}), MakeDataDescriptor(101, {1})));

  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(24, {}), MakeDataDescriptor(101, {}));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(24, {}), MakeDataDescriptor(101, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(24, {0}), MakeDataDescriptor(101, {0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(24, {1}), MakeDataDescriptor(101, {1})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(24, {0}), MakeDataDescriptor(101, {1})));

  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {}), MakeDataDescriptor(102, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {0}), MakeDataDescriptor(102, {0})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {1}), MakeDataDescriptor(102, {1})));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(27, {0}), MakeDataDescriptor(102, {0}));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {}), MakeDataDescriptor(102, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {0}), MakeDataDescriptor(102, {0})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {1}), MakeDataDescriptor(102, {1})));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(27, {1}), MakeDataDescriptor(102, {1}));

  ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100),
                        context.get(), &transformation_context);

  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {}), MakeDataDescriptor(102, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {0}), MakeDataDescriptor(102, {0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(27, {1}), MakeDataDescriptor(102, {1})));

  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(30, {}), MakeDataDescriptor(103, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(30, {0}), MakeDataDescriptor(103, {0})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(30, {1}), MakeDataDescriptor(103, {1})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(33, {}), MakeDataDescriptor(104, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(33, {0}), MakeDataDescriptor(104, {0})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(33, {1}), MakeDataDescriptor(104, {1})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {}), MakeDataDescriptor(105, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {0}), MakeDataDescriptor(105, {0})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {1}), MakeDataDescriptor(105, {1})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {2}), MakeDataDescriptor(105, {2})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {3}), MakeDataDescriptor(105, {3})));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(30, {}), MakeDataDescriptor(103, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(33, {}), MakeDataDescriptor(104, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(34, {0}), MakeDataDescriptor(105, {0}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(34, {1}), MakeDataDescriptor(105, {1}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(34, {2}), MakeDataDescriptor(105, {2}));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(30, {}), MakeDataDescriptor(103, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(30, {0}), MakeDataDescriptor(103, {0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(30, {1}), MakeDataDescriptor(103, {1})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(33, {}), MakeDataDescriptor(104, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(33, {0}), MakeDataDescriptor(104, {0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(33, {1}), MakeDataDescriptor(104, {1})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {}), MakeDataDescriptor(105, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {0}), MakeDataDescriptor(105, {0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {1}), MakeDataDescriptor(105, {1})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {2}), MakeDataDescriptor(105, {2})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {3}), MakeDataDescriptor(105, {3})));

  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(34, {3}), MakeDataDescriptor(105, {3}));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(33, {0}), MakeDataDescriptor(104, {0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(34, {3}), MakeDataDescriptor(105, {3})));

  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(21, {}), MakeDataDescriptor(100, {})));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(21, {0}), MakeDataDescriptor(100, {0}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(21, {1}), MakeDataDescriptor(100, {1}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(21, {2}), MakeDataDescriptor(100, {2}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(21, {3}), MakeDataDescriptor(100, {3}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(21, {4}), MakeDataDescriptor(100, {4}));

  ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100),
                        context.get(), &transformation_context);

  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(21, {}), MakeDataDescriptor(100, {})));

  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(39, {0}), MakeDataDescriptor(107, {0})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(35, {}), MakeDataDescriptor(39, {0})));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(39, {0}), MakeDataDescriptor(35, {}));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(39, {0}), MakeDataDescriptor(107, {0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(35, {}), MakeDataDescriptor(39, {0})));

  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(38, {0}), MakeDataDescriptor(36, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(38, {1}), MakeDataDescriptor(37, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(106, {0}), MakeDataDescriptor(36, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(106, {1}), MakeDataDescriptor(37, {})));
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(38, {}), MakeDataDescriptor(106, {})));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(38, {0}), MakeDataDescriptor(36, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(106, {0}), MakeDataDescriptor(36, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(38, {1}), MakeDataDescriptor(37, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(106, {1}), MakeDataDescriptor(37, {}));

  ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100),
                        context.get(), &transformation_context);

  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(38, {0}), MakeDataDescriptor(36, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(38, {1}), MakeDataDescriptor(37, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(106, {0}), MakeDataDescriptor(36, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(106, {1}), MakeDataDescriptor(37, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(38, {}), MakeDataDescriptor(106, {})));

  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {}), MakeDataDescriptor(108, {})));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(107, {0}), MakeDataDescriptor(35, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(40, {0}), MakeDataDescriptor(108, {0}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(40, {1}), MakeDataDescriptor(108, {1}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(40, {2}), MakeDataDescriptor(108, {2}));

  ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100),
                        context.get(), &transformation_context);

  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {}), MakeDataDescriptor(108, {})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {0}), MakeDataDescriptor(108, {0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1}), MakeDataDescriptor(108, {1})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {2}), MakeDataDescriptor(108, {2})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {0, 0}), MakeDataDescriptor(108, {0, 0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {0, 1}), MakeDataDescriptor(108, {0, 1})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {0, 2}), MakeDataDescriptor(108, {0, 2})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {0, 3}), MakeDataDescriptor(108, {0, 3})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {0, 4}), MakeDataDescriptor(108, {0, 4})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 0}), MakeDataDescriptor(108, {1, 0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 1}), MakeDataDescriptor(108, {1, 1})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 2}), MakeDataDescriptor(108, {1, 2})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 3}), MakeDataDescriptor(108, {1, 3})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 0, 0}), MakeDataDescriptor(108, {1, 0, 0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 1, 0}), MakeDataDescriptor(108, {1, 1, 0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 2, 0}), MakeDataDescriptor(108, {1, 2, 0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 3, 0}), MakeDataDescriptor(108, {1, 3, 0})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 0, 1}), MakeDataDescriptor(108, {1, 0, 1})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 1, 1}), MakeDataDescriptor(108, {1, 1, 1})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 2, 1}), MakeDataDescriptor(108, {1, 2, 1})));
  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {1, 3, 1}), MakeDataDescriptor(108, {1, 3, 1})));

  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {2, 0}), MakeDataDescriptor(108, {2, 0})));

  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {2, 1}), MakeDataDescriptor(108, {2, 1})));

  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {2, 1, 0}), MakeDataDescriptor(108, {2, 1, 0})));

  ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(40, {2, 1, 1}), MakeDataDescriptor(108, {2, 1, 1})));
}

TEST(TransformationComputeDataSynonymFactClosureTest,
     ComputeClosureWithMissingIds) {
  std::string shader = R"(
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint Fragment %12 "main"
               OpExecutionMode %12 OriginUpperLeft
               OpSource ESSL 310
          %2 = OpTypeVoid
          %3 = OpTypeFunction %2
          %6 = OpTypeInt 32 1
          %7 = OpTypeVector %6 4
         %15 = OpConstant %6 24
         %16 = OpConstantComposite %7 %15 %15 %15 %15
         %17 = OpConstantComposite %7 %15 %15 %15 %15
         %18 = OpTypeStruct %7
         %19 = OpConstantComposite %18 %16
         %30 = OpConstantComposite %18 %17
         %12 = OpFunction %2 None %3
         %13 = OpLabel
         %50 = OpCopyObject %7 %16
         %51 = OpCopyObject %7 %17
         %20 = OpCopyObject %6 %15
         %21 = OpCopyObject %6 %15
         %22 = OpCopyObject %6 %15
               OpReturn
               OpFunctionEnd
  )";

  const auto env = SPV_ENV_UNIVERSAL_1_3;
  const auto consumer = nullptr;
  const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption);
  ValidatorOptions validator_options;
  ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
                                               kConsoleMessageConsumer));

  TransformationContext transformation_context(
      MakeUnique<FactManager>(context.get()), validator_options);

  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(20, {}), MakeDataDescriptor(15, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(21, {}), MakeDataDescriptor(15, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(22, {}), MakeDataDescriptor(15, {}));

  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(17, {0}), MakeDataDescriptor(15, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(17, {1}), MakeDataDescriptor(15, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(17, {2}), MakeDataDescriptor(15, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(17, {3}), MakeDataDescriptor(15, {}));

  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(16, {0}), MakeDataDescriptor(20, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(16, {1}), MakeDataDescriptor(21, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(16, {2}), MakeDataDescriptor(22, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(16, {3}), MakeDataDescriptor(15, {}));

  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(51, {0}), MakeDataDescriptor(15, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(51, {1}), MakeDataDescriptor(15, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(51, {2}), MakeDataDescriptor(15, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(51, {3}), MakeDataDescriptor(15, {}));

  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(50, {0}), MakeDataDescriptor(20, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(50, {1}), MakeDataDescriptor(21, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(50, {2}), MakeDataDescriptor(22, {}));
  transformation_context.GetFactManager()->AddFactDataSynonym(
      MakeDataDescriptor(50, {3}), MakeDataDescriptor(15, {}));

  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(19, {}), MakeDataDescriptor(30, {})));

  context->KillDef(20);
  context->KillDef(21);
  context->KillDef(22);
  context->KillDef(50);
  context->KillDef(51);
  context->InvalidateAnalysesExceptFor(opt::IRContext::kAnalysisNone);

  ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100),
                        context.get(), &transformation_context);
  ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
      MakeDataDescriptor(19, {}), MakeDataDescriptor(30, {})));
}

}  // namespace
}  // namespace fuzz
}  // namespace spvtools
