use super::{super::*, *};
#[test]
fn try_bisect_on_view_with_many_elements_converge_to_left_ok() {
let values = input_1_to_10();
let bisector = Bisector::new(&values);
let start_from = Indices::from_bisector(&bisector);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), start_from);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(0, 5));
assert_eq!(step.result.unwrap().unwrap_converge_left(), 6);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(0, 2));
assert_eq!(step.result.unwrap().unwrap_converge_left(), 3);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(0, 1));
assert_eq!(step.result.unwrap().unwrap_converge_left(), 2);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(0, 0));
assert_eq!(step.result.unwrap().unwrap_converge_left(), 1);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(0, 0));
assert!(step.result.is_none());
}
#[test]
fn try_bisect_on_view_with_many_elements_converge_to_right_ok() {
let values = input_1_to_10();
let bisector = Bisector::new(&values);
let start_from = Indices::from_bisector(&bisector);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Right(value)), start_from);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(6, 10));
assert_eq!(step.result.unwrap().unwrap_converge_right(), 6);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Right(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(9, 10));
assert_eq!(step.result.unwrap().unwrap_converge_right(), 9);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Right(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(10, 10));
assert_eq!(step.result.unwrap().unwrap_converge_right(), 10);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Right(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(10, 10));
assert!(step.result.is_none());
}
#[test]
fn try_bisect_on_view_with_many_elements_converge_zig_zag_ok() {
let values = input_1_to_10();
let bisector = Bisector::new(&values);
let start_from = Indices::from_bisector(&bisector);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), start_from);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(0, 5));
assert_eq!(step.result.unwrap().unwrap_converge_left(), 6);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Right(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(3, 5));
assert_eq!(step.result.unwrap().unwrap_converge_right(), 3);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(3, 4));
assert_eq!(step.result.unwrap().unwrap_converge_left(), 5);
let final_step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), step.indices);
let final_step = final_step.unwrap();
assert_eq!(final_step.indices, Indices::new(3, 3));
assert_eq!(final_step.result.unwrap().unwrap_converge_left(), 4);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), final_step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(3, 3));
assert!(step.result.is_none());
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Right(value)), final_step.indices);
let step = step.unwrap();
assert_eq!(step.indices, Indices::new(3, 3));
assert!(step.result.is_none());
}
#[test]
fn try_bisect_on_view_with_many_elements_re_use_same_indices_means_no_progress_with_ok() {
let values = input_1_to_10();
let bisector = Bisector::new(&values);
let start_from = Indices::from_bisector(&bisector);
let expected_next_indices = Indices::new(0, 5);
let expected_output_value = 6;
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), start_from);
let step = step.unwrap();
assert_eq!(step.indices, expected_next_indices);
assert_eq!(
step.result.unwrap().unwrap_converge_left(),
expected_output_value
);
let step: Result<Step<u32, u32>, ()> =
bisector.try_bisect(|&value| Ok(ConvergeTo::Left(value)), start_from);
let step = step.unwrap();
assert_eq!(step.indices, expected_next_indices);
assert_eq!(
step.result.unwrap().unwrap_converge_left(),
expected_output_value
);
}
#[test]
fn try_bisect_with_err() {
let values = input_1_to_10();
let bisector = Bisector::new(&values);
let start_from = Indices::from_bisector(&bisector);
let step: Result<Step<u32, u32>, ()> = bisector.try_bisect(|_| Err(()), start_from);
assert!(step.is_err());
}
#[test]
fn try_bisect_already_converged() {
let values = input_1();
let bisector = Bisector::new(&values);
let start_from = Indices::new(0, 0);
let step: Result<Step<u32, u32>, ()> = bisector.try_bisect(|_| Err(()), start_from);
assert!(step.is_ok());
}