# RUN: %PYTHON %s | FileCheck %s

from mlir.ir import *
import mlir.dialects.python_test as test

def run(f):
  print("\nTEST:", f.__name__)
  f()
  return f

# CHECK-LABEL: TEST: testAttributes
@run
def testAttributes():
  with Context() as ctx, Location.unknown():
    ctx.allow_unregistered_dialects = True

    #
    # Check op construction with attributes.
    #

    i32 = IntegerType.get_signless(32)
    one = IntegerAttr.get(i32, 1)
    two = IntegerAttr.get(i32, 2)
    unit = UnitAttr.get()

    # CHECK: "python_test.attributed_op"() {
    # CHECK-DAG: mandatory_i32 = 1 : i32
    # CHECK-DAG: optional_i32 = 2 : i32
    # CHECK-DAG: unit
    # CHECK: }
    op = test.AttributedOp(one, two, unit)
    print(f"{op}")

    # CHECK: "python_test.attributed_op"() {
    # CHECK: mandatory_i32 = 2 : i32
    # CHECK: }
    op2 = test.AttributedOp(two, None, None)
    print(f"{op2}")

    #
    # Check generic "attributes" access and mutation.
    #

    assert "additional" not in op.attributes

    # CHECK: "python_test.attributed_op"() {
    # CHECK-DAG: additional = 1 : i32
    # CHECK-DAG: mandatory_i32 = 2 : i32
    # CHECK: }
    op2.attributes["additional"] = one
    print(f"{op2}")

    # CHECK: "python_test.attributed_op"() {
    # CHECK-DAG: additional = 2 : i32
    # CHECK-DAG: mandatory_i32 = 2 : i32
    # CHECK: }
    op2.attributes["additional"] = two
    print(f"{op2}")

    # CHECK: "python_test.attributed_op"() {
    # CHECK-NOT: additional = 2 : i32
    # CHECK:     mandatory_i32 = 2 : i32
    # CHECK: }
    del op2.attributes["additional"]
    print(f"{op2}")

    try:
      print(op.attributes["additional"])
    except KeyError:
      pass
    else:
      assert False, "expected KeyError on unknown attribute key"

    #
    # Check accessors to defined attributes.
    #

    # CHECK: Mandatory: 1
    # CHECK: Optional: 2
    # CHECK: Unit: True
    print(f"Mandatory: {op.mandatory_i32.value}")
    print(f"Optional: {op.optional_i32.value}")
    print(f"Unit: {op.unit}")

    # CHECK: Mandatory: 2
    # CHECK: Optional: None
    # CHECK: Unit: False
    print(f"Mandatory: {op2.mandatory_i32.value}")
    print(f"Optional: {op2.optional_i32}")
    print(f"Unit: {op2.unit}")

    # CHECK: Mandatory: 2
    # CHECK: Optional: None
    # CHECK: Unit: False
    op.mandatory_i32 = two
    op.optional_i32 = None
    op.unit = False
    print(f"Mandatory: {op.mandatory_i32.value}")
    print(f"Optional: {op.optional_i32}")
    print(f"Unit: {op.unit}")
    assert "optional_i32" not in op.attributes
    assert "unit" not in op.attributes

    try:
      op.mandatory_i32 = None
    except ValueError:
      pass
    else:
      assert False, "expected ValueError on setting a mandatory attribute to None"

    # CHECK: Optional: 2
    op.optional_i32 = two
    print(f"Optional: {op.optional_i32.value}")

    # CHECK: Optional: None
    del op.optional_i32
    print(f"Optional: {op.optional_i32}")

    # CHECK: Unit: False
    op.unit = None
    print(f"Unit: {op.unit}")
    assert "unit" not in op.attributes

    # CHECK: Unit: True
    op.unit = True
    print(f"Unit: {op.unit}")

    # CHECK: Unit: False
    del op.unit
    print(f"Unit: {op.unit}")


# CHECK-LABEL: TEST: inferReturnTypes
@run
def inferReturnTypes():
  with Context() as ctx, Location.unknown(ctx):
    test.register_python_test_dialect(ctx)
    module = Module.create()
    with InsertionPoint(module.body):
      op = test.InferResultsOp()
      dummy = test.DummyOp()

    # CHECK: [Type(i32), Type(i64)]
    iface = InferTypeOpInterface(op)
    print(iface.inferReturnTypes())

    # CHECK: [Type(i32), Type(i64)]
    iface_static = InferTypeOpInterface(test.InferResultsOp)
    print(iface.inferReturnTypes())

    assert isinstance(iface.opview, test.InferResultsOp)
    assert iface.opview == iface.operation.opview

    try:
      iface_static.opview
    except TypeError:
      pass
    else:
      assert False, ("not expected to be able to obtain an opview from a static"
                     " interface")

    try:
      InferTypeOpInterface(dummy)
    except ValueError:
      pass
    else:
      assert False, "not expected dummy op to implement the interface"

    try:
      InferTypeOpInterface(test.DummyOp)
    except ValueError:
      pass
    else:
      assert False, "not expected dummy op class to implement the interface"


# CHECK-LABEL: TEST: resultTypesDefinedByTraits
@run
def resultTypesDefinedByTraits():
  with Context() as ctx, Location.unknown(ctx):
    test.register_python_test_dialect(ctx)
    module = Module.create()
    with InsertionPoint(module.body):
      inferred = test.InferResultsOp()
      same = test.SameOperandAndResultTypeOp([inferred.results[0]])
      # CHECK-COUNT-2: i32
      print(same.one.type)
      print(same.two.type)

      first_type_attr = test.FirstAttrDeriveTypeAttrOp(
          inferred.results[1], TypeAttr.get(IndexType.get()))
      # CHECK-COUNT-2: index
      print(first_type_attr.one.type)
      print(first_type_attr.two.type)

      first_attr = test.FirstAttrDeriveAttrOp(
          FloatAttr.get(F32Type.get(), 3.14))
      # CHECK-COUNT-3: f32
      print(first_attr.one.type)
      print(first_attr.two.type)
      print(first_attr.three.type)

      implied = test.InferResultsImpliedOp()
      # CHECK: i32
      print(implied.integer.type)
      # CHECK: f64
      print(implied.flt.type)
      # CHECK: index
      print(implied.index.type)


# CHECK-LABEL: TEST: testOptionalOperandOp
@run
def testOptionalOperandOp():
  with Context() as ctx, Location.unknown():
    test.register_python_test_dialect(ctx)

    module = Module.create()
    with InsertionPoint(module.body):

      op1 = test.OptionalOperandOp(None)
      # CHECK: op1.input is None: True
      print(f"op1.input is None: {op1.input is None}")

      op2 = test.OptionalOperandOp(op1)
      # CHECK: op2.input is None: False
      print(f"op2.input is None: {op2.input is None}")
