//===- SetTest.cpp - Tests for PresburgerSet ------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file contains tests for PresburgerSet. The tests for union,
// intersection, subtract, and complement work by computing the operation on
// two sets and checking, for a set of points, that the resulting set contains
// the point iff the result is supposed to contain it. The test for isEqual just
// checks if the result for two sets matches the expected result.
//
//===----------------------------------------------------------------------===//

#include "mlir/Analysis/PresburgerSet.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace mlir {

/// Compute the union of s and t, and check that each of the given points
/// belongs to the union iff it belongs to at least one of s and t.
static void testUnionAtPoints(PresburgerSet s, PresburgerSet t,
                              ArrayRef<SmallVector<int64_t, 4>> points) {
  PresburgerSet unionSet = s.unionSet(t);
  for (const SmallVector<int64_t, 4> &point : points) {
    bool inS = s.containsPoint(point);
    bool inT = t.containsPoint(point);
    bool inUnion = unionSet.containsPoint(point);
    EXPECT_EQ(inUnion, inS || inT);
  }
}

/// Compute the intersection of s and t, and check that each of the given points
/// belongs to the intersection iff it belongs to both s and t.
static void testIntersectAtPoints(PresburgerSet s, PresburgerSet t,
                                  ArrayRef<SmallVector<int64_t, 4>> points) {
  PresburgerSet intersection = s.intersect(t);
  for (const SmallVector<int64_t, 4> &point : points) {
    bool inS = s.containsPoint(point);
    bool inT = t.containsPoint(point);
    bool inIntersection = intersection.containsPoint(point);
    EXPECT_EQ(inIntersection, inS && inT);
  }
}

/// Compute the set difference s \ t, and check that each of the given points
/// belongs to the difference iff it belongs to s and does not belong to t.
static void testSubtractAtPoints(PresburgerSet s, PresburgerSet t,
                                 ArrayRef<SmallVector<int64_t, 4>> points) {
  PresburgerSet diff = s.subtract(t);
  for (const SmallVector<int64_t, 4> &point : points) {
    bool inS = s.containsPoint(point);
    bool inT = t.containsPoint(point);
    bool inDiff = diff.containsPoint(point);
    if (inT)
      EXPECT_FALSE(inDiff);
    else
      EXPECT_EQ(inDiff, inS);
  }
}

/// Compute the complement of s, and check that each of the given points
/// belongs to the complement iff it does not belong to s.
static void testComplementAtPoints(PresburgerSet s,
                                   ArrayRef<SmallVector<int64_t, 4>> points) {
  PresburgerSet complement = s.complement();
  complement.complement();
  for (const SmallVector<int64_t, 4> &point : points) {
    bool inS = s.containsPoint(point);
    bool inComplement = complement.containsPoint(point);
    if (inS)
      EXPECT_FALSE(inComplement);
    else
      EXPECT_TRUE(inComplement);
  }
}

/// Construct a FlatAffineConstraints from a set of inequality and
/// equality constraints. `numIds` is the total number of ids, of which
/// `numLocals` is the number of local ids.
static FlatAffineConstraints
makeFACFromConstraints(unsigned numIds, ArrayRef<SmallVector<int64_t, 4>> ineqs,
                       ArrayRef<SmallVector<int64_t, 4>> eqs,
                       unsigned numLocals = 0) {
  FlatAffineConstraints fac(/*numReservedInequalities=*/ineqs.size(),
                            /*numReservedEqualities=*/eqs.size(),
                            /*numReservedCols=*/numIds + 1,
                            /*numDims=*/numIds - numLocals,
                            /*numSymbols=*/0, numLocals);
  for (const SmallVector<int64_t, 4> &eq : eqs)
    fac.addEquality(eq);
  for (const SmallVector<int64_t, 4> &ineq : ineqs)
    fac.addInequality(ineq);
  return fac;
}

/// Construct a FlatAffineConstraints having `numDims` dimensions from the given
/// set of inequality constraints. This is a convenience function to be used
/// when the FAC to be constructed does not have any local ids and does not have
/// equalties.
static FlatAffineConstraints
makeFACFromIneqs(unsigned numDims, ArrayRef<SmallVector<int64_t, 4>> ineqs) {
  return makeFACFromConstraints(numDims, ineqs, /*eqs=*/{});
}

