lib_tsshow 4.0.1

A visualiser for template-switch alignments
Documentation
use lib_tsalign::a_star_aligner::template_switch_distance::AlignmentType;

use crate::plain_text::mutlipair_alignment_renderer::{
    Character, CharacterKind, MultipairAlignmentSequence, NoCharacterData,
};

use super::MultipairAlignmentRenderer;

#[test]
fn test_parallel_gaps() {
    let mut renderer = MultipairAlignmentRenderer::new(
        "B".to_string(),
        "GGG"
            .chars()
            .map(|c| Character::new_char(c, NoCharacterData)),
    );
    renderer.add_aligned_sequence(
        &"B".to_string(),
        0,
        "A".to_string(),
        "GGGG"
            .chars()
            .map(|c| Character::new_char(c, NoCharacterData)),
        || NoCharacterData,
        || NoCharacterData,
        [
            AlignmentType::PrimaryMatch,
            AlignmentType::PrimaryMatch,
            AlignmentType::PrimaryInsertion,
            AlignmentType::PrimaryMatch,
        ],
        true,
        false,
    );
    renderer.add_aligned_sequence(
        &"B".to_string(),
        0,
        "C".to_string(),
        "GGGG"
            .chars()
            .map(|c| Character::new_char(c, NoCharacterData)),
        || NoCharacterData,
        || NoCharacterData,
        [
            AlignmentType::PrimaryMatch,
            AlignmentType::PrimaryMatch,
            AlignmentType::PrimaryInsertion,
            AlignmentType::PrimaryMatch,
        ],
        true,
        false,
    );

    let mut output = Vec::new();
    renderer
        .render(
            &mut output,
            [&"A".to_string(), &"B".to_string(), &"C".to_string()],
        )
        .unwrap();

    let output = String::from_utf8(output).unwrap();
    assert_eq!(output.trim(), "A: GGGG\nB: GG-G\nC: GGGG");
}

#[test]
fn translate_alignment_offset() {
    let sequence = MultipairAlignmentSequence::<NoCharacterData>::from_iter([
        CharacterKind::Blank,
        CharacterKind::Char('A'),
        CharacterKind::Gap,
        CharacterKind::Char('C'),
        CharacterKind::Gap,
    ]);
    assert_eq!(sequence.translate_alignment_offset(0), Some(0));
    assert_eq!(sequence.translate_alignment_offset(1), Some(2));
    assert_eq!(sequence.translate_alignment_offset(2), Some(4));
    assert_eq!(sequence.translate_alignment_offset(3), None);
}

#[test]
fn translate_extension_offset() {
    let sequence = MultipairAlignmentSequence::<NoCharacterData>::from_iter([
        CharacterKind::Blank,
        CharacterKind::Char('A'),
        CharacterKind::Gap,
        CharacterKind::Char('C'),
        CharacterKind::Gap,
    ]);
    assert_eq!(sequence.translate_extension_offset(0), Some(1));
    assert_eq!(sequence.translate_extension_offset(1), Some(3));
    assert_eq!(sequence.translate_extension_offset(2), Some(5));
    assert_eq!(sequence.translate_alignment_offset(3), None);

    let sequence = MultipairAlignmentSequence::<NoCharacterData>::from_iter([
        CharacterKind::Blank,
        CharacterKind::Char('A'),
        CharacterKind::Gap,
        CharacterKind::Char('C'),
    ]);
    assert_eq!(sequence.translate_extension_offset(0), Some(1));
    assert_eq!(sequence.translate_extension_offset(1), Some(3));
    assert_eq!(sequence.translate_extension_offset(2), Some(4));
    assert_eq!(sequence.translate_alignment_offset(3), None);
}