|
|
|
@ -2,124 +2,124 @@ extern crate hostnames_allocator; |
|
|
|
|
|
|
|
|
|
use hostnames_allocator::ranged_number_allocator::RangedNumberAllocator; |
|
|
|
|
|
|
|
|
|
fn create_allocator(data: &[(u32, u32)]) -> RangedNumberAllocator { |
|
|
|
|
fn create_allocator<const N: usize>(data: [(u32, u32); N]) -> RangedNumberAllocator { |
|
|
|
|
RangedNumberAllocator { |
|
|
|
|
tree: data.to_owned().into_iter().collect() |
|
|
|
|
tree: data.into_iter().collect() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn check_allocator(allocator: RangedNumberAllocator, expected: &[(u32, u32)]) { |
|
|
|
|
itertools::assert_equal(allocator.tree, expected.to_owned()); |
|
|
|
|
fn check_allocator<const N: usize>(allocator: RangedNumberAllocator, expected: [(u32, u32); N]) { |
|
|
|
|
itertools::assert_equal(allocator.tree, expected); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn remove_preserves_tree_when_empty() { |
|
|
|
|
let mut allocator = create_allocator(&[]); |
|
|
|
|
let mut allocator = create_allocator([]); |
|
|
|
|
allocator.remove(5); |
|
|
|
|
check_allocator(allocator, &[]); |
|
|
|
|
check_allocator(allocator, []); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn remove_preserves_tree_when_not_found() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 3), (11, 13)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 3), (11, 13)]); |
|
|
|
|
allocator.remove(5); |
|
|
|
|
check_allocator(allocator, &[(1, 3), (11, 13)]); |
|
|
|
|
check_allocator(allocator, [(1, 3), (11, 13)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn remove_removes_range_with_single_value() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 3), (5, 5), (11, 13)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 3), (5, 5), (11, 13)]); |
|
|
|
|
allocator.remove(5); |
|
|
|
|
check_allocator(allocator, &[(1, 3), (11, 13)]); |
|
|
|
|
check_allocator(allocator, [(1, 3), (11, 13)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn remove_replaces_range_starting_with_value() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 3), (5, 7), (11, 13)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 3), (5, 7), (11, 13)]); |
|
|
|
|
allocator.remove(5); |
|
|
|
|
check_allocator(allocator, &[(1, 3), (6, 7), (11, 13)]); |
|
|
|
|
check_allocator(allocator, [(1, 3), (6, 7), (11, 13)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn remove_changes_range_ending_with_value() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 3), (5, 7), (11, 13)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 3), (5, 7), (11, 13)]); |
|
|
|
|
allocator.remove(7); |
|
|
|
|
check_allocator(allocator, &[(1, 3), (5, 6), (11, 13)]); |
|
|
|
|
check_allocator(allocator, [(1, 3), (5, 6), (11, 13)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn remove_splits_range_containing_value() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 3), (5, 9), (11, 13)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 3), (5, 9), (11, 13)]); |
|
|
|
|
allocator.remove(7); |
|
|
|
|
check_allocator(allocator, &[(1, 3), (5, 6), (8, 9), (11, 13)]); |
|
|
|
|
check_allocator(allocator, [(1, 3), (5, 6), (8, 9), (11, 13)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn remove_removes_last_value() { |
|
|
|
|
let mut allocator = create_allocator(&[(5, 5)]); |
|
|
|
|
let mut allocator = create_allocator([(5, 5)]); |
|
|
|
|
allocator.remove(5); |
|
|
|
|
check_allocator(allocator, &[]); |
|
|
|
|
check_allocator(allocator, []); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_initializes_empty() { |
|
|
|
|
let mut allocator = create_allocator(&[]); |
|
|
|
|
let mut allocator = create_allocator([]); |
|
|
|
|
assert_eq!(allocator.allocate(), 1); |
|
|
|
|
check_allocator(allocator, &[(1, 1)]); |
|
|
|
|
check_allocator(allocator, [(1, 1)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_adds_second_value() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 1)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 1)]); |
|
|
|
|
assert_eq!(allocator.allocate(), 2); |
|
|
|
|
check_allocator(allocator, &[(1, 2)]); |
|
|
|
|
check_allocator(allocator, [(1, 2)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_adds_tenth_value() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 9)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 9)]); |
|
|
|
|
assert_eq!(allocator.allocate(), 10); |
|
|
|
|
check_allocator(allocator, &[(1, 10)]); |
|
|
|
|
check_allocator(allocator, [(1, 10)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_adds_value_for_two_ranges_starting_with_one() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 5), (10, 15)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 5), (10, 15)]); |
|
|
|
|
assert_eq!(allocator.allocate(), 6); |
|
|
|
|
check_allocator(allocator, &[(1, 6), (10, 15)]); |
|
|
|
|
check_allocator(allocator, [(1, 6), (10, 15)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_combines_two_adjacent_ranges_starting_with_one() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 5), (7, 15)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 5), (7, 15)]); |
|
|
|
|
assert_eq!(allocator.allocate(), 6); |
|
|
|
|
check_allocator(allocator, &[(1, 15)]); |
|
|
|
|
check_allocator(allocator, [(1, 15)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_combines_two_adjacent_ranges_starting_with_one_extra() { |
|
|
|
|
let mut allocator = create_allocator(&[(1, 5), (7, 15), (20, 30)]); |
|
|
|
|
let mut allocator = create_allocator([(1, 5), (7, 15), (20, 30)]); |
|
|
|
|
assert_eq!(allocator.allocate(), 6); |
|
|
|
|
check_allocator(allocator, &[(1, 15), (20, 30)]); |
|
|
|
|
check_allocator(allocator, [(1, 15), (20, 30)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_adds_value_for_range_starting_with_two() { |
|
|
|
|
let mut allocator = create_allocator(&[(2, 10)]); |
|
|
|
|
let mut allocator = create_allocator([(2, 10)]); |
|
|
|
|
assert_eq!(allocator.allocate(), 1); |
|
|
|
|
check_allocator(allocator, &[(1, 10)]); |
|
|
|
|
check_allocator(allocator, [(1, 10)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_adds_value_for_range_starting_with_two_extra() { |
|
|
|
|
let mut allocator = create_allocator(&[(2, 10), (20, 30)]); |
|
|
|
|
let mut allocator = create_allocator([(2, 10), (20, 30)]); |
|
|
|
|
assert_eq!(allocator.allocate(), 1); |
|
|
|
|
check_allocator(allocator, &[(1, 10), (20, 30)]); |
|
|
|
|
check_allocator(allocator, [(1, 10), (20, 30)]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn allocate_adds_value_for_range_starting_with_ten() { |
|
|
|
|
let mut allocator = create_allocator(&[(10, 20)]); |
|
|
|
|
let mut allocator = create_allocator([(10, 20)]); |
|
|
|
|
assert_eq!(allocator.allocate(), 1); |
|
|
|
|
check_allocator(allocator, &[(1, 1), (10, 20)]); |
|
|
|
|
check_allocator(allocator, [(1, 1), (10, 20)]); |
|
|
|
|
} |
|
|
|
|