From 0bf12227b2347a37fe756ccfcdd416dd78ba1a4e Mon Sep 17 00:00:00 2001 From: cescofran Date: Tue, 19 Jan 2021 22:38:43 +0100 Subject: [PATCH 01/36] Separate test_countries fixtures and make them accessible to others tests --- tests/core/conftest.py | 34 ++++++++ .../test_parameter_clone.py | 10 +-- tests/core/test_axes.py | 3 +- tests/core/test_countries.py | 33 +------- tests/core/test_dump_restore.py | 4 +- tests/core/test_entities.py | 84 +++++++++---------- tests/core/test_holders.py | 5 +- tests/core/test_parameters.py | 27 +++--- tests/core/test_simulation_builder.py | 35 ++++---- tests/core/test_simulations.py | 10 +-- tests/core/test_yaml.py | 52 ++++++------ tests/core/tools/test_assert_near.py | 6 +- 12 files changed, 146 insertions(+), 157 deletions(-) create mode 100644 tests/core/conftest.py diff --git a/tests/core/conftest.py b/tests/core/conftest.py new file mode 100644 index 0000000000..7eeb7094ff --- /dev/null +++ b/tests/core/conftest.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from pytest import fixture + +from openfisca_core.simulation_builder import SimulationBuilder +from openfisca_country_template import CountryTaxBenefitSystem + + +@fixture +def tax_benefit_system(): + return CountryTaxBenefitSystem() + + +@fixture +def period(): + return "2016-01" + + +@fixture +def make_simulation(tax_benefit_system, period): + def _make_simulation(data): + builder = SimulationBuilder() + builder.default_period = period + return builder.build_from_variables(tax_benefit_system, data) + return _make_simulation + + +@fixture +def make_isolated_simulation(period): + def _make_simulation(tbs, data): + builder = SimulationBuilder() + builder.default_period = period + return builder.build_from_variables(tbs, data) + return _make_simulation diff --git a/tests/core/parameter_validation/test_parameter_clone.py b/tests/core/parameter_validation/test_parameter_clone.py index 7b839caa15..369a5125e9 100644 --- a/tests/core/parameter_validation/test_parameter_clone.py +++ b/tests/core/parameter_validation/test_parameter_clone.py @@ -1,6 +1,4 @@ # -*- coding: utf-8 -*- -from ..test_countries import tax_benefit_system - import os from openfisca_core.parameters import ParameterNode BASE_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -20,7 +18,7 @@ def test_clone(): assert id(clone.node1.param) != id(parameters.node1.param) -def test_clone_parameter(): +def test_clone_parameter(tax_benefit_system): param = tax_benefit_system.parameters.taxes.income_tax_rate clone = param.clone() @@ -32,7 +30,7 @@ def test_clone_parameter(): assert clone.values_list == param.values_list -def test_clone_parameter_node(): +def test_clone_parameter_node(tax_benefit_system): node = tax_benefit_system.parameters.taxes clone = node.clone() @@ -41,7 +39,7 @@ def test_clone_parameter_node(): assert clone.children['income_tax_rate'] is not node.children['income_tax_rate'] -def test_clone_scale(): +def test_clone_scale(tax_benefit_system): scale = tax_benefit_system.parameters.taxes.social_security_contribution clone = scale.clone() @@ -49,7 +47,7 @@ def test_clone_scale(): assert clone.brackets[0].rate is not scale.brackets[0].rate -def test_deep_edit(): +def test_deep_edit(tax_benefit_system): parameters = tax_benefit_system.parameters clone = parameters.clone() diff --git a/tests/core/test_axes.py b/tests/core/test_axes.py index 60c0299f18..d4b122e69b 100644 --- a/tests/core/test_axes.py +++ b/tests/core/test_axes.py @@ -134,8 +134,7 @@ def test_add_perpendicular_axes(simulation_builder, persons): # Integration test -def test_simulation_with_axes(simulation_builder): - from .test_countries import tax_benefit_system +def test_simulation_with_axes(tax_benefit_system, simulation_builder): input_yaml = """ persons: Alicia: {salary: {2018-11: 0}} diff --git a/tests/core/test_countries.py b/tests/core/test_countries.py index e7e8ec0ee1..ab820152c4 100644 --- a/tests/core/test_countries.py +++ b/tests/core/test_countries.py @@ -1,10 +1,9 @@ # -*- coding: utf-8 -*- -from pytest import fixture, raises +from pytest import raises from openfisca_core.variables import Variable from openfisca_core.periods import MONTH -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_core.taxbenefitsystems import VariableNameConflict, VariableNotFound from openfisca_core import periods from openfisca_core.populations import DIVIDE @@ -12,32 +11,6 @@ from openfisca_core.tools import assert_near -tax_benefit_system = CountryTaxBenefitSystem() - - -@fixture -def period(): - return "2016-01" - - -@fixture -def make_simulation(period): - def _make_simulation(data): - builder = SimulationBuilder() - builder.default_period = period - return builder.build_from_variables(tax_benefit_system, data) - return _make_simulation - - -@fixture -def make_isolated_simulation(period): - def _make_simulation(tbs, data): - builder = SimulationBuilder() - builder.default_period = period - return builder.build_from_variables(tbs, data) - return _make_simulation - - def test_input_variable(make_simulation, period): simulation = make_simulation({'salary': 2000}) assert_near(simulation.calculate('salary', period), [2000], absolute_error_margin = 0.01) @@ -104,7 +77,7 @@ def test_input_with_wrong_period(make_simulation): make_simulation({'basic_income': {2015: 12000}}) -def test_variable_with_reference(make_isolated_simulation): +def test_variable_with_reference(tax_benefit_system, make_isolated_simulation): tax_benefit_system = CountryTaxBenefitSystem() # Work in isolation simulation_base = make_isolated_simulation(tax_benefit_system, {'salary': 4000}) @@ -126,7 +99,7 @@ def formula(household, period): assert(revenu_disponible_apres_reforme == 0) -def test_variable_name_conflict(): +def test_variable_name_conflict(tax_benefit_system): class disposable_income(Variable): reference = 'disposable_income' definition_period = MONTH diff --git a/tests/core/test_dump_restore.py b/tests/core/test_dump_restore.py index fcc53f516f..34239985c5 100644 --- a/tests/core/test_dump_restore.py +++ b/tests/core/test_dump_restore.py @@ -10,10 +10,8 @@ from openfisca_country_template.situation_examples import couple from openfisca_core.tools.simulation_dumper import dump_simulation, restore_simulation -from .test_countries import tax_benefit_system - -def test_dump(): +def test_dump(tax_benefit_system): directory = tempfile.mkdtemp(prefix = "openfisca_") simulation = SimulationBuilder().build_from_entities(tax_benefit_system, couple) calculated_value = simulation.calculate('disposable_income', '2018-01') diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index 0702ceaf3b..a78e9c7c48 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -8,8 +8,6 @@ from openfisca_country_template.entities import Household from openfisca_country_template.situation_examples import single, couple -from .test_countries import tax_benefit_system - TEST_CASE = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}, 'ind4': {}, 'ind5': {}}, 'households': { @@ -32,14 +30,14 @@ MONTH = "2016-01" -def new_simulation(test_case, period = MONTH): +def new_simulation(tax_benefit_system, test_case, period = MONTH): builder = SimulationBuilder() builder.set_default_period(period) return builder.build_from_entities(tax_benefit_system, test_case) -def test_role_index_and_positions(): - simulation = new_simulation(TEST_CASE) +def test_role_index_and_positions(tax_benefit_system): + simulation = new_simulation(tax_benefit_system, TEST_CASE) assert_near(simulation.household.members_entity_id, [0, 0, 0, 0, 1, 1]) assert((simulation.household.members_role == [FIRST_PARENT, SECOND_PARENT, CHILD, CHILD, FIRST_PARENT, CHILD]).all()) assert_near(simulation.household.members_position, [0, 1, 2, 3, 0, 1]) @@ -47,7 +45,7 @@ def test_role_index_and_positions(): assert(simulation.household.ids == ['h1', 'h2']) -def test_entity_structure_with_constructor(): +def test_entity_structure_with_constructor(tax_benefit_system): simulation_yaml = """ persons: bill: {} @@ -77,7 +75,7 @@ def test_entity_structure_with_constructor(): assert_near(household.members_position, [0, 1, 0, 2, 3]) -def test_entity_variables_with_constructor(): +def test_entity_variables_with_constructor(tax_benefit_system): simulation_yaml = """ persons: bill: {} @@ -107,7 +105,7 @@ def test_entity_variables_with_constructor(): assert_near(household('rent', "2017-06"), [800, 600]) -def test_person_variable_with_constructor(): +def test_person_variable_with_constructor(tax_benefit_system): simulation_yaml = """ persons: bill: @@ -141,7 +139,7 @@ def test_person_variable_with_constructor(): assert_near(person('salary', "2017-12"), [2000, 0, 4000, 0, 0]) -def test_set_input_with_constructor(): +def test_set_input_with_constructor(tax_benefit_system): simulation_yaml = """ persons: bill: @@ -180,25 +178,25 @@ def test_set_input_with_constructor(): assert_near(person('salary', "2017-10"), [2000, 3000, 1600, 0, 0]) -def test_has_role(): - simulation = new_simulation(TEST_CASE) +def test_has_role(tax_benefit_system): + simulation = new_simulation(tax_benefit_system, TEST_CASE) individu = simulation.persons assert_near(individu.has_role(CHILD), [False, False, True, True, False, True]) -def test_has_role_with_subrole(): - simulation = new_simulation(TEST_CASE) +def test_has_role_with_subrole(tax_benefit_system): + simulation = new_simulation(tax_benefit_system, TEST_CASE) individu = simulation.persons assert_near(individu.has_role(PARENT), [True, True, False, False, True, False]) assert_near(individu.has_role(FIRST_PARENT), [True, False, False, False, True, False]) assert_near(individu.has_role(SECOND_PARENT), [False, True, False, False, False, False]) -def test_project(): +def test_project(tax_benefit_system): test_case = deepcopy(TEST_CASE) test_case['households']['h1']['housing_tax'] = 20000 - simulation = new_simulation(test_case, YEAR) + simulation = new_simulation(tax_benefit_system, test_case, YEAR) household = simulation.household housing_tax = household('housing_tax', YEAR) @@ -210,25 +208,25 @@ def test_project(): assert_near(housing_tax_projected_on_parents, [20000, 20000, 0, 0, 0, 0]) -def test_implicit_projection(): +def test_implicit_projection(tax_benefit_system): test_case = deepcopy(TEST_CASE) test_case['households']['h1']['housing_tax'] = 20000 - simulation = new_simulation(test_case, YEAR) + simulation = new_simulation(tax_benefit_system, test_case, YEAR) individu = simulation.person housing_tax = individu.household('housing_tax', YEAR) assert_near(housing_tax, [20000, 20000, 20000, 20000, 0, 0]) -def test_sum(): +def test_sum(tax_benefit_system): test_case = deepcopy(TEST_CASE) test_case['persons']['ind0']['salary'] = 1000 test_case['persons']['ind1']['salary'] = 1500 test_case['persons']['ind4']['salary'] = 3000 test_case['persons']['ind5']['salary'] = 500 - simulation = new_simulation(test_case, MONTH) + simulation = new_simulation(tax_benefit_system, test_case, MONTH) household = simulation.household salary = household.members('salary', "2016-01") @@ -241,9 +239,9 @@ def test_sum(): assert_near(total_salary_parents_by_household, [2500, 3000]) -def test_any(): +def test_any(tax_benefit_system): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) household = simulation.household age = household.members('age', period = MONTH) @@ -256,9 +254,9 @@ def test_any(): assert_near(has_household_CHILD_with_age_sup_18, [False, True]) -def test_all(): +def test_all(tax_benefit_system): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) household = simulation.household age = household.members('age', period = MONTH) @@ -271,9 +269,9 @@ def test_all(): assert_near(all_parents_age_sup_18, [True, True]) -def test_max(): +def test_max(tax_benefit_system): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) household = simulation.household age = household.members('age', period = MONTH) @@ -285,9 +283,9 @@ def test_max(): assert_near(age_max_child, [9, 20]) -def test_min(): +def test_min(tax_benefit_system): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) household = simulation.household age = household.members('age', period = MONTH) @@ -299,9 +297,9 @@ def test_min(): assert_near(age_min_parents, [37, 54]) -def test_value_nth_person(): +def test_value_nth_person(tax_benefit_system): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) household = simulation.household array = household.members('age', MONTH) @@ -318,9 +316,9 @@ def test_value_nth_person(): assert_near(result3, [9, -1]) -def test_rank(): +def test_rank(tax_benefit_system): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) person = simulation.person age = person('age', MONTH) # [40, 37, 7, 9, 54, 20] @@ -331,14 +329,14 @@ def test_rank(): assert_near(rank_in_siblings, [-1, -1, 1, 0, -1, 0]) -def test_partner(): +def test_partner(tax_benefit_system): test_case = deepcopy(TEST_CASE) test_case['persons']['ind0']['salary'] = 1000 test_case['persons']['ind1']['salary'] = 1500 test_case['persons']['ind4']['salary'] = 3000 test_case['persons']['ind5']['salary'] = 500 - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) persons = simulation.persons salary = persons('salary', period = MONTH) @@ -348,14 +346,14 @@ def test_partner(): assert_near(salary_second_parent, [1500, 1000, 0, 0, 0, 0]) -def test_value_from_first_person(): +def test_value_from_first_person(tax_benefit_system): test_case = deepcopy(TEST_CASE) test_case['persons']['ind0']['salary'] = 1000 test_case['persons']['ind1']['salary'] = 1500 test_case['persons']['ind4']['salary'] = 3000 test_case['persons']['ind5']['salary'] = 500 - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) household = simulation.household salaries = household.members('salary', period = MONTH) @@ -364,7 +362,7 @@ def test_value_from_first_person(): assert_near(salary_first_person, [1000, 3000]) -def test_projectors_methods(): +def test_projectors_methods(tax_benefit_system): simulation = SimulationBuilder().build_from_dict(tax_benefit_system, couple) household = simulation.household person = simulation.person @@ -381,7 +379,7 @@ def test_projectors_methods(): assert(len(household.first_parent.get_rank(household, salary_i)) == 1) # Must be of a person dimension -def test_sum_following_bug_ipp_1(): +def test_sum_following_bug_ipp_1(tax_benefit_system): test_case = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}}, 'households': { @@ -394,7 +392,7 @@ def test_sum_following_bug_ipp_1(): test_case['persons']['ind2']['salary'] = 1000 test_case['persons']['ind3']['salary'] = 1000 - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) household = simulation.household eligible_i = household.members('salary', period = MONTH) < 1500 @@ -403,7 +401,7 @@ def test_sum_following_bug_ipp_1(): assert_near(nb_eligibles_by_household, [0, 2]) -def test_sum_following_bug_ipp_2(): +def test_sum_following_bug_ipp_2(tax_benefit_system): test_case = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}}, 'households': { @@ -416,7 +414,7 @@ def test_sum_following_bug_ipp_2(): test_case['persons']['ind2']['salary'] = 1000 test_case['persons']['ind3']['salary'] = 1000 - simulation = new_simulation(test_case) + simulation = new_simulation(tax_benefit_system, test_case) household = simulation.household eligible_i = household.members('salary', period = MONTH) < 1500 @@ -425,7 +423,7 @@ def test_sum_following_bug_ipp_2(): assert_near(nb_eligibles_by_household, [2, 0]) -def test_get_memory_usage(): +def test_get_memory_usage(tax_benefit_system): test_case = deepcopy(single) test_case["persons"]["Alicia"]["salary"] = {"2017-01": 0} simulation = SimulationBuilder().build_from_dict(tax_benefit_system, test_case) @@ -435,7 +433,7 @@ def test_get_memory_usage(): assert(len(memory_usage['by_variable']) == 1) -def test_unordered_persons(): +def test_unordered_persons(tax_benefit_system): test_case = { 'persons': {'ind4': {}, 'ind3': {}, 'ind1': {}, 'ind2': {}, 'ind5': {}, 'ind0': {}}, 'households': { @@ -456,7 +454,7 @@ def test_unordered_persons(): # household.members_entity_id == [1, 0, 0, 0, 1, 0] - simulation = new_simulation(test_case, MONTH) + simulation = new_simulation(tax_benefit_system, test_case, MONTH) household = simulation.household person = simulation.person diff --git a/tests/core/test_holders.py b/tests/core/test_holders.py index 9e62d6e64b..f3234dd31c 100644 --- a/tests/core/test_holders.py +++ b/tests/core/test_holders.py @@ -11,18 +11,17 @@ from openfisca_core.memory_config import MemoryConfig from openfisca_core.holders import Holder, set_input_dispatch_by_period from openfisca_core.errors import PeriodMismatchError -from .test_countries import tax_benefit_system from pytest import fixture @fixture -def single(): +def single(tax_benefit_system): return SimulationBuilder().build_from_entities(tax_benefit_system, openfisca_country_template.situation_examples.single) @fixture -def couple(): +def couple(tax_benefit_system): return SimulationBuilder().build_from_entities(tax_benefit_system, openfisca_country_template.situation_examples.couple) diff --git a/tests/core/test_parameters.py b/tests/core/test_parameters.py index 88fedcabab..7e7426c5f6 100644 --- a/tests/core/test_parameters.py +++ b/tests/core/test_parameters.py @@ -5,10 +5,9 @@ import pytest from openfisca_core.parameters import ParameterNotFound, ParameterNode, ParameterNodeAtInstant, load_parameter_file -from .test_countries import tax_benefit_system -def test_get_at_instant(): +def test_get_at_instant(tax_benefit_system): parameters = tax_benefit_system.parameters assert isinstance(parameters, ParameterNode), parameters parameters_at_instant = parameters('2016-01-01') @@ -17,7 +16,7 @@ def test_get_at_instant(): assert parameters_at_instant.benefits.basic_income == 600 -def test_param_values(): +def test_param_values(tax_benefit_system): dated_values = { '2015-01-01': 0.15, '2014-01-01': 0.14, @@ -29,37 +28,37 @@ def test_param_values(): assert tax_benefit_system.get_parameters_at_instant(date).taxes.income_tax_rate == value -def test_param_before_it_is_defined(): +def test_param_before_it_is_defined(tax_benefit_system): with pytest.raises(ParameterNotFound): tax_benefit_system.get_parameters_at_instant('1997-12-31').taxes.income_tax_rate # The placeholder should have no effect on the parameter computation -def test_param_with_placeholder(): +def test_param_with_placeholder(tax_benefit_system): assert tax_benefit_system.get_parameters_at_instant('2018-01-01').taxes.income_tax_rate == 0.15 -def test_stopped_parameter_before_end_value(): +def test_stopped_parameter_before_end_value(tax_benefit_system): assert tax_benefit_system.get_parameters_at_instant('2011-12-31').benefits.housing_allowance == 0.25 -def test_stopped_parameter_after_end_value(): +def test_stopped_parameter_after_end_value(tax_benefit_system): with pytest.raises(ParameterNotFound): tax_benefit_system.get_parameters_at_instant('2016-12-01').benefits.housing_allowance -def test_parameter_for_period(): +def test_parameter_for_period(tax_benefit_system): income_tax_rate = tax_benefit_system.parameters.taxes.income_tax_rate assert income_tax_rate("2015") == income_tax_rate("2015-01-01") -def test_wrong_value(): +def test_wrong_value(tax_benefit_system): income_tax_rate = tax_benefit_system.parameters.taxes.income_tax_rate with pytest.raises(ValueError): income_tax_rate("test") -def test_parameter_repr(): +def test_parameter_repr(tax_benefit_system): parameters = tax_benefit_system.parameters tf = tempfile.NamedTemporaryFile(delete = False) tf.write(repr(parameters).encode('utf-8')) @@ -68,7 +67,7 @@ def test_parameter_repr(): assert repr(parameters) == repr(tf_parameters) -def test_parameters_metadata(): +def test_parameters_metadata(tax_benefit_system): parameter = tax_benefit_system.parameters.benefits.basic_income assert parameter.metadata['reference'] == 'https://law.gov.example/basic-income/amount' assert parameter.metadata['unit'] == 'currency-EUR' @@ -79,7 +78,7 @@ def test_parameters_metadata(): assert scale.metadata['rate_unit'] == '/1' -def test_parameter_node_metadata(): +def test_parameter_node_metadata(tax_benefit_system): parameter = tax_benefit_system.parameters.benefits assert parameter.description == 'Social benefits' @@ -87,12 +86,12 @@ def test_parameter_node_metadata(): assert parameter_2.description == 'Housing tax' -def test_parameter_documentation(): +def test_parameter_documentation(tax_benefit_system): parameter = tax_benefit_system.parameters.benefits.housing_allowance assert parameter.documentation == 'A fraction of the rent.\nFrom the 1st of Dec 2016, the housing allowance no longer exists.\n' -def test_get_descendants(): +def test_get_descendants(tax_benefit_system): all_parameters = {parameter.name for parameter in tax_benefit_system.parameters.get_descendants()} assert all_parameters.issuperset({'taxes', 'taxes.housing_tax', 'taxes.housing_tax.minimal_amount'}) diff --git a/tests/core/test_simulation_builder.py b/tests/core/test_simulation_builder.py index 09e594cce1..33158b0da7 100644 --- a/tests/core/test_simulation_builder.py +++ b/tests/core/test_simulation_builder.py @@ -20,9 +20,6 @@ from openfisca_core.indexed_enums import Enum as OFEnum -from .test_countries import tax_benefit_system - - class TestVariable(Variable): definition_period = ETERNITY value_type = float @@ -121,7 +118,7 @@ def check_variable_defined_for_entity(self, variable_name): return Household("household", "households", "", "", roles) -def test_build_default_simulation(simulation_builder): +def test_build_default_simulation(tax_benefit_system, simulation_builder): one_person_simulation = simulation_builder.build_default_simulation(tax_benefit_system, 1) assert one_person_simulation.persons.count == 1 assert one_person_simulation.household.count == 1 @@ -135,7 +132,7 @@ def test_build_default_simulation(simulation_builder): assert (several_persons_simulation.household.members_role == Household.FIRST_PARENT).all() -def test_explicit_singular_entities(simulation_builder): +def test_explicit_singular_entities(tax_benefit_system, simulation_builder): assert simulation_builder.explicit_singular_entities( tax_benefit_system, {'persons': {'Javier': {}}, 'household': {'parents': ['Javier']}} @@ -275,7 +272,7 @@ def test_canonicalize_period_keys(simulation_builder, persons): assert_near(population.get_holder('salary').get_array('2018-12'), [100]) -def test_finalize_group_entity(simulation_builder): +def test_finalize_group_entity(tax_benefit_system, simulation_builder): simulation = Simulation(tax_benefit_system, tax_benefit_system.instantiate_entities()) simulation_builder.add_group_entity('persons', ['Alicia', 'Javier', 'Sarah', 'Tom'], simulation.household.entity, { 'Household_1': {'parents': ['Alicia', 'Javier']}, @@ -337,7 +334,7 @@ def test_allocate_person_twice(simulation_builder): assert exception.value.error == {'familles': {'famille1': {'parents': 'Alicia has been declared more than once in familles'}}} -def test_one_person_without_household(simulation_builder): +def test_one_person_without_household(tax_benefit_system, simulation_builder): simulation_dict = {'persons': {'Alicia': {}}} simulation = simulation_builder.build_from_dict(tax_benefit_system, simulation_dict) assert simulation.household.count == 1 @@ -345,7 +342,7 @@ def test_one_person_without_household(simulation_builder): assert parents_in_households.tolist() == [1] # household member default role is first_parent -def test_some_person_without_household(simulation_builder): +def test_some_person_without_household(tax_benefit_system, simulation_builder): input_yaml = """ persons: {'Alicia': {}, 'Bob': {}} household: {'parents': ['Alicia']} @@ -356,7 +353,7 @@ def test_some_person_without_household(simulation_builder): assert parents_in_households.tolist() == [1, 1] # household member default role is first_parent -def test_nb_persons_in_group_entity(simulation_builder): +def test_nb_persons_in_group_entity(tax_benefit_system, simulation_builder): persons_ids: Iterable = [2, 0, 1, 4, 3] households_ids: Iterable = ['c', 'a', 'b'] persons_households: Iterable = ['c', 'a', 'a', 'b', 'a'] @@ -371,7 +368,7 @@ def test_nb_persons_in_group_entity(simulation_builder): assert persons_in_households.tolist() == [1, 3, 1] -def test_nb_persons_no_role(simulation_builder): +def test_nb_persons_no_role(tax_benefit_system, simulation_builder): persons_ids: Iterable = [2, 0, 1, 4, 3] households_ids: Iterable = ['c', 'a', 'b'] persons_households: Iterable = ['c', 'a', 'a', 'b', 'a'] @@ -386,7 +383,7 @@ def test_nb_persons_no_role(simulation_builder): assert parents_in_households.tolist() == [1, 3, 1] # household member default role is first_parent -def test_nb_persons_by_role(simulation_builder): +def test_nb_persons_by_role(tax_benefit_system, simulation_builder): persons_ids: Iterable = [2, 0, 1, 4, 3] households_ids: Iterable = ['c', 'a', 'b'] persons_households: Iterable = ['c', 'a', 'a', 'b', 'a'] @@ -406,7 +403,7 @@ def test_nb_persons_by_role(simulation_builder): assert parents_in_households.tolist() == [0, 1, 1] -def test_integral_roles(simulation_builder): +def test_integral_roles(tax_benefit_system, simulation_builder): persons_ids: Iterable = [2, 0, 1, 4, 3] households_ids: Iterable = ['c', 'a', 'b'] persons_households: Iterable = ['c', 'a', 'a', 'b', 'a'] @@ -430,7 +427,7 @@ def test_integral_roles(simulation_builder): # Test Intégration -def test_from_person_variable_to_group(simulation_builder): +def test_from_person_variable_to_group(tax_benefit_system, simulation_builder): persons_ids: Iterable = [2, 0, 1, 4, 3] households_ids: Iterable = ['c', 'a', 'b'] @@ -456,7 +453,7 @@ def test_from_person_variable_to_group(simulation_builder): assert total_taxes / simulation.calculate('rent', period) == approx(1) -def test_simulation(simulation_builder): +def test_simulation(tax_benefit_system, simulation_builder): input_yaml = """ salary: 2016-10: 12000 @@ -469,7 +466,7 @@ def test_simulation(simulation_builder): simulation.calculate("total_taxes", "2016-10") -def test_vectorial_input(simulation_builder): +def test_vectorial_input(tax_benefit_system, simulation_builder): input_yaml = """ salary: 2016-10: [12000, 20000] @@ -482,13 +479,13 @@ def test_vectorial_input(simulation_builder): simulation.calculate("total_taxes", "2016-10") -def test_fully_specified_entities(simulation_builder): +def test_fully_specified_entities(tax_benefit_system, simulation_builder): simulation = simulation_builder.build_from_dict(tax_benefit_system, couple) assert simulation.household.count == 1 assert simulation.persons.count == 2 -def test_single_entity_shortcut(simulation_builder): +def test_single_entity_shortcut(tax_benefit_system, simulation_builder): input_yaml = """ persons: Alicia: {} @@ -501,7 +498,7 @@ def test_single_entity_shortcut(simulation_builder): assert simulation.household.count == 1 -def test_order_preserved(simulation_builder): +def test_order_preserved(tax_benefit_system, simulation_builder): input_yaml = """ persons: Javier: {} @@ -519,7 +516,7 @@ def test_order_preserved(simulation_builder): assert simulation.persons.ids == ['Javier', 'Alicia', 'Sarah', 'Tom'] -def test_inconsistent_input(simulation_builder): +def test_inconsistent_input(tax_benefit_system, simulation_builder): input_yaml = """ salary: 2016-10: [12000, 20000] diff --git a/tests/core/test_simulations.py b/tests/core/test_simulations.py index 6665cce8e1..0891769594 100644 --- a/tests/core/test_simulations.py +++ b/tests/core/test_simulations.py @@ -5,10 +5,8 @@ from openfisca_country_template.situation_examples import single -from .test_countries import tax_benefit_system - -def test_calculate_full_tracer(): +def test_calculate_full_tracer(tax_benefit_system): simulation = SimulationBuilder().build_default_simulation(tax_benefit_system) simulation.trace = True simulation.calculate('income_tax', '2017-01') @@ -29,12 +27,12 @@ def test_calculate_full_tracer(): assert income_tax_node.parameters[0].value == 0.15 -def test_get_entity_not_found(): +def test_get_entity_not_found(tax_benefit_system): simulation = SimulationBuilder().build_default_simulation(tax_benefit_system) assert simulation.get_entity(plural = "no_such_entities") is None -def test_clone(): +def test_clone(tax_benefit_system): simulation = SimulationBuilder().build_from_entities(tax_benefit_system, { "persons": { @@ -63,7 +61,7 @@ def test_clone(): assert salary_holder_clone.population == simulation_clone.persons -def test_get_memory_usage(): +def test_get_memory_usage(tax_benefit_system): simulation = SimulationBuilder().build_from_entities(tax_benefit_system, single) simulation.calculate('disposable_income', '2017-01') memory_usage = simulation.get_memory_usage(variables = ['salary']) diff --git a/tests/core/test_yaml.py b/tests/core/test_yaml.py index 2390eb6929..0d0c80d1bc 100644 --- a/tests/core/test_yaml.py +++ b/tests/core/test_yaml.py @@ -9,8 +9,6 @@ from openfisca_core.tools.test_runner import run_tests -from .test_countries import tax_benefit_system - openfisca_core_dir = pkg_resources.get_distribution('OpenFisca-Core').location yaml_tests_dir = os.path.join(openfisca_core_dir, 'tests', 'core', 'yaml_tests') @@ -18,7 +16,7 @@ EXIT_TESTSFAILED = 1 -def run_yaml_test(path, options = None): +def run_yaml_test(tax_benefit_system, path, options = None): yaml_path = os.path.join(yaml_tests_dir, path) if options is None: @@ -28,53 +26,53 @@ def run_yaml_test(path, options = None): return result -def test_success(): - assert run_yaml_test('test_success.yml') == EXIT_OK +def test_success(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'test_success.yml') == EXIT_OK -def test_fail(): - assert run_yaml_test('test_failure.yaml') == EXIT_TESTSFAILED +def test_fail(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'test_failure.yaml') == EXIT_TESTSFAILED -def test_relative_error_margin_success(): - assert run_yaml_test('test_relative_error_margin.yaml') == EXIT_OK +def test_relative_error_margin_success(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'test_relative_error_margin.yaml') == EXIT_OK -def test_relative_error_margin_fail(): - assert run_yaml_test('failing_test_relative_error_margin.yaml') == EXIT_TESTSFAILED +def test_relative_error_margin_fail(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'failing_test_relative_error_margin.yaml') == EXIT_TESTSFAILED -def test_absolute_error_margin_success(): - assert run_yaml_test('test_absolute_error_margin.yaml') == EXIT_OK +def test_absolute_error_margin_success(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'test_absolute_error_margin.yaml') == EXIT_OK -def test_absolute_error_margin_fail(): - assert run_yaml_test('failing_test_absolute_error_margin.yaml') == EXIT_TESTSFAILED +def test_absolute_error_margin_fail(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'failing_test_absolute_error_margin.yaml') == EXIT_TESTSFAILED -def test_run_tests_from_directory(): +def test_run_tests_from_directory(tax_benefit_system): dir_path = os.path.join(yaml_tests_dir, 'directory') - assert run_yaml_test(dir_path) == EXIT_OK + assert run_yaml_test(tax_benefit_system, dir_path) == EXIT_OK -def test_with_reform(): - assert run_yaml_test('test_with_reform.yaml') == EXIT_OK +def test_with_reform(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'test_with_reform.yaml') == EXIT_OK -def test_with_extension(): - assert run_yaml_test('test_with_extension.yaml') == EXIT_OK +def test_with_extension(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'test_with_extension.yaml') == EXIT_OK -def test_with_anchors(): - assert run_yaml_test('test_with_anchors.yaml') == EXIT_OK +def test_with_anchors(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, 'test_with_anchors.yaml') == EXIT_OK -def test_run_tests_from_directory_fail(): - assert run_yaml_test(yaml_tests_dir) == EXIT_TESTSFAILED +def test_run_tests_from_directory_fail(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, yaml_tests_dir) == EXIT_TESTSFAILED -def test_name_filter(): - assert run_yaml_test( +def test_name_filter(tax_benefit_system): + assert run_yaml_test(tax_benefit_system, yaml_tests_dir, options = {'name_filter': 'success'} ) == EXIT_OK diff --git a/tests/core/tools/test_assert_near.py b/tests/core/tools/test_assert_near.py index 597e3d612b..035ca07466 100644 --- a/tests/core/tools/test_assert_near.py +++ b/tests/core/tools/test_assert_near.py @@ -3,21 +3,19 @@ from openfisca_core.tools import assert_near -from ..test_countries import tax_benefit_system - def test_date(): assert_near(np.array("2012-03-24", dtype = 'datetime64[D]'), "2012-03-24") -def test_enum(): +def test_enum(tax_benefit_system): possible_values = tax_benefit_system.variables['housing_occupancy_status'].possible_values value = possible_values.encode(np.array(['tenant'])) expected_value = 'tenant' assert_near(value, expected_value) -def test_enum_2(): +def test_enum_2(tax_benefit_system): possible_values = tax_benefit_system.variables['housing_occupancy_status'].possible_values value = possible_values.encode(np.array(['tenant', 'owner'])) expected_value = ['tenant', 'owner'] From 88adca2693015eb85efbc1f8288a1c4fb5cee851 Mon Sep 17 00:00:00 2001 From: cescofran Date: Tue, 19 Jan 2021 22:40:48 +0100 Subject: [PATCH 02/36] Refactor test_simulation_builder fixtures --- tests/core/conftest.py | 107 +++++++++++++++++++++++++ tests/core/test_simulation_builder.py | 110 +------------------------- 2 files changed, 109 insertions(+), 108 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 7eeb7094ff..7bb65d730d 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -1,10 +1,27 @@ # -*- coding: utf-8 -*- +from enum import Enum +from datetime import date from pytest import fixture from openfisca_core.simulation_builder import SimulationBuilder from openfisca_country_template import CountryTaxBenefitSystem +from openfisca_core.variables import Variable +from openfisca_core.periods import ETERNITY +from openfisca_core.entities import Entity, GroupEntity +from openfisca_country_template.entities import Household +from openfisca_core.indexed_enums import Enum as OFEnum + + +class TestVariable(Variable): + definition_period = ETERNITY + value_type = float + + def __init__(self, entity): + self.__class__.entity = entity + super().__init__() + @fixture def tax_benefit_system(): @@ -32,3 +49,93 @@ def _make_simulation(tbs, data): builder.default_period = period return builder.build_from_variables(tbs, data) return _make_simulation + + +@fixture +def simulation_builder(): + return SimulationBuilder() + + +@fixture +def int_variable(persons): + + class intvar(Variable): + definition_period = ETERNITY + value_type = int + entity = persons + + def __init__(self): + super().__init__() + + return intvar() + + +@fixture +def date_variable(persons): + + class datevar(Variable): + definition_period = ETERNITY + value_type = date + entity = persons + + def __init__(self): + super().__init__() + + return datevar() + + +@fixture +def enum_variable(): + + class TestEnum(Variable): + definition_period = ETERNITY + value_type = OFEnum + dtype = 'O' + default_value = '0' + is_neutralized = False + set_input = None + possible_values = Enum('foo', 'bar') + name = "enum" + + def __init__(self): + pass + + return TestEnum() + + +@fixture +def persons(): + class TestPersonEntity(Entity): + def get_variable(self, variable_name): + result = TestVariable(self) + result.name = variable_name + return result + + def check_variable_defined_for_entity(self, variable_name): + return True + + return TestPersonEntity("person", "persons", "", "") + + +@fixture +def group_entity(): + class Household(GroupEntity): + def get_variable(self, variable_name): + result = TestVariable(self) + result.name = variable_name + return result + + def check_variable_defined_for_entity(self, variable_name): + return True + + roles = [{ + 'key': 'parent', + 'plural': 'parents', + 'max': 2 + }, { + 'key': 'child', + 'plural': 'children' + }] + + return Household("household", "households", "", "", roles) + diff --git a/tests/core/test_simulation_builder.py b/tests/core/test_simulation_builder.py index 33158b0da7..2ae9c6196e 100644 --- a/tests/core/test_simulation_builder.py +++ b/tests/core/test_simulation_builder.py @@ -1,121 +1,15 @@ # -*- coding: utf-8 -*- from typing import Iterable +from pytest import raises, approx -from enum import Enum -from datetime import date - -from pytest import raises, fixture, approx - -from openfisca_core.simulation_builder import SimulationBuilder, Simulation +from openfisca_core.simulation_builder import Simulation from openfisca_core.tools import assert_near from openfisca_core.tools.test_runner import yaml -from openfisca_core.entities import Entity, GroupEntity from openfisca_core.populations import Population -from openfisca_core.variables import Variable from openfisca_country_template.entities import Household from openfisca_country_template.situation_examples import couple from openfisca_core.errors import SituationParsingError -from openfisca_core.periods import ETERNITY -from openfisca_core.indexed_enums import Enum as OFEnum - - -class TestVariable(Variable): - definition_period = ETERNITY - value_type = float - - def __init__(self, entity): - self.__class__.entity = entity - super().__init__() - - -@fixture -def simulation_builder(): - return SimulationBuilder() - - -@fixture -def int_variable(persons): - - class intvar(Variable): - definition_period = ETERNITY - value_type = int - entity = persons - - def __init__(self): - super().__init__() - - return intvar() - - -@fixture -def date_variable(persons): - - class datevar(Variable): - definition_period = ETERNITY - value_type = date - entity = persons - - def __init__(self): - super().__init__() - - return datevar() - - -@fixture -def enum_variable(): - - class TestEnum(Variable): - definition_period = ETERNITY - value_type = OFEnum - dtype = 'O' - default_value = '0' - is_neutralized = False - set_input = None - possible_values = Enum('foo', 'bar') - name = "enum" - - def __init__(self): - pass - - return TestEnum() - - -@fixture -def persons(): - class TestPersonEntity(Entity): - def get_variable(self, variable_name): - result = TestVariable(self) - result.name = variable_name - return result - - def check_variable_defined_for_entity(self, variable_name): - return True - - return TestPersonEntity("person", "persons", "", "") - - -@fixture -def group_entity(): - class Household(GroupEntity): - def get_variable(self, variable_name): - result = TestVariable(self) - result.name = variable_name - return result - - def check_variable_defined_for_entity(self, variable_name): - return True - - roles = [{ - 'key': 'parent', - 'plural': 'parents', - 'max': 2 - }, { - 'key': 'child', - 'plural': 'children' - }] - - return Household("household", "households", "", "", roles) def test_build_default_simulation(tax_benefit_system, simulation_builder): From 1cd22b7bc0324f9007700b1b79f6b458c5e8730b Mon Sep 17 00:00:00 2001 From: cescofran Date: Tue, 19 Jan 2021 22:45:27 +0100 Subject: [PATCH 03/36] Add new fixtures in conftest --- tests/core/conftest.py | 46 ++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 7bb65d730d..65d19006fd 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -28,32 +28,44 @@ def tax_benefit_system(): return CountryTaxBenefitSystem() +@fixture +def simulation_builder(): + return SimulationBuilder() + + @fixture def period(): return "2016-01" @fixture -def make_simulation(tax_benefit_system, period): +def make_simulation(tax_benefit_system, simulation_builder, period): def _make_simulation(data): - builder = SimulationBuilder() - builder.default_period = period - return builder.build_from_variables(tax_benefit_system, data) + simulation_builder.default_period = period + return simulation_builder.build_from_variables(tax_benefit_system, data) return _make_simulation @fixture -def make_isolated_simulation(period): +def make_isolated_simulation(simulation_builder, period): def _make_simulation(tbs, data): - builder = SimulationBuilder() - builder.default_period = period - return builder.build_from_variables(tbs, data) + simulation_builder.default_period = period + return simulation_builder.build_from_variables(tbs, data) return _make_simulation @fixture -def simulation_builder(): - return SimulationBuilder() +def persons(): + class TestPersonEntity(Entity): + def get_variable(self, variable_name): + result = TestVariable(self) + result.name = variable_name + return result + + def check_variable_defined_for_entity(self, variable_name): + return True + + return TestPersonEntity("person", "persons", "", "") @fixture @@ -103,20 +115,6 @@ def __init__(self): return TestEnum() -@fixture -def persons(): - class TestPersonEntity(Entity): - def get_variable(self, variable_name): - result = TestVariable(self) - result.name = variable_name - return result - - def check_variable_defined_for_entity(self, variable_name): - return True - - return TestPersonEntity("person", "persons", "", "") - - @fixture def group_entity(): class Household(GroupEntity): From 542490f5720859363cbcdc150b4fef21029b5bb5 Mon Sep 17 00:00:00 2001 From: cescofran Date: Tue, 19 Jan 2021 22:47:31 +0100 Subject: [PATCH 04/36] Introduce simulator_builder fixture in test_simulations --- tests/core/test_simulations.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/core/test_simulations.py b/tests/core/test_simulations.py index 0891769594..f78ebe97e4 100644 --- a/tests/core/test_simulations.py +++ b/tests/core/test_simulations.py @@ -1,13 +1,10 @@ # -*- coding: utf-8 -*- - -from openfisca_core.simulation_builder import SimulationBuilder - from openfisca_country_template.situation_examples import single -def test_calculate_full_tracer(tax_benefit_system): - simulation = SimulationBuilder().build_default_simulation(tax_benefit_system) +def test_calculate_full_tracer(tax_benefit_system, simulation_builder): + simulation = simulation_builder.build_default_simulation(tax_benefit_system) simulation.trace = True simulation.calculate('income_tax', '2017-01') @@ -27,13 +24,13 @@ def test_calculate_full_tracer(tax_benefit_system): assert income_tax_node.parameters[0].value == 0.15 -def test_get_entity_not_found(tax_benefit_system): - simulation = SimulationBuilder().build_default_simulation(tax_benefit_system) +def test_get_entity_not_found(tax_benefit_system, simulation_builder): + simulation = simulation_builder.build_default_simulation(tax_benefit_system) assert simulation.get_entity(plural = "no_such_entities") is None -def test_clone(tax_benefit_system): - simulation = SimulationBuilder().build_from_entities(tax_benefit_system, +def test_clone(tax_benefit_system, simulation_builder): + simulation = simulation_builder.build_from_entities(tax_benefit_system, { "persons": { "bill": {"salary": {"2017-01": 3000}}, @@ -61,8 +58,8 @@ def test_clone(tax_benefit_system): assert salary_holder_clone.population == simulation_clone.persons -def test_get_memory_usage(tax_benefit_system): - simulation = SimulationBuilder().build_from_entities(tax_benefit_system, single) +def test_get_memory_usage(tax_benefit_system, simulation_builder): + simulation = simulation_builder.build_from_entities(tax_benefit_system, single) simulation.calculate('disposable_income', '2017-01') memory_usage = simulation.get_memory_usage(variables = ['salary']) assert(memory_usage['total_nb_bytes'] > 0) From 47af3cfc606b6db706eee174853b1fa783d67654 Mon Sep 17 00:00:00 2001 From: cescofran Date: Tue, 19 Jan 2021 22:48:57 +0100 Subject: [PATCH 05/36] Create single fixture --- tests/core/conftest.py | 20 ++++++++++++++++++++ tests/core/test_simulations.py | 5 +---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 65d19006fd..558967944e 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -137,3 +137,23 @@ def check_variable_defined_for_entity(self, variable_name): return Household("household", "households", "", "", roles) + +@fixture +def single(): + return { + "persons": { + "Alicia": { + "birth": { + "2017-01": None + }, + "disposable_income": { + "2017-01": None + } + } + }, + "households": { + "_": { + "parents": ["Alicia"] + } + } + } diff --git a/tests/core/test_simulations.py b/tests/core/test_simulations.py index f78ebe97e4..28df89df90 100644 --- a/tests/core/test_simulations.py +++ b/tests/core/test_simulations.py @@ -1,8 +1,5 @@ # -*- coding: utf-8 -*- -from openfisca_country_template.situation_examples import single - - def test_calculate_full_tracer(tax_benefit_system, simulation_builder): simulation = simulation_builder.build_default_simulation(tax_benefit_system) simulation.trace = True @@ -58,7 +55,7 @@ def test_clone(tax_benefit_system, simulation_builder): assert salary_holder_clone.population == simulation_clone.persons -def test_get_memory_usage(tax_benefit_system, simulation_builder): +def test_get_memory_usage(tax_benefit_system, simulation_builder, single): simulation = simulation_builder.build_from_entities(tax_benefit_system, single) simulation.calculate('disposable_income', '2017-01') memory_usage = simulation.get_memory_usage(variables = ['salary']) From 91b07353eb106bd372d0f486f4f11c2b910eb15d Mon Sep 17 00:00:00 2001 From: cescofran Date: Tue, 19 Jan 2021 22:51:54 +0100 Subject: [PATCH 06/36] Refactor test_formulas fixtures --- tests/core/test_formulas.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/core/test_formulas.py b/tests/core/test_formulas.py index 19dd6bbf4e..8e8693f37b 100644 --- a/tests/core/test_formulas.py +++ b/tests/core/test_formulas.py @@ -1,13 +1,10 @@ # -*- coding: utf-8 -*- - import numpy as np from openfisca_core.periods import MONTH -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_core.variables import Variable from openfisca_core.formula_helpers import switch -from openfisca_country_template import CountryTaxBenefitSystem from openfisca_country_template.entities import Person from pytest import fixture, approx @@ -59,9 +56,10 @@ def formula(person, period): return result -# TaxBenefitSystem instance declared after formulas -our_tbs = CountryTaxBenefitSystem() -our_tbs.add_variables(choice, uses_multiplication, uses_switch, returns_scalar) +@fixture +def our_tbs(tax_benefit_system): + tax_benefit_system.add_variables(choice, uses_multiplication, uses_switch, returns_scalar) + return tax_benefit_system @fixture @@ -70,10 +68,12 @@ def month(): @fixture -def simulation(month): - builder = SimulationBuilder() - builder.default_period = month - simulation = builder.build_from_variables(our_tbs, {'choice': np.random.randint(2, size = 1000) + 1}) +def simulation(our_tbs, simulation_builder, month): + simulation_builder.default_period = month + simulation = simulation_builder.build_from_variables( + our_tbs, + {'choice': np.random.randint(2, size = 1000) + 1} + ) simulation.debug = True return simulation From ffc1d1c7452672b5535d4b2cc9b7d5123b9efa83 Mon Sep 17 00:00:00 2001 From: Mahdi Ben Jelloul Date: Wed, 20 Jan 2021 09:57:43 +0100 Subject: [PATCH 07/36] flake8 --- tests/core/conftest.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 558967944e..ac8c8ad2c4 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -10,7 +10,6 @@ from openfisca_core.variables import Variable from openfisca_core.periods import ETERNITY from openfisca_core.entities import Entity, GroupEntity -from openfisca_country_template.entities import Household from openfisca_core.indexed_enums import Enum as OFEnum @@ -141,19 +140,19 @@ def check_variable_defined_for_entity(self, variable_name): @fixture def single(): return { - "persons": { - "Alicia": { - "birth": { - "2017-01": None - }, - "disposable_income": { - "2017-01": None - } - } - }, - "households": { - "_": { - "parents": ["Alicia"] - } - } - } + "persons": { + "Alicia": { + "birth": { + "2017-01": None + }, + "disposable_income": { + "2017-01": None + } + } + }, + "households": { + "_": { + "parents": ["Alicia"] + } + } + } From 361941b5347fc5c1100b42f76d29f99e0afb2e24 Mon Sep 17 00:00:00 2001 From: cescofran Date: Wed, 20 Jan 2021 23:22:07 +0100 Subject: [PATCH 08/36] Add single fixture to test_calculate_output --- tests/core/test_calculate_output.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/core/test_calculate_output.py b/tests/core/test_calculate_output.py index 63959155d2..9e3eb82529 100644 --- a/tests/core/test_calculate_output.py +++ b/tests/core/test_calculate_output.py @@ -4,13 +4,12 @@ from openfisca_country_template import CountryTaxBenefitSystem from openfisca_country_template.entities import * # noqa analysis:ignore -from openfisca_country_template.situation_examples import single from pytest import fixture, raises @fixture -def simulation(): +def simulation(single): return SimulationBuilder().build_from_entities(tax_benefit_system, single) From f4aff8cf809231a65f0726e653bf39f547e88af2 Mon Sep 17 00:00:00 2001 From: cescofran Date: Wed, 20 Jan 2021 23:23:10 +0100 Subject: [PATCH 09/36] Add single fixture to test_entities --- tests/core/test_entities.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index a78e9c7c48..1c7d4165be 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -6,7 +6,7 @@ from openfisca_core.tools import assert_near from openfisca_core.tools.test_runner import yaml from openfisca_country_template.entities import Household -from openfisca_country_template.situation_examples import single, couple +from openfisca_country_template.situation_examples import couple TEST_CASE = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}, 'ind4': {}, 'ind5': {}}, @@ -423,7 +423,7 @@ def test_sum_following_bug_ipp_2(tax_benefit_system): assert_near(nb_eligibles_by_household, [2, 0]) -def test_get_memory_usage(tax_benefit_system): +def test_get_memory_usage(tax_benefit_system, single): test_case = deepcopy(single) test_case["persons"]["Alicia"]["salary"] = {"2017-01": 0} simulation = SimulationBuilder().build_from_dict(tax_benefit_system, test_case) From f5debc3aab246c037e7817ddbddeb9ffec247089 Mon Sep 17 00:00:00 2001 From: cescofran Date: Wed, 20 Jan 2021 23:25:57 +0100 Subject: [PATCH 10/36] Add couple to conftest --- tests/core/conftest.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index ac8c8ad2c4..eaee93566e 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -156,3 +156,44 @@ def single(): } } } + + +@fixture +def couple(): + return { + "persons": { + "Alicia": { + "birth": { + "ETERNITY": "1980-01-01" + }, + "salary": { + "2017-01": 4000 + }, + "disposable_income": { + "2017-01": None + } + }, + "Javier": { + "birth": { + "ETERNITY": "1984-01-01" + }, + "salary": { + "2017-01": 2500 + }, + "disposable_income": { + "2017-01": None + } + } + }, + "households": { + "_": { + "parents": ["Alicia", "Javier"], + "total_benefits": { + "2017-01": None + }, + "total_taxes": { + "2017-01": None + } + } + } +} From 65ac243e890d52983b9325874a66263d31acadae Mon Sep 17 00:00:00 2001 From: cescofran Date: Wed, 20 Jan 2021 23:27:46 +0100 Subject: [PATCH 11/36] Add couple to dump_restore --- tests/core/test_dump_restore.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/core/test_dump_restore.py b/tests/core/test_dump_restore.py index 34239985c5..96a18fc15d 100644 --- a/tests/core/test_dump_restore.py +++ b/tests/core/test_dump_restore.py @@ -7,11 +7,10 @@ from numpy.testing import assert_array_equal from openfisca_core.simulation_builder import SimulationBuilder -from openfisca_country_template.situation_examples import couple from openfisca_core.tools.simulation_dumper import dump_simulation, restore_simulation -def test_dump(tax_benefit_system): +def test_dump(tax_benefit_system, couple): directory = tempfile.mkdtemp(prefix = "openfisca_") simulation = SimulationBuilder().build_from_entities(tax_benefit_system, couple) calculated_value = simulation.calculate('disposable_income', '2018-01') From 31d53aa0f61a8af0472f826284bd80f2523fad62 Mon Sep 17 00:00:00 2001 From: cescofran Date: Wed, 20 Jan 2021 23:29:01 +0100 Subject: [PATCH 12/36] Add couple to test_entities --- tests/core/test_entities.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index 1c7d4165be..212671ed52 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -6,7 +6,6 @@ from openfisca_core.tools import assert_near from openfisca_core.tools.test_runner import yaml from openfisca_country_template.entities import Household -from openfisca_country_template.situation_examples import couple TEST_CASE = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}, 'ind4': {}, 'ind5': {}}, @@ -362,7 +361,7 @@ def test_value_from_first_person(tax_benefit_system): assert_near(salary_first_person, [1000, 3000]) -def test_projectors_methods(tax_benefit_system): +def test_projectors_methods(tax_benefit_system, couple): simulation = SimulationBuilder().build_from_dict(tax_benefit_system, couple) household = simulation.household person = simulation.person From cb48a5dd14d16a572b4fe40444d9c24eb4a8c43b Mon Sep 17 00:00:00 2001 From: cescofran Date: Wed, 20 Jan 2021 23:30:16 +0100 Subject: [PATCH 13/36] Add couple to test_simulation_builder --- tests/core/test_simulation_builder.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/core/test_simulation_builder.py b/tests/core/test_simulation_builder.py index 2ae9c6196e..72b255ed0a 100644 --- a/tests/core/test_simulation_builder.py +++ b/tests/core/test_simulation_builder.py @@ -8,7 +8,6 @@ from openfisca_core.tools.test_runner import yaml from openfisca_core.populations import Population from openfisca_country_template.entities import Household -from openfisca_country_template.situation_examples import couple from openfisca_core.errors import SituationParsingError @@ -373,7 +372,7 @@ def test_vectorial_input(tax_benefit_system, simulation_builder): simulation.calculate("total_taxes", "2016-10") -def test_fully_specified_entities(tax_benefit_system, simulation_builder): +def test_fully_specified_entities(tax_benefit_system, simulation_builder, couple): simulation = simulation_builder.build_from_dict(tax_benefit_system, couple) assert simulation.household.count == 1 assert simulation.persons.count == 2 From be404c0561581e6882106fb01533b748fb8ac4e7 Mon Sep 17 00:00:00 2001 From: cescofran Date: Wed, 20 Jan 2021 23:47:07 +0100 Subject: [PATCH 14/36] Add simulation_single simulation_couple --- tests/core/conftest.py | 9 +++ tests/core/test_holders.py | 154 +++++++++++++++---------------------- 2 files changed, 73 insertions(+), 90 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index eaee93566e..f90c1fea0d 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -197,3 +197,12 @@ def couple(): } } } + +@fixture +def simulation_single(simulation_builder, tax_benefit_system, single): + return simulation_builder.build_from_entities(tax_benefit_system, single) + + +@fixture +def simulation_couple(simulation_builder, tax_benefit_system, couple): + return simulation_builder.build_from_entities(tax_benefit_system, couple) diff --git a/tests/core/test_holders.py b/tests/core/test_holders.py index f3234dd31c..6edb5f1786 100644 --- a/tests/core/test_holders.py +++ b/tests/core/test_holders.py @@ -15,78 +15,62 @@ from pytest import fixture -@fixture -def single(tax_benefit_system): - return SimulationBuilder().build_from_entities(tax_benefit_system, openfisca_country_template.situation_examples.single) - - -@fixture -def couple(tax_benefit_system): - return SimulationBuilder().build_from_entities(tax_benefit_system, openfisca_country_template.situation_examples.couple) - - period = make_period('2017-12') -def test_set_input_enum_string(couple): - simulation = couple +def test_set_input_enum_string(simulation_couple): status_occupancy = np.asarray(['free_lodger']) - simulation.household.get_holder('housing_occupancy_status').set_input(period, status_occupancy) - result = simulation.calculate('housing_occupancy_status', period) + simulation_couple.household.get_holder('housing_occupancy_status').set_input(period, status_occupancy) + result = simulation_couple.calculate('housing_occupancy_status', period) assert result == HousingOccupancyStatus.free_lodger -def test_set_input_enum_int(couple): - simulation = couple +def test_set_input_enum_int(simulation_couple): status_occupancy = np.asarray([2], dtype = np.int16) - simulation.household.get_holder('housing_occupancy_status').set_input(period, status_occupancy) - result = simulation.calculate('housing_occupancy_status', period) + simulation_couple.household.get_holder('housing_occupancy_status').set_input(period, status_occupancy) + result = simulation_couple.calculate('housing_occupancy_status', period) assert result == HousingOccupancyStatus.free_lodger -def test_set_input_enum_item(couple): - simulation = couple +def test_set_input_enum_item(simulation_couple): status_occupancy = np.asarray([HousingOccupancyStatus.free_lodger]) - simulation.household.get_holder('housing_occupancy_status').set_input(period, status_occupancy) - result = simulation.calculate('housing_occupancy_status', period) + simulation_couple.household.get_holder('housing_occupancy_status').set_input(period, status_occupancy) + result = simulation_couple.calculate('housing_occupancy_status', period) assert result == HousingOccupancyStatus.free_lodger -def test_yearly_input_month_variable(couple): +def test_yearly_input_month_variable(simulation_couple): with pytest.raises(PeriodMismatchError) as error: - couple.set_input('rent', 2019, 3000) + simulation_couple.set_input('rent', 2019, 3000) assert 'Unable to set a value for variable "rent" for year-long period' in error.value.message -def test_3_months_input_month_variable(couple): +def test_3_months_input_month_variable(simulation_couple): with pytest.raises(PeriodMismatchError) as error: - couple.set_input('rent', 'month:2019-01:3', 3000) + simulation_couple.set_input('rent', 'month:2019-01:3', 3000) assert 'Unable to set a value for variable "rent" for 3-months-long period' in error.value.message -def test_month_input_year_variable(couple): +def test_month_input_year_variable(simulation_couple): with pytest.raises(PeriodMismatchError) as error: - couple.set_input('housing_tax', '2019-01', 3000) + simulation_couple.set_input('housing_tax', '2019-01', 3000) assert 'Unable to set a value for variable "housing_tax" for month-long period' in error.value.message -def test_enum_dtype(couple): - simulation = couple +def test_enum_dtype(simulation_couple): status_occupancy = np.asarray([2], dtype = np.int16) - simulation.household.get_holder('housing_occupancy_status').set_input(period, status_occupancy) - result = simulation.calculate('housing_occupancy_status', period) + simulation_couple.household.get_holder('housing_occupancy_status').set_input(period, status_occupancy) + result = simulation_couple.calculate('housing_occupancy_status', period) assert result.dtype.kind is not None -def test_permanent_variable_empty(single): - simulation = single - holder = simulation.person.get_holder('birth') +def test_permanent_variable_empty(simulation_single): + holder = simulation_single.person.get_holder('birth') assert holder.get_array(None) is None -def test_permanent_variable_filled(single): - simulation = single - holder = simulation.person.get_holder('birth') +def test_permanent_variable_filled(simulation_single): + holder = simulation_single.person.get_holder('birth') value = np.asarray(['1980-01-01'], dtype = holder.variable.dtype) holder.set_input(make_period(ETERNITY), value) assert holder.get_array(None) == value @@ -94,22 +78,20 @@ def test_permanent_variable_filled(single): assert holder.get_array('2016-01') == value -def test_delete_arrays(single): - simulation = single - salary_holder = simulation.person.get_holder('salary') +def test_delete_arrays(simulation_single): + salary_holder = simulation_single.person.get_holder('salary') salary_holder.set_input(make_period(2017), np.asarray([30000])) salary_holder.set_input(make_period(2018), np.asarray([60000])) - assert simulation.person('salary', '2017-01') == 2500 - assert simulation.person('salary', '2018-01') == 5000 + assert simulation_single.person('salary', '2017-01') == 2500 + assert simulation_single.person('salary', '2018-01') == 5000 salary_holder.delete_arrays(period = 2018) salary_holder.set_input(make_period(2018), np.asarray([15000])) - assert simulation.person('salary', '2017-01') == 2500 - assert simulation.person('salary', '2018-01') == 1250 + assert simulation_single.person('salary', '2017-01') == 2500 + assert simulation_single.person('salary', '2018-01') == 1250 -def test_get_memory_usage(single): - simulation = single - salary_holder = simulation.person.get_holder('salary') +def test_get_memory_usage(simulation_single): + salary_holder = simulation_single.person.get_holder('salary') memory_usage = salary_holder.get_memory_usage() assert memory_usage['total_nb_bytes'] == 0 salary_holder.set_input(make_period(2017), np.asarray([30000])) @@ -121,24 +103,22 @@ def test_get_memory_usage(single): assert memory_usage['total_nb_bytes'] == 4 * 12 * 1 -def test_get_memory_usage_with_trace(single): - simulation = single - simulation.trace = True - salary_holder = simulation.person.get_holder('salary') +def test_get_memory_usage_with_trace(simulation_single): + simulation_single.trace = True + salary_holder = simulation_single.person.get_holder('salary') salary_holder.set_input(make_period(2017), np.asarray([30000])) - simulation.calculate('salary', '2017-01') - simulation.calculate('salary', '2017-01') - simulation.calculate('salary', '2017-02') - simulation.calculate_add('salary', '2017') # 12 calculations + simulation_single.calculate('salary', '2017-01') + simulation_single.calculate('salary', '2017-01') + simulation_single.calculate('salary', '2017-02') + simulation_single.calculate_add('salary', '2017') # 12 calculations memory_usage = salary_holder.get_memory_usage() assert memory_usage['nb_requests'] == 15 assert memory_usage['nb_requests_by_array'] == 1.25 # 15 calculations / 12 arrays -def test_set_input_dispatch_by_period(single): - simulation = single - variable = simulation.tax_benefit_system.get_variable('housing_occupancy_status') - entity = simulation.household +def test_set_input_dispatch_by_period(simulation_single): + variable = simulation_single.tax_benefit_system.get_variable('housing_occupancy_status') + entity = simulation_single.household holder = Holder(variable, entity) set_input_dispatch_by_period(holder, make_period(2019), 'owner') assert holder.get_array('2019-01') == holder.get_array('2019-12') # Check the feature @@ -148,37 +128,34 @@ def test_set_input_dispatch_by_period(single): force_storage_on_disk = MemoryConfig(max_memory_occupation = 0) -def test_delete_arrays_on_disk(single): - simulation = single - simulation.memory_config = force_storage_on_disk - salary_holder = simulation.person.get_holder('salary') +def test_delete_arrays_on_disk(simulation_single): + simulation_single.memory_config = force_storage_on_disk + salary_holder = simulation_single.person.get_holder('salary') salary_holder.set_input(make_period(2017), np.asarray([30000])) salary_holder.set_input(make_period(2018), np.asarray([60000])) - assert simulation.person('salary', '2017-01') == 2500 - assert simulation.person('salary', '2018-01') == 5000 + assert simulation_single.person('salary', '2017-01') == 2500 + assert simulation_single.person('salary', '2018-01') == 5000 salary_holder.delete_arrays(period = 2018) salary_holder.set_input(make_period(2018), np.asarray([15000])) - assert simulation.person('salary', '2017-01') == 2500 - assert simulation.person('salary', '2018-01') == 1250 + assert simulation_single.person('salary', '2017-01') == 2500 + assert simulation_single.person('salary', '2018-01') == 1250 -def test_cache_disk(couple): - simulation = couple - simulation.memory_config = force_storage_on_disk +def test_cache_disk(simulation_couple): + simulation_couple.memory_config = force_storage_on_disk month = make_period('2017-01') - holder = simulation.person.get_holder('disposable_income') + holder = simulation_couple.person.get_holder('disposable_income') data = np.asarray([2000, 3000]) holder.put_in_cache(data, month) stored_data = holder.get_array(month) assert_near(data, stored_data) -def test_known_periods(couple): - simulation = couple - simulation.memory_config = force_storage_on_disk +def test_known_periods(simulation_couple): + simulation_couple.memory_config = force_storage_on_disk month = make_period('2017-01') month_2 = make_period('2017-02') - holder = simulation.person.get_holder('disposable_income') + holder = simulation_couple.person.get_holder('disposable_income') data = np.asarray([2000, 3000]) holder.put_in_cache(data, month) holder._memory_storage.put(data, month_2) @@ -186,28 +163,25 @@ def test_known_periods(couple): assert sorted(holder.get_known_periods()), [month == month_2] -def test_cache_enum_on_disk(single): - simulation = single - simulation.memory_config = force_storage_on_disk +def test_cache_enum_on_disk(simulation_single): + simulation_single.memory_config = force_storage_on_disk month = make_period('2017-01') - simulation.calculate('housing_occupancy_status', month) # First calculation - housing_occupancy_status = simulation.calculate('housing_occupancy_status', month) # Read from cache + simulation_single.calculate('housing_occupancy_status', month) # First calculation + housing_occupancy_status = simulation_single.calculate('housing_occupancy_status', month) # Read from cache assert housing_occupancy_status == HousingOccupancyStatus.tenant -def test_set_not_cached_variable(single): +def test_set_not_cached_variable(simulation_single): dont_cache_variable = MemoryConfig(max_memory_occupation = 1, variables_to_drop = ['salary']) - simulation = single - simulation.memory_config = dont_cache_variable - holder = simulation.person.get_holder('salary') + simulation_single.memory_config = dont_cache_variable + holder = simulation_single.person.get_holder('salary') array = np.asarray([2000]) holder.set_input('2015-01', array) - assert simulation.calculate('salary', '2015-01') == array + assert simulation_single.calculate('salary', '2015-01') == array -def test_set_input_float_to_int(single): - simulation = single +def test_set_input_float_to_int(simulation_single): age = np.asarray([50.6]) - simulation.person.get_holder('age').set_input(period, age) - result = simulation.calculate('age', period) + simulation_single.person.get_holder('age').set_input(period, age) + result = simulation_single.calculate('age', period) assert result == np.asarray([50]) From 81894f92eb125799aca56d7e838d75858e9feda5 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 00:01:19 +0100 Subject: [PATCH 15/36] Fix undefined variables --- tests/core/test_dump_restore.py | 22 ++++++++++------------ tests/core/test_entities.py | 7 +++---- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/tests/core/test_dump_restore.py b/tests/core/test_dump_restore.py index 96a18fc15d..3f6117643c 100644 --- a/tests/core/test_dump_restore.py +++ b/tests/core/test_dump_restore.py @@ -6,27 +6,25 @@ from numpy.testing import assert_array_equal -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_core.tools.simulation_dumper import dump_simulation, restore_simulation -def test_dump(tax_benefit_system, couple): +def test_dump(tax_benefit_system, simulation_single): directory = tempfile.mkdtemp(prefix = "openfisca_") - simulation = SimulationBuilder().build_from_entities(tax_benefit_system, couple) - calculated_value = simulation.calculate('disposable_income', '2018-01') - dump_simulation(simulation, directory) + calculated_value = simulation_single.calculate('disposable_income', '2018-01') + dump_simulation(simulation_single, directory) simulation_2 = restore_simulation(directory, tax_benefit_system) # Check entities structure have been restored - assert_array_equal(simulation.person.ids, simulation_2.person.ids) - assert_array_equal(simulation.person.count, simulation_2.person.count) - assert_array_equal(simulation.household.ids, simulation_2.household.ids) - assert_array_equal(simulation.household.count, simulation_2.household.count) - assert_array_equal(simulation.household.members_position, simulation_2.household.members_position) - assert_array_equal(simulation.household.members_entity_id, simulation_2.household.members_entity_id) - assert_array_equal(simulation.household.members_role, simulation_2.household.members_role) + assert_array_equal(simulation_single.person.ids, simulation_2.person.ids) + assert_array_equal(simulation_single.person.count, simulation_2.person.count) + assert_array_equal(simulation_single.household.ids, simulation_2.household.ids) + assert_array_equal(simulation_single.household.count, simulation_2.household.count) + assert_array_equal(simulation_single.household.members_position, simulation_2.household.members_position) + assert_array_equal(simulation_single.household.members_entity_id, simulation_2.household.members_entity_id) + assert_array_equal(simulation_single.household.members_role, simulation_2.household.members_role) # Check calculated values are in cache diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index 212671ed52..c1bef18da5 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -361,10 +361,9 @@ def test_value_from_first_person(tax_benefit_system): assert_near(salary_first_person, [1000, 3000]) -def test_projectors_methods(tax_benefit_system, couple): - simulation = SimulationBuilder().build_from_dict(tax_benefit_system, couple) - household = simulation.household - person = simulation.person +def test_projectors_methods(simulation_couple): + household = simulation_couple.household + person = simulation_couple.person projected_vector = household.first_parent.has_role(Household.FIRST_PARENT) assert(len(projected_vector) == 1) # Must be of a household dimension From eca7b51b69d3ac5c7ba289dd0200060ba2fa2740 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 00:02:48 +0100 Subject: [PATCH 16/36] Add single to test_calculate_ and fix fix F401 --- tests/core/test_calculate_output.py | 28 +++++++++++----------------- tests/core/test_holders.py | 4 ---- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/tests/core/test_calculate_output.py b/tests/core/test_calculate_output.py index 9e3eb82529..cdb6e8a87f 100644 --- a/tests/core/test_calculate_output.py +++ b/tests/core/test_calculate_output.py @@ -1,16 +1,10 @@ from openfisca_core.model_api import * # noqa analysis:ignore -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_core.tools import assert_near from openfisca_country_template import CountryTaxBenefitSystem from openfisca_country_template.entities import * # noqa analysis:ignore -from pytest import fixture, raises - - -@fixture -def simulation(single): - return SimulationBuilder().build_from_entities(tax_benefit_system, single) +from pytest import raises class simple_variable(Variable): @@ -41,18 +35,18 @@ class variable_with_calculate_output_divide(Variable): ) -def test_calculate_output_default(simulation): +def test_calculate_output_default(simulation_single): with raises(ValueError): - simulation.calculate_output('simple_variable', 2017) + simulation_single.calculate_output('simple_variable', 2017) -def test_calculate_output_add(simulation): - simulation.set_input('variable_with_calculate_output_add', '2017-01', [10]) - simulation.set_input('variable_with_calculate_output_add', '2017-05', [20]) - simulation.set_input('variable_with_calculate_output_add', '2017-12', [70]) - assert_near(simulation.calculate_output('variable_with_calculate_output_add', 2017), 100) +def test_calculate_output_add(simulation_single): + simulation_single.set_input('variable_with_calculate_output_add', '2017-01', [10]) + simulation_single.set_input('variable_with_calculate_output_add', '2017-05', [20]) + simulation_single.set_input('variable_with_calculate_output_add', '2017-12', [70]) + assert_near(simulation_single.calculate_output('variable_with_calculate_output_add', 2017), 100) -def test_calculate_output_divide(simulation): - simulation.set_input('variable_with_calculate_output_divide', 2017, [12000]) - assert_near(simulation.calculate_output('variable_with_calculate_output_divide', '2017-06'), 1000) +def test_calculate_output_divide(simulation_single): + simulation_single.set_input('variable_with_calculate_output_divide', 2017, [12000]) + assert_near(simulation_single.calculate_output('variable_with_calculate_output_divide', '2017-06'), 1000) diff --git a/tests/core/test_holders.py b/tests/core/test_holders.py index 6edb5f1786..46bc1cbf29 100644 --- a/tests/core/test_holders.py +++ b/tests/core/test_holders.py @@ -3,8 +3,6 @@ import numpy as np import pytest -import openfisca_country_template.situation_examples -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_country_template.variables.housing import HousingOccupancyStatus from openfisca_core.periods import period as make_period, ETERNITY from openfisca_core.tools import assert_near @@ -12,8 +10,6 @@ from openfisca_core.holders import Holder, set_input_dispatch_by_period from openfisca_core.errors import PeriodMismatchError -from pytest import fixture - period = make_period('2017-12') From ccabe808457a1d9029d36240dae737e834c8b02a Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 00:23:13 +0100 Subject: [PATCH 17/36] Add simulation_single_with_variables --- tests/core/conftest.py | 33 ++++++++++++++++++ tests/core/test_calculate_output.py | 54 ++++++----------------------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index f90c1fea0d..b4ea34a88f 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -12,6 +12,9 @@ from openfisca_core.entities import Entity, GroupEntity from openfisca_core.indexed_enums import Enum as OFEnum +from openfisca_core.model_api import * # noqa analysis:ignore +from openfisca_country_template.entities import * # noqa analysis:ignore + class TestVariable(Variable): definition_period = ETERNITY @@ -206,3 +209,33 @@ def simulation_single(simulation_builder, tax_benefit_system, single): @fixture def simulation_couple(simulation_builder, tax_benefit_system, couple): return simulation_builder.build_from_entities(tax_benefit_system, couple) + + +class simple_variable(Variable): + entity = Person + definition_period = MONTH + value_type = int + + +class variable_with_calculate_output_add(Variable): + entity = Person + definition_period = MONTH + value_type = int + calculate_output = calculate_output_add + + +class variable_with_calculate_output_divide(Variable): + entity = Person + definition_period = YEAR + value_type = int + calculate_output = calculate_output_divide + + +@fixture +def simulation_single_with_variables(simulation_builder, tax_benefit_system, single): + tax_benefit_system.add_variables( + simple_variable, + variable_with_calculate_output_add, + variable_with_calculate_output_divide + ) + return simulation_builder.build_from_entities(tax_benefit_system, single) diff --git a/tests/core/test_calculate_output.py b/tests/core/test_calculate_output.py index cdb6e8a87f..bfc26e8715 100644 --- a/tests/core/test_calculate_output.py +++ b/tests/core/test_calculate_output.py @@ -1,52 +1,20 @@ -from openfisca_core.model_api import * # noqa analysis:ignore -from openfisca_core.tools import assert_near - -from openfisca_country_template import CountryTaxBenefitSystem -from openfisca_country_template.entities import * # noqa analysis:ignore - from pytest import raises - -class simple_variable(Variable): - entity = Person - definition_period = MONTH - value_type = int - - -class variable_with_calculate_output_add(Variable): - entity = Person - definition_period = MONTH - value_type = int - calculate_output = calculate_output_add - - -class variable_with_calculate_output_divide(Variable): - entity = Person - definition_period = YEAR - value_type = int - calculate_output = calculate_output_divide - - -tax_benefit_system = CountryTaxBenefitSystem() -tax_benefit_system.add_variables( - simple_variable, - variable_with_calculate_output_add, - variable_with_calculate_output_divide - ) +from openfisca_core.tools import assert_near -def test_calculate_output_default(simulation_single): +def test_calculate_output_default(simulation_single_with_variables): with raises(ValueError): - simulation_single.calculate_output('simple_variable', 2017) + simulation_single_with_variables.calculate_output('simple_variable', 2017) -def test_calculate_output_add(simulation_single): - simulation_single.set_input('variable_with_calculate_output_add', '2017-01', [10]) - simulation_single.set_input('variable_with_calculate_output_add', '2017-05', [20]) - simulation_single.set_input('variable_with_calculate_output_add', '2017-12', [70]) - assert_near(simulation_single.calculate_output('variable_with_calculate_output_add', 2017), 100) +def test_calculate_output_add(simulation_single_with_variables): + simulation_single_with_variables.set_input('variable_with_calculate_output_add', '2017-01', [10]) + simulation_single_with_variables.set_input('variable_with_calculate_output_add', '2017-05', [20]) + simulation_single_with_variables.set_input('variable_with_calculate_output_add', '2017-12', [70]) + assert_near(simulation_single_with_variables.calculate_output('variable_with_calculate_output_add', 2017), 100) -def test_calculate_output_divide(simulation_single): - simulation_single.set_input('variable_with_calculate_output_divide', 2017, [12000]) - assert_near(simulation_single.calculate_output('variable_with_calculate_output_divide', '2017-06'), 1000) +def test_calculate_output_divide(simulation_single_with_variables): + simulation_single_with_variables.set_input('variable_with_calculate_output_divide', 2017, [12000]) + assert_near(simulation_single_with_variables.calculate_output('variable_with_calculate_output_divide', '2017-06'), 1000) From de07a0d6e0f188674d48b70e114a34266858fe01 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 00:34:11 +0100 Subject: [PATCH 18/36] Add simulation to conftest --- tests/core/conftest.py | 5 +++++ tests/core/test_cycles.py | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index b4ea34a88f..5a1d0fedb4 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -35,6 +35,11 @@ def simulation_builder(): return SimulationBuilder() +@fixture +def simulation(tax_benefit_system, simulation_builder): + return SimulationBuilder().build_default_simulation(tax_benefit_system) + + @fixture def period(): return "2016-01" diff --git a/tests/core/test_cycles.py b/tests/core/test_cycles.py index 949df40336..0cb2b3ec93 100644 --- a/tests/core/test_cycles.py +++ b/tests/core/test_cycles.py @@ -18,11 +18,6 @@ def reference_period(): return periods.period('2013-01') -@fixture -def simulation(reference_period): - return SimulationBuilder().build_default_simulation(tax_benefit_system) - - # 1 <--> 2 with same period class variable1(Variable): value_type = int From 2088980728d0e67e9b5d8e0dfc364a87382ae692 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 00:38:01 +0100 Subject: [PATCH 19/36] Fix F401 on test_cycles --- tests/core/test_cycles.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/core/test_cycles.py b/tests/core/test_cycles.py index 0cb2b3ec93..106906256e 100644 --- a/tests/core/test_cycles.py +++ b/tests/core/test_cycles.py @@ -2,7 +2,6 @@ from openfisca_core import periods from openfisca_core.periods import MONTH -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_core.simulations import CycleError from openfisca_core.variables import Variable From 47dc01f0a64d91069ac16bf21284c53a8a4d98f5 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 00:52:33 +0100 Subject: [PATCH 20/36] Add simulation_with_variables --- tests/core/conftest.py | 91 +++++++++++++++++++++++++++++ tests/core/test_cycles.py | 120 +++++--------------------------------- 2 files changed, 104 insertions(+), 107 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 5a1d0fedb4..7e00f92f4c 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -244,3 +244,94 @@ def simulation_single_with_variables(simulation_builder, tax_benefit_system, sin variable_with_calculate_output_divide ) return simulation_builder.build_from_entities(tax_benefit_system, single) + + + +# 1 <--> 2 with same period +class variable1(Variable): + value_type = int + entity = Person + definition_period = MONTH + + def formula(person, period): + return person('variable2', period) + + +class variable2(Variable): + value_type = int + entity = Person + definition_period = MONTH + + def formula(person, period): + return person('variable1', period) + + +# 3 <--> 4 with a period offset +class variable3(Variable): + value_type = int + entity = Person + definition_period = MONTH + + def formula(person, period): + return person('variable4', period.last_month) + + +class variable4(Variable): + value_type = int + entity = Person + definition_period = MONTH + + def formula(person, period): + return person('variable3', period) + + +# 5 -f-> 6 with a period offset +# <--- +class variable5(Variable): + value_type = int + entity = Person + definition_period = MONTH + + def formula(person, period): + variable6 = person('variable6', period.last_month) + return 5 + variable6 + + +class variable6(Variable): + value_type = int + entity = Person + definition_period = MONTH + + def formula(person, period): + variable5 = person('variable5', period) + return 6 + variable5 + + +class variable7(Variable): + value_type = int + entity = Person + definition_period = MONTH + + def formula(person, period): + variable5 = person('variable5', period) + return 7 + variable5 + + +# december cotisation depending on november value +class cotisation(Variable): + value_type = int + entity = Person + definition_period = MONTH + + def formula(person, period): + if period.start.month == 12: + return 2 * person('cotisation', period.last_month) + else: + return person.empty_array() + 1 + + +@fixture +def simulation_with_variables(tax_benefit_system, simulation_builder): + tax_benefit_system.add_variables(variable1, variable2, variable3, variable4, + variable5, variable6, variable7, cotisation) + return SimulationBuilder().build_default_simulation(tax_benefit_system) diff --git a/tests/core/test_cycles.py b/tests/core/test_cycles.py index 106906256e..eae9675d61 100644 --- a/tests/core/test_cycles.py +++ b/tests/core/test_cycles.py @@ -1,12 +1,7 @@ # -*- coding: utf-8 -*- from openfisca_core import periods -from openfisca_core.periods import MONTH from openfisca_core.simulations import CycleError -from openfisca_core.variables import Variable - -from openfisca_country_template import CountryTaxBenefitSystem -from openfisca_country_template.entities import Person from openfisca_core.tools import assert_near from pytest import fixture, raises @@ -17,121 +12,32 @@ def reference_period(): return periods.period('2013-01') -# 1 <--> 2 with same period -class variable1(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - return person('variable2', period) - - -class variable2(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - return person('variable1', period) - - -# 3 <--> 4 with a period offset -class variable3(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - return person('variable4', period.last_month) - - -class variable4(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - return person('variable3', period) - - -# 5 -f-> 6 with a period offset -# <--- -class variable5(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - variable6 = person('variable6', period.last_month) - return 5 + variable6 - - -class variable6(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - variable5 = person('variable5', period) - return 6 + variable5 - - -class variable7(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - variable5 = person('variable5', period) - return 7 + variable5 - - -# december cotisation depending on november value -class cotisation(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - if period.start.month == 12: - return 2 * person('cotisation', period.last_month) - else: - return person.empty_array() + 1 - - -# TaxBenefitSystem instance declared after formulas -tax_benefit_system = CountryTaxBenefitSystem() -tax_benefit_system.add_variables(variable1, variable2, variable3, variable4, - variable5, variable6, variable7, cotisation) - - -def test_pure_cycle(simulation, reference_period): +def test_pure_cycle(simulation_with_variables, reference_period): with raises(CycleError): - simulation.calculate('variable1', period = reference_period) + simulation_with_variables.calculate('variable1', period = reference_period) -def test_spirals_result_in_default_value(simulation, reference_period): - variable3 = simulation.calculate('variable3', period = reference_period) +def test_spirals_result_in_default_value(simulation_with_variables, reference_period): + variable3 = simulation_with_variables.calculate('variable3', period = reference_period) assert_near(variable3, [0]) -def test_spiral_heuristic(simulation, reference_period): - variable5 = simulation.calculate('variable5', period = reference_period) - variable6 = simulation.calculate('variable6', period = reference_period) - variable6_last_month = simulation.calculate('variable6', reference_period.last_month) +def test_spiral_heuristic(simulation_with_variables, reference_period): + variable5 = simulation_with_variables.calculate('variable5', period = reference_period) + variable6 = simulation_with_variables.calculate('variable6', period = reference_period) + variable6_last_month = simulation_with_variables.calculate('variable6', reference_period.last_month) assert_near(variable5, [11]) assert_near(variable6, [11]) assert_near(variable6_last_month, [11]) -def test_spiral_cache(simulation, reference_period): - simulation.calculate('variable7', period = reference_period) - cached_variable7 = simulation.get_holder('variable7').get_array(reference_period) +def test_spiral_cache(simulation_with_variables, reference_period): + simulation_with_variables.calculate('variable7', period = reference_period) + cached_variable7 = simulation_with_variables.get_holder('variable7').get_array(reference_period) assert cached_variable7 is not None -def test_cotisation_1_level(simulation, reference_period): +def test_cotisation_1_level(simulation_with_variables, reference_period): month = reference_period.last_month - cotisation = simulation.calculate('cotisation', period = month) + cotisation = simulation_with_variables.calculate('cotisation', period = month) assert_near(cotisation, [0]) From 1cdba5017e20a69b2fdb7fb585fa4b9110dceed8 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 21:39:59 +0100 Subject: [PATCH 21/36] Add conftest fixture at test_axes --- tests/core/test_axes.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/tests/core/test_axes.py b/tests/core/test_axes.py index d4b122e69b..1346611be4 100644 --- a/tests/core/test_axes.py +++ b/tests/core/test_axes.py @@ -1,13 +1,5 @@ # -*- coding: utf-8 -*- -from pytest import fixture, approx - -from openfisca_core.simulation_builder import SimulationBuilder -from .test_simulation_builder import * # noqa: F401 - - -@fixture -def simulation_builder(): - return SimulationBuilder() +from pytest import approx def test_add_axis_on_persons(simulation_builder, persons): From d8b2a428c48ae37bc813a0ca9baa0b2d37ab500c Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 22:04:34 +0100 Subject: [PATCH 22/36] Remove unnecessary tax_benefit_system fixture in test_countries --- tests/core/test_countries.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/core/test_countries.py b/tests/core/test_countries.py index ab820152c4..a1c6bafa02 100644 --- a/tests/core/test_countries.py +++ b/tests/core/test_countries.py @@ -7,7 +7,6 @@ from openfisca_core.taxbenefitsystems import VariableNameConflict, VariableNotFound from openfisca_core import periods from openfisca_core.populations import DIVIDE -from openfisca_country_template import CountryTaxBenefitSystem from openfisca_core.tools import assert_near @@ -78,8 +77,6 @@ def test_input_with_wrong_period(make_simulation): def test_variable_with_reference(tax_benefit_system, make_isolated_simulation): - tax_benefit_system = CountryTaxBenefitSystem() # Work in isolation - simulation_base = make_isolated_simulation(tax_benefit_system, {'salary': 4000}) revenu_disponible_avant_reforme = simulation_base.calculate('disposable_income', "2016-01") From d141e9c9a99da55fd937c4eb2a23eb569d1d511c Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 23:53:35 +0100 Subject: [PATCH 23/36] Add make_simulation_from_yaml in test_entities --- tests/core/test_entities.py | 45 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index c1bef18da5..de7b96c720 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from copy import deepcopy +from pytest import fixture -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_core.tools import assert_near from openfisca_core.tools.test_runner import yaml from openfisca_country_template.entities import Household @@ -28,11 +28,15 @@ YEAR = 2016 MONTH = "2016-01" +@fixture +def make_simulation_from_yaml(tax_benefit_system, simulation_builder): + def _make_simulation_from_yaml(simulation_yaml): + return simulation_builder.build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) + return _make_simulation_from_yaml -def new_simulation(tax_benefit_system, test_case, period = MONTH): - builder = SimulationBuilder() - builder.set_default_period(period) - return builder.build_from_entities(tax_benefit_system, test_case) +def new_simulation(simulation_builder, tax_benefit_system, test_case, period = MONTH): + simulation_builder.set_default_period(period) + return simulation_builder.build_from_entities(tax_benefit_system, test_case) def test_role_index_and_positions(tax_benefit_system): @@ -44,8 +48,8 @@ def test_role_index_and_positions(tax_benefit_system): assert(simulation.household.ids == ['h1', 'h2']) -def test_entity_structure_with_constructor(tax_benefit_system): - simulation_yaml = """ +def test_entity_structure_with_constructor(make_simulation_from_yaml): + simulation = make_simulation_from_yaml(""" persons: bill: {} bob: {} @@ -63,9 +67,7 @@ def test_entity_structure_with_constructor(tax_benefit_system): second_household: parents: - claudia - """ - - simulation = SimulationBuilder().build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) + """) household = simulation.household @@ -74,8 +76,8 @@ def test_entity_structure_with_constructor(tax_benefit_system): assert_near(household.members_position, [0, 1, 0, 2, 3]) -def test_entity_variables_with_constructor(tax_benefit_system): - simulation_yaml = """ +def test_entity_variables_with_constructor(make_simulation_from_yaml): + simulation = make_simulation_from_yaml(""" persons: bill: {} bob: {} @@ -97,15 +99,14 @@ def test_entity_variables_with_constructor(tax_benefit_system): - claudia rent: 2017-06: 600 - """ + """) - simulation = SimulationBuilder().build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) household = simulation.household assert_near(household('rent', "2017-06"), [800, 600]) -def test_person_variable_with_constructor(tax_benefit_system): - simulation_yaml = """ +def test_person_variable_with_constructor(make_simulation_from_yaml): + simulation = make_simulation_from_yaml(""" persons: bill: salary: @@ -130,16 +131,15 @@ def test_person_variable_with_constructor(tax_benefit_system): second_household: parents: - claudia - """ + """) - simulation = SimulationBuilder().build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) person = simulation.person assert_near(person('salary', "2017-11"), [1500, 0, 3000, 0, 0]) assert_near(person('salary', "2017-12"), [2000, 0, 4000, 0, 0]) -def test_set_input_with_constructor(tax_benefit_system): - simulation_yaml = """ +def test_set_input_with_constructor(make_simulation_from_yaml): + simulation = make_simulation_from_yaml(""" persons: bill: salary: @@ -169,9 +169,8 @@ def test_set_input_with_constructor(tax_benefit_system): second_household: parents: - claudia - """ + """) - simulation = SimulationBuilder().build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) person = simulation.person assert_near(person('salary', "2017-12"), [2000, 0, 4000, 0, 0]) assert_near(person('salary', "2017-10"), [2000, 3000, 1600, 0, 0]) @@ -424,7 +423,7 @@ def test_sum_following_bug_ipp_2(tax_benefit_system): def test_get_memory_usage(tax_benefit_system, single): test_case = deepcopy(single) test_case["persons"]["Alicia"]["salary"] = {"2017-01": 0} - simulation = SimulationBuilder().build_from_dict(tax_benefit_system, test_case) + simulation = simulation_builder.build_from_dict(tax_benefit_system, test_case) simulation.calculate('disposable_income', '2017-01') memory_usage = simulation.person.get_memory_usage(variables = ['salary']) assert(memory_usage['total_nb_bytes'] > 0) From 6cf2e17334e142a6429ebf12eae03adccdcae767 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 22:39:14 +0100 Subject: [PATCH 24/36] Add make_simulation_from_entities in test_entities --- tests/core/test_entities.py | 78 +++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index de7b96c720..e86ae67c01 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -34,13 +34,17 @@ def _make_simulation_from_yaml(simulation_yaml): return simulation_builder.build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) return _make_simulation_from_yaml -def new_simulation(simulation_builder, tax_benefit_system, test_case, period = MONTH): - simulation_builder.set_default_period(period) - return simulation_builder.build_from_entities(tax_benefit_system, test_case) + +@fixture +def make_simulation_from_entities(tax_benefit_system, simulation_builder, period): + def _make_simulation_from_enties(entities, period=period): + simulation_builder.set_default_period(period) + return simulation_builder.build_from_entities(tax_benefit_system, entities) + return _make_simulation_from_enties -def test_role_index_and_positions(tax_benefit_system): - simulation = new_simulation(tax_benefit_system, TEST_CASE) +def test_role_index_and_positions(make_simulation_from_entities): + simulation = make_simulation_from_entities(TEST_CASE) assert_near(simulation.household.members_entity_id, [0, 0, 0, 0, 1, 1]) assert((simulation.household.members_role == [FIRST_PARENT, SECOND_PARENT, CHILD, CHILD, FIRST_PARENT, CHILD]).all()) assert_near(simulation.household.members_position, [0, 1, 2, 3, 0, 1]) @@ -176,25 +180,25 @@ def test_set_input_with_constructor(make_simulation_from_yaml): assert_near(person('salary', "2017-10"), [2000, 3000, 1600, 0, 0]) -def test_has_role(tax_benefit_system): - simulation = new_simulation(tax_benefit_system, TEST_CASE) +def test_has_role(make_simulation_from_entities): + simulation = make_simulation_from_entities(TEST_CASE) individu = simulation.persons assert_near(individu.has_role(CHILD), [False, False, True, True, False, True]) -def test_has_role_with_subrole(tax_benefit_system): - simulation = new_simulation(tax_benefit_system, TEST_CASE) +def test_has_role_with_subrole(make_simulation_from_entities): + simulation = make_simulation_from_entities(TEST_CASE) individu = simulation.persons assert_near(individu.has_role(PARENT), [True, True, False, False, True, False]) assert_near(individu.has_role(FIRST_PARENT), [True, False, False, False, True, False]) assert_near(individu.has_role(SECOND_PARENT), [False, True, False, False, False, False]) -def test_project(tax_benefit_system): +def test_project(make_simulation_from_entities): test_case = deepcopy(TEST_CASE) test_case['households']['h1']['housing_tax'] = 20000 - simulation = new_simulation(tax_benefit_system, test_case, YEAR) + simulation = make_simulation_from_entities(test_case, YEAR) household = simulation.household housing_tax = household('housing_tax', YEAR) @@ -206,25 +210,25 @@ def test_project(tax_benefit_system): assert_near(housing_tax_projected_on_parents, [20000, 20000, 0, 0, 0, 0]) -def test_implicit_projection(tax_benefit_system): +def test_implicit_projection(make_simulation_from_entities): test_case = deepcopy(TEST_CASE) test_case['households']['h1']['housing_tax'] = 20000 - simulation = new_simulation(tax_benefit_system, test_case, YEAR) + simulation = make_simulation_from_entities(test_case, YEAR) individu = simulation.person housing_tax = individu.household('housing_tax', YEAR) assert_near(housing_tax, [20000, 20000, 20000, 20000, 0, 0]) -def test_sum(tax_benefit_system): +def test_sum(make_simulation_from_entities): test_case = deepcopy(TEST_CASE) test_case['persons']['ind0']['salary'] = 1000 test_case['persons']['ind1']['salary'] = 1500 test_case['persons']['ind4']['salary'] = 3000 test_case['persons']['ind5']['salary'] = 500 - simulation = new_simulation(tax_benefit_system, test_case, MONTH) + simulation = make_simulation_from_entities(test_case, MONTH) household = simulation.household salary = household.members('salary', "2016-01") @@ -237,9 +241,9 @@ def test_sum(tax_benefit_system): assert_near(total_salary_parents_by_household, [2500, 3000]) -def test_any(tax_benefit_system): +def test_any(make_simulation_from_entities): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) household = simulation.household age = household.members('age', period = MONTH) @@ -252,9 +256,9 @@ def test_any(tax_benefit_system): assert_near(has_household_CHILD_with_age_sup_18, [False, True]) -def test_all(tax_benefit_system): +def test_all(make_simulation_from_entities): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) household = simulation.household age = household.members('age', period = MONTH) @@ -267,9 +271,9 @@ def test_all(tax_benefit_system): assert_near(all_parents_age_sup_18, [True, True]) -def test_max(tax_benefit_system): +def test_max(make_simulation_from_entities): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) household = simulation.household age = household.members('age', period = MONTH) @@ -281,9 +285,9 @@ def test_max(tax_benefit_system): assert_near(age_max_child, [9, 20]) -def test_min(tax_benefit_system): +def test_min(make_simulation_from_entities): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) household = simulation.household age = household.members('age', period = MONTH) @@ -295,9 +299,9 @@ def test_min(tax_benefit_system): assert_near(age_min_parents, [37, 54]) -def test_value_nth_person(tax_benefit_system): +def test_value_nth_person(make_simulation_from_entities): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) household = simulation.household array = household.members('age', MONTH) @@ -314,9 +318,9 @@ def test_value_nth_person(tax_benefit_system): assert_near(result3, [9, -1]) -def test_rank(tax_benefit_system): +def test_rank(make_simulation_from_entities): test_case = deepcopy(TEST_CASE_AGES) - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) person = simulation.person age = person('age', MONTH) # [40, 37, 7, 9, 54, 20] @@ -327,14 +331,14 @@ def test_rank(tax_benefit_system): assert_near(rank_in_siblings, [-1, -1, 1, 0, -1, 0]) -def test_partner(tax_benefit_system): +def test_partner(make_simulation_from_entities): test_case = deepcopy(TEST_CASE) test_case['persons']['ind0']['salary'] = 1000 test_case['persons']['ind1']['salary'] = 1500 test_case['persons']['ind4']['salary'] = 3000 test_case['persons']['ind5']['salary'] = 500 - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) persons = simulation.persons salary = persons('salary', period = MONTH) @@ -344,14 +348,14 @@ def test_partner(tax_benefit_system): assert_near(salary_second_parent, [1500, 1000, 0, 0, 0, 0]) -def test_value_from_first_person(tax_benefit_system): +def test_value_from_first_person(make_simulation_from_entities): test_case = deepcopy(TEST_CASE) test_case['persons']['ind0']['salary'] = 1000 test_case['persons']['ind1']['salary'] = 1500 test_case['persons']['ind4']['salary'] = 3000 test_case['persons']['ind5']['salary'] = 500 - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) household = simulation.household salaries = household.members('salary', period = MONTH) @@ -376,7 +380,7 @@ def test_projectors_methods(simulation_couple): assert(len(household.first_parent.get_rank(household, salary_i)) == 1) # Must be of a person dimension -def test_sum_following_bug_ipp_1(tax_benefit_system): +def test_sum_following_bug_ipp_1(make_simulation_from_entities): test_case = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}}, 'households': { @@ -389,7 +393,7 @@ def test_sum_following_bug_ipp_1(tax_benefit_system): test_case['persons']['ind2']['salary'] = 1000 test_case['persons']['ind3']['salary'] = 1000 - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) household = simulation.household eligible_i = household.members('salary', period = MONTH) < 1500 @@ -398,7 +402,7 @@ def test_sum_following_bug_ipp_1(tax_benefit_system): assert_near(nb_eligibles_by_household, [0, 2]) -def test_sum_following_bug_ipp_2(tax_benefit_system): +def test_sum_following_bug_ipp_2(make_simulation_from_entities): test_case = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}}, 'households': { @@ -411,7 +415,7 @@ def test_sum_following_bug_ipp_2(tax_benefit_system): test_case['persons']['ind2']['salary'] = 1000 test_case['persons']['ind3']['salary'] = 1000 - simulation = new_simulation(tax_benefit_system, test_case) + simulation = make_simulation_from_entities(test_case) household = simulation.household eligible_i = household.members('salary', period = MONTH) < 1500 @@ -430,7 +434,7 @@ def test_get_memory_usage(tax_benefit_system, single): assert(len(memory_usage['by_variable']) == 1) -def test_unordered_persons(tax_benefit_system): +def test_unordered_persons(make_simulation_from_entities): test_case = { 'persons': {'ind4': {}, 'ind3': {}, 'ind1': {}, 'ind2': {}, 'ind5': {}, 'ind0': {}}, 'households': { @@ -451,7 +455,7 @@ def test_unordered_persons(tax_benefit_system): # household.members_entity_id == [1, 0, 0, 0, 1, 0] - simulation = new_simulation(tax_benefit_system, test_case, MONTH) + simulation = make_simulation_from_entities(test_case, MONTH) household = simulation.household person = simulation.person From a09bd597dd56bdf44df32697d19287730446eb11 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 23:15:11 +0100 Subject: [PATCH 25/36] Add case and ages_case fixtures in test_entities --- tests/core/test_entities.py | 184 +++++++++++++++++------------------- 1 file changed, 88 insertions(+), 96 deletions(-) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index e86ae67c01..8d2b92e03b 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -1,24 +1,27 @@ # -*- coding: utf-8 -*- -from copy import deepcopy from pytest import fixture from openfisca_core.tools import assert_near from openfisca_core.tools.test_runner import yaml from openfisca_country_template.entities import Household -TEST_CASE = { - 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}, 'ind4': {}, 'ind5': {}}, - 'households': { - 'h1': {'children': ['ind2', 'ind3'], 'parents': ['ind0', 'ind1']}, - 'h2': {'children': ['ind5'], 'parents': ['ind4']} - }, - } +@fixture +def case(): + return { + 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}, 'ind4': {}, 'ind5': {}}, + 'households': { + 'h1': {'children': ['ind2', 'ind3'], 'parents': ['ind0', 'ind1']}, + 'h2': {'children': ['ind5'], 'parents': ['ind4']} + }, + } -TEST_CASE_AGES = deepcopy(TEST_CASE) -AGES = [40, 37, 7, 9, 54, 20] -for (individu, age) in zip(TEST_CASE_AGES['persons'].values(), AGES): - individu['age'] = age +@fixture +def ages_case(case): + AGES = [40, 37, 7, 9, 54, 20] + for (individu, age) in zip(case['persons'].values(), AGES): + individu['age'] = age + return case FIRST_PARENT = Household.FIRST_PARENT SECOND_PARENT = Household.SECOND_PARENT @@ -42,14 +45,17 @@ def _make_simulation_from_enties(entities, period=period): return simulation_builder.build_from_entities(tax_benefit_system, entities) return _make_simulation_from_enties +@fixture +def simulation_case(make_simulation_from_entities, case): + return make_simulation_from_entities(case) + -def test_role_index_and_positions(make_simulation_from_entities): - simulation = make_simulation_from_entities(TEST_CASE) - assert_near(simulation.household.members_entity_id, [0, 0, 0, 0, 1, 1]) - assert((simulation.household.members_role == [FIRST_PARENT, SECOND_PARENT, CHILD, CHILD, FIRST_PARENT, CHILD]).all()) - assert_near(simulation.household.members_position, [0, 1, 2, 3, 0, 1]) - assert(simulation.person.ids == ["ind0", "ind1", "ind2", "ind3", "ind4", "ind5"]) - assert(simulation.household.ids == ['h1', 'h2']) +def test_role_index_and_positions(simulation_case): + assert_near(simulation_case.household.members_entity_id, [0, 0, 0, 0, 1, 1]) + assert((simulation_case.household.members_role == [FIRST_PARENT, SECOND_PARENT, CHILD, CHILD, FIRST_PARENT, CHILD]).all()) + assert_near(simulation_case.household.members_position, [0, 1, 2, 3, 0, 1]) + assert(simulation_case.person.ids == ["ind0", "ind1", "ind2", "ind3", "ind4", "ind5"]) + assert(simulation_case.household.ids == ['h1', 'h2']) def test_entity_structure_with_constructor(make_simulation_from_yaml): @@ -180,25 +186,22 @@ def test_set_input_with_constructor(make_simulation_from_yaml): assert_near(person('salary', "2017-10"), [2000, 3000, 1600, 0, 0]) -def test_has_role(make_simulation_from_entities): - simulation = make_simulation_from_entities(TEST_CASE) - individu = simulation.persons +def test_has_role(simulation_case): + individu = simulation_case.persons assert_near(individu.has_role(CHILD), [False, False, True, True, False, True]) -def test_has_role_with_subrole(make_simulation_from_entities): - simulation = make_simulation_from_entities(TEST_CASE) - individu = simulation.persons +def test_has_role_with_subrole(simulation_case): + individu = simulation_case.persons assert_near(individu.has_role(PARENT), [True, True, False, False, True, False]) assert_near(individu.has_role(FIRST_PARENT), [True, False, False, False, True, False]) assert_near(individu.has_role(SECOND_PARENT), [False, True, False, False, False, False]) -def test_project(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE) - test_case['households']['h1']['housing_tax'] = 20000 +def test_project(make_simulation_from_entities, case): + case['households']['h1']['housing_tax'] = 20000 - simulation = make_simulation_from_entities(test_case, YEAR) + simulation = make_simulation_from_entities(case, YEAR) household = simulation.household housing_tax = household('housing_tax', YEAR) @@ -210,25 +213,23 @@ def test_project(make_simulation_from_entities): assert_near(housing_tax_projected_on_parents, [20000, 20000, 0, 0, 0, 0]) -def test_implicit_projection(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE) - test_case['households']['h1']['housing_tax'] = 20000 +def test_implicit_projection(make_simulation_from_entities, case): + case['households']['h1']['housing_tax'] = 20000 - simulation = make_simulation_from_entities(test_case, YEAR) + simulation = make_simulation_from_entities(case, YEAR) individu = simulation.person housing_tax = individu.household('housing_tax', YEAR) assert_near(housing_tax, [20000, 20000, 20000, 20000, 0, 0]) -def test_sum(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE) - test_case['persons']['ind0']['salary'] = 1000 - test_case['persons']['ind1']['salary'] = 1500 - test_case['persons']['ind4']['salary'] = 3000 - test_case['persons']['ind5']['salary'] = 500 +def test_sum(make_simulation_from_entities, case): + case['persons']['ind0']['salary'] = 1000 + case['persons']['ind1']['salary'] = 1500 + case['persons']['ind4']['salary'] = 3000 + case['persons']['ind5']['salary'] = 500 - simulation = make_simulation_from_entities(test_case, MONTH) + simulation = make_simulation_from_entities(case, MONTH) household = simulation.household salary = household.members('salary', "2016-01") @@ -241,9 +242,8 @@ def test_sum(make_simulation_from_entities): assert_near(total_salary_parents_by_household, [2500, 3000]) -def test_any(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE_AGES) - simulation = make_simulation_from_entities(test_case) +def test_any(make_simulation_from_entities, ages_case): + simulation = make_simulation_from_entities(ages_case) household = simulation.household age = household.members('age', period = MONTH) @@ -256,9 +256,8 @@ def test_any(make_simulation_from_entities): assert_near(has_household_CHILD_with_age_sup_18, [False, True]) -def test_all(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE_AGES) - simulation = make_simulation_from_entities(test_case) +def test_all(make_simulation_from_entities, ages_case): + simulation = make_simulation_from_entities(ages_case) household = simulation.household age = household.members('age', period = MONTH) @@ -271,9 +270,8 @@ def test_all(make_simulation_from_entities): assert_near(all_parents_age_sup_18, [True, True]) -def test_max(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE_AGES) - simulation = make_simulation_from_entities(test_case) +def test_max(make_simulation_from_entities, ages_case): + simulation = make_simulation_from_entities(ages_case) household = simulation.household age = household.members('age', period = MONTH) @@ -285,9 +283,8 @@ def test_max(make_simulation_from_entities): assert_near(age_max_child, [9, 20]) -def test_min(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE_AGES) - simulation = make_simulation_from_entities(test_case) +def test_min(make_simulation_from_entities, ages_case): + simulation = make_simulation_from_entities(ages_case) household = simulation.household age = household.members('age', period = MONTH) @@ -299,9 +296,8 @@ def test_min(make_simulation_from_entities): assert_near(age_min_parents, [37, 54]) -def test_value_nth_person(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE_AGES) - simulation = make_simulation_from_entities(test_case) +def test_value_nth_person(make_simulation_from_entities, ages_case): + simulation = make_simulation_from_entities(test_case, ages_case) household = simulation.household array = household.members('age', MONTH) @@ -318,9 +314,8 @@ def test_value_nth_person(make_simulation_from_entities): assert_near(result3, [9, -1]) -def test_rank(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE_AGES) - simulation = make_simulation_from_entities(test_case) +def test_rank(make_simulation_from_entities, ages_case): + simulation = make_simulation_from_entities(ages_case) person = simulation.person age = person('age', MONTH) # [40, 37, 7, 9, 54, 20] @@ -331,14 +326,13 @@ def test_rank(make_simulation_from_entities): assert_near(rank_in_siblings, [-1, -1, 1, 0, -1, 0]) -def test_partner(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE) - test_case['persons']['ind0']['salary'] = 1000 - test_case['persons']['ind1']['salary'] = 1500 - test_case['persons']['ind4']['salary'] = 3000 - test_case['persons']['ind5']['salary'] = 500 +def test_partner(make_simulation_from_entities, case): + case['persons']['ind0']['salary'] = 1000 + case['persons']['ind1']['salary'] = 1500 + case['persons']['ind4']['salary'] = 3000 + case['persons']['ind5']['salary'] = 500 - simulation = make_simulation_from_entities(test_case) + simulation = make_simulation_from_entities(case) persons = simulation.persons salary = persons('salary', period = MONTH) @@ -348,14 +342,13 @@ def test_partner(make_simulation_from_entities): assert_near(salary_second_parent, [1500, 1000, 0, 0, 0, 0]) -def test_value_from_first_person(make_simulation_from_entities): - test_case = deepcopy(TEST_CASE) - test_case['persons']['ind0']['salary'] = 1000 - test_case['persons']['ind1']['salary'] = 1500 - test_case['persons']['ind4']['salary'] = 3000 - test_case['persons']['ind5']['salary'] = 500 +def test_value_from_first_person(make_simulation_from_entities, case): + case['persons']['ind0']['salary'] = 1000 + case['persons']['ind1']['salary'] = 1500 + case['persons']['ind4']['salary'] = 3000 + case['persons']['ind5']['salary'] = 500 - simulation = make_simulation_from_entities(test_case) + simulation = make_simulation_from_entities(case) household = simulation.household salaries = household.members('salary', period = MONTH) @@ -381,19 +374,19 @@ def test_projectors_methods(simulation_couple): def test_sum_following_bug_ipp_1(make_simulation_from_entities): - test_case = { + new_case = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}}, 'households': { 'h1': {'parents': ['ind0']}, 'h2': {'parents': ['ind1'], 'children': ['ind2', 'ind3']} }, } - test_case['persons']['ind0']['salary'] = 2000 - test_case['persons']['ind1']['salary'] = 2000 - test_case['persons']['ind2']['salary'] = 1000 - test_case['persons']['ind3']['salary'] = 1000 + new_case['persons']['ind0']['salary'] = 2000 + new_case['persons']['ind1']['salary'] = 2000 + new_case['persons']['ind2']['salary'] = 1000 + new_case['persons']['ind3']['salary'] = 1000 - simulation = make_simulation_from_entities(test_case) + simulation = make_simulation_from_entities(new_case) household = simulation.household eligible_i = household.members('salary', period = MONTH) < 1500 @@ -403,19 +396,19 @@ def test_sum_following_bug_ipp_1(make_simulation_from_entities): def test_sum_following_bug_ipp_2(make_simulation_from_entities): - test_case = { + new_case = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}}, 'households': { 'h1': {'parents': ['ind1'], 'children': ['ind2', 'ind3']}, 'h2': {'parents': ['ind0']}, }, } - test_case['persons']['ind0']['salary'] = 2000 - test_case['persons']['ind1']['salary'] = 2000 - test_case['persons']['ind2']['salary'] = 1000 - test_case['persons']['ind3']['salary'] = 1000 + new_case['persons']['ind0']['salary'] = 2000 + new_case['persons']['ind1']['salary'] = 2000 + new_case['persons']['ind2']['salary'] = 1000 + new_case['persons']['ind3']['salary'] = 1000 - simulation = make_simulation_from_entities(test_case) + simulation = make_simulation_from_entities(new_case) household = simulation.household eligible_i = household.members('salary', period = MONTH) < 1500 @@ -425,9 +418,8 @@ def test_sum_following_bug_ipp_2(make_simulation_from_entities): def test_get_memory_usage(tax_benefit_system, single): - test_case = deepcopy(single) - test_case["persons"]["Alicia"]["salary"] = {"2017-01": 0} - simulation = simulation_builder.build_from_dict(tax_benefit_system, test_case) + single["persons"]["Alicia"]["salary"] = {"2017-01": 0} + simulation = simulation_builder.build_from_dict(tax_benefit_system, single) simulation.calculate('disposable_income', '2017-01') memory_usage = simulation.person.get_memory_usage(variables = ['salary']) assert(memory_usage['total_nb_bytes'] > 0) @@ -435,7 +427,7 @@ def test_get_memory_usage(tax_benefit_system, single): def test_unordered_persons(make_simulation_from_entities): - test_case = { + new_case = { 'persons': {'ind4': {}, 'ind3': {}, 'ind1': {}, 'ind2': {}, 'ind5': {}, 'ind0': {}}, 'households': { 'h1': {'children': ['ind2', 'ind3'], 'parents': ['ind0', 'ind1']}, @@ -443,19 +435,19 @@ def test_unordered_persons(make_simulation_from_entities): }, } # 1st family - test_case['persons']['ind0']['salary'] = 1000 - test_case['persons']['ind1']['salary'] = 1500 - test_case['persons']['ind2']['salary'] = 20 - test_case['households']['h1']['accommodation_size'] = 160 + new_case['persons']['ind0']['salary'] = 1000 + new_case['persons']['ind1']['salary'] = 1500 + new_case['persons']['ind2']['salary'] = 20 + new_case['households']['h1']['accommodation_size'] = 160 # 2nd family - test_case['persons']['ind4']['salary'] = 3000 - test_case['persons']['ind5']['salary'] = 500 - test_case['households']['h2']['accommodation_size'] = 60 + new_case['persons']['ind4']['salary'] = 3000 + new_case['persons']['ind5']['salary'] = 500 + new_case['households']['h2']['accommodation_size'] = 60 # household.members_entity_id == [1, 0, 0, 0, 1, 0] - simulation = make_simulation_from_entities(test_case, MONTH) + simulation = make_simulation_from_entities(new_case, MONTH) household = simulation.household person = simulation.person From 35fe22c551eeb6bbc886f5f40330ca79ddc25e4e Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 23:25:00 +0100 Subject: [PATCH 26/36] Add period and year_period fixtures in test_entities --- tests/core/conftest.py | 5 +++ tests/core/test_entities.py | 65 +++++++++++++++++++------------------ 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 7e00f92f4c..2b05d6a7a4 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -45,6 +45,11 @@ def period(): return "2016-01" +@fixture +def year_period(): + return "2016" + + @fixture def make_simulation(tax_benefit_system, simulation_builder, period): def _make_simulation(data): diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index 8d2b92e03b..bcfe6713a4 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -6,6 +6,7 @@ from openfisca_core.tools.test_runner import yaml from openfisca_country_template.entities import Household + @fixture def case(): return { @@ -16,6 +17,7 @@ def case(): }, } + @fixture def ages_case(case): AGES = [40, 37, 7, 9, 54, 20] @@ -23,13 +25,12 @@ def ages_case(case): individu['age'] = age return case + FIRST_PARENT = Household.FIRST_PARENT SECOND_PARENT = Household.SECOND_PARENT PARENT = Household.PARENT CHILD = Household.CHILD -YEAR = 2016 -MONTH = "2016-01" @fixture def make_simulation_from_yaml(tax_benefit_system, simulation_builder): @@ -198,13 +199,13 @@ def test_has_role_with_subrole(simulation_case): assert_near(individu.has_role(SECOND_PARENT), [False, True, False, False, False, False]) -def test_project(make_simulation_from_entities, case): +def test_project(make_simulation_from_entities, case, year_period): case['households']['h1']['housing_tax'] = 20000 - simulation = make_simulation_from_entities(case, YEAR) + simulation = make_simulation_from_entities(case, year_period) household = simulation.household - housing_tax = household('housing_tax', YEAR) + housing_tax = household('housing_tax', year_period) projected_housing_tax = household.project(housing_tax) assert_near(projected_housing_tax, [20000, 20000, 20000, 20000, 0, 0]) @@ -213,23 +214,23 @@ def test_project(make_simulation_from_entities, case): assert_near(housing_tax_projected_on_parents, [20000, 20000, 0, 0, 0, 0]) -def test_implicit_projection(make_simulation_from_entities, case): +def test_implicit_projection(make_simulation_from_entities, case, year_period): case['households']['h1']['housing_tax'] = 20000 - simulation = make_simulation_from_entities(case, YEAR) + simulation = make_simulation_from_entities(case, year_period) individu = simulation.person - housing_tax = individu.household('housing_tax', YEAR) + housing_tax = individu.household('housing_tax', year_period) assert_near(housing_tax, [20000, 20000, 20000, 20000, 0, 0]) -def test_sum(make_simulation_from_entities, case): +def test_sum(make_simulation_from_entities, case, period): case['persons']['ind0']['salary'] = 1000 case['persons']['ind1']['salary'] = 1500 case['persons']['ind4']['salary'] = 3000 case['persons']['ind5']['salary'] = 500 - simulation = make_simulation_from_entities(case, MONTH) + simulation = make_simulation_from_entities(case, period) household = simulation.household salary = household.members('salary', "2016-01") @@ -242,11 +243,11 @@ def test_sum(make_simulation_from_entities, case): assert_near(total_salary_parents_by_household, [2500, 3000]) -def test_any(make_simulation_from_entities, ages_case): +def test_any(make_simulation_from_entities, ages_case, period): simulation = make_simulation_from_entities(ages_case) household = simulation.household - age = household.members('age', period = MONTH) + age = household.members('age', period = period) condition_age = (age <= 18) has_household_member_with_age_inf_18 = household.any(condition_age) assert_near(has_household_member_with_age_inf_18, [True, False]) @@ -256,11 +257,11 @@ def test_any(make_simulation_from_entities, ages_case): assert_near(has_household_CHILD_with_age_sup_18, [False, True]) -def test_all(make_simulation_from_entities, ages_case): +def test_all(make_simulation_from_entities, ages_case, period): simulation = make_simulation_from_entities(ages_case) household = simulation.household - age = household.members('age', period = MONTH) + age = household.members('age', period = period) condition_age = (age >= 18) all_persons_age_sup_18 = household.all(condition_age) @@ -270,11 +271,11 @@ def test_all(make_simulation_from_entities, ages_case): assert_near(all_parents_age_sup_18, [True, True]) -def test_max(make_simulation_from_entities, ages_case): +def test_max(make_simulation_from_entities, ages_case, period): simulation = make_simulation_from_entities(ages_case) household = simulation.household - age = household.members('age', period = MONTH) + age = household.members('age', period = period) age_max = household.max(age) assert_near(age_max, [40, 54]) @@ -283,11 +284,11 @@ def test_max(make_simulation_from_entities, ages_case): assert_near(age_max_child, [9, 20]) -def test_min(make_simulation_from_entities, ages_case): +def test_min(make_simulation_from_entities, ages_case, period): simulation = make_simulation_from_entities(ages_case) household = simulation.household - age = household.members('age', period = MONTH) + age = household.members('age', period = period) age_min = household.min(age) assert_near(age_min, [7, 20]) @@ -296,10 +297,10 @@ def test_min(make_simulation_from_entities, ages_case): assert_near(age_min_parents, [37, 54]) -def test_value_nth_person(make_simulation_from_entities, ages_case): +def test_value_nth_person(make_simulation_from_entities, ages_case, period): simulation = make_simulation_from_entities(test_case, ages_case) household = simulation.household - array = household.members('age', MONTH) + array = household.members('age', period) result0 = household.value_nth_person(0, array, default=-1) assert_near(result0, [40, 54]) @@ -314,11 +315,11 @@ def test_value_nth_person(make_simulation_from_entities, ages_case): assert_near(result3, [9, -1]) -def test_rank(make_simulation_from_entities, ages_case): +def test_rank(make_simulation_from_entities, ages_case, period): simulation = make_simulation_from_entities(ages_case) person = simulation.person - age = person('age', MONTH) # [40, 37, 7, 9, 54, 20] + age = person('age', period) # [40, 37, 7, 9, 54, 20] rank = person.get_rank(person.household, age) assert_near(rank, [3, 2, 0, 1, 1, 0]) @@ -326,7 +327,7 @@ def test_rank(make_simulation_from_entities, ages_case): assert_near(rank_in_siblings, [-1, -1, 1, 0, -1, 0]) -def test_partner(make_simulation_from_entities, case): +def test_partner(make_simulation_from_entities, case, period): case['persons']['ind0']['salary'] = 1000 case['persons']['ind1']['salary'] = 1500 case['persons']['ind4']['salary'] = 3000 @@ -335,14 +336,14 @@ def test_partner(make_simulation_from_entities, case): simulation = make_simulation_from_entities(case) persons = simulation.persons - salary = persons('salary', period = MONTH) + salary = persons('salary', period = period) salary_second_parent = persons.value_from_partner(salary, persons.household, PARENT) assert_near(salary_second_parent, [1500, 1000, 0, 0, 0, 0]) -def test_value_from_first_person(make_simulation_from_entities, case): +def test_value_from_first_person(make_simulation_from_entities, case, period): case['persons']['ind0']['salary'] = 1000 case['persons']['ind1']['salary'] = 1500 case['persons']['ind4']['salary'] = 3000 @@ -351,7 +352,7 @@ def test_value_from_first_person(make_simulation_from_entities, case): simulation = make_simulation_from_entities(case) household = simulation.household - salaries = household.members('salary', period = MONTH) + salaries = household.members('salary', period = period) salary_first_person = household.value_from_first_person(salaries) assert_near(salary_first_person, [1000, 3000]) @@ -373,7 +374,7 @@ def test_projectors_methods(simulation_couple): assert(len(household.first_parent.get_rank(household, salary_i)) == 1) # Must be of a person dimension -def test_sum_following_bug_ipp_1(make_simulation_from_entities): +def test_sum_following_bug_ipp_1(make_simulation_from_entities, period): new_case = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}}, 'households': { @@ -389,13 +390,13 @@ def test_sum_following_bug_ipp_1(make_simulation_from_entities): simulation = make_simulation_from_entities(new_case) household = simulation.household - eligible_i = household.members('salary', period = MONTH) < 1500 + eligible_i = household.members('salary', period = period) < 1500 nb_eligibles_by_household = household.sum(eligible_i, role = CHILD) assert_near(nb_eligibles_by_household, [0, 2]) -def test_sum_following_bug_ipp_2(make_simulation_from_entities): +def test_sum_following_bug_ipp_2(make_simulation_from_entities, period): new_case = { 'persons': {'ind0': {}, 'ind1': {}, 'ind2': {}, 'ind3': {}}, 'households': { @@ -411,7 +412,7 @@ def test_sum_following_bug_ipp_2(make_simulation_from_entities): simulation = make_simulation_from_entities(new_case) household = simulation.household - eligible_i = household.members('salary', period = MONTH) < 1500 + eligible_i = household.members('salary', period = period) < 1500 nb_eligibles_by_household = household.sum(eligible_i, role = CHILD) assert_near(nb_eligibles_by_household, [2, 0]) @@ -426,7 +427,7 @@ def test_get_memory_usage(tax_benefit_system, single): assert(len(memory_usage['by_variable']) == 1) -def test_unordered_persons(make_simulation_from_entities): +def test_unordered_persons(make_simulation_from_entities, period): new_case = { 'persons': {'ind4': {}, 'ind3': {}, 'ind1': {}, 'ind2': {}, 'ind5': {}, 'ind0': {}}, 'households': { @@ -447,7 +448,7 @@ def test_unordered_persons(make_simulation_from_entities): # household.members_entity_id == [1, 0, 0, 0, 1, 0] - simulation = make_simulation_from_entities(new_case, MONTH) + simulation = make_simulation_from_entities(new_case, period) household = simulation.household person = simulation.person From 5c70aa55a68529a4f9ea2583d1a9bfbab36df45e Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 23:27:13 +0100 Subject: [PATCH 27/36] Fix typo --- tests/core/test_entities.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index bcfe6713a4..3f2d0a28e8 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -41,10 +41,10 @@ def _make_simulation_from_yaml(simulation_yaml): @fixture def make_simulation_from_entities(tax_benefit_system, simulation_builder, period): - def _make_simulation_from_enties(entities, period=period): + def _make_simulation_from_entities(entities, period=period): simulation_builder.set_default_period(period) return simulation_builder.build_from_entities(tax_benefit_system, entities) - return _make_simulation_from_enties + return _make_simulation_from_entities @fixture def simulation_case(make_simulation_from_entities, case): From 1bae580a02aae74183a5479c442b1f0233dc7d72 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 23:59:55 +0100 Subject: [PATCH 28/36] Fix flake8 errors --- tests/core/test_entities.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index 3f2d0a28e8..566e868272 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -32,20 +32,21 @@ def ages_case(case): CHILD = Household.CHILD -@fixture +@fixture def make_simulation_from_yaml(tax_benefit_system, simulation_builder): def _make_simulation_from_yaml(simulation_yaml): return simulation_builder.build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) return _make_simulation_from_yaml -@fixture +@fixture def make_simulation_from_entities(tax_benefit_system, simulation_builder, period): def _make_simulation_from_entities(entities, period=period): simulation_builder.set_default_period(period) return simulation_builder.build_from_entities(tax_benefit_system, entities) return _make_simulation_from_entities + @fixture def simulation_case(make_simulation_from_entities, case): return make_simulation_from_entities(case) @@ -60,7 +61,7 @@ def test_role_index_and_positions(simulation_case): def test_entity_structure_with_constructor(make_simulation_from_yaml): - simulation = make_simulation_from_yaml(""" + simulation = make_simulation_from_yaml(""" persons: bill: {} bob: {} @@ -298,7 +299,7 @@ def test_min(make_simulation_from_entities, ages_case, period): def test_value_nth_person(make_simulation_from_entities, ages_case, period): - simulation = make_simulation_from_entities(test_case, ages_case) + simulation = make_simulation_from_entities(ages_case) household = simulation.household array = household.members('age', period) @@ -418,7 +419,7 @@ def test_sum_following_bug_ipp_2(make_simulation_from_entities, period): assert_near(nb_eligibles_by_household, [2, 0]) -def test_get_memory_usage(tax_benefit_system, single): +def test_get_memory_usage(tax_benefit_system, simulation_builder, single): single["persons"]["Alicia"]["salary"] = {"2017-01": 0} simulation = simulation_builder.build_from_dict(tax_benefit_system, single) simulation.calculate('disposable_income', '2017-01') From e4e8eda2b597bd0f23de1097831c837bd074a702 Mon Sep 17 00:00:00 2001 From: cescofran Date: Thu, 21 Jan 2021 23:56:14 +0100 Subject: [PATCH 29/36] Add make_simulation_from_yaml in test_axes --- tests/core/conftest.py | 13 ++++++++++--- tests/core/test_axes.py | 8 +++----- tests/core/test_entities.py | 8 -------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 2b05d6a7a4..59ea8e1191 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -4,16 +4,16 @@ from datetime import date from pytest import fixture -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_country_template import CountryTaxBenefitSystem +from openfisca_country_template.entities import * # noqa analysis:ignore +from openfisca_core.simulation_builder import SimulationBuilder +from openfisca_core.tools.test_runner import yaml from openfisca_core.variables import Variable from openfisca_core.periods import ETERNITY from openfisca_core.entities import Entity, GroupEntity from openfisca_core.indexed_enums import Enum as OFEnum - from openfisca_core.model_api import * # noqa analysis:ignore -from openfisca_country_template.entities import * # noqa analysis:ignore class TestVariable(Variable): @@ -66,6 +66,13 @@ def _make_simulation(tbs, data): return _make_simulation +@fixture +def make_simulation_from_yaml(tax_benefit_system, simulation_builder): + def _make_simulation_from_yaml(simulation_yaml): + return simulation_builder.build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) + return _make_simulation_from_yaml + + @fixture def persons(): class TestPersonEntity(Entity): diff --git a/tests/core/test_axes.py b/tests/core/test_axes.py index 1346611be4..fd91c6790a 100644 --- a/tests/core/test_axes.py +++ b/tests/core/test_axes.py @@ -126,8 +126,8 @@ def test_add_perpendicular_axes(simulation_builder, persons): # Integration test -def test_simulation_with_axes(tax_benefit_system, simulation_builder): - input_yaml = """ +def test_simulation_with_axes(make_simulation_from_yaml): + simulation = make_simulation_from_yaml(""" persons: Alicia: {salary: {2018-11: 0}} Javier: {} @@ -144,8 +144,6 @@ def test_simulation_with_axes(tax_benefit_system, simulation_builder): min: 0 max: 3000 period: 2018-11 - """ - data = yaml.safe_load(input_yaml) - simulation = simulation_builder.build_from_dict(tax_benefit_system, data) + """) assert simulation.get_array('salary', '2018-11') == approx([0, 0, 0, 0, 0, 0]) assert simulation.get_array('rent', '2018-11') == approx([0, 0, 3000, 0]) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index 566e868272..57a5e562e4 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -3,7 +3,6 @@ from pytest import fixture from openfisca_core.tools import assert_near -from openfisca_core.tools.test_runner import yaml from openfisca_country_template.entities import Household @@ -32,13 +31,6 @@ def ages_case(case): CHILD = Household.CHILD -@fixture -def make_simulation_from_yaml(tax_benefit_system, simulation_builder): - def _make_simulation_from_yaml(simulation_yaml): - return simulation_builder.build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) - return _make_simulation_from_yaml - - @fixture def make_simulation_from_entities(tax_benefit_system, simulation_builder, period): def _make_simulation_from_entities(entities, period=period): From fb9089f989c657b3b897c14c1823d8e7dbe9a20d Mon Sep 17 00:00:00 2001 From: Mahdi Ben Jelloul Date: Fri, 22 Jan 2021 12:18:15 +0100 Subject: [PATCH 30/36] flake8 --- tests/core/conftest.py | 68 +++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 59ea8e1191..76cff50fc2 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -181,42 +181,43 @@ def single(): @fixture def couple(): return { - "persons": { - "Alicia": { - "birth": { - "ETERNITY": "1980-01-01" - }, - "salary": { - "2017-01": 4000 - }, - "disposable_income": { - "2017-01": None - } - }, - "Javier": { - "birth": { - "ETERNITY": "1984-01-01" - }, - "salary": { - "2017-01": 2500 - }, - "disposable_income": { - "2017-01": None - } - } - }, - "households": { - "_": { - "parents": ["Alicia", "Javier"], - "total_benefits": { - "2017-01": None + "persons": { + "Alicia": { + "birth": { + "ETERNITY": "1980-01-01" + }, + "salary": { + "2017-01": 4000 + }, + "disposable_income": { + "2017-01": None + } + }, + "Javier": { + "birth": { + "ETERNITY": "1984-01-01" + }, + "salary": { + "2017-01": 2500 + }, + "disposable_income": { + "2017-01": None + } + } }, - "total_taxes": { - "2017-01": None + "households": { + "_": { + "parents": ["Alicia", "Javier"], + "total_benefits": { + "2017-01": None + }, + "total_taxes": { + "2017-01": None + } + } } } - } -} + @fixture def simulation_single(simulation_builder, tax_benefit_system, single): @@ -258,7 +259,6 @@ def simulation_single_with_variables(simulation_builder, tax_benefit_system, sin return simulation_builder.build_from_entities(tax_benefit_system, single) - # 1 <--> 2 with same period class variable1(Variable): value_type = int From af2af135c0ec062e885b2a1769204ff9f9748029 Mon Sep 17 00:00:00 2001 From: cescofran Date: Fri, 22 Jan 2021 21:58:56 +0100 Subject: [PATCH 31/36] Add tax_benefit_system fixtures to test_extensions --- tests/core/test_extensions.py | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/tests/core/test_extensions.py b/tests/core/test_extensions.py index 864adf606e..1ea95e8844 100644 --- a/tests/core/test_extensions.py +++ b/tests/core/test_extensions.py @@ -1,29 +1,23 @@ import pytest -from openfisca_country_template import CountryTaxBenefitSystem +def test_load_extension(tax_benefit_system): + new_tax_benefit_system = tax_benefit_system.clone() + assert new_tax_benefit_system.get_variable('local_town_child_allowance') is None -original_tbs = CountryTaxBenefitSystem() + new_tax_benefit_system.load_extension('openfisca_extension_template') + assert new_tax_benefit_system.get_variable('local_town_child_allowance') is not None + assert tax_benefit_system.get_variable('local_town_child_allowance') is None -def test_load_extension(): - tbs = original_tbs.clone() - assert tbs.get_variable('local_town_child_allowance') is None - tbs.load_extension('openfisca_extension_template') +def test_access_to_parameters(tax_benefit_system): + tax_benefit_system.load_extension('openfisca_extension_template') - assert tbs.get_variable('local_town_child_allowance') is not None - assert original_tbs.get_variable('local_town_child_allowance') is None + assert tax_benefit_system.parameters('2016-01').local_town.child_allowance.amount == 100.0 + assert tax_benefit_system.parameters.local_town.child_allowance.amount('2016-01') == 100.0 -def test_access_to_parameters(): - tbs = original_tbs.clone() - tbs.load_extension('openfisca_extension_template') - - assert tbs.parameters('2016-01').local_town.child_allowance.amount == 100.0 - assert tbs.parameters.local_town.child_allowance.amount('2016-01') == 100.0 - - -def test_failure_to_load_extension_when_directory_doesnt_exist(): +def test_failure_to_load_extension_when_directory_doesnt_exist(tax_benefit_system): with pytest.raises(ValueError): - original_tbs.load_extension('/this/is/not/a/real/path') + tax_benefit_system.load_extension('/this/is/not/a/real/path') From 9244c4e2a6633b1b8d937ad8e80301fe411ba2df Mon Sep 17 00:00:00 2001 From: cescofran Date: Fri, 22 Jan 2021 22:00:10 +0100 Subject: [PATCH 32/36] Refactor fixtures in test_opt_out_cache --- tests/core/test_opt_out_cache.py | 40 ++++++-------------------------- 1 file changed, 7 insertions(+), 33 deletions(-) diff --git a/tests/core/test_opt_out_cache.py b/tests/core/test_opt_out_cache.py index 1b76287264..a4c2d33a3e 100644 --- a/tests/core/test_opt_out_cache.py +++ b/tests/core/test_opt_out_cache.py @@ -2,8 +2,6 @@ from pytest import fixture -from openfisca_core.simulation_builder import SimulationBuilder -from openfisca_country_template import CountryTaxBenefitSystem from openfisca_country_template.entities import Person from openfisca_core.variables import Variable from openfisca_core.periods import MONTH @@ -14,15 +12,6 @@ def month(): return '2016-05' -@fixture -def make_isolated_simulation(month): - def _make_simulation(tbs, data): - builder = SimulationBuilder() - builder.default_period = month - return builder.build_from_variables(tbs, data) - return _make_simulation - - class input(Variable): value_type = int entity = Person @@ -50,31 +39,20 @@ def formula(person, period): return person('intermediate', period) -def get_filled_tbs(): - tax_benefit_system = CountryTaxBenefitSystem() +@fixture +def simulation(tax_benefit_system, make_isolated_simulation): + tax_benefit_system.cache_blacklist = set(['intermediate']) tax_benefit_system.add_variables(input, intermediate, output) - - return tax_benefit_system - - -# TaxBenefitSystem instance declared after formulas + return make_isolated_simulation(tax_benefit_system, {'input': 1}) -tax_benefit_system = get_filled_tbs() - - -tax_benefit_system.cache_blacklist = set(['intermediate']) - - -def test_without_cache_opt_out(make_isolated_simulation, month): - simulation = make_isolated_simulation(tax_benefit_system, {'input': 1}) +def test_without_cache_opt_out(simulation, month): simulation.calculate('output', period = month) intermediate_cache = simulation.persons.get_holder('intermediate') assert(intermediate_cache.get_array(month) is not None) -def test_with_cache_opt_out(make_isolated_simulation, month): - simulation = make_isolated_simulation(tax_benefit_system, {'input': 1}) +def test_with_cache_opt_out(simulation, month): simulation.debug = True simulation.opt_out_cache = True simulation.calculate('output', period = month) @@ -82,11 +60,7 @@ def test_with_cache_opt_out(make_isolated_simulation, month): assert(intermediate_cache.get_array(month) is None) -tax_benefit_system2 = get_filled_tbs() - - -def test_with_no_blacklist(make_isolated_simulation, month): - simulation = make_isolated_simulation(tax_benefit_system2, {'input': 1}) +def test_with_no_blacklist(simulation, month): simulation.calculate('output', period = month) intermediate_cache = simulation.persons.get_holder('intermediate') assert(intermediate_cache.get_array(month) is not None) From ab640b9fbdbd8970dcdedf19217866f3c29c5d5c Mon Sep 17 00:00:00 2001 From: cescofran Date: Fri, 22 Jan 2021 22:01:43 +0100 Subject: [PATCH 33/36] Refactor fixtures in test_parameters add tmp_path --- tests/core/test_parameters.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/core/test_parameters.py b/tests/core/test_parameters.py index 7e7426c5f6..1b585723e3 100644 --- a/tests/core/test_parameters.py +++ b/tests/core/test_parameters.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -import tempfile - import pytest from openfisca_core.parameters import ParameterNotFound, ParameterNode, ParameterNodeAtInstant, load_parameter_file @@ -58,13 +56,12 @@ def test_wrong_value(tax_benefit_system): income_tax_rate("test") -def test_parameter_repr(tax_benefit_system): +def test_parameter_repr(tax_benefit_system, tmp_path): + path = tmp_path / 'parameters' parameters = tax_benefit_system.parameters - tf = tempfile.NamedTemporaryFile(delete = False) - tf.write(repr(parameters).encode('utf-8')) - tf.close() - tf_parameters = load_parameter_file(file_path = tf.name) - assert repr(parameters) == repr(tf_parameters) + path.write_bytes(repr(parameters).encode('utf-8')) + tmp_parameters = load_parameter_file(file_path = path) + assert repr(parameters) == repr(tmp_parameters) def test_parameters_metadata(tax_benefit_system): From bf03583e3404c973c2141596e6fa2df294e70a08 Mon Sep 17 00:00:00 2001 From: cescofran Date: Fri, 22 Jan 2021 22:03:15 +0100 Subject: [PATCH 34/36] Refactor fixtures in test_reform --- tests/core/test_reforms.py | 61 +++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/tests/core/test_reforms.py b/tests/core/test_reforms.py index c76739691d..a369eb28ef 100644 --- a/tests/core/test_reforms.py +++ b/tests/core/test_reforms.py @@ -6,41 +6,26 @@ from openfisca_core import periods from openfisca_core.periods import Instant -from openfisca_core.simulation_builder import SimulationBuilder from openfisca_core.tools import assert_near from openfisca_core.parameters import ValuesHistory, ParameterNode from openfisca_country_template.entities import Household, Person from openfisca_core.model_api import * # noqa analysis:ignore -from openfisca_country_template import CountryTaxBenefitSystem -tax_benefit_system = CountryTaxBenefitSystem() @fixture -def make_simulation(): +def make_simulation(simulation_builder): def _make_simulation(tbs, period, data): - builder = SimulationBuilder() - builder.default_period = period - return builder.build_from_variables(tbs, data) + simulation_builder.default_period = period + return simulation_builder.build_from_variables(tbs, data) return _make_simulation -class goes_to_school(Variable): - value_type = bool - default_value = True - entity = Person - label = "The person goes to school (only relevant for children)" - definition_period = MONTH - - -tax_benefit_system.add_variable(goes_to_school) - - class WithBasicIncomeNeutralized(Reform): def apply(self): self.neutralize_variable('basic_income') -def test_formula_neutralization(make_simulation): +def test_formula_neutralization(tax_benefit_system, make_simulation): reform = WithBasicIncomeNeutralized(tax_benefit_system) period = '2017-01' @@ -61,21 +46,31 @@ def test_formula_neutralization(make_simulation): assert_near(disposable_income_reform, 0) -def test_neutralization_variable_with_default_value(make_simulation): +def test_neutralization_variable_with_default_value(tax_benefit_system, make_simulation): + + class goes_to_school(Variable): + value_type = bool + default_value = True + entity = Person + label = "The person goes to school (only relevant for children)" + definition_period = MONTH + class test_goes_to_school_neutralization(Reform): def apply(self): self.neutralize_variable('goes_to_school') + tax_benefit_system.add_variable(goes_to_school) + reform = test_goes_to_school_neutralization(tax_benefit_system) period = "2017-01" simulation = make_simulation(reform.base_tax_benefit_system, period, {}) - goes_to_school = simulation.calculate('goes_to_school', period) - assert_near(goes_to_school, [True], absolute_error_margin = 0) + goes_to_school_result = simulation.calculate('goes_to_school', period) + assert_near(goes_to_school_result, [True], absolute_error_margin = 0) -def test_neutralization_optimization(make_simulation): +def test_neutralization_optimization(tax_benefit_system, make_simulation): reform = WithBasicIncomeNeutralized(tax_benefit_system) period = '2017-01' @@ -90,7 +85,7 @@ def test_neutralization_optimization(make_simulation): assert basic_income_holder.get_known_periods() == [] -def test_input_variable_neutralization(make_simulation): +def test_input_variable_neutralization(tax_benefit_system, make_simulation): class test_salary_neutralization(Reform): def apply(self): @@ -111,7 +106,7 @@ def apply(self): assert_near(disposable_income_reform, [600, 600]) -def test_permanent_variable_neutralization(make_simulation): +def test_permanent_variable_neutralization(tax_benefit_system, make_simulation): class test_date_naissance_neutralization(Reform): def apply(self): @@ -223,7 +218,7 @@ def check_update_items(description, value_history, start_instant, stop_instant, ) -def test_add_variable(make_simulation): +def test_add_variable(tax_benefit_system, make_simulation): class new_variable(Variable): value_type = int label = "Nouvelle variable introduite par la réforme" @@ -247,7 +242,7 @@ def apply(self): assert_near(new_variable1, 10, absolute_error_margin = 0) -def test_add_dated_variable(make_simulation): +def test_add_dated_variable(tax_benefit_system, make_simulation): class new_dated_variable(Variable): value_type = int label = "Nouvelle variable introduite par la réforme" @@ -272,7 +267,7 @@ def apply(self): assert_near(new_dated_variable1, 15, absolute_error_margin = 0) -def test_update_variable(make_simulation): +def test_update_variable(tax_benefit_system, make_simulation): class disposable_income(Variable): definition_period = MONTH @@ -303,7 +298,7 @@ def apply(self): assert(disposable_income2 > 100) -def test_replace_variable(): +def test_replace_variable(tax_benefit_system): class disposable_income(Variable): definition_period = MONTH @@ -324,7 +319,7 @@ def apply(self): assert disposable_income_reform.get_formula('2017') is None -def test_wrong_reform(): +def test_wrong_reform(tax_benefit_system): class wrong_reform(Reform): # A Reform must implement an `apply` method pass @@ -333,7 +328,7 @@ class wrong_reform(Reform): wrong_reform(tax_benefit_system) -def test_modify_parameters(): +def test_modify_parameters(tax_benefit_system): def modify_parameters(reference_parameters): reform_parameters_subtree = ParameterNode( @@ -361,7 +356,7 @@ def apply(self): assert parameters_at_instant.new_node.new_param is True -def test_attributes_conservation(): +def test_attributes_conservation(tax_benefit_system): class some_variable(Variable): value_type = int @@ -391,7 +386,7 @@ def apply(self): assert reform_variable.calculate_output == baseline_variable.calculate_output -def test_formulas_removal(): +def test_formulas_removal(tax_benefit_system): class reform(Reform): def apply(self): From f77117bfc5b60d6b9a54d40555bd7d7d5ce01811 Mon Sep 17 00:00:00 2001 From: cescofran Date: Fri, 22 Jan 2021 22:04:07 +0100 Subject: [PATCH 35/36] Use simulations fixtures in test_simulation --- tests/core/test_simulations.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/core/test_simulations.py b/tests/core/test_simulations.py index 28df89df90..dde211a8c6 100644 --- a/tests/core/test_simulations.py +++ b/tests/core/test_simulations.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- -def test_calculate_full_tracer(tax_benefit_system, simulation_builder): - simulation = simulation_builder.build_default_simulation(tax_benefit_system) +def test_calculate_full_tracer(simulation): simulation.trace = True simulation.calculate('income_tax', '2017-01') @@ -21,8 +20,7 @@ def test_calculate_full_tracer(tax_benefit_system, simulation_builder): assert income_tax_node.parameters[0].value == 0.15 -def test_get_entity_not_found(tax_benefit_system, simulation_builder): - simulation = simulation_builder.build_default_simulation(tax_benefit_system) +def test_get_entity_not_found(simulation): assert simulation.get_entity(plural = "no_such_entities") is None @@ -55,9 +53,8 @@ def test_clone(tax_benefit_system, simulation_builder): assert salary_holder_clone.population == simulation_clone.persons -def test_get_memory_usage(tax_benefit_system, simulation_builder, single): - simulation = simulation_builder.build_from_entities(tax_benefit_system, single) - simulation.calculate('disposable_income', '2017-01') - memory_usage = simulation.get_memory_usage(variables = ['salary']) +def test_get_memory_usage(simulation_single): + simulation_single.calculate('disposable_income', '2017-01') + memory_usage = simulation_single.get_memory_usage(variables = ['salary']) assert(memory_usage['total_nb_bytes'] > 0) assert(len(memory_usage['by_variable']) == 1) From a162adb3d9561b68cd9f8ee14b9feb48d1520287 Mon Sep 17 00:00:00 2001 From: cescofran Date: Sat, 23 Jan 2021 19:30:46 +0100 Subject: [PATCH 36/36] Refactor with the make_variable fixture --- tests/core/conftest.py | 248 +++++--------------------- tests/core/test_calculate_output.py | 29 ++- tests/core/test_countries.py | 16 +- tests/core/test_cycles.py | 39 ++++ tests/core/test_entities.py | 5 + tests/core/test_opt_out_cache.py | 4 +- tests/core/test_simulation_builder.py | 66 ++++++- 7 files changed, 193 insertions(+), 214 deletions(-) diff --git a/tests/core/conftest.py b/tests/core/conftest.py index 76cff50fc2..572a934a51 100644 --- a/tests/core/conftest.py +++ b/tests/core/conftest.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -from enum import Enum -from datetime import date from pytest import fixture from openfisca_country_template import CountryTaxBenefitSystem @@ -12,65 +10,26 @@ from openfisca_core.variables import Variable from openfisca_core.periods import ETERNITY from openfisca_core.entities import Entity, GroupEntity -from openfisca_core.indexed_enums import Enum as OFEnum from openfisca_core.model_api import * # noqa analysis:ignore -class TestVariable(Variable): - definition_period = ETERNITY - value_type = float - - def __init__(self, entity): - self.__class__.entity = entity - super().__init__() - - -@fixture -def tax_benefit_system(): - return CountryTaxBenefitSystem() - - -@fixture -def simulation_builder(): - return SimulationBuilder() - - -@fixture -def simulation(tax_benefit_system, simulation_builder): - return SimulationBuilder().build_default_simulation(tax_benefit_system) - +# PERIODS @fixture def period(): return "2016-01" -@fixture -def year_period(): - return "2016" +# ENTITIES -@fixture -def make_simulation(tax_benefit_system, simulation_builder, period): - def _make_simulation(data): - simulation_builder.default_period = period - return simulation_builder.build_from_variables(tax_benefit_system, data) - return _make_simulation - - -@fixture -def make_isolated_simulation(simulation_builder, period): - def _make_simulation(tbs, data): - simulation_builder.default_period = period - return simulation_builder.build_from_variables(tbs, data) - return _make_simulation - +class TestVariable(Variable): + definition_period = ETERNITY + value_type = float -@fixture -def make_simulation_from_yaml(tax_benefit_system, simulation_builder): - def _make_simulation_from_yaml(simulation_yaml): - return simulation_builder.build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) - return _make_simulation_from_yaml + def __init__(self, entity): + self.__class__.entity = entity + super().__init__() @fixture @@ -87,53 +46,6 @@ def check_variable_defined_for_entity(self, variable_name): return TestPersonEntity("person", "persons", "", "") -@fixture -def int_variable(persons): - - class intvar(Variable): - definition_period = ETERNITY - value_type = int - entity = persons - - def __init__(self): - super().__init__() - - return intvar() - - -@fixture -def date_variable(persons): - - class datevar(Variable): - definition_period = ETERNITY - value_type = date - entity = persons - - def __init__(self): - super().__init__() - - return datevar() - - -@fixture -def enum_variable(): - - class TestEnum(Variable): - definition_period = ETERNITY - value_type = OFEnum - dtype = 'O' - default_value = '0' - is_neutralized = False - set_input = None - possible_values = Enum('foo', 'bar') - name = "enum" - - def __init__(self): - pass - - return TestEnum() - - @fixture def group_entity(): class Household(GroupEntity): @@ -218,132 +130,68 @@ def couple(): } } - -@fixture -def simulation_single(simulation_builder, tax_benefit_system, single): - return simulation_builder.build_from_entities(tax_benefit_system, single) +# TAX BENEFIt SYSTEMS @fixture -def simulation_couple(simulation_builder, tax_benefit_system, couple): - return simulation_builder.build_from_entities(tax_benefit_system, couple) - - -class simple_variable(Variable): - entity = Person - definition_period = MONTH - value_type = int - - -class variable_with_calculate_output_add(Variable): - entity = Person - definition_period = MONTH - value_type = int - calculate_output = calculate_output_add +def tax_benefit_system(): + return CountryTaxBenefitSystem() -class variable_with_calculate_output_divide(Variable): - entity = Person - definition_period = YEAR - value_type = int - calculate_output = calculate_output_divide +# SIMULATIONS @fixture -def simulation_single_with_variables(simulation_builder, tax_benefit_system, single): - tax_benefit_system.add_variables( - simple_variable, - variable_with_calculate_output_add, - variable_with_calculate_output_divide - ) - return simulation_builder.build_from_entities(tax_benefit_system, single) - - -# 1 <--> 2 with same period -class variable1(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - return person('variable2', period) - - -class variable2(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - return person('variable1', period) - - -# 3 <--> 4 with a period offset -class variable3(Variable): - value_type = int - entity = Person - definition_period = MONTH - - def formula(person, period): - return person('variable4', period.last_month) - +def simulation_builder(): + return SimulationBuilder() -class variable4(Variable): - value_type = int - entity = Person - definition_period = MONTH - def formula(person, period): - return person('variable3', period) +@fixture +def simulation(tax_benefit_system, simulation_builder): + return SimulationBuilder().build_default_simulation(tax_benefit_system) -# 5 -f-> 6 with a period offset -# <--- -class variable5(Variable): - value_type = int - entity = Person - definition_period = MONTH +@fixture +def make_simulation_from_entities(tax_benefit_system, simulation_builder): + def _make_simulation_from_entities(entities): + return simulation_builder.build_from_entities(tax_benefit_system, entities) + return _make_simulation_from_entities - def formula(person, period): - variable6 = person('variable6', period.last_month) - return 5 + variable6 +@fixture +def make_simulation_from_tbs_and_variables(simulation_builder, period): + def _make_simulation_from_variables_and_tbs(tbs, variables): + simulation_builder.default_period = period + return simulation_builder.build_from_variables(tbs, variables) + return _make_simulation_from_variables_and_tbs -class variable6(Variable): - value_type = int - entity = Person - definition_period = MONTH - def formula(person, period): - variable5 = person('variable5', period) - return 6 + variable5 +@fixture +def make_simulation_from_yaml(tax_benefit_system, simulation_builder): + def _make_simulation_from_yaml(simulation_yaml): + return simulation_builder.build_from_dict(tax_benefit_system, yaml.safe_load(simulation_yaml)) + return _make_simulation_from_yaml -class variable7(Variable): - value_type = int - entity = Person - definition_period = MONTH +@fixture +def simulation_single(make_simulation_from_entities, single): + return make_simulation_from_entities(single) - def formula(person, period): - variable5 = person('variable5', period) - return 7 + variable5 +@fixture +def simulation_couple(make_simulation_from_entities, couple): + return make_simulation_from_entities(couple) -# december cotisation depending on november value -class cotisation(Variable): - value_type = int - entity = Person - definition_period = MONTH - def formula(person, period): - if period.start.month == 12: - return 2 * person('cotisation', period.last_month) - else: - return person.empty_array() + 1 +# VARIABLES @fixture -def simulation_with_variables(tax_benefit_system, simulation_builder): - tax_benefit_system.add_variables(variable1, variable2, variable3, variable4, - variable5, variable6, variable7, cotisation) - return SimulationBuilder().build_default_simulation(tax_benefit_system) +def make_variable(): + def _make_variable(name, **new_methods_and_attrs): + methods_and_attrs = {} + default = dict(value_type = int, entity = Person, definition_period = MONTH) + methods_and_attrs.update(default) + methods_and_attrs.update(new_methods_and_attrs) + return type(name, (Variable, ), methods_and_attrs) + return _make_variable diff --git a/tests/core/test_calculate_output.py b/tests/core/test_calculate_output.py index bfc26e8715..c31294ef97 100644 --- a/tests/core/test_calculate_output.py +++ b/tests/core/test_calculate_output.py @@ -1,6 +1,33 @@ -from pytest import raises +from pytest import fixture, raises from openfisca_core.tools import assert_near +from openfisca_core.simulations import calculate_output_add +from openfisca_core.simulations import calculate_output_divide +from openfisca_core.periods import YEAR + + +@fixture +def simple_variable(make_variable): + return make_variable('simple_variable') + + +@fixture +def variable_with_calculate_output_add(make_variable): + return make_variable('variable_with_calculate_output_add', calculate_output = calculate_output_add) + + +@fixture +def variable_with_calculate_output_divide(make_variable): + return make_variable('variable_with_calculate_output_divide', + definition_period = YEAR, + calculate_output = calculate_output_divide) + + +@fixture +def simulation_single_with_variables(simulation_builder, tax_benefit_system, single, + simple_variable, variable_with_calculate_output_add, variable_with_calculate_output_divide): + tax_benefit_system.add_variables(simple_variable, variable_with_calculate_output_add, variable_with_calculate_output_divide) + return simulation_builder.build_from_entities(tax_benefit_system, single) def test_calculate_output_default(simulation_single_with_variables): diff --git a/tests/core/test_countries.py b/tests/core/test_countries.py index a1c6bafa02..b1544b54ad 100644 --- a/tests/core/test_countries.py +++ b/tests/core/test_countries.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from pytest import raises +from pytest import fixture, raises from openfisca_core.variables import Variable from openfisca_core.periods import MONTH @@ -10,6 +10,14 @@ from openfisca_core.tools import assert_near +@fixture +def make_simulation(tax_benefit_system, simulation_builder, period): + def _make_simulation(variables): + simulation_builder.default_period = period + return simulation_builder.build_from_variables(tax_benefit_system, variables) + return _make_simulation + + def test_input_variable(make_simulation, period): simulation = make_simulation({'salary': 2000}) assert_near(simulation.calculate('salary', period), [2000], absolute_error_margin = 0.01) @@ -76,8 +84,8 @@ def test_input_with_wrong_period(make_simulation): make_simulation({'basic_income': {2015: 12000}}) -def test_variable_with_reference(tax_benefit_system, make_isolated_simulation): - simulation_base = make_isolated_simulation(tax_benefit_system, {'salary': 4000}) +def test_variable_with_reference(tax_benefit_system, make_simulation_from_tbs_and_variables): + simulation_base = make_simulation_from_tbs_and_variables(tax_benefit_system, {'salary': 4000}) revenu_disponible_avant_reforme = simulation_base.calculate('disposable_income', "2016-01") assert(revenu_disponible_avant_reforme > 0) @@ -90,7 +98,7 @@ def formula(household, period): tax_benefit_system.update_variable(disposable_income) - simulation_reform = make_isolated_simulation(tax_benefit_system, {'salary': 4000}) + simulation_reform = make_simulation_from_tbs_and_variables(tax_benefit_system, {'salary': 4000}) revenu_disponible_apres_reforme = simulation_reform.calculate('disposable_income', "2016-01") assert(revenu_disponible_apres_reforme == 0) diff --git a/tests/core/test_cycles.py b/tests/core/test_cycles.py index eae9675d61..053731fe78 100644 --- a/tests/core/test_cycles.py +++ b/tests/core/test_cycles.py @@ -12,6 +12,45 @@ def reference_period(): return periods.period('2013-01') +# december cotisation depending on november value +@fixture +def cotisation(make_variable): + variable = make_variable('cotisation') + + def formula(person, period): + if period.start.month == 12: + return 2 * person('cotisation', period.last_month) + else: + return person.empty_array() + 1 + variable.formula = formula + return variable + + +@fixture +def cycle_variables(make_variable, cotisation): + variables = [ + # 1 <--> 2 with same period + make_variable('variable1', formula = lambda person, period: person('variable2', period)), + make_variable('variable2', formula = lambda person, period: person('variable1', period)), + # 3 <--> 4 with a period offset + make_variable('variable3', formula = lambda person, period: person('variable4', period.last_month)), + make_variable('variable4', formula = lambda person, period: person('variable3', period)), + # 5 -f-> 6 with a period offset + # <--- + make_variable('variable5', formula = lambda person, period: 5 + person('variable6', period.last_month)), + make_variable('variable6', formula = lambda person, period: 6 + person('variable5', period)), + make_variable('variable7', formula = lambda person, period: 7 + person('variable5', period)), + cotisation + ] + return variables + + +@fixture +def simulation_with_variables(tax_benefit_system, simulation_builder, cycle_variables): + tax_benefit_system.add_variables(*cycle_variables) + return simulation_builder.build_default_simulation(tax_benefit_system) + + def test_pure_cycle(simulation_with_variables, reference_period): with raises(CycleError): simulation_with_variables.calculate('variable1', period = reference_period) diff --git a/tests/core/test_entities.py b/tests/core/test_entities.py index 57a5e562e4..8120c99e8a 100644 --- a/tests/core/test_entities.py +++ b/tests/core/test_entities.py @@ -6,6 +6,11 @@ from openfisca_country_template.entities import Household +@fixture +def year_period(): + return "2016" + + @fixture def case(): return { diff --git a/tests/core/test_opt_out_cache.py b/tests/core/test_opt_out_cache.py index a4c2d33a3e..b7dfcb129d 100644 --- a/tests/core/test_opt_out_cache.py +++ b/tests/core/test_opt_out_cache.py @@ -40,10 +40,10 @@ def formula(person, period): @fixture -def simulation(tax_benefit_system, make_isolated_simulation): +def simulation(tax_benefit_system, make_simulation_from_tbs_and_variables): tax_benefit_system.cache_blacklist = set(['intermediate']) tax_benefit_system.add_variables(input, intermediate, output) - return make_isolated_simulation(tax_benefit_system, {'input': 1}) + return make_simulation_from_tbs_and_variables(tax_benefit_system, {'input': 1}) def test_without_cache_opt_out(simulation, month): diff --git a/tests/core/test_simulation_builder.py b/tests/core/test_simulation_builder.py index 72b255ed0a..85348d3fbb 100644 --- a/tests/core/test_simulation_builder.py +++ b/tests/core/test_simulation_builder.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- from typing import Iterable -from pytest import raises, approx +from pytest import fixture, raises, approx +from datetime import date +from enum import Enum from openfisca_core.simulation_builder import Simulation from openfisca_core.tools import assert_near @@ -9,6 +11,56 @@ from openfisca_core.populations import Population from openfisca_country_template.entities import Household from openfisca_core.errors import SituationParsingError +from openfisca_core.variables import Variable +from openfisca_core.periods import ETERNITY +from openfisca_core.indexed_enums import Enum as OFEnum + + +@fixture +def enum_variable_instance(): + + class TestEnum(Variable): + definition_period = ETERNITY + value_type = OFEnum + dtype = 'O' + default_value = '0' + is_neutralized = False + set_input = None + possible_values = Enum('foo', 'bar') + name = "enum" + + def __init__(self): + pass + + return TestEnum() + + +@fixture +def int_variable_instance(persons): + + class intvar(Variable): + definition_period = ETERNITY + value_type = int + entity = persons + + def __init__(self): + super().__init__() + + return intvar() + + +@fixture +def date_variable_instance(persons): + + class datevar(Variable): + definition_period = ETERNITY + value_type = date + entity = persons + + def __init__(self): + super().__init__() + + return datevar() def test_build_default_simulation(tax_benefit_system, simulation_builder): @@ -124,27 +176,27 @@ def test_fail_on_ill_formed_expression(simulation_builder, persons): assert excinfo.value.error == {'persons': {'Alicia': {'salary': {'2018-11': "I couldn't understand '2 * / 1000' as a value for 'salary'"}}}} -def test_fail_on_integer_overflow(simulation_builder, persons, int_variable): +def test_fail_on_integer_overflow(simulation_builder, persons, int_variable_instance): instance_index = 0 simulation_builder.entity_counts['persons'] = 1 with raises(SituationParsingError) as excinfo: - simulation_builder.add_variable_value(persons, int_variable, instance_index, 'Alicia', '2018-11', 9223372036854775808) + simulation_builder.add_variable_value(persons, int_variable_instance, instance_index, 'Alicia', '2018-11', 9223372036854775808) assert excinfo.value.error == {'persons': {'Alicia': {'intvar': {'2018-11': "Can't deal with value: '9223372036854775808', it's too large for type 'integer'."}}}} -def test_fail_on_date_parsing(simulation_builder, persons, date_variable): +def test_fail_on_date_parsing(simulation_builder, persons, date_variable_instance): instance_index = 0 simulation_builder.entity_counts['persons'] = 1 with raises(SituationParsingError) as excinfo: - simulation_builder.add_variable_value(persons, date_variable, instance_index, 'Alicia', '2018-11', '2019-02-30') + simulation_builder.add_variable_value(persons, date_variable_instance, instance_index, 'Alicia', '2018-11', '2019-02-30') assert excinfo.value.error == {'persons': {'Alicia': {'datevar': {'2018-11': "Can't deal with date: '2019-02-30'."}}}} -def test_add_unknown_enum_variable_value(simulation_builder, persons, enum_variable): +def test_add_unknown_enum_variable_value(simulation_builder, persons, enum_variable_instance): instance_index = 0 simulation_builder.entity_counts['persons'] = 1 with raises(SituationParsingError): - simulation_builder.add_variable_value(persons, enum_variable, instance_index, 'Alicia', '2018-11', 'baz') + simulation_builder.add_variable_value(persons, enum_variable_instance, instance_index, 'Alicia', '2018-11', 'baz') def test_finalize_person_entity(simulation_builder, persons):