/// Construct a PresburgerSet having `numDims` dimensions and no symbols from
/// the given list of FlatAffineConstraints. Each FAC in `facs` should also have
/// `numDims` dimensions and no symbols, although it can have any number of
/// local ids.
static PresburgerSet makeSetFromFACs(unsigned numDims,
                                     ArrayRef<FlatAffineConstraints> facs) {
  PresburgerSet set = PresburgerSet::getEmptySet(numDims);
  for (const FlatAffineConstraints &fac : facs)
    set.unionFACInPlace(fac);
  return set;
}

TEST(SetTest, containsPoint) {
  PresburgerSet setA =
      makeSetFromFACs(1, {
                             makeFACFromIneqs(1, {{1, -2},    // x >= 2.
                                                  {-1, 8}}),  // x <= 8.
                             makeFACFromIneqs(1, {{1, -10},   // x >= 10.
                                                  {-1, 20}}), // x <= 20.
                         });
  for (unsigned x = 0; x <= 21; ++x) {
    if ((2 <= x && x <= 8) || (10 <= x && x <= 20))
      EXPECT_TRUE(setA.containsPoint({x}));
    else
      EXPECT_FALSE(setA.containsPoint({x}));
  }

  // A parallelogram with vertices {(3, 1), (10, -6), (24, 8), (17, 15)} union
  // a square with opposite corners (2, 2) and (10, 10).
  PresburgerSet setB =
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 1, -2},   // x + y >= 4.
                                               {-1, -1, 30}, // x + y <= 32.
                                               {1, -1, 0},   // x - y >= 2.
                                               {-1, 1, 10},  // x - y <= 16.
                                           }),
                          makeFACFromIneqs(2, {
                                                  {1, 0, -2},  // x >= 2.
                                                  {0, 1, -2},  // y >= 2.
                                                  {-1, 0, 10}, // x <= 10.
                                                  {0, -1, 10}  // y <= 10.
                                              })});

  for (unsigned x = 1; x <= 25; ++x) {
    for (unsigned y = -6; y <= 16; ++y) {
      if (4 <= x + y && x + y <= 32 && 2 <= x - y && x - y <= 16)
        EXPECT_TRUE(setB.containsPoint({x, y}));
      else if (2 <= x && x <= 10 && 2 <= y && y <= 10)
        EXPECT_TRUE(setB.containsPoint({x, y}));
      else
        EXPECT_FALSE(setB.containsPoint({x, y}));
    }
  }
}

TEST(SetTest, Union) {
  PresburgerSet set =
      makeSetFromFACs(1, {
                             makeFACFromIneqs(1, {{1, -2},    // x >= 2.
                                                  {-1, 8}}),  // x <= 8.
                             makeFACFromIneqs(1, {{1, -10},   // x >= 10.
                                                  {-1, 20}}), // x <= 20.
                         });

  // Universe union set.
  testUnionAtPoints(PresburgerSet::getUniverse(1), set,
                    {{1}, {2}, {8}, {9}, {10}, {20}, {21}});

  // empty set union set.
  testUnionAtPoints(PresburgerSet::getEmptySet(1), set,
                    {{1}, {2}, {8}, {9}, {10}, {20}, {21}});

  // empty set union Universe.
  testUnionAtPoints(PresburgerSet::getEmptySet(1),
                    PresburgerSet::getUniverse(1), {{1}, {2}, {0}, {-1}});

  // Universe union empty set.
  testUnionAtPoints(PresburgerSet::getUniverse(1),
                    PresburgerSet::getEmptySet(1), {{1}, {2}, {0}, {-1}});

  // empty set union empty set.
  testUnionAtPoints(PresburgerSet::getEmptySet(1),
                    PresburgerSet::getEmptySet(1), {{1}, {2}, {0}, {-1}});
}

