#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct AxisLabels {
pub low: String,
pub high: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct QuadrantLabels {
pub q1: Option<String>,
pub q2: Option<String>,
pub q3: Option<String>,
pub q4: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct QuadrantPoint {
pub name: String,
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct QuadrantChart {
pub title: Option<String>,
pub x_axis: Option<AxisLabels>,
pub y_axis: Option<AxisLabels>,
pub quadrants: QuadrantLabels,
pub points: Vec<QuadrantPoint>,
}
impl QuadrantChart {
pub fn point_count(&self) -> usize {
self.points.len()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_chart_has_zero_points() {
let chart = QuadrantChart::default();
assert_eq!(chart.point_count(), 0);
assert!(chart.title.is_none());
assert!(chart.x_axis.is_none());
assert!(chart.y_axis.is_none());
assert!(chart.quadrants.q1.is_none());
assert!(chart.quadrants.q4.is_none());
assert!(chart.points.is_empty());
}
#[test]
fn point_count_reflects_number_of_points() {
let chart = QuadrantChart {
points: vec![
QuadrantPoint {
name: "A".to_string(),
x: 0.3,
y: 0.6,
},
QuadrantPoint {
name: "B".to_string(),
x: 0.7,
y: 0.2,
},
QuadrantPoint {
name: "C".to_string(),
x: 0.5,
y: 0.5,
},
],
..Default::default()
};
assert_eq!(chart.point_count(), 3);
}
#[test]
fn equality_holds_for_identical_charts() {
let a = QuadrantChart {
title: Some("My Chart".to_string()),
x_axis: Some(AxisLabels {
low: "Low".to_string(),
high: "High".to_string(),
}),
points: vec![QuadrantPoint {
name: "P".to_string(),
x: 0.5,
y: 0.5,
}],
..Default::default()
};
let b = a.clone();
assert_eq!(a, b);
let c = QuadrantChart {
title: Some("Other".to_string()),
..Default::default()
};
assert_ne!(a, c);
}
#[test]
fn partial_eq_works_for_f64_coordinates() {
let p1 = QuadrantPoint {
name: "X".to_string(),
x: 0.123_456_789,
y: 0.987_654_321,
};
let p2 = p1.clone();
assert_eq!(p1, p2);
let p3 = QuadrantPoint {
name: "X".to_string(),
x: 0.123_456_789,
y: 0.1,
};
assert_ne!(p1, p3);
}
}