diff --git a/tests/tests/test_train_schedule.py b/tests/tests/test_train_schedule.py index 7e6639cea45..b625fd9cdeb 100644 --- a/tests/tests/test_train_schedule.py +++ b/tests/tests/test_train_schedule.py @@ -11,6 +11,17 @@ from .services import EDITOAST_URL +def kph2ms(kmh_speed: float) -> float: + return kmh_speed / 3.6 + + +MAX_SPEED_288 = kph2ms(288) +SPEED_LIMIT_142 = kph2ms(141.9984) +SPEED_LIMIT_112 = kph2ms(111.9996) +SAFE_SPEED_30 = kph2ms(29.9988) +SHORT_SLIP_SPEED_10 = kph2ms(10.0008) + + def _update_simulation_with_mareco_allowances(editoast_url, train_Schedule_id): response = requests.get(editoast_url + f"/train_schedule/{train_Schedule_id}/") assert response.status_code == 200 @@ -177,20 +188,20 @@ def test_etcs_schedule_stop_brakes_result_never_reach_mrsp(etcs_scenario: Scenar # In practice, check noticeable points of the braking curves (with the stops already checked) offset_first_high_speed = 14_509_017 offset_first_brake_220_kph_speed = 17_544_856 - assert abs(_get_current_or_next_speed_at(simulation_final_output, offset_first_high_speed) - kph2ms(274.176)) < 1e-2 - assert ( - abs(_get_current_or_next_speed_at(simulation_final_output, offset_first_brake_220_kph_speed) - kph2ms(221.004)) - < 1e-2 + _assert_equal_speeds( + _get_current_or_next_speed_at(simulation_final_output, offset_first_high_speed), kph2ms(274.176) + ) + _assert_equal_speeds( + _get_current_or_next_speed_at(simulation_final_output, offset_first_brake_220_kph_speed), kph2ms(221.004) ) offset_fourth_high_speed = 37_087_342 offset_fourth_brake_220_kph_speed = 37_661_601 - assert ( - abs(_get_current_or_next_speed_at(simulation_final_output, offset_fourth_high_speed) - kph2ms(230.976)) < 1e-2 + _assert_equal_speeds( + _get_current_or_next_speed_at(simulation_final_output, offset_fourth_high_speed), kph2ms(230.976) ) - assert ( - abs(_get_current_or_next_speed_at(simulation_final_output, offset_fourth_brake_220_kph_speed) - kph2ms(219.744)) - < 1e-2 + _assert_equal_speeds( + _get_current_or_next_speed_at(simulation_final_output, offset_fourth_brake_220_kph_speed), kph2ms(219.744) ) @@ -277,13 +288,13 @@ def test_etcs_schedule_result_stop_brake_from_mrsp(etcs_scenario: Scenario, etcs # Check that the braking curves from the MRSP for the first and second stops start at the expected offset offset_start_first_brake = 21_467_192 speed_before_first_brake = _get_current_or_next_speed_at(simulation_final_output, offset_start_first_brake) - assert abs(speed_before_first_brake - kph2ms(288)) < 1e-2 + _assert_equal_speeds(speed_before_first_brake, MAX_SPEED_288) assert ( _get_current_or_next_speed_at(simulation_final_output, offset_start_first_brake + 1) < speed_before_first_brake ) offset_start_second_brake = 40_663_532 speed_before_second_brake = _get_current_or_next_speed_at(simulation_final_output, offset_start_second_brake) - assert abs(speed_before_second_brake - kph2ms(141.9984)) < 1e-2 + _assert_equal_speeds(speed_before_second_brake, SPEED_LIMIT_142) assert ( _get_current_or_next_speed_at(simulation_final_output, offset_start_second_brake + 1) < speed_before_second_brake @@ -333,7 +344,7 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st # To debug this test: please add a breakpoint then use front to display speed-space chart # (activate Context for Slopes and Speed limits). - # Check that the curves does respect Ends of Authority (EoA = stops), and that there is an + # Check that the curves do respect Ends of Authority (EoA = stops), and that there is an # acceleration then deceleration in between (maintain speed when reach the MRSP). # This is the case here because MRSP is not doing ups-and-downs. final_stop_offset = 47_000_000 @@ -364,7 +375,7 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st # Check that the braking curves for limits of Authority (LoA = slowdowns of the MRSP) start and end at the # expected offset. # Also check a bending point for the first curve (where Guidance curve's influence stops). - # Note: the end of the braking is upstream the actual MRSP slowdown's target as per the offset applied to + # Note: the end of the braking is upstream of the actual MRSP slowdown's target as per the offset applied to # LoA braking curves. # First slowdown @@ -372,7 +383,7 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st speed_before_brake_288_to_142 = _get_current_or_next_speed_at( simulation_final_output, offset_start_brake_288_to_142 ) - assert abs(speed_before_brake_288_to_142 - kph2ms(288)) < 1e-2 + _assert_equal_speeds(speed_before_brake_288_to_142, MAX_SPEED_288) assert ( _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_288_to_142 + 1) < speed_before_brake_288_to_142 @@ -382,7 +393,7 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st speed_at_bending_guidance_point = _get_current_or_next_speed_at( simulation_final_output, offset_bending_guidance_point ) - assert abs(speed_at_bending_guidance_point - kph2ms(235.901_491_880_851_1)) < 1e-2 + _assert_equal_speeds(speed_at_bending_guidance_point, kph2ms(235.901_491_880_851_1)) offset_end_brake_288_to_142 = 40_724_374 speed_after_brake_288_to_142 = _get_current_or_next_speed_at(simulation_final_output, offset_end_brake_288_to_142) @@ -390,14 +401,14 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st _get_current_or_prev_speed_at(simulation_final_output, offset_end_brake_288_to_142 - 1) > speed_after_brake_288_to_142 ) - assert abs(speed_after_brake_288_to_142 - kph2ms(141.9984)) < 1e-2 + _assert_equal_speeds(speed_after_brake_288_to_142, SPEED_LIMIT_142) # Second slowdown offset_start_brake_142_to_120 = 44_313_934 speed_before_brake_142_to_120 = _get_current_or_next_speed_at( simulation_final_output, offset_start_brake_142_to_120 ) - assert abs(speed_before_brake_142_to_120 - kph2ms(141.9984)) < 1e-2 + _assert_equal_speeds(speed_before_brake_142_to_120, SPEED_LIMIT_142) assert ( _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_142_to_120 + 1) < speed_before_brake_142_to_120 @@ -408,12 +419,12 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st _get_current_or_prev_speed_at(simulation_final_output, offset_end_brake_142_to_120 - 1) > speed_after_brake_142_to_120 ) - assert abs(speed_after_brake_142_to_120 - kph2ms(111.9996)) < 1e-2 + _assert_equal_speeds(speed_after_brake_142_to_120, SPEED_LIMIT_112) - # Slowdown for Safety Speed stop: should probably disappear for ETCS at some point + # Slowdown for Safety Speed stop: should probably disappear for ETCS at some point. offset_start_brake_120_to_30 = 45_536_480 speed_before_brake_120_to_30 = _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_120_to_30) - assert abs(speed_before_brake_120_to_30 - kph2ms(111.9996)) < 1e-2 + _assert_equal_speeds(speed_before_brake_120_to_30, SPEED_LIMIT_112) assert ( _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_120_to_30 + 1) < speed_before_brake_120_to_30 @@ -424,12 +435,12 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st _get_current_or_prev_speed_at(simulation_final_output, offset_end_brake_120_to_30 - 1) > speed_after_brake_120_to_30 ) - assert abs(speed_after_brake_120_to_30 - kph2ms(29.9988)) < 1e-2 + _assert_equal_speeds(speed_after_brake_120_to_30, SAFE_SPEED_30) - # Slowdown for short slip stop: should probably disappear for ETCS at some point + # Slowdown for short slip stop: should probably disappear for ETCS at some point. offset_start_brake_30_to_10 = 46_597_240 speed_before_brake_30_to_10 = _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_30_to_10) - assert abs(speed_before_brake_30_to_10 - kph2ms(29.9988)) < 1e-2 + _assert_equal_speeds(speed_before_brake_30_to_10, SAFE_SPEED_30) assert ( _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_30_to_10 + 1) < speed_before_brake_30_to_10 @@ -440,20 +451,21 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st _get_current_or_prev_speed_at(simulation_final_output, offset_end_brake_30_to_10 - 1) > speed_after_brake_30_to_10 ) - assert abs(speed_after_brake_30_to_10 - kph2ms(10.0008)) < 1e-2 + _assert_equal_speeds(speed_after_brake_30_to_10, SHORT_SLIP_SPEED_10) - # Final slowdown: EoA (complete stop) braking curve is applied + # Final slowdown: EoA (complete stop) braking curve is applied. + # Note: This should also be impacted if Safety Speed stop and short slip stop disappear for ETCS. offset_start_brake_10_to_0 = 46_953_914 speed_before_brake_10_to_0 = _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_10_to_0) - assert abs(speed_before_brake_10_to_0 - kph2ms(10.0008)) < 1e-2 + _assert_equal_speeds(speed_before_brake_10_to_0, SHORT_SLIP_SPEED_10) assert ( _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_10_to_0 + 1) < speed_before_brake_10_to_0 ) -def kph2ms(kmh_speed: float) -> float: - return kmh_speed / 3.6 +def _assert_equal_speeds(left, right): + assert abs(left - right) < 1e-2 def _get_current_or_next_speed_at(simulation_final_output: Dict[str, Any], position: int) -> int: