use ragc_common::Contig;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ContigProcessingStage {
AllContigs,
Registration,
NewSplitters,
HardContigs,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Task {
pub stage: ContigProcessingStage,
pub sample_name: String,
pub contig_name: String,
pub sequence: Contig,
}
impl Task {
pub fn new_contig(
sample_name: String,
contig_name: String,
sequence: Contig,
stage: ContigProcessingStage,
) -> Self {
Task {
stage,
sample_name,
contig_name,
sequence,
}
}
pub fn new_sync(stage: ContigProcessingStage) -> Self {
assert!(
stage == ContigProcessingStage::Registration
|| stage == ContigProcessingStage::NewSplitters,
"Sync tasks must be Registration or NewSplitters"
);
Task {
stage,
sample_name: String::new(),
contig_name: String::new(),
sequence: Vec::new(),
}
}
pub fn is_sync(&self) -> bool {
(self.stage == ContigProcessingStage::Registration
|| self.stage == ContigProcessingStage::NewSplitters)
&& self.sample_name.is_empty()
&& self.contig_name.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_contig_task_creation() {
let task = Task::new_contig(
"sample1".to_string(),
"chr1".to_string(),
vec![0, 1, 2, 3],
ContigProcessingStage::AllContigs,
);
assert_eq!(task.stage, ContigProcessingStage::AllContigs);
assert_eq!(task.sample_name, "sample1");
assert_eq!(task.contig_name, "chr1");
assert_eq!(task.sequence, vec![0, 1, 2, 3]);
assert!(!task.is_sync());
}
#[test]
fn test_registration_sync_task() {
let task = Task::new_sync(ContigProcessingStage::Registration);
assert_eq!(task.stage, ContigProcessingStage::Registration);
assert!(task.sample_name.is_empty());
assert!(task.contig_name.is_empty());
assert!(task.sequence.is_empty());
assert!(task.is_sync());
}
#[test]
fn test_new_splitters_sync_task() {
let task = Task::new_sync(ContigProcessingStage::NewSplitters);
assert_eq!(task.stage, ContigProcessingStage::NewSplitters);
assert!(task.is_sync());
}
#[test]
#[should_panic(expected = "Sync tasks must be Registration or NewSplitters")]
fn test_invalid_sync_task() {
Task::new_sync(ContigProcessingStage::AllContigs);
}
#[test]
fn test_hard_contig_task() {
let task = Task::new_contig(
"sample1".to_string(),
"chr1".to_string(),
vec![0, 1, 2, 3],
ContigProcessingStage::HardContigs,
);
assert_eq!(task.stage, ContigProcessingStage::HardContigs);
assert!(!task.is_sync());
}
}