import numpy.testing as npt
import pytest

from caimira import models


@pytest.fixture
def simple_co2_conc_model():
    return models.CO2ConcentrationModel(
        room=models.Room(200, models.PiecewiseConstant((0., 24.), (293,))),
        ventilation=models.AirChange(models.PeriodicInterval(period=120, duration=120), 0.25),
        CO2_emitters=models.SimplePopulation(
            number=5,
            presence=models.SpecificInterval((([0., 4.], ))),
            activity=models.Activity.types['Seated'],
        ),
    )


@pytest.mark.parametrize(
    "time, expected_co2_concentration", [
        [0., 440.44],
        [1., 914.2487227],
        [2., 1283.251327],
        [3., 1570.630844],
        [4., 1794.442237],
    ]
)
def test_co2_concentration(
    simple_co2_conc_model: models.CO2ConcentrationModel,
    time: float,
    expected_co2_concentration: float,
):
    npt.assert_almost_equal(simple_co2_conc_model.concentration(time), expected_co2_concentration)


def test_integrated_concentration(simple_co2_conc_model):
    c1 = simple_co2_conc_model.integrated_concentration(0, 2)
    c2 = simple_co2_conc_model.integrated_concentration(0, 1)
    c3 = simple_co2_conc_model.integrated_concentration(1, 2)
    assert c1 != 0
    npt.assert_almost_equal(c1, c2 + c3)
