1use crate::curves::curve_py::Curve;
2use crate::curves::{CurveDF, CurveInterpolation};
3use crate::json::JSON;
4use crate::scheduling::DateRoll;
5use serde::{Deserialize, Serialize};
6
7impl<T, U> JSON for CurveDF<T, U>
8where
9 T: CurveInterpolation + for<'a> Deserialize<'a> + Serialize,
10 U: DateRoll + for<'a> Deserialize<'a> + Serialize,
11{
12}
13
14impl JSON for Curve {}
15
16#[cfg(test)]
17mod tests {
18 use super::*;
19 use crate::curves::curve_py::CurveInterpolator;
20 use crate::curves::{
21 FlatBackwardInterpolator, FlatForwardInterpolator, LinearInterpolator,
22 LinearZeroRateInterpolator, LogLinearInterpolator, Modifier, Nodes,
23 };
24 use crate::scheduling::{ndt, Convention, NamedCal};
25 use indexmap::IndexMap;
26
27 fn curve_fixture<T: CurveInterpolation>(interpolator: T) -> CurveDF<T, NamedCal> {
28 let nodes = Nodes::F64(IndexMap::from_iter(vec![
29 (ndt(2000, 1, 1), 1.0_f64),
30 (ndt(2001, 1, 1), 0.99_f64),
31 (ndt(2002, 1, 1), 0.98_f64),
32 ]));
33 let convention = Convention::Act360;
34 let modifier = Modifier::ModF;
35 let cal = NamedCal::try_new("all").unwrap();
36 CurveDF::try_new(nodes, interpolator, "crv", convention, modifier, None, cal).unwrap()
37 }
38
39 #[test]
40 fn test_curve_json_all_interpolators() {
41 macro_rules! test_interpolator {
42 ($Variant: ident) => {
43 let interpolator = $Variant::new();
44 let curve = curve_fixture(interpolator);
45 let js = curve.to_json().unwrap();
46 let curve2 = CurveDF::from_json(&js).unwrap();
47 assert_eq!(curve, curve2);
48 };
49 }
50
51 test_interpolator!(FlatBackwardInterpolator);
52 test_interpolator!(FlatForwardInterpolator);
53 test_interpolator!(LogLinearInterpolator);
54 test_interpolator!(LinearInterpolator);
55 test_interpolator!(LinearZeroRateInterpolator);
56 }
57
58 #[test]
59 fn test_curve_json_py_enum() {
60 let interpolator = CurveInterpolator::Linear(LinearInterpolator::new());
61 let curve = curve_fixture(interpolator);
62 let js = curve.to_json().unwrap();
63 println!("{}", js);
64 let curve2 = CurveDF::from_json(&js).unwrap();
65 assert_eq!(curve, curve2);
66 }
67}