use crate::base::Coordinate;
use crate::interval::r#trait;
use crate::position::Number;
use crate::system::Base;
use crate::system::Interbase;
pub type Interval = crate::Interval<Base>;
impl Interval {
pub fn into_equivalent_interbase(self) -> crate::interval::Interval<Interbase> {
let (start, end) = self.into_coordinates();
let start = start.nudge_backward().unwrap();
let end = end.nudge_forward().unwrap();
crate::interval::Interval::<Interbase>::try_new(start, end).unwrap()
}
}
impl r#trait::Interval<Base> for Interval {
fn contains_entity(&self, coordinate: &Coordinate) -> bool {
self.contains_coordinate(coordinate)
}
fn count_entities(&self) -> Number {
self.start()
.position()
.distance_unchecked(self.end().position())
+ 1
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Coordinate;
use crate::system::Base;
fn create_coordinate(contig: &str, strand: &str, position: Number) -> crate::Coordinate<Base> {
Coordinate::try_new(contig, strand, position).unwrap()
}
fn create_interval(contig: &str, strand: &str, start: Number, end: Number) -> Interval {
Interval::try_new(
create_coordinate(contig, strand, start),
create_coordinate(contig, strand, end),
)
.unwrap()
}
#[test]
fn contains() {
let interval = create_interval("seq0", "+", 10, 20);
assert!(interval.contains_coordinate(interval.start()));
assert!(interval.contains_coordinate(interval.end()));
assert!(interval.contains_coordinate(&create_coordinate("seq0", "+", 15)));
assert!(!interval.contains_coordinate(&create_coordinate("seq0", "+", 9)));
assert!(!interval.contains_coordinate(&create_coordinate("seq0", "+", 21)));
assert!(!interval.contains_coordinate(&create_coordinate("seq0", "+", 1000)));
assert!(!interval.contains_coordinate(&create_coordinate("seq1", "+", 15)));
assert!(!interval.contains_coordinate(&create_coordinate("seq0", "-", 15)));
let interval = create_interval("seq0", "-", 20, 10);
assert!(interval.contains_coordinate(interval.start()));
assert!(interval.contains_coordinate(interval.end()));
assert!(interval.contains_coordinate(&create_coordinate("seq0", "-", 15)));
assert!(!interval.contains_coordinate(&create_coordinate("seq0", "-", 21)));
assert!(!interval.contains_coordinate(&create_coordinate("seq0", "-", 9)));
assert!(!interval.contains_coordinate(&create_coordinate("seq0", "-", 1)));
assert!(!interval.contains_coordinate(&create_coordinate("seq1", "-", 15)));
assert!(!interval.contains_coordinate(&create_coordinate("seq0", "+", 15)));
}
#[test]
fn contains_entity() {
let interval = create_interval("seq0", "+", 10, 20);
assert!(!interval.contains_entity(&create_coordinate("seq0", "+", 9)));
assert!(interval.contains_entity(&create_coordinate("seq0", "+", 10)));
assert!(interval.contains_entity(&create_coordinate("seq0", "+", 20)));
assert!(!interval.contains_entity(&create_coordinate("seq0", "+", 21)));
assert!(interval.contains_entity(&create_coordinate("seq0", "+", 15)));
assert!(!interval.contains_entity(&create_coordinate("seq1", "+", 15)));
assert!(!interval.contains_entity(&create_coordinate("seq0", "-", 15)));
let interval = create_interval("seq0", "-", 20, 10);
assert!(!interval.contains_entity(&create_coordinate("seq0", "-", 21)));
assert!(interval.contains_entity(&create_coordinate("seq0", "-", 20)));
assert!(interval.contains_entity(&create_coordinate("seq0", "-", 10)));
assert!(!interval.contains_entity(&create_coordinate("seq0", "-", 9)));
assert!(interval.contains_entity(&create_coordinate("seq0", "-", 15)));
assert!(!interval.contains_entity(&create_coordinate("seq1", "-", 15)));
assert!(!interval.contains_entity(&create_coordinate("seq0", "+", 15)));
}
}