def setup_simulation(components: List, input_config: Mapping=None,
                     plugin_config: Mapping=None) -> InteractiveContext:
    """Construct a simulation from a list of components and call its setup
    method.

    Parameters
    ----------
    components
        A list of initialized simulation components. Corresponds to the
        components block of a model specification.
    input_config
        A nested dictionary with any additional simulation configuration
        information needed. Corresponds to the configuration block of a model
        specification.
    plugin_config
        A dictionary containing a description of any simulation plugins to
        include in the simulation. If you're using this argument, you're either
        deep in the process of simulation development or the maintainers have
        done something wrong. Corresponds to the plugins block of a model
        specification.

    Returns
    -------
        A simulation context that is setup and ready to run.
    """
    simulation = initialize_simulation(components, input_config, plugin_config)
    simulation.setup()

    return simulation