#  Copyright 2020 Modelling, Simulation and Design Lab (MSDL) at
#  McGill University and the University of Antwerp (http://msdl.cs.mcgill.ca/)
#
#  Licensed 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.

"""Tests for the generic building blocks."""

from pypdevs.DEVS import CoupledDEVS
from pypdevs.simulator import Simulator

class Model(CoupledDEVS):
    """Simple model constructor for the tests.

    Args:
        nodes (iter):       An iterable with all submodels to add.
        connections (iter): An iterable with all port connections.
                            Each entry is in the form of (from, to)
    """
    def __init__(self, nodes, connections):
        super(Model, self).__init__("Model")
        self.nodes = []
        for n in range(len(nodes)):
            self.nodes.append(self.addSubModel(nodes[n]))

        for f, t in connections:
            self.connectPorts(f, t)


def simulate(model, tt=None):
    """Simulates the model.

    Args:
        model (MModel):  The :class:`Model` to simulate.
        tt (numeric):   The termination time or ``None`` if
                        no termination time needs to be set.
                        Defaults to ``None``.
    """
    sim = Simulator(model)
    sim.setClassicDEVS()
    # sim.setVerbose(None)
    if tt is not None:
        sim.setTerminationTime(tt)
    sim.simulate()
