Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_outputport.py 2.45 KiB
"""
B-ASIC test suite for OutputPort.
"""
import pytest

from b_asic import OutputPort, InputPort, Signal


@pytest.fixture
def output_port():
    return OutputPort(None, 0)

@pytest.fixture
def input_port():
    return InputPort(None, 0)

@pytest.fixture
def list_of_input_ports():
    return [InputPort(None, i) for i in range(0, 3)]


class TestConnect:
    def test_multiple_ports(self, output_port, list_of_input_ports):
        """Can multiple ports connect to an output port?"""
        for port in list_of_input_ports:
            port.connect(output_port)

        assert output_port.signal_count == len(list_of_input_ports)

    def test_same_port(self, output_port, list_of_input_ports):
        """Check error handing."""
        list_of_input_ports[0].connect(output_port)
        with pytest.raises(Exception):
            list_of_input_ports[0].connect(output_port)

        assert output_port.signal_count == 1

class TestAddSignal:
    def test_dangling(self, output_port):
        s = Signal()
        output_port.add_signal(s)

        assert output_port.signal_count == 1
        assert output_port.signals == [s]

class TestDisconnect:
    def test_others_clear(self, output_port, list_of_input_ports):
        """Can multiple ports disconnect from OutputPort?"""
        for port in list_of_input_ports:
            port.connect(output_port)

        for port in list_of_input_ports:
            port.clear()

        assert output_port.signal_count == 3
        assert all(s.dangling() for s in output_port.signals)

    def test_self_clear(self, output_port, list_of_input_ports):
        """Can an OutputPort disconnect from multiple ports?"""
        for port in list_of_input_ports:
            port.connect(output_port)

        output_port.clear()

        assert output_port.signal_count == 0
        assert output_port.signals == []

class TestRemoveSignal:
    def test_one_signal(self, output_port, input_port):
        s = input_port.connect(output_port)
        output_port.remove_signal(s)

        assert output_port.signal_count == 0
        assert output_port.signals == []

    def test_multiple_signals(self, output_port, list_of_input_ports):
        """Can multiple signals disconnect from OutputPort?"""
        sigs = []

        for port in list_of_input_ports:
            sigs.append(port.connect(output_port))

        for s in sigs:
            output_port.remove_signal(s)

        assert output_port.signal_count == 0
        assert output_port.signals == []