def cost_json(constant_cost, constant_cost_json, timeofday_cost,
              timeofday_cost_json, datetime_cost, datetime_cost_json,
              banded_cost_params, banded_cost_params_json, request):
    if request.param == 'constant':
        return constant_cost_json, datamodel.Cost(
            name='constantcost', type='constant', parameters=constant_cost)
    elif request.param == 'timeofday':
        return timeofday_cost_json, datamodel.Cost(
            name='timeofdaycost', type='timeofday', parameters=timeofday_cost)
    elif request.param == 'datetime':
        return datetime_cost_json, datamodel.Cost(
            name='datetimecost', type='datetime', parameters=datetime_cost)
    elif request.param == 'errorband':
        return banded_cost_params_json, banded_cost_params
def test_cost_types(which, constant_cost, datetime_cost, timeofday_cost,
                    errorband_cost):
    dd = {'constant': constant_cost, 'timeofday': timeofday_cost,
          'datetime': datetime_cost, 'errorband': errorband_cost,
          'other': constant_cost}
    out = datamodel.Cost(
        name='test',
        type=which,
        parameters=dd[which]
    )
    assert isinstance(out, datamodel.Cost)
    assert str(out.parameters).split('(')[0].lower() == which + 'cost'
            )
        )]
    )
    fx = default_cost_err
    obs = pd.Series(0, index=fx.index)
    err = deterministic.error_band_cost(
        obs, fx, params, deterministic.error)
    assert err == 0


@pytest.mark.parametrize('params,exp', [
    ('banded', 12.06),
    (None, np.nan),
    (datamodel.Cost(
        name='cost',
        type='constant',
        parameters=datamodel.ConstantCost(
            cost=1.9, aggregation='sum', net=True)
        ), 8.6 * 1.9),
    (datamodel.Cost(
        name='cost',
        type='timeofday',
        parameters=datamodel.TimeOfDayCost(
            cost=[1.0, 2.0, 3.0],
            times=[dt.time(3), dt.time(4), dt.time(8, 1)],
            fill='forward',
            aggregation='sum',
            net=True
        )), 16.1),
    (datamodel.Cost(
        name='cost',
        type='datetime',