#[test]
fn simple_table_collection_creation_with_newtype() {
let sequence_length = tskit::Position::from(100.0);
if let Ok(tables) = tskit::TableCollection::new(sequence_length) {
assert_eq!(tables.sequence_length(), sequence_length);
assert_eq!(tables.sequence_length(), 100.0);
} else {
panic!(
"TableCollection creation sequence length = {} failed",
sequence_length
);
}
}
#[test]
fn simple_table_collection_creation() {
let tables = tskit::TableCollection::new(100.0).unwrap();
assert_eq!(tables.sequence_length(), 100.0);
}
#[test]
fn add_node_without_metadata() {
{
let mut tables = tskit::TableCollection::new(100.0).unwrap();
if let Ok(node_id) = tables.add_node(
0, tskit::Time::from(0.0), tskit::PopulationId::NULL, tskit::IndividualId::NULL, ) {
assert_eq!(node_id, 0);
}
}
{
let mut tables = tskit::TableCollection::new(100.0).unwrap();
let node_id = tables.add_node(0, 0.0, -1, -1).unwrap();
assert_eq!(node_id, 0);
}
}
#[test]
fn add_node_handle_error() {
let mut tables = tskit::TableCollection::new(100.0).unwrap();
tables.add_edge(-1.0, 110.0, 0, 1).unwrap();
match tables.check_integrity(tskit::TableIntegrityCheckFlags::default()) {
Ok(code) => panic!("expected Err(e) but got code: {}", code),
Err(e) => println!("{}", e),
}
assert!(tables
.check_integrity(tskit::TableIntegrityCheckFlags::default())
.is_err());
}
#[test]
fn get_data_from_edge_table() {
use rand::distributions::Distribution;
use tskit::prelude::*;
let sequence_length = tskit::Position::from(100.0);
let mut rng = rand::thread_rng();
let random_pos = rand::distributions::Uniform::new::<f64, f64>(0., sequence_length.into());
let mut tables = tskit::TableCollection::new(sequence_length).unwrap();
let child = tables.add_node(0, 0.0, -1, -1).unwrap();
let parent = tables.add_node(0, 1.0, -1, -1).unwrap();
let mut left = tskit::Position::from(random_pos.sample(&mut rng));
let mut right = tskit::Position::from(random_pos.sample(&mut rng));
if left > right {
std::mem::swap(&mut left, &mut right);
}
if let Ok(edge_id) = tables.add_edge(left, right, parent, child) {
let edges = tables.edges();
if let Some(p) = edges.parent(edge_id) {
assert_eq!(p, parent);
}
if let Some(c) = edges.child(edge_id) {
assert_eq!(c, child);
}
if let Some(l) = edges.left(edge_id) {
assert_eq!(l, left);
}
if let Some(r) = edges.right(edge_id) {
assert_eq!(r, right);
}
} else {
panic!("that should have worked...");
}
assert!(tables.edges().parent(tskit::EdgeId::NULL).is_none());
let edge_id = tskit::EdgeId::from(0);
if let Some(row) = tables.edges().row(edge_id) {
assert_eq!(row.id, 0);
assert_eq!(row.left, left);
assert_eq!(row.right, right);
assert_eq!(row.parent, parent);
assert_eq!(row.child, child);
} else {
panic!("that should have worked...");
}
if let Some(row_view) = tables.edges().row_view(edge_id) {
assert_eq!(row_view.id, 0);
assert_eq!(row_view.left, left);
assert_eq!(row_view.right, right);
assert_eq!(row_view.parent, parent);
assert_eq!(row_view.child, child);
} else {
panic!("that should have worked...");
}
let mut edge_table_lending_iter = tables.edges().lending_iter();
while let Some(row_view) = edge_table_lending_iter.next() {
assert_eq!(row_view.id, 0);
assert_eq!(row_view.left, left);
assert_eq!(row_view.right, right);
assert_eq!(row_view.parent, parent);
assert_eq!(row_view.child, child);
assert!(row_view.metadata.is_none()); }
assert!(tables
.check_integrity(tskit::TableIntegrityCheckFlags::default())
.is_ok());
for row in tables.edges_iter() {
assert_eq!(row.id, 0);
assert_eq!(row.left, left);
assert_eq!(row.right, right);
assert_eq!(row.parent, parent);
assert_eq!(row.child, child);
}
assert!(tables
.check_integrity(tskit::TableIntegrityCheckFlags::default())
.is_ok());
}
#[test]
fn test_adding_node_table_row_with_defaults() {
let mut tables = tskit::TableCollection::new(10.).unwrap();
let defaults = tskit::NodeDefaults::default();
let node = tables.add_node_with_defaults(0.0, &defaults).unwrap();
assert_eq!(node, 0);
let node = tables
.add_node_with_defaults(
0.0,
&tskit::NodeDefaults {
flags: tskit::NodeFlags::new_sample(),
..defaults
},
)
.unwrap();
assert!(tables.nodes().flags(node).unwrap().is_sample());
}
macro_rules! impl_node_metadata_traits {
() => {
impl tskit::metadata::MetadataRoundtrip for NodeMetadata {
fn encode(&self) -> Result<Vec<u8>, tskit::metadata::MetadataError> {
match serde_json::to_string(self) {
Ok(x) => Ok(x.as_bytes().to_vec()),
Err(e) => {
Err(::tskit::metadata::MetadataError::RoundtripError { value: Box::new(e) })
}
}
}
fn decode(md: &[u8]) -> Result<Self, tskit::metadata::MetadataError>
where
Self: Sized,
{
match serde_json::from_slice(md) {
Ok(v) => Ok(v),
Err(e) => {
Err(::tskit::metadata::MetadataError::RoundtripError { value: Box::new(e) })
}
}
}
}
impl tskit::metadata::NodeMetadata for NodeMetadata {}
};
}
mod node_metadata {
#[derive(Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq)]
pub struct NodeMetadata {
pub value: i32,
}
impl_node_metadata_traits!();
}
mod node_metadata_clone {
#[derive(Debug, Eq, PartialEq, Clone, serde::Serialize, serde::Deserialize)]
pub struct NodeMetadata {
pub value: i32,
}
impl_node_metadata_traits!();
}
#[test]
fn test_adding_node_table_row_with_defaults_and_metadata() {
use node_metadata::NodeMetadata;
let mut tables = tskit::TableCollection::new(10.0).unwrap();
type DefaultsWithMetadata = tskit::NodeDefaultsWithMetadata<NodeMetadata>;
let defaults = DefaultsWithMetadata::default();
let n0 = tables.add_node_with_defaults(0.0, &defaults).unwrap();
let n1 = tables
.add_node_with_defaults(
0.0,
&DefaultsWithMetadata {
population: 3.into(),
metadata: Some(NodeMetadata { value: 42 }),
..defaults
},
)
.unwrap();
let n2 = tables
.add_node_with_defaults(
0.0,
&DefaultsWithMetadata {
population: 1.into(),
metadata: Some(NodeMetadata { value: 1234 }),
..defaults
},
)
.unwrap();
assert!(tables.nodes().metadata::<NodeMetadata>(n0).is_none());
assert_eq!(
tables
.nodes()
.metadata::<NodeMetadata>(n1)
.unwrap()
.unwrap(),
NodeMetadata { value: 42 }
);
assert_eq!(
tables
.nodes()
.metadata::<NodeMetadata>(n2)
.unwrap()
.unwrap(),
NodeMetadata { value: 1234 }
);
}
#[test]
fn test_adding_node_table_row_with_defaults_and_metadata_requiring_clone() {
use node_metadata_clone::NodeMetadata;
let mut tables = tskit::TableCollection::new(10.0).unwrap();
type DefaultsWithMetadata = tskit::NodeDefaultsWithMetadata<NodeMetadata>;
let defaults = DefaultsWithMetadata {
metadata: Some(NodeMetadata { value: 42 }),
..Default::default()
};
let n0 = tables
.add_node_with_defaults(
0.0,
&DefaultsWithMetadata {
metadata: Some(NodeMetadata { value: 2 * 42 }),
..defaults
},
)
.unwrap();
assert_eq!(
tables
.nodes()
.metadata::<NodeMetadata>(n0)
.unwrap()
.unwrap(),
NodeMetadata { value: 2 * 42 }
);
let n1 = tables
.add_node_with_defaults(
0.0,
&DefaultsWithMetadata {
population: 6.into(),
..defaults.clone()
},
)
.unwrap();
assert_eq!(
tables
.nodes()
.metadata::<NodeMetadata>(n1)
.unwrap()
.unwrap(),
NodeMetadata { value: 42 }
);
let n2 = tables
.add_node_with_defaults(
0.0,
&DefaultsWithMetadata {
individual: 7.into(),
..defaults
},
)
.unwrap();
assert_eq!(
tables
.nodes()
.metadata::<NodeMetadata>(n2)
.unwrap()
.unwrap(),
NodeMetadata { value: 42 }
);
}