5 use Test::More 'no_plan';
7 use Maasha::AlignTwoSeq;
10 test_new_space_left();
11 test_new_space_right();
13 test_matches_select();
15 test_word_size_calc();
20 test_match_expand_forward_end_space();
21 test_match_expand_forward_end_match();
22 test_match_expand_backward_end_space();
23 test_match_expand_backward_end_match();
24 test_match_expand_end_space();
25 test_match_expand_end_match();
27 test_match_redundant_add();
28 test_match_redundant();
30 test_matches_filter();
32 test_match_score_narrow();
33 test_match_score_diag();
34 test_match_score_len();
44 my $space = { Q_SEQ => \"ATCG", S_SEQ => \"atcg" };
46 Maasha::AlignTwoSeq::new_space( $space );
48 is( ${ $space->{ 'Q_SEQ' } }, "ATCG" );
49 is( ${ $space->{ 'S_SEQ' } }, "atcg" );
50 ok( $space->{ 'Q_MIN' } == 0 );
51 ok( $space->{ 'S_MIN' } == 0 );
52 ok( $space->{ 'Q_MAX' } == 3 );
53 ok( $space->{ 'S_MAX' } == 3 );
57 sub test_new_space_left
59 my ( $best_match, $space, $new_space );
79 $new_space = Maasha::AlignTwoSeq::new_space_left( $best_match, $space );
81 ok( defined $new_space );
82 is( ${ $new_space->{ 'Q_SEQ' } }, "ATCG" );
83 is( ${ $new_space->{ 'S_SEQ' } }, "atcg" );
84 ok( $new_space->{ 'Q_MIN' } == 0 );
85 ok( $new_space->{ 'S_MIN' } == 0 );
86 ok( $new_space->{ 'Q_MAX' } == 1 );
87 ok( $new_space->{ 'S_MAX' } == 1 );
91 sub test_new_space_right
93 my ( $best_match, $space, $new_space );
113 $new_space = Maasha::AlignTwoSeq::new_space_right( $best_match, $space );
115 ok( defined $new_space );
116 is( ${ $new_space->{ 'Q_SEQ' } }, "ATCG" );
117 is( ${ $new_space->{ 'S_SEQ' } }, "atcg" );
118 ok( $new_space->{ 'Q_MIN' } == 2 );
119 ok( $new_space->{ 'S_MIN' } == 2 );
120 ok( $new_space->{ 'Q_MAX' } == 3 );
121 ok( $new_space->{ 'S_MAX' } == 3 );
125 sub test_matches_select
127 my ( $matches, $space );
130 { Q_BEG => 9, S_BEG => 9, Q_END => 10, S_END => 10 },
131 { Q_BEG => 10, S_BEG => 10, Q_END => 20, S_END => 20 },
132 { Q_BEG => 20, S_BEG => 20, Q_END => 21, S_END => 21 },
144 Maasha::AlignTwoSeq::matches_select( $matches, $space );
146 ok( scalar @{ $matches } == 1 );
150 sub test_word_size_calc
152 ok( Maasha::AlignTwoSeq::word_size_calc( { Q_MIN => 0, S_MIN => 0, Q_MAX => 1, S_MAX => 1 } ) == 1 );
153 ok( Maasha::AlignTwoSeq::word_size_calc( { Q_MIN => 0, S_MIN => 0, Q_MAX => 200, S_MAX => 200 } ) == 10 + 1 );
159 my ( $space, $word_size, $index );
172 $index = Maasha::AlignTwoSeq::seq_index( $space, $word_size );
174 ok( scalar keys %{ $index } == 3 );
175 ok( exists $index->{ 'AT' } );
176 ok( exists $index->{ 'TC' } );
177 ok( exists $index->{ 'CG' } );
178 ok( $index->{ 'AT' }->[ 0 ] == 0 );
179 ok( $index->{ 'TC' }->[ 0 ] == 1 );
180 ok( $index->{ 'CG' }->[ 0 ] == 2 );
186 my ( $space, $word_size, $index, $matches );
199 $index = Maasha::AlignTwoSeq::seq_index( $space, $word_size );
200 $matches = Maasha::AlignTwoSeq::seq_scan( $index, $space, $word_size );
202 ok( scalar @{ $matches } == 1 );
203 ok( $matches->[ 0 ]->{ 'Q_BEG' } == 0 );
204 ok( $matches->[ 0 ]->{ 'S_BEG' } == 0 );
205 ok( $matches->[ 0 ]->{ 'Q_END' } == 3 );
206 ok( $matches->[ 0 ]->{ 'S_END' } == 3 );
207 ok( $matches->[ 0 ]->{ 'LEN' } == 4 );
208 ok( $matches->[ 0 ]->{ 'SCORE' } == 0 );
212 sub test_matches_find
214 my ( $space, $matches );
216 $space = { Q_SEQ => \"ATCG", S_SEQ => \"ATCG", Q_MIN => 0, S_MIN => 0, Q_MAX => 3, S_MAX => 3 };
218 $matches = Maasha::AlignTwoSeq::matches_find( $space );
220 ok( scalar @{ $matches } == 1 );
221 ok( $matches->[ 0 ]->{ 'Q_BEG' } == 0 );
222 ok( $matches->[ 0 ]->{ 'S_BEG' } == 0 );
223 ok( $matches->[ 0 ]->{ 'Q_END' } == 3 );
224 ok( $matches->[ 0 ]->{ 'S_END' } == 3 );
225 ok( $matches->[ 0 ]->{ 'LEN' } == 4 );
227 $space = { Q_SEQ => \"ATXXGAT", S_SEQ => \"ATCGAT", Q_MIN => 0, S_MIN => 0, Q_MAX => 6, S_MAX => 5 };
229 $matches = Maasha::AlignTwoSeq::matches_find( $space );
231 ok( scalar @{ $matches } == 4 );
232 ok( $matches->[ 0 ]->{ 'Q_BEG' } == 0 );
233 ok( $matches->[ 0 ]->{ 'S_BEG' } == 0 );
234 ok( $matches->[ 0 ]->{ 'Q_END' } == 1 );
235 ok( $matches->[ 0 ]->{ 'S_END' } == 1 );
236 ok( $matches->[ 0 ]->{ 'LEN' } == 2 );
237 ok( $matches->[ 1 ]->{ 'Q_BEG' } == 5 );
238 ok( $matches->[ 1 ]->{ 'S_BEG' } == 0 );
239 ok( $matches->[ 1 ]->{ 'Q_END' } == 6 );
240 ok( $matches->[ 1 ]->{ 'S_END' } == 1 );
241 ok( $matches->[ 1 ]->{ 'LEN' } == 2 );
242 ok( $matches->[ 2 ]->{ 'Q_BEG' } == 4 );
243 ok( $matches->[ 2 ]->{ 'S_BEG' } == 3 );
244 ok( $matches->[ 2 ]->{ 'Q_END' } == 6 );
245 ok( $matches->[ 2 ]->{ 'S_END' } == 5 );
246 ok( $matches->[ 2 ]->{ 'LEN' } == 3 );
247 ok( $matches->[ 3 ]->{ 'Q_BEG' } == 0 );
248 ok( $matches->[ 3 ]->{ 'S_BEG' } == 4 );
249 ok( $matches->[ 3 ]->{ 'Q_END' } == 1 );
250 ok( $matches->[ 3 ]->{ 'S_END' } == 5 );
251 ok( $matches->[ 3 ]->{ 'LEN' } == 2 );
254 sub test_match_expand_forward_end_space
256 my ( $match, $space );
276 Maasha::AlignTwoSeq::match_expand_forward( $match, $space );
278 ok( $match->{ 'Q_BEG' } == 1 );
279 ok( $match->{ 'S_BEG' } == 1 );
280 ok( $match->{ 'Q_END' } == 3 );
281 ok( $match->{ 'S_END' } == 3 );
282 ok( $match->{ 'LEN' } == 3 );
286 sub test_match_expand_forward_end_match
288 my ( $match, $space );
308 Maasha::AlignTwoSeq::match_expand_forward( $match, $space );
310 ok( $match->{ 'Q_BEG' } == 1 );
311 ok( $match->{ 'S_BEG' } == 1 );
312 ok( $match->{ 'Q_END' } == 3 );
313 ok( $match->{ 'S_END' } == 3 );
314 ok( $match->{ 'LEN' } == 3 );
318 sub test_match_expand_backward_end_space
320 my ( $match, $space );
340 Maasha::AlignTwoSeq::match_expand_backward( $match, $space );
342 ok( $match->{ 'Q_BEG' } == 0 );
343 ok( $match->{ 'S_BEG' } == 0 );
344 ok( $match->{ 'Q_END' } == 2 );
345 ok( $match->{ 'S_END' } == 2 );
346 ok( $match->{ 'LEN' } == 3 );
350 sub test_match_expand_backward_end_match
352 my ( $match, $space );
372 Maasha::AlignTwoSeq::match_expand_backward( $match, $space );
374 ok( $match->{ 'Q_BEG' } == 1 );
375 ok( $match->{ 'S_BEG' } == 1 );
376 ok( $match->{ 'Q_END' } == 3 );
377 ok( $match->{ 'S_END' } == 3 );
378 ok( $match->{ 'LEN' } == 3 );
382 sub test_match_expand_end_space
384 my ( $match, $space );
404 Maasha::AlignTwoSeq::match_expand( $match, $space );
406 ok( $match->{ 'Q_BEG' } == 0 );
407 ok( $match->{ 'S_BEG' } == 0 );
408 ok( $match->{ 'Q_END' } == 3 );
409 ok( $match->{ 'S_END' } == 3 );
410 ok( $match->{ 'LEN' } == 4 );
414 sub test_match_expand_end_match
416 my ( $match, $space );
436 Maasha::AlignTwoSeq::match_expand( $match, $space );
438 ok( $match->{ 'Q_BEG' } == 1 );
439 ok( $match->{ 'S_BEG' } == 1 );
440 ok( $match->{ 'Q_END' } == 4 );
441 ok( $match->{ 'S_END' } == 4 );
442 ok( $match->{ 'LEN' } == 4 );
446 sub test_match_redundant_add
452 Maasha::AlignTwoSeq::match_redundant_add( { Q_BEG => 10, Q_END => 20, S_BEG => 110, S_END => 120 }, $redundant );
453 Maasha::AlignTwoSeq::match_redundant_add( { Q_BEG => 15, Q_END => 25, S_BEG => 210, S_END => 220 }, $redundant );
455 ok( scalar keys %{ $redundant } == 16 );
459 sub test_match_redundant
465 Maasha::AlignTwoSeq::match_redundant_add( { Q_BEG => 10, Q_END => 20, S_BEG => 110, S_END => 120 }, $redundant );
466 Maasha::AlignTwoSeq::match_redundant_add( { Q_BEG => 15, Q_END => 25, S_BEG => 210, S_END => 220 }, $redundant );
468 ok( Maasha::AlignTwoSeq::match_redundant( { Q_BEG => 10, Q_END => 20, S_BEG => 110, S_END => 120 }, $redundant ) );
469 ok( not Maasha::AlignTwoSeq::match_redundant( { Q_BEG => 1, Q_END => 2, S_BEG => 110, S_END => 120 }, $redundant ) );
473 sub test_matches_filter
479 sub test_match_score_narrow
485 sub test_match_score_diag
491 sub test_match_score_len
503 sub test_align_two_seq
505 my ( $space, $matches );
512 $matches = Maasha::AlignTwoSeq::align_two_seq( $space, [] );
514 # print Dumper( $matches );
520 sub test_insert_indels
522 my ( $matches, $q_seq, $s_seq );
525 { Q_BEG => 1, S_BEG => 1, Q_END => 4, S_END => 4 }
531 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
533 is( $q_seq, "XATCG" );
534 is( $s_seq, "PATCG" );
537 { Q_BEG => 0, S_BEG => 1, Q_END => 3, S_END => 4 }
543 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
545 is( $q_seq, "-ATCG" );
546 is( $s_seq, "PATCG" );
549 { Q_BEG => 1, S_BEG => 0, Q_END => 4, S_END => 3 }
555 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
557 is( $q_seq, "XATCG" );
558 is( $s_seq, "-ATCG" );
561 { Q_BEG => 0, S_BEG => 0, Q_END => 3, S_END => 3 },
562 { Q_BEG => 6, S_BEG => 6, Q_END => 9, S_END => 9 },
565 $q_seq = "ATCGXXATCG";
566 $s_seq = "ATCGNNATCG";
568 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
570 is( $q_seq, "ATCGXXATCG" );
571 is( $s_seq, "ATCGNNATCG" );
574 { Q_BEG => 0, S_BEG => 0, Q_END => 3, S_END => 3 },
575 { Q_BEG => 6, S_BEG => 4, Q_END => 9, S_END => 7 },
578 $q_seq = "ATCGXXATCG";
581 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
583 is( $q_seq, "ATCGXXATCG" );
584 is( $s_seq, "ATCG--ATCG" );
587 { Q_BEG => 0, S_BEG => 1, Q_END => 2, S_END => 3 },
588 { Q_BEG => 5, S_BEG => 4, Q_END => 8, S_END => 7 },
591 $q_seq = "TCGXXATCG";
594 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
596 is( $q_seq, "-TCGXXATCG" );
597 is( $s_seq, "ATCG--ATCG" );
600 { Q_BEG => 1, S_BEG => 0, Q_END => 3, S_END => 2 },
601 { Q_BEG => 6, S_BEG => 3, Q_END => 9, S_END => 6 },
604 $q_seq = "ATCGXXATCG";
607 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
609 is( $q_seq, "ATCGXXATCG" );
610 is( $s_seq, "-TCG--ATCG" );
613 { Q_BEG => 1, Q_END => 3, S_BEG => 0, S_END => 2 },
614 { Q_BEG => 6, Q_END => 7, S_BEG => 3, S_END => 4 },
615 { Q_BEG => 9, Q_END => 10, S_BEG => 7, S_END => 8 },
618 $q_seq = "ATCGXXATACG";
619 $s_seq = "TCGATNTCG";
621 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
623 is( $q_seq, "ATCGXXAT-ACG" );
625 is( $s_seq, "-TCG--ATNTCG" );
628 { Q_BEG => 1, Q_END => 3, S_BEG => 0, S_END => 2 },
629 { Q_BEG => 6, Q_END => 7, S_BEG => 3, S_END => 4 },
630 { Q_BEG => 9, Q_END => 10, S_BEG => 7, S_END => 8 },
633 $q_seq = "ATCGXXATACG";
634 $s_seq = "TCGATNTCGXX";
636 Maasha::AlignTwoSeq::insert_indels( $matches, \$q_seq, \$s_seq );
638 is( $q_seq, "ATCGXXAT-ACG--" );
640 is( $s_seq, "-TCG--ATNTCGXX" );