# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
# pylint: disable=missing-docstring

import pytest

from tvm import IRModule
from tvm.script.ir_builder import IRBuilder
from tvm.script.ir_builder import ir as I
from tvm.script.ir_builder import tirx as T


def _assert_print(obj, expected):
    assert str(obj).strip() == expected.strip()
    assert repr(obj).strip() == expected.strip()
    if isinstance(obj, IRModule):
        assert obj.script().strip() == expected.strip()


def test_ir_module():
    with IRBuilder() as ib:  # pylint: disable=invalid-name
        with I.ir_module():
            with T.prim_func(s_tir=True):
                T.func_name("foo")
    mod = ib.get()
    _assert_print(
        mod,
        """
# from tvm.script import ir as I
# from tvm.script import tirx as T
# from tvm.tirx.layout import Axis

@I.ir_module
class Module:
    @T.prim_func(s_tir=True)
    def foo():
        T.evaluate(0)""",
    )


def test_failed_invalid_prefix():
    with IRBuilder() as ib:  # pylint: disable=invalid-name
        with I.ir_module():
            with T.prim_func():
                T.func_name("foo")
    mod = ib.get()

    with pytest.raises(RuntimeError):
        mod.script(ir_prefix="2I")


if __name__ == "__main__":
    test_ir_module()
    test_failed_invalid_prefix()
