use super::super::{CreationError, Histogram};
use crate::tests::helpers::histo64;
#[test]
fn unit_magnitude_0_index_calculations() {
let h = histo64(1_u64, 1_u64 << 32, 3);
assert_eq!(2048, h.sub_bucket_count);
assert_eq!(0, h.unit_magnitude);
assert_eq!(23, h.bucket_count);
assert_eq!(0, h.bucket_for(3));
assert_eq!(3, h.sub_bucket_for(3, 0));
assert_eq!(0, h.bucket_for(1024 + 3));
assert_eq!(1024 + 3, h.sub_bucket_for(1024 + 3, 0));
assert_eq!(1, h.bucket_for(2048 + 3 * 2));
assert_eq!(1024 + 3, h.sub_bucket_for(2048 + 3 * 2, 1));
assert_eq!(2, h.bucket_for((2048 << 1) + 3 * 4));
assert_eq!(1024 + 3, h.sub_bucket_for((2048 << 1) + 3 * 4, 2));
assert_eq!(23, h.bucket_for((2048_u64 << 22) + 3 * (1 << 23)));
assert_eq!(
1024 + 3,
h.sub_bucket_for((2048_u64 << 22) + 3 * (1 << 23), 23)
);
}
#[test]
fn unit_magnitude_4_index_calculations() {
let h = histo64(1_u64 << 12, 1_u64 << 32, 3);
assert_eq!(2048, h.sub_bucket_count);
assert_eq!(12, h.unit_magnitude);
assert_eq!(11, h.bucket_count);
let unit = 1_u64 << 12;
assert_eq!(0, h.bucket_for(3));
assert_eq!(0, h.sub_bucket_for(3, 0));
assert_eq!(0, h.bucket_for(3 * unit));
assert_eq!(3, h.sub_bucket_for(3 * unit, 0));
assert_eq!(0, h.bucket_for(unit * (1024 + 3)));
assert_eq!(1024 + 3, h.sub_bucket_for(unit * (1024 + 3), 0));
assert_eq!(1, h.bucket_for((unit << 11) + 3 * (unit << 1)));
assert_eq!(
1024 + 3,
h.sub_bucket_for((unit << 11) + 3 * (unit << 1), 1)
);
assert_eq!(2, h.bucket_for((unit << 12) + 3 * (unit << 2)));
assert_eq!(
1024 + 3,
h.sub_bucket_for((unit << 12) + 3 * (unit << 2), 2)
);
assert_eq!(11, h.bucket_for((unit << 21) + 3 * (unit << 11)));
assert_eq!(
1024 + 3,
h.sub_bucket_for((unit << 21) + 3 * (unit << 11), 11)
);
}
#[test]
fn unit_magnitude_52_sub_bucket_magnitude_11_index_calculations() {
let h = histo64(1_u64 << 52, u64::max_value(), 3);
assert_eq!(2048, h.sub_bucket_count);
assert_eq!(52, h.unit_magnitude);
assert_eq!(2, h.bucket_count);
assert_eq!(1, h.leading_zero_count_base);
let unit = 1_u64 << 52;
assert_eq!(0, h.bucket_for(3));
assert_eq!(0, h.sub_bucket_for(3, 0));
assert_eq!(0, h.bucket_for(3 * unit));
assert_eq!(3, h.sub_bucket_for(3 * unit, 0));
assert_eq!(0, h.bucket_for(unit * (1024 + 3)));
assert_eq!(1024 + 3, h.sub_bucket_for(unit * (1024 + 3), 0));
assert_eq!(0, h.bucket_for(unit * 1024 + 1023 * unit));
assert_eq!(1024 + 1023, h.sub_bucket_for(unit * 1024 + 1023 * unit, 0));
assert_eq!(1, h.bucket_for((unit << 11) + 3 * (unit << 1)));
assert_eq!(
1024 + 3,
h.sub_bucket_for((unit << 11) + 3 * (unit << 1), 1)
);
assert_eq!(1, h.bucket_for(u64::max_value()));
assert_eq!(1024 + 1023, h.sub_bucket_for(u64::max_value(), 1));
}
#[test]
fn unit_magnitude_53_sub_bucket_magnitude_11_throws() {
assert_eq!(
CreationError::CannotRepresentSigFigBeyondLow,
Histogram::<u64>::new_with_bounds(1_u64 << 53, 1_u64 << 63, 3).unwrap_err()
);
}
#[test]
fn unit_magnitude_55_sub_bucket_magnitude_8_ok() {
let h = histo64(1_u64 << 55, 1_u64 << 63, 2);
assert_eq!(256, h.sub_bucket_count);
assert_eq!(55, h.unit_magnitude);
assert_eq!(2, h.bucket_count);
assert_eq!(0, h.bucket_for(3));
assert_eq!(0, h.sub_bucket_for(3, 0));
assert_eq!(1, h.bucket_for(u64::max_value()));
assert_eq!(128 + 127, h.sub_bucket_for(u64::max_value(), 1));
}
#[test]
fn unit_magnitude_62_sub_bucket_magnitude_1_ok() {
let h = histo64(1_u64 << 62, 1_u64 << 63, 0);
assert_eq!(2, h.sub_bucket_count);
assert_eq!(62, h.unit_magnitude);
assert_eq!(2, h.bucket_count);
assert_eq!(0, h.bucket_for(3));
assert_eq!(0, h.sub_bucket_for(3, 0));
assert_eq!(1, h.bucket_for(u64::max_value()));
assert_eq!(1, h.sub_bucket_for(u64::max_value(), 1));
}
#[test]
fn bucket_for_smallest_value_in_first_bucket() {
let h = histo64(1, 100_000, 3);
assert_eq!(0, h.bucket_for(0))
}
#[test]
fn bucket_for_biggest_value_in_first_bucket() {
let h = histo64(1, 100_000, 3);
assert_eq!(0, h.bucket_for(2047))
}
#[test]
fn bucket_for_smallest_value_in_second_bucket() {
let h = histo64(1, 100_000, 3);
assert_eq!(1, h.bucket_for(2048))
}
#[test]
fn bucket_for_biggest_value_in_second_bucket() {
let h = histo64(1, 100_000, 3);
assert_eq!(1, h.bucket_for(4095))
}
#[test]
fn bucket_for_smallest_value_in_third_bucket() {
let h = histo64(1, 100_000, 3);
assert_eq!(2, h.bucket_for(4096))
}
#[test]
fn bucket_for_smallest_value_in_last_bucket() {
let h = histo64(1, 100_000, 3);
assert_eq!(6, h.bucket_for(65536))
}
#[test]
fn bucket_for_value_below_smallest_clamps_to_zero() {
let h = histo64(1024, 100_000, 3);
assert_eq!(0, h.bucket_for(0));
assert_eq!(0, h.bucket_for(1));
assert_eq!(0, h.bucket_for(1023));
assert_eq!(0, h.bucket_for(1024))
}
#[test]
fn bucket_for_value_above_biggest_isnt_clamped_at_max_bucket() {
let h = histo64(1, 100_000, 3);
assert_eq!(6, h.bucket_for(100_000));
assert_eq!(26, h.bucket_for(100_000_000_000));
}
#[test]
fn sub_bucket_for_zero_value_in_first_bucket() {
let h = histo64(1, 100_000, 3);
let value = 0;
assert_eq!(0, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_smallest_distinguishable_value_in_first_bucket() {
let h = histo64(1, 100_000, 3);
let value = 1;
assert_eq!(1, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_zero_value_in_first_bucket_unit_magnitude_2() {
let h = histo64(4, 100_000, 3);
let value = 0;
assert_eq!(2, h.unit_magnitude);
assert_eq!(0, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_smaller_than_distinguishable_value_in_first_bucket_unit_magnitude_2() {
let h = histo64(4, 100_000, 3);
let value = 3;
assert_eq!(2, h.unit_magnitude);
assert_eq!(0, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_smallest_distinguishable_value_in_first_bucket_unit_magnitude_2() {
let h = histo64(4, 100_000, 3);
let value = 4;
assert_eq!(2, h.unit_magnitude);
assert_eq!(1, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_largest_value_in_first_bucket_unit_magnitude_2() {
let h = histo64(4, 100_000, 3);
let value = 2048 * 4 - 1;
assert_eq!(2, h.unit_magnitude);
assert_eq!(2047, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_smallest_value_in_second_bucket_unit_magnitude_2() {
let h = histo64(4, 100_000, 3);
let value = 2048 * 4;
assert_eq!(2, h.unit_magnitude);
assert_eq!(1024, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_largest_value_in_first_bucket() {
let h = histo64(1, 100_000, 3);
let value = 2047;
assert_eq!(2047, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_smallest_value_in_second_bucket() {
let h = histo64(1, 100_000, 3);
let value = 2048;
assert_eq!(1024, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_biggest_value_in_second_bucket() {
let h = histo64(1, 100_000, 3);
let value = 4095;
assert_eq!(2047, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_smallest_value_in_third_bucket() {
let h = histo64(1, 100_000, 3);
let value = 4096;
assert_eq!(1024, h.sub_bucket_for(value, h.bucket_for(value)))
}
#[test]
fn sub_bucket_for_value_below_smallest_clamps_to_zero() {
let h = histo64(1024, 100_000, 3);
assert_eq!(0, h.sub_bucket_for(0, 0));
assert_eq!(0, h.sub_bucket_for(1, 0));
assert_eq!(0, h.sub_bucket_for(1023, 0));
assert_eq!(1, h.sub_bucket_for(1024, 0))
}
#[test]
fn sub_bucket_for_value_above_biggest_still_works() {
let h = histo64(1, 1024 * 1024, 3);
assert_eq!(1562, h.sub_bucket_for(100_000, h.bucket_for(100_000)));
assert_eq!(
466 + 1024,
h.sub_bucket_for(100_000_000_000, h.bucket_for(100_000_000_000))
);
}
#[test]
fn index_for_first_bucket_first_entry() {
let h = histo64(1, 100_000, 3);
assert_eq!(0, h.index_for(0).unwrap());
}
#[test]
fn index_for_first_bucket_first_distinguishable_entry() {
let h = histo64(1, 100_000, 3);
assert_eq!(1, h.index_for(1).unwrap());
}
#[test]
fn index_for_first_bucket_last_entry() {
let h = histo64(1, 100_000, 3);
assert_eq!(2047, h.index_for(2047).unwrap());
}
#[test]
fn index_for_second_bucket_last_entry() {
let h = histo64(1, 100_000, 3);
assert_eq!(2048 + 1023, h.index_for(2048 + 2047).unwrap());
}
#[test]
fn index_for_second_bucket_last_entry_indistinguishable() {
let h = histo64(1, 100_000, 3);
assert_eq!(2048 + 1023, h.index_for(2048 + 2046).unwrap());
}
#[test]
fn index_for_second_bucket_first_entry() {
let h = histo64(1, 100_000, 3);
assert_eq!(2048, h.index_for(2048).unwrap());
}
#[test]
fn index_for_below_smallest() {
let h = histo64(1024, 100_000, 3);
assert_eq!(0, h.index_for(512).unwrap());
}
#[test]
fn index_for_way_past_largest_value_exceeds_length() {
let h = histo64(1, 100_000, 3);
assert_eq!(8 * 1024, h.counts.len());
assert_eq!(1024 * (30 + 1), h.index_for(1 << 40).unwrap());
}