# Copyright (c) ONNX Project Contributors
#
# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations

import numpy as np

import onnx
from onnx.backend.test.case.base import Base
from onnx.backend.test.case.node import expect


class Identity(Base):
    @staticmethod
    def export() -> None:
        node = onnx.helper.make_node(
            "Identity",
            inputs=["x"],
            outputs=["y"],
        )

        data = np.array(
            [
                [
                    [
                        [1, 2],
                        [3, 4],
                    ]
                ]
            ],
            dtype=np.float32,
        )

        expect(node, inputs=[data], outputs=[data], name="test_identity")

    @staticmethod
    def export_sequence() -> None:
        node = onnx.helper.make_node(
            "Identity",
            inputs=["x"],
            outputs=["y"],
        )

        data = [
            np.array(
                [
                    [
                        [
                            [1, 2],
                            [3, 4],
                        ]
                    ]
                ],
                dtype=np.float32,
            ),
            np.array(
                [
                    [
                        [
                            [2, 3],
                            [1, 5],
                        ]
                    ]
                ],
                dtype=np.float32,
            ),
        ]

        expect(node, inputs=[data], outputs=[data], name="test_identity_sequence")

    @staticmethod
    def export_identity_opt() -> None:
        ten_in_tp = onnx.helper.make_tensor_type_proto(
            onnx.TensorProto.FLOAT, shape=[5]
        )
        seq_in_tp = onnx.helper.make_sequence_type_proto(ten_in_tp)
        opt_in_tp = onnx.helper.make_optional_type_proto(seq_in_tp)

        identity_node = onnx.helper.make_node(
            "Identity", inputs=["opt_in"], outputs=["opt_out"]
        )

        x = [np.array([1, 2, 3, 4, 5]).astype(np.float32)]

        expect(
            identity_node,
            inputs=[x],
            outputs=[x],
            name="test_identity_opt",
            opset_imports=[onnx.helper.make_opsetid("", 16)],
            input_type_protos=[opt_in_tp],
            output_type_protos=[opt_in_tp],
        )
