diff --git a/stationapi/src/use_case/dto/simulation.rs b/stationapi/src/use_case/dto/simulation.rs index 812a5df3..74f22901 100644 --- a/stationapi/src/use_case/dto/simulation.rs +++ b/stationapi/src/use_case/dto/simulation.rs @@ -17,7 +17,7 @@ const SUBWAY_MAX_SPEED: f64 = 22.222_222_222_22; // 80 km/h const NORMAL_MAX_SPEED: f64 = 25.0; // 90 km/h const TRAM_MAX_SPEED: f64 = 11.111_111_111_11; // 40 km/h -const LIMITED_EXPRESS_KIND_MAX_SPEED: f64 = 36.111_111_111_1; // 130 km/h +const LIMITED_EXPRESS_KIND_FLOOR_SPEED: f64 = 36.111_111_111_1; // 130 km/h pub fn resolve_speed_profile( line_type: Option, @@ -40,9 +40,12 @@ pub fn resolve_speed_profile( _ => (NORMAL_MAX_SPEED, 0.83, 0.69), }; + // 種別による 130km/h は在来線の速達種別を底上げするための下限値。 + // 新幹線(のぞみ等は kind=LimitedExpress)では路線種別の上限の方が速いため、 + // 種別値で引き下げない。 let max_speed = match kind.and_then(|v| TrainTypeKind::try_from(v).ok()) { Some(TrainTypeKind::LimitedExpress) | Some(TrainTypeKind::HighSpeedRapid) => { - LIMITED_EXPRESS_KIND_MAX_SPEED + line_max_speed.max(LIMITED_EXPRESS_KIND_FLOOR_SPEED) } _ => line_max_speed, }; @@ -90,25 +93,39 @@ mod tests { } #[test] - fn limited_express_kind_caps_speed_over_line_type() { + fn limited_express_kind_raises_speed_over_line_type() { let p = resolve_speed_profile( Some(LineType::Normal as i32), false, Some(TrainTypeKind::LimitedExpress as i32), ); - assert_eq!(p.max_speed, LIMITED_EXPRESS_KIND_MAX_SPEED); + assert_eq!(p.max_speed, LIMITED_EXPRESS_KIND_FLOOR_SPEED); assert_eq!(p.max_acceleration, 0.83); assert_eq!(p.max_deceleration, 0.69); } #[test] - fn high_speed_rapid_kind_caps_speed() { + fn limited_express_kind_does_not_slow_down_bullet_train() { + // のぞみ等は kind=LimitedExpress で登録されているが、 + // 新幹線の路線上限(320km/h)を 130km/h に引き下げてはいけない。 + let p = resolve_speed_profile( + Some(LineType::BulletTrain as i32), + false, + Some(TrainTypeKind::LimitedExpress as i32), + ); + assert_eq!(p.max_speed, BULLET_TRAIN_MAX_SPEED); + assert_eq!(p.max_acceleration, 0.72); + assert_eq!(p.max_deceleration, 0.56); + } + + #[test] + fn high_speed_rapid_kind_raises_speed() { let p = resolve_speed_profile( Some(LineType::Normal as i32), false, Some(TrainTypeKind::HighSpeedRapid as i32), ); - assert_eq!(p.max_speed, LIMITED_EXPRESS_KIND_MAX_SPEED); + assert_eq!(p.max_speed, LIMITED_EXPRESS_KIND_FLOOR_SPEED); } #[test]