# RUN: %PYTHON %s | FileCheck %s

import gc
from mlir.ir import *

def run(f):
  print("\nTEST:", f.__name__)
  f()
  gc.collect()
  assert Context._get_live_count() == 0
  return f


# CHECK-LABEL: TEST: testIntegerSetCapsule
@run
def testIntegerSetCapsule():
  with Context() as ctx:
    is1 = IntegerSet.get_empty(1, 1, ctx)
  capsule = is1._CAPIPtr
  # CHECK: mlir.ir.IntegerSet._CAPIPtr
  print(capsule)
  is2 = IntegerSet._CAPICreate(capsule)
  assert is1 == is2
  assert is2.context is ctx


# CHECK-LABEL: TEST: testIntegerSetGet
@run
def testIntegerSetGet():
  with Context():
    d0 = AffineDimExpr.get(0)
    d1 = AffineDimExpr.get(1)
    s0 = AffineSymbolExpr.get(0)
    c42 = AffineConstantExpr.get(42)

    # CHECK: (d0, d1)[s0] : (d0 - d1 == 0, s0 - 42 >= 0)
    set0 = IntegerSet.get(2, 1, [d0 - d1, s0 - c42], [True, False])
    print(set0)

    # CHECK: (d0)[s0] : (1 == 0)
    set1 = IntegerSet.get_empty(1, 1)
    print(set1)

    # CHECK: (d0)[s0, s1] : (d0 - s1 == 0, s0 - 42 >= 0)
    set2 = set0.get_replaced([d0, AffineSymbolExpr.get(1)], [s0], 1, 2)
    print(set2)

    try:
      IntegerSet.get(2, 1, [], [])
    except ValueError as e:
      # CHECK: Expected non-empty list of constraints
      print(e)

    try:
      IntegerSet.get(2, 1, [d0 - d1], [True, False])
    except ValueError as e:
      # CHECK: Expected the number of constraints to match that of equality flags
      print(e)

    try:
      IntegerSet.get(2, 1, [0], [True])
    except RuntimeError as e:
      # CHECK: Invalid expression when attempting to create an IntegerSet
      print(e)

    try:
      IntegerSet.get(2, 1, [None], [True])
    except RuntimeError as e:
      # CHECK: Invalid expression (None?) when attempting to create an IntegerSet
      print(e)

    try:
      set0.get_replaced([d0], [s0], 1, 1)
    except ValueError as e:
      # CHECK: Expected the number of dimension replacement expressions to match that of dimensions
      print(e)

    try:
      set0.get_replaced([d0, d1], [s0, s0], 1, 1)
    except ValueError as e:
      # CHECK: Expected the number of symbol replacement expressions to match that of symbols
      print(e)

    try:
      set0.get_replaced([d0, 1], [s0], 1, 1)
    except RuntimeError as e:
      # CHECK: Invalid expression when attempting to create an IntegerSet by replacing dimensions
      print(e)

    try:
      set0.get_replaced([d0, d1], [None], 1, 1)
    except RuntimeError as e:
      # CHECK: Invalid expression (None?) when attempting to create an IntegerSet by replacing symbols
      print(e)


# CHECK-LABEL: TEST: testIntegerSetProperties
@run
def testIntegerSetProperties():
  with Context():
    d0 = AffineDimExpr.get(0)
    d1 = AffineDimExpr.get(1)
    s0 = AffineSymbolExpr.get(0)
    c42 = AffineConstantExpr.get(42)

    set0 = IntegerSet.get(2, 1, [d0 - d1, s0 - c42, s0 - d0], [True, False, False])
    # CHECK: 2
    print(set0.n_dims)
    # CHECK: 1
    print(set0.n_symbols)
    # CHECK: 3
    print(set0.n_inputs)
    # CHECK: 1
    print(set0.n_equalities)
    # CHECK: 2
    print(set0.n_inequalities)

    # CHECK: 3
    print(len(set0.constraints))

    # CHECK-DAG: d0 - d1 == 0
    # CHECK-DAG: s0 - 42 >= 0
    # CHECK-DAG: -d0 + s0 >= 0
    for cstr in set0.constraints:
      print(cstr.expr, end='')
      print(" == 0" if cstr.is_eq else " >= 0")


# CHECK_LABEL: TEST: testHash
@run
def testHash():
  with Context():
    d0 = AffineDimExpr.get(0)
    d1 = AffineDimExpr.get(1)
    set = IntegerSet.get(2, 0, [d0 + d1], [True])

    assert hash(set) == hash(IntegerSet.get(2, 0, [d0 + d1], [True]))

    dictionary = dict()
    dictionary[set] = 42
    assert set in dictionary