TEST(SetTest, Intersect) {
  PresburgerSet set =
      makeSetFromFACs(1, {
                             makeFACFromIneqs(1, {{1, -2},    // x >= 2.
                                                  {-1, 8}}),  // x <= 8.
                             makeFACFromIneqs(1, {{1, -10},   // x >= 10.
                                                  {-1, 20}}), // x <= 20.
                         });

  // Universe intersection set.
  testIntersectAtPoints(PresburgerSet::getUniverse(1), set,
                        {{1}, {2}, {8}, {9}, {10}, {20}, {21}});

  // empty set intersection set.
  testIntersectAtPoints(PresburgerSet::getEmptySet(1), set,
                        {{1}, {2}, {8}, {9}, {10}, {20}, {21}});

  // empty set intersection Universe.
  testIntersectAtPoints(PresburgerSet::getEmptySet(1),
                        PresburgerSet::getUniverse(1), {{1}, {2}, {0}, {-1}});

  // Universe intersection empty set.
  testIntersectAtPoints(PresburgerSet::getUniverse(1),
                        PresburgerSet::getEmptySet(1), {{1}, {2}, {0}, {-1}});

  // Universe intersection Universe.
  testIntersectAtPoints(PresburgerSet::getUniverse(1),
                        PresburgerSet::getUniverse(1), {{1}, {2}, {0}, {-1}});
}

TEST(SetTest, Subtract) {
  // The interval [2, 8] minus
  // the interval [10, 20].
  testSubtractAtPoints(
      makeSetFromFACs(1, {makeFACFromIneqs(1, {})}),
      makeSetFromFACs(1,
                      {
                          makeFACFromIneqs(1, {{1, -2},    // x >= 2.
                                               {-1, 8}}),  // x <= 8.
                          makeFACFromIneqs(1, {{1, -10},   // x >= 10.
                                               {-1, 20}}), // x <= 20.
                      }),
      {{1}, {2}, {8}, {9}, {10}, {20}, {21}});

  // ((-infinity, 0] U [3, 4] U [6, 7]) - ([2, 3] U [5, 6])
  testSubtractAtPoints(
      makeSetFromFACs(1,
                      {
                          makeFACFromIneqs(1,
                                           {
                                               {-1, 0} // x <= 0.
                                           }),
                          makeFACFromIneqs(1,
                                           {
                                               {1, -3}, // x >= 3.
                                               {-1, 4}  // x <= 4.
                                           }),
                          makeFACFromIneqs(1,
                                           {
                                               {1, -6}, // x >= 6.
                                               {-1, 7}  // x <= 7.
                                           }),
                      }),
      makeSetFromFACs(1, {makeFACFromIneqs(1,
                                           {
                                               {1, -2}, // x >= 2.
                                               {-1, 3}, // x <= 3.
                                           }),
                          makeFACFromIneqs(1,
                                           {
                                               {1, -5}, // x >= 5.
                                               {-1, 6}  // x <= 6.
                                           })}),
      {{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}});

  // Expected result is {[x, y] : x > y}, i.e., {[x, y] : x >= y + 1}.
  testSubtractAtPoints(
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, -1, 0} // x >= y.
                                           })}),
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 1, 0} // x >= -y.
                                           })}),
      {{0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}});

  // A rectangle with corners at (2, 2) and (10, 10), minus
  // a rectangle with corners at (5, -10) and (7, 100).
  // This splits the former rectangle into two halves, (2, 2) to (5, 10) and
  // (7, 2) to (10, 10).
  testSubtractAtPoints(
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 0, -2},  // x >= 2.
                                               {0, 1, -2},  // y >= 2.
                                               {-1, 0, 10}, // x <= 10.
                                               {0, -1, 10}  // y <= 10.
                                           })}),
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 0, -5},   // x >= 5.
                                               {0, 1, 10},   // y >= -10.
                                               {-1, 0, 7},   // x <= 7.
                                               {0, -1, 100}, // y <= 100.
                                           })}),
      {{1, 2},  {2, 2},  {4, 2},  {5, 2},  {7, 2},  {8, 2},  {11, 2},
       {1, 1},  {2, 1},  {4, 1},  {5, 1},  {7, 1},  {8, 1},  {11, 1},
       {1, 10}, {2, 10}, {4, 10}, {5, 10}, {7, 10}, {8, 10}, {11, 10},
       {1, 11}, {2, 11}, {4, 11}, {5, 11}, {7, 11}, {8, 11}, {11, 11}});

  // A rectangle with corners at (2, 2) and (10, 10), minus
  // a rectangle with corners at (5, 4) and (7, 8).
  // This creates a hole in the middle of the former rectangle, and the
  // resulting set can be represented as a union of four rectangles.
  testSubtractAtPoints(
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 0, -2},  // x >= 2.
                                               {0, 1, -2},  // y >= 2.
                                               {-1, 0, 10}, // x <= 10.
                                               {0, -1, 10}  // y <= 10.
                                           })}),
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 0, -5}, // x >= 5.
                                               {0, 1, -4}, // y >= 4.
                                               {-1, 0, 7}, // x <= 7.
                                               {0, -1, 8}, // y <= 8.
                                           })}),
      {{1, 1},
       {2, 2},
       {10, 10},
       {11, 11},
       {5, 4},
       {7, 4},
       {5, 8},
       {7, 8},
       {4, 4},
       {8, 4},
       {4, 8},
       {8, 8}});

  // The second set is a superset of the first one, since on the line x + y = 0,
  // y <= 1 is equivalent to x >= -1. So the result is empty.
  testSubtractAtPoints(
      makeSetFromFACs(2, {makeFACFromConstraints(2,
                                                 {
                                                     {1, 0, 0} // x >= 0.
                                                 },
                                                 {
                                                     {1, 1, 0} // x + y = 0.
                                                 })}),
      makeSetFromFACs(2, {makeFACFromConstraints(2,
                                                 {
                                                     {0, -1, 1} // y <= 1.
                                                 },
                                                 {
                                                     {1, 1, 0} // x + y = 0.
                                                 })}),
      {{0, 0},
       {1, -1},
       {2, -2},
       {-1, 1},
       {-2, 2},
       {1, 1},
       {-1, -1},
       {-1, 1},
       {1, -1}});

  // The result should be {0} U {2}.
  testSubtractAtPoints(
      makeSetFromFACs(1,
                      {
                          makeFACFromIneqs(1, {{1, 0},    // x >= 0.
                                               {-1, 2}}), // x <= 2.
                      }),
      makeSetFromFACs(1,
                      {
                          makeFACFromConstraints(1, {},
                                                 {
                                                     {1, -1} // x = 1.
                                                 }),
                      }),
      {{-1}, {0}, {1}, {2}, {3}});

  // Sets with lots of redundant inequalities to test the redundancy heuristic.
  // (the heuristic is for the subtrahend, the second set which is the one being
  // subtracted)

  // A parallelogram with vertices {(3, 1), (10, -6), (24, 8), (17, 15)} minus
  // a triangle with vertices {(2, 2), (10, 2), (10, 10)}.
  testSubtractAtPoints(
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 1, -2},   // x + y >= 4.
                                               {-1, -1, 30}, // x + y <= 32.
                                               {1, -1, 0},   // x - y >= 2.
                                               {-1, 1, 10},  // x - y <= 16.
                                           })}),
      makeSetFromFACs(
          2, {makeFACFromIneqs(2,
                               {
                                   {1, 0, -2},   // x >= 2. [redundant]
                                   {0, 1, -2},   // y >= 2.
                                   {-1, 0, 10},  // x <= 10.
                                   {0, -1, 10},  // y <= 10. [redundant]
                                   {1, 1, -2},   // x + y >= 2. [redundant]
                                   {-1, -1, 30}, // x + y <= 30. [redundant]
                                   {1, -1, 0},   // x - y >= 0.
                                   {-1, 1, 10},  // x - y <= 10.
                               })}),
      {{1, 2},  {2, 2},   {3, 2},   {4, 2},  {1, 1},   {2, 1},   {3, 1},
       {4, 1},  {2, 0},   {3, 0},   {4, 0},  {5, 0},   {10, 2},  {11, 2},
       {10, 1}, {10, 10}, {10, 11}, {10, 9}, {11, 10}, {10, -6}, {11, -6},
       {24, 8}, {24, 7},  {17, 15}, {16, 15}});

  testSubtractAtPoints(
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 1, -2},   // x + y >= 4.
                                               {-1, -1, 30}, // x + y <= 32.
                                               {1, -1, 0},   // x - y >= 2.
                                               {-1, 1, 10},  // x - y <= 16.
                                           })}),
      makeSetFromFACs(
          2, {makeFACFromIneqs(2,
                               {
                                   {1, 0, -2},   // x >= 2. [redundant]
                                   {0, 1, -2},   // y >= 2.
                                   {-1, 0, 10},  // x <= 10.
                                   {0, -1, 10},  // y <= 10. [redundant]
                                   {1, 1, -2},   // x + y >= 2. [redundant]
                                   {-1, -1, 30}, // x + y <= 30. [redundant]
                                   {1, -1, 0},   // x - y >= 0.
                                   {-1, 1, 10},  // x - y <= 10.
                               })}),
      {{1, 2},  {2, 2},   {3, 2},   {4, 2},  {1, 1},   {2, 1},   {3, 1},
       {4, 1},  {2, 0},   {3, 0},   {4, 0},  {5, 0},   {10, 2},  {11, 2},
       {10, 1}, {10, 10}, {10, 11}, {10, 9}, {11, 10}, {10, -6}, {11, -6},
       {24, 8}, {24, 7},  {17, 15}, {16, 15}});

  // ((-infinity, -5] U [3, 3] U [4, 4] U [5, 5]) - ([-2, -10] U [3, 4] U [6,
  // 7])
  testSubtractAtPoints(
      makeSetFromFACs(1,
                      {
                          makeFACFromIneqs(1,
                                           {
                                               {-1, -5}, // x <= -5.
                                           }),
                          makeFACFromConstraints(1, {},
                                                 {
                                                     {1, -3} // x = 3.
                                                 }),
                          makeFACFromConstraints(1, {},
                                                 {
                                                     {1, -4} // x = 4.
                                                 }),
                          makeFACFromConstraints(1, {},
                                                 {
                                                     {1, -5} // x = 5.
                                                 }),
                      }),
      makeSetFromFACs(
          1,
          {
              makeFACFromIneqs(1,
                               {
                                   {-1, -2},  // x <= -2.
                                   {1, -10},  // x >= -10.
                                   {-1, 0},   // x <= 0. [redundant]
                                   {-1, 10},  // x <= 10. [redundant]
                                   {1, -100}, // x >= -100. [redundant]
                                   {1, -50}   // x >= -50. [redundant]
                               }),
              makeFACFromIneqs(1,
                               {
                                   {1, -3}, // x >= 3.
                                   {-1, 4}, // x <= 4.
                                   {1, 1},  // x >= -1. [redundant]
                                   {1, 7},  // x >= -7. [redundant]
                                   {-1, 10} // x <= 10. [redundant]
                               }),
              makeFACFromIneqs(1,
                               {
                                   {1, -6}, // x >= 6.
                                   {-1, 7}, // x <= 7.
                                   {1, 1},  // x >= -1. [redundant]
                                   {1, -3}, // x >= -3. [redundant]
                                   {-1, 5}  // x <= 5. [redundant]
                               }),
          }),
      {{-6},
       {-5},
       {-4},
       {-9},
       {-10},
       {-11},
       {0},
       {1},
       {2},
       {3},
       {4},
       {5},
       {6},
       {7},
       {8}});
}

