"""
B-ASIC test suite for the AbstractOperation class.
"""

from b_asic.core_operations import Addition, ConstantAddition, Subtraction, ConstantSubtraction, \
    Multiplication, ConstantMultiplication, Division, ConstantDivision

import pytest


def test_addition_overload():
    """Tests addition overloading for both operation and number argument."""
    add1 = Addition(None, None, "add1")
    add2 = Addition(None, None, "add2")

    add3 = add1 + add2

    assert isinstance(add3, Addition)
    assert add3.input(0).signals == add1.output(0).signals
    assert add3.input(1).signals == add2.output(0).signals

    add4 = add3 + 5

    assert isinstance(add4, ConstantAddition)
    assert add4.input(0).signals == add3.output(0).signals


def test_subtraction_overload():
    """Tests subtraction overloading for both operation and number argument."""
    add1 = Addition(None, None, "add1")
    add2 = Addition(None, None, "add2")

    sub1 = add1 - add2

    assert isinstance(sub1, Subtraction)
    assert sub1.input(0).signals == add1.output(0).signals
    assert sub1.input(1).signals == add2.output(0).signals

    sub2 = sub1 - 5

    assert isinstance(sub2, ConstantSubtraction)
    assert sub2.input(0).signals == sub1.output(0).signals


def test_multiplication_overload():
    """Tests multiplication overloading for both operation and number argument."""
    add1 = Addition(None, None, "add1")
    add2 = Addition(None, None, "add2")

    mul1 = add1 * add2

    assert isinstance(mul1, Multiplication)
    assert mul1.input(0).signals == add1.output(0).signals
    assert mul1.input(1).signals == add2.output(0).signals

    mul2 = mul1 * 5

    assert isinstance(mul2, ConstantMultiplication)
    assert mul2.input(0).signals == mul1.output(0).signals


def test_division_overload():
    """Tests division overloading for both operation and number argument."""
    add1 = Addition(None, None, "add1")
    add2 = Addition(None, None, "add2")

    div1 = add1 / add2

    assert isinstance(div1, Division)
    assert div1.input(0).signals == add1.output(0).signals
    assert div1.input(1).signals == add2.output(0).signals

    div2 = div1 / 5

    assert isinstance(div2, ConstantDivision)
    assert div2.input(0).signals == div1.output(0).signals