#[derive(PartialEq, Debug)]
#[allow(clippy::enum_variant_names)]
pub enum Quadrants {
RightPair,
LeftPair,
TopPair,
BottomPair,
AllQuadrants,
TopRight,
TopLeft,
BottomRight,
BottomLeft,
}
pub fn get_quadrants(min_xy: (i32, i32), max_xy: (i32, i32)) -> Quadrants {
match min_xy.0.signum() {
1 => {
match min_xy.1.signum() {
1 => Quadrants::TopRight,
0 => Quadrants::TopRight,
-1 => match max_xy.1.signum() {
1 => Quadrants::RightPair,
0 => Quadrants::BottomRight,
-1 => Quadrants::BottomRight,
_ => {
panic!("Invalid `signum()`?!")
}
},
_ => {
panic!("Invalid `signum()`?!")
}
}
}
0 => {
match min_xy.1.signum() {
1 => Quadrants::TopRight,
0 => {
match max_xy.1.signum() {
1 => Quadrants::TopRight,
0 => {
panic!("Quadrant bounds: invalid data, x is positive while y is exactly zero")
}
-1 => {
panic!("Quadrant bounds: invalid data, x is positive y min cannot be zero with positive y max ")
}
_ => {
panic!("Invalid `signum()`?!")
}
}
}
-1 => match max_xy.1.signum() {
1 => Quadrants::RightPair,
0 => Quadrants::BottomRight,
-1 => Quadrants::BottomRight,
_ => {
panic!("Invalid `signum()`?!")
}
},
_ => {
panic!("Invalid `signum()`?!")
}
}
}
-1 => {
match max_xy.0.signum() {
1 => {
match min_xy.1.signum() {
1 => Quadrants::TopPair,
0 => Quadrants::TopPair,
-1 => match max_xy.1.signum() {
1 => Quadrants::AllQuadrants,
0 => Quadrants::BottomPair,
-1 => Quadrants::BottomPair,
_ => {
panic!("Invalid `signum()`?!")
}
},
_ => {
panic!("Invalid `signum()`?!")
}
}
}
0 => {
match min_xy.1.signum() {
1 => Quadrants::TopLeft,
0 => Quadrants::TopLeft,
-1 => {
match max_xy.1.signum() {
1 => Quadrants::LeftPair,
0 => Quadrants::BottomLeft,
-1 => Quadrants::BottomLeft,
_ => {
panic!("Invalid `signum()`?!")
}
}
}
_ => {
panic!("Invalid `signum()`?!")
}
}
}
-1 => match min_xy.1.signum() {
1 => Quadrants::TopLeft,
0 => Quadrants::TopLeft,
-1 => match max_xy.1.signum() {
1 => Quadrants::LeftPair,
0 => Quadrants::BottomLeft,
-1 => Quadrants::BottomLeft,
_ => {
panic!("Invalid `signum()`?!")
}
},
_ => {
panic!("Invalid `signum()`?!")
}
},
_ => {
panic!("Invalid `signum()`?!")
}
}
}
_ => {
panic!("Invalid `signum()`?!")
}
}
}
#[cfg(test)]
mod tests {
use crate::canvas::quadrants::{get_quadrants, Quadrants};
#[test]
fn all_quadrants() {
let min_xy: (i32, i32) = (-1, -1);
let max_xy: (i32, i32) = (1, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::AllQuadrants, q);
}
#[test]
fn top_pair_ensure_valid_zero() {
let min_xy: (i32, i32) = (-1, 0);
let max_xy: (i32, i32) = (1, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopPair, q);
}
#[test]
fn top_pair() {
let min_xy: (i32, i32) = (-1, 1);
let max_xy: (i32, i32) = (1, 2);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopPair, q);
}
#[test]
fn bottom_pair_ensure_valid_zero() {
let min_xy: (i32, i32) = (-1, -1);
let max_xy: (i32, i32) = (1, 0);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomPair, q);
}
#[test]
fn bottom_pair() {
let min_xy: (i32, i32) = (-1, -1);
let max_xy: (i32, i32) = (1, -2);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomPair, q);
}
#[test]
fn left_pair_ensure_valid_zero() {
let min_xy: (i32, i32) = (-1, -1);
let max_xy: (i32, i32) = (0, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::LeftPair, q);
}
#[test]
fn left_pair() {
let min_xy: (i32, i32) = (-2, -1);
let max_xy: (i32, i32) = (-1, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::LeftPair, q);
}
#[test]
fn right_pair_ensure_valid_zero() {
let min_xy: (i32, i32) = (0, -1);
let max_xy: (i32, i32) = (1, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::RightPair, q);
}
#[test]
fn right_pair() {
let min_xy: (i32, i32) = (1, -1);
let max_xy: (i32, i32) = (2, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::RightPair, q);
}
#[test]
fn top_right_ensure_zero() {
let min_xy: (i32, i32) = (0, 0);
let max_xy: (i32, i32) = (1, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopRight, q);
}
#[test]
fn top_right_ensure_zero2() {
let min_xy: (i32, i32) = (1, 0);
let max_xy: (i32, i32) = (2, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopRight, q);
}
#[test]
fn top_right_ensure_zero3() {
let min_xy: (i32, i32) = (0, 1);
let max_xy: (i32, i32) = (1, 2);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopRight, q);
}
#[test]
fn top_right() {
let min_xy: (i32, i32) = (1, 1);
let max_xy: (i32, i32) = (2, 2);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopRight, q);
}
#[test]
fn top_left_ensure_zero() {
let min_xy: (i32, i32) = (-1, 0);
let max_xy: (i32, i32) = (0, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopLeft, q);
}
#[test]
fn top_left_ensure_zero2() {
let min_xy: (i32, i32) = (-2, 0);
let max_xy: (i32, i32) = (-1, 1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopLeft, q);
}
#[test]
fn top_left_ensure_zero3() {
let min_xy: (i32, i32) = (-1, 1);
let max_xy: (i32, i32) = (0, 2);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopLeft, q);
}
#[test]
fn top_left() {
let min_xy: (i32, i32) = (-2, 1);
let max_xy: (i32, i32) = (-1, 2);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::TopLeft, q);
}
#[test]
fn bottom_left_ensure_zero() {
let min_xy: (i32, i32) = (-1, -1);
let max_xy: (i32, i32) = (0, 0);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomLeft, q);
}
#[test]
fn bottom_left_ensure_zero2() {
let min_xy: (i32, i32) = (-2, -1);
let max_xy: (i32, i32) = (-1, 0);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomLeft, q);
}
#[test]
fn bottom_left_ensure_zero3() {
let min_xy: (i32, i32) = (-1, -2);
let max_xy: (i32, i32) = (0, -1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomLeft, q);
}
#[test]
fn bottom_left() {
let min_xy: (i32, i32) = (-2, -2);
let max_xy: (i32, i32) = (-1, -1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomLeft, q);
}
#[test]
fn bottom_right_ensure_zero() {
let min_xy: (i32, i32) = (0, -1);
let max_xy: (i32, i32) = (1, 0);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomRight, q);
}
#[test]
fn bottom_right_ensure_zero2() {
let min_xy: (i32, i32) = (1, -1);
let max_xy: (i32, i32) = (2, 0);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomRight, q);
}
#[test]
fn bottom_right_ensure_zero3() {
let min_xy: (i32, i32) = (0, -2);
let max_xy: (i32, i32) = (1, -1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomRight, q);
}
#[test]
fn bottom_right() {
let min_xy: (i32, i32) = (1, -2);
let max_xy: (i32, i32) = (2, -1);
let q = get_quadrants(min_xy, max_xy);
assert_eq!(Quadrants::BottomRight, q);
}
}