TEST(SetTest, Complement) {
  // Complement of universe.
  testComplementAtPoints(
      PresburgerSet::getUniverse(1),
      {{-1}, {-2}, {-8}, {1}, {2}, {8}, {9}, {10}, {20}, {21}});

  // Complement of empty set.
  testComplementAtPoints(
      PresburgerSet::getEmptySet(1),
      {{-1}, {-2}, {-8}, {1}, {2}, {8}, {9}, {10}, {20}, {21}});

  testComplementAtPoints(
      makeSetFromFACs(2, {makeFACFromIneqs(2,
                                           {
                                               {1, 0, -2},  // x >= 2.
                                               {0, 1, -2},  // y >= 2.
                                               {-1, 0, 10}, // x <= 10.
                                               {0, -1, 10}  // y <= 10.
                                           })}),
      {{1, 1},
       {2, 1},
       {1, 2},
       {2, 2},
       {2, 3},
       {3, 2},
       {10, 10},
       {10, 11},
       {11, 10},
       {2, 10},
       {2, 11},
       {1, 10}});
}

TEST(SetTest, isEqual) {
  // set = [2, 8] U [10, 20].
  PresburgerSet universe = PresburgerSet::getUniverse(1);
  PresburgerSet emptySet = PresburgerSet::getEmptySet(1);
  PresburgerSet set =
      makeSetFromFACs(1, {
                             makeFACFromIneqs(1, {{1, -2},    // x >= 2.
                                                  {-1, 8}}),  // x <= 8.
                             makeFACFromIneqs(1, {{1, -10},   // x >= 10.
                                                  {-1, 20}}), // x <= 20.
                         });

  // universe != emptySet.
  EXPECT_FALSE(universe.isEqual(emptySet));
  // emptySet != universe.
  EXPECT_FALSE(emptySet.isEqual(universe));
  // emptySet == emptySet.
  EXPECT_TRUE(emptySet.isEqual(emptySet));
  // universe == universe.
  EXPECT_TRUE(universe.isEqual(universe));

  // universe U emptySet == universe.
  EXPECT_TRUE(universe.unionSet(emptySet).isEqual(universe));
  // universe U universe == universe.
  EXPECT_TRUE(universe.unionSet(universe).isEqual(universe));
  // emptySet U emptySet == emptySet.
  EXPECT_TRUE(emptySet.unionSet(emptySet).isEqual(emptySet));
  // universe U emptySet != emptySet.
  EXPECT_FALSE(universe.unionSet(emptySet).isEqual(emptySet));
  // universe U universe != emptySet.
  EXPECT_FALSE(universe.unionSet(universe).isEqual(emptySet));
  // emptySet U emptySet != universe.
  EXPECT_FALSE(emptySet.unionSet(emptySet).isEqual(universe));

  // set \ set == emptySet.
  EXPECT_TRUE(set.subtract(set).isEqual(emptySet));
  // set == set.
  EXPECT_TRUE(set.isEqual(set));
  // set U (universe \ set) == universe.
  EXPECT_TRUE(set.unionSet(set.complement()).isEqual(universe));
  // set U (universe \ set) != set.
  EXPECT_FALSE(set.unionSet(set.complement()).isEqual(set));
  // set != set U (universe \ set).
  EXPECT_FALSE(set.isEqual(set.unionSet(set.complement())));

  // square is one unit taller than rect.
  PresburgerSet square =
      makeSetFromFACs(2, {makeFACFromIneqs(2, {
                                                  {1, 0, -2}, // x >= 2.
                                                  {0, 1, -2}, // y >= 2.
                                                  {-1, 0, 9}, // x <= 9.
                                                  {0, -1, 9}  // y <= 9.
                                              })});
  PresburgerSet rect =
      makeSetFromFACs(2, {makeFACFromIneqs(2, {
                                                  {1, 0, -2}, // x >= 2.
                                                  {0, 1, -2}, // y >= 2.
                                                  {-1, 0, 9}, // x <= 9.
                                                  {0, -1, 8}  // y <= 8.
                                              })});
  EXPECT_FALSE(square.isEqual(rect));
  PresburgerSet universeRect = square.unionSet(square.complement());
  PresburgerSet universeSquare = rect.unionSet(rect.complement());
  EXPECT_TRUE(universeRect.isEqual(universeSquare));
  EXPECT_FALSE(universeRect.isEqual(rect));
  EXPECT_FALSE(universeSquare.isEqual(square));
  EXPECT_FALSE(rect.complement().isEqual(square.complement()));
}

