]> git.donarmstrong.com Git - biopieces.git/blob - code_perl/Maasha/test/test_AlignTwoSeq.pl
working on AlignTwoSeq
[biopieces.git] / code_perl / Maasha / test / test_AlignTwoSeq.pl
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings;
5 use Test::More 'no_plan';
6 use Data::Dumper;
7 use Maasha::AlignTwoSeq;
8
9 test_new_space();
10 test_new_space_left();
11 test_new_space_right();
12
13 test_matches_select();
14
15 test_word_size_calc();
16 test_seq_index();
17 test_seq_scan();
18 test_matches_find();
19
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();
26
27 test_match_redundant_add();
28 test_match_redundant();
29
30 test_matches_filter();
31
32 test_match_score_narrow();
33 test_match_score_diag();
34 test_match_score_len();
35 test_match_score();
36
37 test_align_two_seq();
38
39
40 sub test_new_space
41 {
42     my $space = { Q_SEQ => \"ATCG", S_SEQ => \"atcg" };
43     
44     Maasha::AlignTwoSeq::new_space( $space );
45
46     is( ${ $space->{ 'Q_SEQ' } }, "ATCG" );
47     is( ${ $space->{ 'S_SEQ' } }, "atcg" );
48     ok( $space->{ 'Q_MIN' } == 0 );
49     ok( $space->{ 'S_MIN' } == 0 );
50     ok( $space->{ 'Q_MAX' } == 3 );
51     ok( $space->{ 'S_MAX' } == 3 );
52 }
53
54
55 sub test_new_space_left
56 {
57     my ( $best_match, $space, $new_space );
58
59     $best_match = {
60         Q_BEG => 2,
61         Q_END => 3,
62         S_BEG => 2,
63         S_END => 3,
64         SCORE => 0,
65         LEN   => 2,
66     };
67
68     $space = {
69         Q_SEQ => \"ATCG",
70         S_SEQ => \"atcg",
71         Q_MIN => 0,
72         S_MIN => 0,
73         Q_MAX => 3,
74         S_MAX => 3,
75     };
76
77     $new_space = Maasha::AlignTwoSeq::new_space_left( $best_match, $space );
78
79     ok( defined $new_space );
80     is( ${ $new_space->{ 'Q_SEQ' } }, "ATCG" );
81     is( ${ $new_space->{ 'S_SEQ' } }, "atcg" );
82     ok( $new_space->{ 'Q_MIN' } == 0 );
83     ok( $new_space->{ 'S_MIN' } == 0 );
84     ok( $new_space->{ 'Q_MAX' } == 1 );
85     ok( $new_space->{ 'S_MAX' } == 1 );
86 }
87
88
89 sub test_new_space_right
90 {
91     my ( $best_match, $space, $new_space );
92
93     $best_match = {
94         Q_BEG => 0,
95         Q_END => 1,
96         S_BEG => 0,
97         S_END => 1,
98         SCORE => 0,
99         LEN   => 2,
100     };
101
102     $space = {
103         Q_SEQ => \"ATCG",
104         S_SEQ => \"atcg",
105         Q_MIN => 0,
106         S_MIN => 0,
107         Q_MAX => 3,
108         S_MAX => 3,
109     };
110
111     $new_space = Maasha::AlignTwoSeq::new_space_right( $best_match, $space );
112
113     ok( defined $new_space );
114     is( ${ $new_space->{ 'Q_SEQ' } }, "ATCG" );
115     is( ${ $new_space->{ 'S_SEQ' } }, "atcg" );
116     ok( $new_space->{ 'Q_MIN' } == 2 );
117     ok( $new_space->{ 'S_MIN' } == 2 );
118     ok( $new_space->{ 'Q_MAX' } == 3 );
119     ok( $new_space->{ 'S_MAX' } == 3 );
120 }
121
122
123 sub test_matches_select
124 {
125     my ( $matches, $space );
126
127     $matches = [
128         { Q_BEG => 9,  S_BEG =>  9, Q_END => 10, S_END => 10 },
129         { Q_BEG => 10, S_BEG => 10, Q_END => 20, S_END => 20 },
130         { Q_BEG => 20, S_BEG => 20, Q_END => 21, S_END => 21 },
131     ];
132
133     $space = {
134         Q_SEQ => \"ATCG",
135         S_SEQ => \"atcg",
136         Q_MIN => 10,
137         S_MIN => 10,
138         Q_MAX => 20,
139         S_MAX => 20,
140     };
141
142     Maasha::AlignTwoSeq::matches_select( $matches, $space );
143
144     ok( scalar @{ $matches } == 1 );
145 }
146
147
148 sub test_word_size_calc
149 {
150     ok( Maasha::AlignTwoSeq::word_size_calc( { Q_MIN => 0, S_MIN => 0, Q_MAX => 1, S_MAX => 1 } ) == 1 );
151     ok( Maasha::AlignTwoSeq::word_size_calc( { Q_MIN => 0, S_MIN => 0, Q_MAX => 200, S_MAX => 200 } ) == 10 + 1 );
152 }
153
154
155 sub test_seq_index
156 {
157     my ( $space, $word_size, $index );
158
159     $space = {
160         Q_SEQ => \"ATCG",
161         S_SEQ => \"atcg",
162         Q_MIN => 0,
163         S_MIN => 0,
164         Q_MAX => 3,
165         S_MAX => 3,
166     };
167
168     $word_size = 2;
169     
170     $index = Maasha::AlignTwoSeq::seq_index( $space, $word_size );
171
172     ok( scalar keys %{ $index } == 3 );
173     ok( exists $index->{ 'AT' } );
174     ok( exists $index->{ 'TC' } );
175     ok( exists $index->{ 'CG' } );
176     ok( $index->{ 'AT' }->[ 0 ] == 0 );
177     ok( $index->{ 'TC' }->[ 0 ] == 1 );
178     ok( $index->{ 'CG' }->[ 0 ] == 2 );
179 }
180
181
182 sub test_seq_scan
183 {
184     my ( $space, $word_size, $index, $matches );
185
186     $space = {
187         Q_SEQ => \"ATCG",
188         S_SEQ => \"atcg",
189         Q_MIN => 0,
190         S_MIN => 0,
191         Q_MAX => 3,
192         S_MAX => 3,
193     };
194
195     $word_size = 2;
196     
197     $index   = Maasha::AlignTwoSeq::seq_index( $space, $word_size );
198     $matches = Maasha::AlignTwoSeq::seq_scan( $index, $space, $word_size );
199
200     ok( scalar @{ $matches } == 1 );
201     ok( $matches->[ 0 ]->{ 'Q_BEG' } == 0 );
202     ok( $matches->[ 0 ]->{ 'S_BEG' } == 0 );
203     ok( $matches->[ 0 ]->{ 'Q_END' } == 3 );
204     ok( $matches->[ 0 ]->{ 'S_END' } == 3 );
205     ok( $matches->[ 0 ]->{ 'LEN' }   == 4 );
206     ok( $matches->[ 0 ]->{ 'SCORE' } == 0 );
207 }
208
209
210 sub test_matches_find
211 {
212     my ( $space, $matches );
213
214     $space = { Q_SEQ => \"ATCG", S_SEQ => \"ATCG", Q_MIN => 0, S_MIN => 0, Q_MAX => 3, S_MAX => 3 };
215
216     $matches = Maasha::AlignTwoSeq::matches_find( $space );
217
218     ok( scalar @{ $matches } == 1 );
219     ok( $matches->[ 0 ]->{ 'Q_BEG' } == 0 );
220     ok( $matches->[ 0 ]->{ 'S_BEG' } == 0 );
221     ok( $matches->[ 0 ]->{ 'Q_END' } == 3 );
222     ok( $matches->[ 0 ]->{ 'S_END' } == 3 );
223     ok( $matches->[ 0 ]->{ 'LEN' }   == 4 );
224
225     $space = { Q_SEQ => \"ATXXGAT", S_SEQ => \"ATCGAT", Q_MIN => 0, S_MIN => 0, Q_MAX => 6, S_MAX => 5 };
226
227     $matches = Maasha::AlignTwoSeq::matches_find( $space );
228
229     ok( scalar @{ $matches } == 4 );
230     ok( $matches->[ 0 ]->{ 'Q_BEG' } == 0 );
231     ok( $matches->[ 0 ]->{ 'S_BEG' } == 0 );
232     ok( $matches->[ 0 ]->{ 'Q_END' } == 1 );
233     ok( $matches->[ 0 ]->{ 'S_END' } == 1 );
234     ok( $matches->[ 0 ]->{ 'LEN' }   == 2 );
235     ok( $matches->[ 1 ]->{ 'Q_BEG' } == 5 );
236     ok( $matches->[ 1 ]->{ 'S_BEG' } == 0 );
237     ok( $matches->[ 1 ]->{ 'Q_END' } == 6 );
238     ok( $matches->[ 1 ]->{ 'S_END' } == 1 );
239     ok( $matches->[ 1 ]->{ 'LEN' }   == 2 );
240     ok( $matches->[ 2 ]->{ 'Q_BEG' } == 4 );
241     ok( $matches->[ 2 ]->{ 'S_BEG' } == 3 );
242     ok( $matches->[ 2 ]->{ 'Q_END' } == 6 );
243     ok( $matches->[ 2 ]->{ 'S_END' } == 5 );
244     ok( $matches->[ 2 ]->{ 'LEN' }   == 3 );
245     ok( $matches->[ 3 ]->{ 'Q_BEG' } == 0 );
246     ok( $matches->[ 3 ]->{ 'S_BEG' } == 4 );
247     ok( $matches->[ 3 ]->{ 'Q_END' } == 1 );
248     ok( $matches->[ 3 ]->{ 'S_END' } == 5 );
249     ok( $matches->[ 3 ]->{ 'LEN' }   == 2 );
250 }
251
252 sub test_match_expand_forward_end_space
253 {
254     my ( $match, $space );
255
256     $match = {
257         Q_BEG => 1,
258         Q_END => 2,
259         S_BEG => 1,
260         S_END => 2,
261         SCORE => 0,
262         LEN   => 2,
263     };
264
265     $space = {
266         Q_SEQ => \"ATCG",
267         S_SEQ => \"atcg",
268         Q_MIN => 0,
269         S_MIN => 0,
270         Q_MAX => 3,
271         S_MAX => 3,
272     };
273
274     Maasha::AlignTwoSeq::match_expand_forward( $match, $space );
275
276     ok( $match->{ 'Q_BEG' } == 1 );
277     ok( $match->{ 'S_BEG' } == 1 );
278     ok( $match->{ 'Q_END' } == 3 );
279     ok( $match->{ 'S_END' } == 3 );
280     ok( $match->{ 'LEN' }   == 3 );
281 }
282
283
284 sub test_match_expand_forward_end_match
285 {
286     my ( $match, $space );
287
288     $match = {
289         Q_BEG => 1,
290         Q_END => 2,
291         S_BEG => 1,
292         S_END => 2,
293         SCORE => 0,
294         LEN   => 2,
295     };
296
297     $space = {
298         Q_SEQ => \"ATCGXX",
299         S_SEQ => \"atcgnn",
300         Q_MIN => 0,
301         S_MIN => 0,
302         Q_MAX => 6,
303         S_MAX => 6,
304     };
305
306     Maasha::AlignTwoSeq::match_expand_forward( $match, $space );
307
308     ok( $match->{ 'Q_BEG' } == 1 );
309     ok( $match->{ 'S_BEG' } == 1 );
310     ok( $match->{ 'Q_END' } == 3 );
311     ok( $match->{ 'S_END' } == 3 );
312     ok( $match->{ 'LEN' }   == 3 );
313 }
314
315
316 sub test_match_expand_backward_end_space
317 {
318     my ( $match, $space );
319
320     $match = {
321         Q_BEG => 1,
322         Q_END => 2,
323         S_BEG => 1,
324         S_END => 2,
325         SCORE => 0,
326         LEN   => 2,
327     };
328
329     $space = {
330         Q_SEQ => \"ATCG",
331         S_SEQ => \"atcg",
332         Q_MIN => 0,
333         S_MIN => 0,
334         Q_MAX => 3,
335         S_MAX => 3,
336     };
337
338     Maasha::AlignTwoSeq::match_expand_backward( $match, $space );
339
340     ok( $match->{ 'Q_BEG' } == 0 );
341     ok( $match->{ 'S_BEG' } == 0 );
342     ok( $match->{ 'Q_END' } == 2 );
343     ok( $match->{ 'S_END' } == 2 );
344     ok( $match->{ 'LEN' }   == 3 );
345 }
346
347
348 sub test_match_expand_backward_end_match
349 {
350     my ( $match, $space );
351
352     $match = {
353         Q_BEG => 2,
354         Q_END => 3,
355         S_BEG => 2,
356         S_END => 3,
357         SCORE => 0,
358         LEN   => 2,
359     };
360
361     $space = {
362         Q_SEQ => \"XATCG",
363         S_SEQ => \"natcg",
364         Q_MIN => 0,
365         S_MIN => 0,
366         Q_MAX => 4,
367         S_MAX => 4,
368     };
369
370     Maasha::AlignTwoSeq::match_expand_backward( $match, $space );
371
372     ok( $match->{ 'Q_BEG' } == 1 );
373     ok( $match->{ 'S_BEG' } == 1 );
374     ok( $match->{ 'Q_END' } == 3 );
375     ok( $match->{ 'S_END' } == 3 );
376     ok( $match->{ 'LEN' }   == 3 );
377 }
378
379
380 sub test_match_expand_end_space
381 {
382     my ( $match, $space );
383
384     $match = {
385         Q_BEG => 1,
386         Q_END => 2,
387         S_BEG => 1,
388         S_END => 2,
389         SCORE => 0,
390         LEN   => 2,
391     };
392
393     $space = {
394         Q_SEQ => \"ATCG",
395         S_SEQ => \"atcg",
396         Q_MIN => 0,
397         S_MIN => 0,
398         Q_MAX => 3,
399         S_MAX => 3,
400     };
401
402     Maasha::AlignTwoSeq::match_expand( $match, $space );
403
404     ok( $match->{ 'Q_BEG' } == 0 );
405     ok( $match->{ 'S_BEG' } == 0 );
406     ok( $match->{ 'Q_END' } == 3 );
407     ok( $match->{ 'S_END' } == 3 );
408     ok( $match->{ 'LEN' }   == 4 );
409 }
410
411
412 sub test_match_expand_end_match
413 {
414     my ( $match, $space );
415
416     $match = {
417         Q_BEG => 2,
418         Q_END => 3,
419         S_BEG => 2,
420         S_END => 3,
421         SCORE => 0,
422         LEN   => 2,
423     };
424
425     $space = {
426         Q_SEQ => \"XATCGX",
427         S_SEQ => \"natcgn",
428         Q_MIN => 0,
429         S_MIN => 0,
430         Q_MAX => 6,
431         S_MAX => 6,
432     };
433
434     Maasha::AlignTwoSeq::match_expand( $match, $space );
435
436     ok( $match->{ 'Q_BEG' } == 1 );
437     ok( $match->{ 'S_BEG' } == 1 );
438     ok( $match->{ 'Q_END' } == 4 );
439     ok( $match->{ 'S_END' } == 4 );
440     ok( $match->{ 'LEN' }   == 4 );
441 }
442
443
444 sub test_match_redundant_add
445 {
446     my ( $redundant );
447
448     $redundant = {};
449
450     Maasha::AlignTwoSeq::match_redundant_add( { Q_BEG => 10, Q_END => 20, S_BEG => 110, S_END => 120 }, $redundant );
451     Maasha::AlignTwoSeq::match_redundant_add( { Q_BEG => 15, Q_END => 25, S_BEG => 210, S_END => 220 }, $redundant );
452
453     ok( scalar keys %{ $redundant } == 16 );
454 }
455
456
457 sub test_match_redundant
458 {
459     my ( $redundant );
460
461     $redundant = {};
462
463     Maasha::AlignTwoSeq::match_redundant_add( { Q_BEG => 10, Q_END => 20, S_BEG => 110, S_END => 120 }, $redundant );
464     Maasha::AlignTwoSeq::match_redundant_add( { Q_BEG => 15, Q_END => 25, S_BEG => 210, S_END => 220 }, $redundant );
465
466     ok( Maasha::AlignTwoSeq::match_redundant( { Q_BEG => 10, Q_END => 20, S_BEG => 110, S_END => 120 }, $redundant ) );
467     ok( not Maasha::AlignTwoSeq::match_redundant( { Q_BEG => 1, Q_END => 2, S_BEG => 110, S_END => 120 }, $redundant ) );
468 }
469
470
471 sub test_matches_filter
472 {
473     ok( 0 );
474 }
475
476
477 sub test_match_score_narrow
478 {
479     ok( 0 );
480 }
481
482
483 sub test_match_score_diag
484 {
485     ok( 0 );
486 }
487
488
489 sub test_match_score_len
490 {
491     ok( 0 );
492 }
493
494
495 sub test_match_score
496 {
497     ok( 0 );
498 }
499
500
501 sub test_align_two_seq
502 {
503     my ( $space, $matches );
504
505     $space = {
506         Q_SEQ => \"ATXCG",
507         S_SEQ => \"ATCG",
508     };
509
510     $matches = Maasha::AlignTwoSeq::align_two_seq( $space, [] );
511
512     print Dumper( $matches );
513
514     ok( 0 );
515 }
516
517