254 lines
6.3 KiB
Rust
254 lines
6.3 KiB
Rust
// flow-rbp: A library for packing rectangles into two-dimensional finite bins.
|
|
// public domain License
|
|
|
|
use flow_rbp::FreeRectHeuristic;
|
|
use flow_rbp::RectsBinPack;
|
|
|
|
#[test]
|
|
fn insert_short_side_fit() {
|
|
let mut rbp = RectsBinPack::new(32, 32, false).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::ShortSideFit)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.25);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::ShortSideFit)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.5);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::ShortSideFit)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.75);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::ShortSideFit)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(1, 1, FreeRectHeuristic::ShortSideFit).is_none(),
|
|
true
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_short_side_fit_rotated() {
|
|
let mut rbp = RectsBinPack::new(32, 16, true).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 32, FreeRectHeuristic::ShortSideFit)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(1, 1, FreeRectHeuristic::ShortSideFit).is_none(),
|
|
true
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_long_side_fit() {
|
|
let mut rbp = RectsBinPack::new(32, 32, false).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::LongSideFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.25);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::LongSideFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.5);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::LongSideFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.75);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::LongSideFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(1, 1, FreeRectHeuristic::LongSideFit).is_none(),
|
|
true
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_long_side_fit_rotated() {
|
|
let mut rbp = RectsBinPack::new(32, 16, true).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 32, FreeRectHeuristic::LongSideFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(1, 1, FreeRectHeuristic::LongSideFit).is_none(),
|
|
true
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_area_fit() {
|
|
let mut rbp = RectsBinPack::new(32, 32, false).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::AreaFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.25);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::AreaFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.5);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::AreaFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.75);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::AreaFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(rbp.insert(1, 1, FreeRectHeuristic::AreaFit).is_none(), true);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_area_fit_rotated() {
|
|
let mut rbp = RectsBinPack::new(32, 16, true).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 32, FreeRectHeuristic::AreaFit).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(rbp.insert(1, 1, FreeRectHeuristic::AreaFit).is_none(), true);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_bottom_left() {
|
|
let mut rbp = RectsBinPack::new(32, 32, false).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::BottomLeft).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.25);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::BottomLeft).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.5);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::BottomLeft).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.75);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::BottomLeft).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(1, 1, FreeRectHeuristic::BottomLeft).is_none(),
|
|
true
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_bottom_left_rotated() {
|
|
let mut rbp = RectsBinPack::new(32, 16, true).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 32, FreeRectHeuristic::BottomLeft).is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(1, 1, FreeRectHeuristic::BottomLeft).is_none(),
|
|
true
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_contact_point() {
|
|
let mut rbp = RectsBinPack::new(32, 32, false).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::ContactPoint)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.25);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::ContactPoint)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.5);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::ContactPoint)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 0.75);
|
|
assert_eq!(
|
|
rbp.insert(16, 16, FreeRectHeuristic::ContactPoint)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(1, 1, FreeRectHeuristic::ContactPoint).is_none(),
|
|
true
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_contact_point_rotated() {
|
|
let mut rbp = RectsBinPack::new(32, 16, true).unwrap();
|
|
assert_eq!(rbp.get_occupancy(), 0.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(16, 32, FreeRectHeuristic::ContactPoint)
|
|
.is_some(),
|
|
true
|
|
);
|
|
assert_eq!(rbp.get_occupancy(), 1.0);
|
|
|
|
assert_eq!(
|
|
rbp.insert(1, 1, FreeRectHeuristic::ContactPoint).is_none(),
|
|
true
|
|
);
|
|
}
|