void expectEqual(PresburgerSet s, PresburgerSet t) {
  EXPECT_TRUE(s.isEqual(t));
}

void expectEmpty(PresburgerSet s) { EXPECT_TRUE(s.isIntegerEmpty()); }

TEST(SetTest, divisions) {
  // Note: we currently need to add the equalities as inequalities to the FAC
  // since detecting divisions based on equalities is not yet supported.

  // evens = {x : exists q, x = 2q}.
  PresburgerSet evens{
      makeFACFromConstraints(2, {{1, -2, 0}, {-1, 2, 1}}, {{1, -2, 0}}, 1)};
  // odds = {x : exists q, x = 2q + 1}.
  PresburgerSet odds{
      makeFACFromConstraints(2, {{1, -2, 0}, {-1, 2, 1}}, {{1, -2, -1}}, 1)};
  // multiples6 = {x : exists q, x = 6q}.
  PresburgerSet multiples3{
      makeFACFromConstraints(2, {{1, -3, 0}, {-1, 3, 2}}, {{1, -3, 0}}, 1)};
  // multiples6 = {x : exists q, x = 6q}.
  PresburgerSet multiples6{
      makeFACFromConstraints(2, {{1, -6, 0}, {-1, 6, 5}}, {{1, -6, 0}}, 1)};

  // evens /\ odds = empty.
  expectEmpty(PresburgerSet(evens).intersect(PresburgerSet(odds)));
  // evens U odds = universe.
  expectEqual(evens.unionSet(odds), PresburgerSet::getUniverse(1));
  expectEqual(evens.complement(), odds);
  expectEqual(odds.complement(), evens);
  // even multiples of 3 = multiples of 6.
  expectEqual(multiples3.intersect(evens), multiples6);
}

} // namespace mlir
