in progress...
[jalview.git] / forester / ruby / evoruby / exe / test.rb
1 #!/usr/local/bin/ruby -w
2 #
3 # = exe/test - Test class
4 #
5 # Copyright::  Copyright (C) 2006-2007 Christian M. Zmasek
6 # License::    GNU Lesser General Public License (LGPL)
7 #
8 # $Id: test.rb,v 1.18 2010/10/08 22:04:17 cmzmasek Exp $
9 #
10 # last modified: 05/15/2007
11
12
13 require 'lib/evo/util/constants'
14 require 'lib/evo/taxonomy/taxonomy'
15 require 'lib/evo/sequence/sequence'
16 require 'lib/evo/msa/msa'
17 require 'lib/evo/msa/msa_factory'
18 require 'lib/evo/sequence/domain_structure'
19 require 'lib/evo/sequence/protein_domain'
20 require 'lib/evo/table/basic_table'
21 require 'lib/evo/io/msa_io'
22 require 'lib/evo/io/writer/phylip_sequential_writer'
23 require 'lib/evo/io/writer/nexus_writer'
24 require 'lib/evo/io/writer/fasta_writer'
25 require 'lib/evo/io/parser/fasta_parser'
26 require 'lib/evo/io/parser/ncbi_tseq_parser'
27 require 'lib/evo/io/parser/hmmsearch_domain_extractor'
28 require 'lib/evo/tool/domain_sequence_extractor'
29 require 'lib/evo/tool/hmmscan_summary'
30 require 'lib/evo/tool/domains_to_forester'
31 require 'lib/evo/io/parser/general_msa_parser'
32 require 'lib/evo/io/parser/basic_table_parser'
33 require 'lib/evo/util/command_line_arguments'
34 require 'lib/evo/soft/fastme'
35 require 'lib/evo/soft/tree_puzzle'
36
37
38
39 module Evoruby
40
41     class Test
42
43         GENERAL_MSA_FILE = "files/test/general_msa_file.txt"
44         FASTA_FILE       = "files/test/fasta_file.txt"
45         TSEQ_FILE        = "files/test/ncbi_tseq.xml"
46
47         def initialize()
48             @failures  = 0
49             @successes = 0
50         end
51
52
53
54         def test_taxonomy()
55             begin
56                 tax = Taxonomy.new( "pig" )
57
58                 if tax.get_name != "pig"
59                     return false
60                 end
61
62                 tax1 = Taxonomy.new( "dog", "id", "source" )
63                 tax2 = tax1.copy
64
65                 if tax2.get_name != "dog"
66                     return false
67                 end
68                 if tax2.get_id != "id"
69                     return false
70                 end
71                 if tax2.get_id_source != "source"
72                     return false
73                 end
74
75                 if !( tax1 == tax2 )
76                     return false
77                 end
78
79                 if !( tax1 == tax1 )
80                     return false
81                 end
82
83                 tax3 = Taxonomy.new( "dog", "id"  )
84                 if ( tax1 == tax3 )
85                     return false
86                 end
87
88                 tax4 = Taxonomy.new( "dog" )
89                 tax5 = Taxonomy.new( "dog" )
90                 if !( tax4 == tax5 )
91                     return false
92                 end
93
94             rescue Exception => e
95                 puts()
96                 puts( e.to_s )
97                 puts()
98                 return false
99             end
100             return true
101         end
102
103
104         def test_sequence()
105             begin
106                 seq = Sequence.new( "seq1", "WLIQ" )
107                 if ( seq.get_length != 4 )
108                     return false
109                 end
110                 if ( seq.get_residue( 3 ) != "Q" )
111                     return false
112                 end
113                 seq.append!( "E?-*X_Y" )
114                 if ( seq.get_length != 11 )
115                     return false
116                 end
117                 if ( seq.get_residue( 3 ) != "Q" )
118                     return false
119                 end
120                 if ( seq.get_residue( 4 ) != "E" )
121                     return false
122                 end
123                 seq.append!( "A V_" )
124                 if ( seq.get_length != 15 )
125                     return false
126                 end
127                 if ( !Test::same?( seq.get_gap_length, 5 ) )
128                     return false
129                 end
130                 if ( !Test::same?( seq.get_gap_ratio, 5.0 / 15.0 ) )
131                     return false
132                 end
133                 seq.delete_residue!( 0 )
134                 seq.delete_residue!( 2 )
135                 seq2 = seq.copy()
136                 seq.delete_residue!( 0 )
137                 seq.delete_residue!( 0 )
138                 seq = nil
139                 if ( seq2.get_length != 13 )
140                     return false
141                 end
142                 if ( seq2.get_sequence_as_string != "LIE?-*X_YA V_" )
143                     return false
144                 end
145                 if ( seq2.get_slice( 2, 2 ) != "E?" )
146                     return false
147                 end
148                 if ( seq2.get_slice( 0, 1 ) != "L" )
149                     return false
150                 end
151                 if ( seq2.get_subsequence( 1, 4 ).get_sequence_as_string != "IE?-" )
152                     return false
153                 end
154                 if ( seq2.get_name() != "seq1" )
155                     return false
156                 end
157                 if ( seq2.get_slice!( 2, 2 ) != "E?" )
158                     return false
159                 end
160                 if ( seq2.get_sequence_as_string != "LI-*X_YA V_" )
161                     return false
162                 end
163                 if ( seq2.get_length != 11 )
164                     return false
165                 end
166                 if ( seq2.get_character_code( 0 ) != 76 )
167                     return false
168                 end
169                 str_0 = " Li-*X_YA V_ 3 3    1212 ?? B1J OU.Z "
170                 if ( Util.clean_seq_str( str_0 ) != "LI-X-YAV-XXXXXX-X" )
171                     return false
172                 end
173
174                 tax = Taxonomy.new( "dog", "tax_id", "tax_source" )
175                 seqn = Sequence.new( "seqn", "VVVVV", "acc", "acc source", tax, "symbol", "2accession", "2source" )
176                 seqc = seqn.copy
177                 if ( seqc.get_name() != "seqn" )
178                     return false
179                 end
180                 if ( seqc.get_accession() != "acc" )
181                     return false
182                 end
183                 if ( seqc.get_accession_source() != "acc source" )
184                     return false
185                 end
186                 if ( seqc.get_taxonomy.get_name != "dog" )
187                     return false
188                 end
189                 if ( seqc.get_taxonomy.get_id != "tax_id" )
190                     return false
191                 end
192                 if ( seqc.get_symbol != "symbol" )
193                     return false
194                 end
195                 if ( seqc.get_secondary_accession != "2accession" )
196                     return false
197                 end
198                 if ( seqc.get_secondary_accession_source != "2source" )
199                     return false
200                 end
201
202             rescue Exception => e
203                 puts()
204                 puts( e.to_s )
205                 puts()
206                 return false
207             end
208             return true
209         end
210
211
212         def test_msa()
213             begin
214                 msa = Msa.new()
215                 seq0 = Sequence.new( "seq 0", "a-*-_ x-ijklmnopqrstuvwxyz" )
216                 seq1 = Sequence.new( "seq 1", "ab--_ X-ijklmnopqrstuvwxyz" )
217                 seq2 = Sequence.new( "seq 2", "abc-_?x-ijklmnopqrstuvwxyz" )
218                 seq3 = Sequence.new( "seq 3", "abcd_?x-ijklmnopqrstuvwxyz" )
219                 seq4 = Sequence.new( "seq 4", "abcde?x-ijklmnopqrstuvwxyz" )
220                 seq5 = Sequence.new( "seq 5", "abcdefx-ijklmnopqrstuvwxyz" )
221                 msa.add_sequence( seq0 );
222                 msa.add_sequence( seq1 );
223                 msa.add_sequence( seq2 );
224                 msa.add_sequence( seq3 );
225                 msa.add_sequence( seq4 );
226                 msa.add_sequence( seq5 );
227                 msa.add(                      "seq 6", "abcdefg-ijklmnopqrstuvwxyz" );
228                 if ( msa.get_sequence( 0 ).get_name() != "seq 0" )
229                     return false
230                 end
231                 if ( msa.get_by_name( "Eq 1", false, true ).get_name != "seq 1" )
232                     return false
233                 end
234                 if ( msa.find_by_name( "Eq 2", false, true )[ 0 ] != 2 )
235                     return false
236                 end
237                 if ( !msa.is_aligned )
238                     return false
239                 end
240                 if ( msa.get_number_of_seqs != 7 )
241                     return false
242                 end
243                 if ( msa.get_length != 26 )
244                     return false
245                 end
246                 msa.add( "seq 7", "abcdefgqijklmnopqrstuvwxyz" );
247                 if ( msa.get_number_of_seqs != 8 )
248                     return false
249                 end
250                 msa.remove_sequence!( 7 )
251                 if ( msa.get_number_of_seqs != 7 )
252                     return false
253                 end
254                 msa.remove_gap_only_columns!()
255                 if ( msa.get_length() != 25 )
256                     return false
257                 end
258                 if ( msa.get_by_name( "seq 0" ).get_sequence_as_string != "a-*-_ xijklmnopqrstuvwxyz" )
259                     return false
260                 end
261                 msa.remove_gap_columns_w_gap_ratio!( 6.1 / 7.0 )
262                 if ( msa.get_length() != 25 )
263                     return false
264                 end
265                 msa.remove_gap_columns_w_gap_ratio!( 6.0 / 7.0 )
266                 if ( msa.get_length() != 25 )
267                     return false
268                 end
269                 if ( msa.get_by_name( "seq 0" ).get_sequence_as_string != "a-*-_ xijklmnopqrstuvwxyz" )
270                     return false
271                 end
272                 msa.remove_gap_columns_w_gap_ratio!( 5.0 / 7.0 )
273                 if ( msa.get_length() != 25 )
274                     return false
275                 end
276                 if ( msa.get_by_name( "seq 0" ).get_sequence_as_string != "a-*-_ xijklmnopqrstuvwxyz" )
277                     return false
278                 end
279                 msa.remove_gap_columns_w_gap_ratio!( 2.0 / 7.0 )
280                 if ( msa.get_length() != 23 )
281                     return false
282                 end
283                 if ( msa.get_by_name( "seq 0" ).get_sequence_as_string != "a-* xijklmnopqrstuvwxyz" )
284                     puts msa.get_by_name( "seq 0" ).get_sequence_as_string
285                     return false
286                 end
287                 msa.remove_gap_columns_w_gap_ratio!( 1.0 / 7.0 )
288                 if ( msa.get_length() != 21 )
289                     return false
290                 end
291                 if ( msa.get_by_name( "seq 0" ).get_sequence_as_string != "a-xijklmnopqrstuvwxyz" )
292                     return false
293                 end
294                 msa2 = Evoruby::Msa.new()
295                 msa2.add( "seq0", "abcdefgh" );
296                 msa2.add( "seq1", "a-cdefgh" );
297                 msa2.add( "seq2", "a--defgh" );
298                 msa2.add( "seq3", "a---efgh" );
299                 msa2.add( "seq4", "a----fgh" );
300                 msa2.add( "seq5", "a" );
301                 if ( msa2.is_aligned )
302                     return false
303                 end
304                 msa2.remove_sequence!( 5 )
305                 if ( !msa2.is_aligned )
306                     return false
307                 end
308                 if ( msa2.get_number_of_seqs != 5 )
309                     return false
310                 end
311                 msa2.remove_gap_only_columns!()
312
313                 if ( msa2.get_length != 8 )
314                     return false
315                 end
316
317                 msa2.remove_sequences_by_gap_ratio!( 4.0 / 8.0 )
318                 if ( msa2.get_number_of_seqs != 5 )
319                     return false
320                 end
321                 msa2.remove_sequences_by_gap_ratio!( 3.0 / 8.0 )
322                 if ( msa2.get_number_of_seqs != 4 )
323                     return false
324                 end
325                 msa2.remove_sequences_by_gap_ratio!( 1.0 / 8.0 )
326                 if ( msa2.get_number_of_seqs != 2 )
327                     return false
328                 end
329                 msa2.remove_sequences_by_gap_ratio!( 0.0 )
330                 if ( msa2.get_number_of_seqs != 1 )
331                     return false
332                 end
333                 msa2.add( "seq1", "a-cdefgh" );
334                 msa2.add( "seq2", "a--defgh" );
335                 msa2.add( "seq3", "a---efgh" );
336                 msa2.add( "seq4", "a----fgh" );
337
338                 msa2.remove_sequences_by_non_gap_length!( 4 )
339                 if ( msa2.get_number_of_seqs != 5 )
340                     return false
341                 end
342                 msa2.remove_sequences_by_non_gap_length!( 5 )
343                 if ( msa2.get_number_of_seqs != 4 )
344                     return false
345                 end
346                 msa2.remove_sequences_by_non_gap_length!( 8 )
347                 if ( msa2.get_number_of_seqs != 1 )
348                     return false
349                 end
350                 msa2.add( "seq1", "a-cdefgh" );
351                 msa2.add( "seq2", "a--defgh" );
352                 msa2.add( "seq3", "a---efgh" );
353                 msa2.add( "seq4", "a----fgh" );
354                 msa2.trim!( 0, 7 )
355                 if ( msa2.get_by_name( "seq0" ).get_sequence_as_string != "abcdefgh" )
356                     return false
357                 end
358                 msa2.trim!( 3, 4 )
359                 if ( msa2.get_by_name( "seq0" ).get_sequence_as_string != "de" )
360                     return false
361                 end
362                 msa3 = Evoruby::Msa.new()
363                 msa3.add( "seq0", "abcdefgh-abcdef--*" );
364                 msa3.add( "seq1", "b-deefgh-a____f--*" );
365                 msa3.add( "seq2", "A________abcdef--*" );
366                 msa3.add( "seq3", "A   Efgh---------*" );
367                 msa3.add( "seq4", "    eFhh---------*" );
368                 msa3.add( "seq5", "----------------ee" );
369                 if ( !Test::same?( msa3.calculate_overlap( 0, 0 ), 14 ) )
370                     return false
371                 end
372                 if ( !Test::same?( msa3.calculate_overlap( 0, 1 ), 9 ) )
373                     return false
374                 end
375                 if ( !Test::same?( msa3.calculate_overlap( 0, 5 ), 0 ) )
376                     return false
377                 end
378                 if ( !Test::same?( msa3.calculate_overlap( 4, 5 ), 0 ) )
379                     return false
380                 end
381                 if ( !msa3.overlap?( 2, 3 ) )
382                     return false
383                 end
384                 if ( msa3.overlap?( 2, 3, 2 ) )
385                     return false
386                 end
387                 if ( msa3.overlap?( 4, 5 ) )
388                     return false
389                 end
390                 if ( !Test::same?( msa3.calculate_identities( 4, 5 ), 0 ) )
391                     return false
392                 end
393                 if ( !Test::same?( msa3.calculate_identities( 3, 4 ), 3 ) )
394                     return false
395                 end
396                 if ( msa3.split_into_overlapping_msa.length != 3 )
397                     return false
398                 end
399                 if ( msa3.split_into_overlapping_msa( 5 ).length != 4 )
400                     return false
401                 end
402
403
404                 msa4 = Msa.new()
405                 seq0 = Sequence.new( "seq 0", "ABCDED" )
406                 seq1 = Sequence.new( "seq 1", "ABCDEE" )
407                 seq2 = Sequence.new( "seq 2", "abcded" )
408                 seq3 = Sequence.new( "seq 3", " ABCDEE" )
409                 seq4 = Sequence.new( "seq 4", "ABCDEV" )
410                 seq5 = Sequence.new( "seq 5", "ABCDED" )
411                 seq6 = Sequence.new( "seq 6", "AB.DEI" )
412                 seq7 = Sequence.new( "seq 7", "aB-DEi*" )
413                 seq8 = Sequence.new( "seq 8", "ABCDED" )
414                 seq9 = Sequence.new( "seq 9", "ABCDED" )
415                 seq10 = Sequence.new( "seq 10", "ABCDED" )
416                 seq11 = Sequence.new( "seq 11", "ABCDED" )
417                 msa4.add_sequence( seq0 );
418                 msa4.add_sequence( seq1 );
419                 msa4.add_sequence( seq2 );
420                 msa4.add_sequence( seq3 );
421                 msa4.add_sequence( seq4 );
422                 msa4.add_sequence( seq5 );
423                 msa4.add_sequence( seq6 );
424                 msa4.add_sequence( seq7 );
425                 msa4.add_sequence( seq8 );
426                 msa4.add_sequence( seq9 );
427                 msa4.add_sequence( seq10 );
428                 msa4.add_sequence( seq11 );
429
430                 msa4.remove_redundant_sequences!
431
432                 puts msa4.to_str
433
434                 if msa4.get_number_of_seqs != 4
435                     return false
436                 end
437
438                 if msa4.get_sequence( 0 ).get_name != "seq 0"
439                     return false
440                 end
441                 if msa4.get_sequence( 1 ).get_name != "seq 1"
442                     return false
443                 end
444                 if msa4.get_sequence( 2 ).get_name != "seq 4"
445                     return false
446                 end
447                 if msa4.get_sequence( 3 ).get_name != "seq 6"
448                     return false
449                 end
450
451             rescue Exception => e
452                 puts()
453                 puts( e.to_s )
454                 puts()
455                 return false
456             end
457             return true
458         end
459
460         def test_msa_factory()
461             begin
462                 f = MsaFactory.new()
463             rescue Exception => e
464                 puts()
465                 puts( e.to_s )
466                 puts()
467                 return false
468             end
469             return true
470         end
471
472         def test_domain_structure()
473             begin
474                 ds = DomainStructure.new( 190 )
475             rescue Exception => e
476                 puts()
477                 puts( e.to_s )
478                 puts()
479                 return false
480             end
481             return true
482         end
483
484         def test_protein_domain()
485             begin
486                 ds = ProteinDomain.new( "domain", 23, 466, "d1", 0.4 )
487             rescue Exception => e
488                 puts()
489                 puts( e.to_s )
490                 puts()
491                 return false
492             end
493             return true
494         end
495
496         def test_basic_table()
497             begin
498                 t = BasicTable.new()
499                 t.set_value( 233, 923, "snake" )
500                 t.set_value( 233, 923, "lizard" )
501                 if ( t.get_value_as_string( 233, 923 ) != "lizard" )
502                     return false
503                 end
504                 if ( t.get_value_as_string( 33, 23 ) != "" )
505                     return false
506                 end
507             rescue Exception => e
508                 puts()
509                 puts( e.to_s )
510                 puts()
511                 return false
512             end
513             return true
514         end
515
516         def test_msa_io()
517             begin
518                 msaio = MsaIO.new()
519             rescue Exception => e
520                 puts()
521                 puts( e.to_s )
522                 puts()
523                 return false
524             end
525             return true
526         end
527
528         def test_phylip_sequentialwriter()
529             begin
530                 p = PhylipSequentialWriter.new()
531             rescue Exception => e
532                 puts()
533                 puts( e.to_s )
534                 puts()
535                 return false
536             end
537             return true
538         end
539
540         def test_nexus_writer()
541             begin
542                 n = NexusWriter.new()
543             rescue Exception => e
544                 puts()
545                 puts( e.to_s )
546                 puts()
547                 return false
548             end
549             return true
550         end
551
552         def test_fasta_writer()
553             begin
554                 f = FastaWriter.new()
555             rescue Exception => e
556                 puts()
557                 puts( e.to_s )
558                 puts()
559                 return false
560             end
561             return true
562         end
563
564         def test_general_msa_parser( path_to_evoruby )
565             begin
566                 g = GeneralMsaParser.new()
567                 f = MsaFactory.new()
568                 sep = ""
569                 if ( !Util::is_string_empty?( path_to_evoruby ) )
570                     sep = Constants::FILE_SEPARATOR
571                 end
572                 msa = f.create_msa_from_file( path_to_evoruby +
573                      sep +
574                      GENERAL_MSA_FILE, g )
575
576                 if ( msa.get_length() != 29 )
577                     return false
578                 end
579                 if ( msa.get_number_of_seqs() != 7 )
580                     return false
581                 end
582
583                 seq0 = msa.get_sequence( 0 )
584                 seq1 = msa.get_sequence( 1 )
585                 seq2 = msa.get_sequence( 2 )
586                 seq3 = msa.get_sequence( 3 )
587                 seq4 = msa.get_sequence( 4 )
588                 seq5 = msa.get_sequence( 5 )
589                 seq6 = msa.get_sequence( 6 )
590
591                 if ( seq0.get_name() != "sequence0" )
592                     return false
593                 end
594                 if ( seq0.get_sequence_as_string() != "ABCDE.GHIJKLMNOPQR.TUVWabcxy0" )
595                     return false
596                 end
597
598                 if ( seq1.get_name() != "sequence1" )
599                     return false
600                 end
601                 if ( seq1.get_sequence_as_string() != "abcdefghijklmnopqrstuvwabcxy1" )
602                     return false
603                 end
604
605                 if ( seq2.get_name() != "sequence2" )
606                     return false
607                 end
608                 if ( seq2.get_sequence_as_string() != "abcdefghijkl---x_-*?_XXabcxy2" )
609                     return false
610                 end
611
612                 if ( seq3.get_name() != "sequence3" )
613                     return false
614                 end
615                 if ( seq3.get_sequence_as_string() != "12345678901234567890123abcxy3" )
616                     return false
617                 end
618
619                 if ( seq4.get_name() != "sequence4" )
620                     return false
621                 end
622                 if ( seq4.get_sequence_as_string() != "--------------------------xy4" )
623                     return false
624                 end
625
626                 if ( seq5.get_name() != "sequence5" )
627                     return false
628                 end
629                 if ( seq5.get_sequence_as_string() != "a*c*ef****************wabcxy5" )
630                     return false
631                 end
632
633                 if ( seq6.get_name() != "sequence6" )
634                     return false
635                 end
636                 if ( seq6.get_sequence_as_string() != "ururufhfghfgftgfhftgfttabcxy6" )
637                     return false
638                 end
639
640             rescue Exception => e
641                 puts()
642                 puts( e.to_s )
643                 puts()
644                 return false
645             end
646             return true
647         end
648
649         def test_fasta_parser( path_to_evoruby )
650             begin
651                 fasta = FastaParser.new()
652                 f = MsaFactory.new()
653                 sep = ""
654                 if ( !Util::is_string_empty?( path_to_evoruby ) )
655                     sep = Constants::FILE_SEPARATOR
656                 end
657                 msa = f.create_msa_from_file( path_to_evoruby +
658                      sep +
659                      FASTA_FILE, fasta )
660
661                 if ( msa.get_length() != 6 )
662                     return false
663                 end
664                 if ( msa.get_number_of_seqs() != 4 )
665                     return false
666                 end
667
668                 seq0 = msa.get_sequence( 0 )
669                 seq1 = msa.get_sequence( 1 )
670                 seq2 = msa.get_sequence( 2 )
671                 seq3 = msa.get_sequence( 3 )
672
673                 if ( seq0.get_name() != "sequence 0" )
674                     return false
675                 end
676                 if ( seq0.get_sequence_as_string() != "ABCDEF" )
677                     return false
678                 end
679
680                 if ( seq1.get_name() != "sequence 1" )
681                     return false
682                 end
683                 if ( seq1.get_sequence_as_string() != "abcdef" )
684                     return false
685                 end
686
687                 if ( seq2.get_name() != "sequence 2" )
688                     return false
689                 end
690                 if ( seq2.get_sequence_as_string() != "123456" )
691                     return false
692                 end
693                 if ( seq3.get_name() != "sequence 3" )
694                     return false
695                 end
696                 if ( seq3.get_sequence_as_string() != "a-c--f" )
697                     return false
698                 end
699
700             rescue Exception => e
701                 puts()
702                 puts( e.to_s )
703                 puts()
704                 return false
705             end
706             return true
707         end
708
709         def test_ncbi_tseq_parser( path_to_evoruby )
710             begin
711                 parser = NcbiTSeqParser.new
712                 f = MsaFactory.new
713                 sep = ""
714                 if ( !Util::is_string_empty?( path_to_evoruby ) )
715                     sep = Constants::FILE_SEPARATOR
716                 end
717                 msa = f.create_msa_from_file( path_to_evoruby +
718                      sep +
719                      TSEQ_FILE, parser )
720
721                 if ( msa.get_number_of_seqs() != 9 )
722                     return false
723                 end
724
725                 seq0 = msa.get_sequence( 0 )
726                 seq1 = msa.get_sequence( 1 )
727                 seq8 = msa.get_sequence( 8 )
728
729                 if ( seq0.get_name() != "SusD [Bacteroides thetaiotaomicron VPI-5482]" )
730                     return false
731                 end
732                 if ( seq0.get_sequence_as_string() != "MKTKYIKQLFSAALIAVLSSGVTSCINDLDISPIDPQTGGSFDQQGVFVKGYAMLGVTGQKGIDGSPDLDGQDEGESGFYRTTFNCNELPTDECLWAWQENQDIPQLTSISWSPSSQRTEWVYVRLGYDITQYNFFLDQTEGMTDAETLRQRAEIRFLRALHYWYFLDLFGKAPFKEHFSNDLPVEKKGTELYTYIQNELNEIEADMYEPRQAPFGRADKAANWLLRARLYLNAGVYTGQTDYAKAEEYASKVIGSAYKLCTNYSELFMADNDENENAMQEIILPIRQDGVKTRNYGGSTYLVCGTRVAGMPRMGTTNGWSCIFARAAMVQKFFSNLEDVPMLPADVEIPTKGLDTDEQIDAFDAEHGIRTEDMIKAAGDDRALLYSGVGGGRRKIQTDAISGFTDGLSIVKWQNYRSDGKPVSHATYPDTDIPLFRLAEAYLTRAEAIFRQGGDATGDINELRKRANCTRKVQTVTEQELIDEWAREFYLEGRRRSDLVRFGMFTTNKYLWDWKGGAMNGTSVASYYNKYPIPVSDINNNRNMSQNEGYK" )
733                     return false
734                 end
735                 if ( seq0.get_accession != "29341016" )
736                     return false
737                 end
738                 if ( seq0.get_accession_source != "gi" )
739                     return false
740                 end
741                 if ( seq0.get_taxonomy.get_name != "Bacteroides thetaiotaomicron VPI-5482" )
742                     return false
743                 end
744                 if ( seq0.get_taxonomy.get_id != "226186" )
745                     return false
746                 end
747                 if ( seq0.get_taxonomy.get_id_source != "ncbi" )
748                     return false
749                 end
750
751
752                 if ( seq1.get_name() != "SusD, outer membrane protein [Bacteroides thetaiotaomicron VPI-5482]" )
753                     return false
754                 end
755                 if ( seq1.get_accession != "29349109" )
756                     return false
757                 end
758                 if ( seq1.get_accession_source != "gi" )
759                     return false
760                 end
761                 if ( seq1.get_taxonomy.get_name != "Bacteroides thetaiotaomicron VPI-5482" )
762                     return false
763                 end
764                 if ( seq1.get_taxonomy.get_id != "226186" )
765                     return false
766                 end
767                 if ( seq1.get_taxonomy.get_id_source != "ncbi" )
768                     return false
769                 end
770
771
772                 if ( seq8.get_name() != "Chain A, B. Thetaiotaomicron Susd With Maltotriose" )
773                     return false
774                 end
775                 if ( seq8.get_accession != "pdb|3CKB|A" )
776                     return false
777                 end
778                 if ( seq8.get_accession_source != "ncbi" )
779                     return false
780                 end
781                 if ( seq8.get_taxonomy.get_name != "Bacteroides thetaiotaomicron" )
782                     return false
783                 end
784                 if ( seq8.get_taxonomy.get_id != "818" )
785                     return false
786                 end
787                 if ( seq8.get_taxonomy.get_id_source != "ncbi" )
788                     return false
789                 end
790
791             rescue Exception => e
792                 puts()
793                 puts( e.to_s )
794                 puts()
795                 return false
796             end
797             return true
798         end
799
800         def test_hmmsearch_domain_extractor()
801             begin
802                 h = Evoruby::HmmsearchDomainExtractor.new()
803             rescue Exception => e
804                 puts()
805                 puts( e.to_s )
806                 puts()
807                 return false
808             end
809             return true
810         end
811
812         def test_domain_sequence_extractor()
813             begin
814                 h = Evoruby::DomainSequenceExtractor.new()
815             rescue Exception => e
816                 puts()
817                 puts( e.to_s )
818                 puts()
819                 return false
820             end
821             return true
822         end
823
824         def test_hmmscan_parser()
825             begin
826                 h = Evoruby::HmmscanSummary.new()
827             rescue Exception => e
828                 puts()
829                 puts( e.to_s )
830                 puts()
831                 return false
832             end
833             return true
834         end
835
836         def test_domains_to_forester()
837             begin
838                 d = Evoruby::DomainsToForester.new()
839             rescue Exception => e
840                 puts()
841                 puts( e.to_s )
842                 puts()
843                 return false
844             end
845             return true
846         end
847
848
849         def test_basic_table_parser()
850             begin
851                 b = Evoruby::BasicTableParser.new()
852             rescue Exception => e
853                 puts()
854                 puts( e.to_s )
855                 puts()
856                 return false
857             end
858             return true
859         end
860
861
862         def test_cla()
863             begin
864                 cla = CommandLineArguments.new( Array.new )
865             rescue Exception => e
866                 puts()
867                 puts( e.to_s )
868                 puts()
869                 return false
870             end
871             return true
872         end
873
874         def test_tree_puzzle()
875             begin
876                 tp = TreePuzzle.new()
877                 tp.run( '/home/czmasek/scratch/small.aln',
878                     :wag,
879                     :uniform,
880                     200 )
881             rescue Exception => e
882                 puts()
883                 puts( e.to_s )
884                 puts()
885                 return false
886             end
887             return true
888         end
889
890         def test_fastme()
891             begin
892                 fastme = FastMe.new()
893                 fastme.run( '/home/czmasek/scratch/outdist', 0, :GME )
894             rescue Exception => e
895                 puts()
896                 puts( e.to_s )
897                 puts()
898                 return false
899             end
900             return true
901         end
902
903
904         def run()
905
906             t0 = Time.now
907
908             puts
909             puts "ruby version " + RUBY_VERSION
910             puts Constants::EVORUBY + " version " + Constants::EVORUBY_VERSION
911             puts
912
913             path_to_evoruby = Test.get_path_to_evoruby()
914
915             if ( Util.is_string_empty?( path_to_evoruby ) )
916                 path_to_evoruby = ""
917                 puts()
918                 puts( "Warning! Path to evoruby could not be established. Some tests will might fail." )
919                 puts()
920             end
921
922             print( "--- Taxonomy: " )
923             if ( test_taxonomy() )
924                 puts( "ok" )
925                 @successes += 1
926             else
927                 puts( "FAILED" )
928                 @failures += 1
929             end
930
931             print( "--- Sequence: " )
932             if ( test_sequence() )
933                 puts( "ok" )
934                 @successes += 1
935             else
936                 puts( "FAILED" )
937                 @failures += 1
938             end
939
940             print( "--- Msa: " )
941             if ( test_msa() )
942                 puts( "ok" )
943                 @successes += 1
944             else
945                 puts( "FAILED" )
946                 @failures += 1
947             end
948
949             print( "--- MsaFactory: " )
950             if ( test_msa_factory() )
951                 puts( "ok" )
952                 @successes += 1
953             else
954                 puts( "FAILED" )
955                 @failures += 1
956             end
957
958             print( "--- DomainStructure: " )
959             if ( test_domain_structure() )
960                 puts( "ok" )
961                 @successes += 1
962             else
963                 puts( "FAILED" )
964                 @failures += 1
965             end
966
967             print( "--- ProteinDomain: " )
968             if ( test_protein_domain() )
969                 puts( "ok" )
970                 @successes += 1
971             else
972                 puts( "FAILED" )
973                 @failures += 1
974             end
975
976             print( "--- BasicTable: " )
977             if ( test_basic_table() )
978                 puts( "ok" )
979                 @successes += 1
980             else
981                 puts( "FAILED" )
982                 @failures += 1
983             end
984
985             print( "--- MsaIO: " )
986             if ( test_msa_io )
987                 puts( "ok" )
988                 @successes += 1
989             else
990                 puts( "FAILED" )
991                 @failures += 1
992             end
993
994             print( "--- PhylipSequentialWriter: " )
995             if ( test_phylip_sequentialwriter )
996                 puts( "ok" )
997                 @successes += 1
998             else
999                 puts( "FAILED" )
1000                 @failures += 1
1001             end
1002
1003             print( "--- FastaWriter : " )
1004             if ( test_fasta_writer )
1005                 puts( "ok" )
1006                 @successes += 1
1007             else
1008                 puts( "FAILED" )
1009                 @failures += 1
1010             end
1011
1012             print( "--- NexusWriter: " )
1013             if ( test_nexus_writer )
1014                 puts( "ok" )
1015                 @successes += 1
1016             else
1017                 puts( "FAILED" )
1018                 @failures += 1
1019             end
1020
1021             print( "--- FastaParser: " )
1022             if ( test_fasta_parser( path_to_evoruby ) )
1023                 puts( "ok" )
1024                 @successes += 1
1025             else
1026                 puts( "FAILED" )
1027                 @failures += 1
1028             end
1029
1030             print( "--- NCBI Tseq parser: " )
1031             if (  test_ncbi_tseq_parser( path_to_evoruby ) )
1032                 puts( "ok" )
1033                 @successes += 1
1034             else
1035                 puts( "FAILED" )
1036                 @failures += 1
1037             end
1038
1039             print( "--- GeneralMsaParser: " )
1040             if ( test_general_msa_parser( path_to_evoruby ) )
1041                 puts( "ok" )
1042                 @successes += 1
1043             else
1044                 puts( "FAILED" )
1045                 @failures += 1
1046             end
1047
1048
1049             print( "--- Hmmsearch domain extractor: " )
1050             if ( test_hmmsearch_domain_extractor )
1051                 puts( "ok" )
1052                 @successes += 1
1053             else
1054                 puts( "FAILED" )
1055                 @failures += 1
1056             end
1057
1058             print( "--- Domain sequence extractor: " )
1059             if ( test_domain_sequence_extractor )
1060                 puts( "ok" )
1061                 @successes += 1
1062             else
1063                 puts( "FAILED" )
1064                 @failures += 1
1065             end
1066
1067             print( "--- Hmmscan parser: " )
1068             if ( test_hmmscan_parser )
1069                 puts( "ok" )
1070                 @successes += 1
1071             else
1072                 puts( "FAILED" )
1073                 @failures += 1
1074             end
1075
1076
1077             print( "--- Domains 2 forester: " )
1078             if ( test_domains_to_forester )
1079                 puts( "ok" )
1080                 @successes += 1
1081             else
1082                 puts( "FAILED" )
1083                 @failures += 1
1084             end
1085
1086             print( "--- BasicTableParser: " )
1087             if ( test_basic_table_parser )
1088                 puts( "ok" )
1089                 @successes += 1
1090             else
1091                 puts( "FAILED" )
1092                 @failures += 1
1093             end
1094
1095             print( "--- TreePuzzle (wrapper): " )
1096             if ( test_tree_puzzle() )
1097                 puts( "ok" )
1098                 @successes += 1
1099             else
1100                 puts( "FAILED" )
1101                 @failures += 1
1102             end
1103
1104             print( "--- FastMe (wrapper): " )
1105             if ( test_fastme() )
1106                 puts( "ok" )
1107                 @successes += 1
1108             else
1109                 puts( "FAILED" )
1110                 @failures += 1
1111             end
1112
1113
1114
1115             print( "--- CLA: " )
1116             if ( test_cla() )
1117                 puts( "ok" )
1118                 @successes += 1
1119             else
1120                 puts( "FAILED" )
1121                 @failures += 1
1122             end
1123             puts
1124             puts "ruby version " + RUBY_VERSION
1125             puts Constants::EVORUBY + " version " + Constants::EVORUBY_VERSION
1126             puts
1127
1128             td = Time.at( Time.now - t0 )
1129             puts( "Time            : #{ td.sec }.#{ td.usec }s" )
1130             puts()
1131
1132             puts( "Successful tests: " + @successes.to_s )
1133             puts( "Failed tests    : " + @failures.to_s )
1134             puts()
1135             if ( @failures < 1 )
1136                 puts( "OK" )
1137             else
1138                 puts( "NOT ok" )
1139             end
1140
1141             puts()
1142         end
1143
1144         private
1145
1146         def Test.same?( n, m )
1147             return ( ( n - m ).abs < 0.000001 )
1148         end
1149
1150         def Test.get_path_to_evoruby()
1151             rubylib = ENV['RUBYLIB'].split(':')
1152             evoruby_path = nil
1153             rubylib.each do | path |
1154                 if ( path =~ /evoruby/ )
1155                     evoruby_path = path
1156                     break
1157                 end
1158             end
1159             evoruby_path
1160         end
1161
1162     end # class Test
1163
1164
1165     test = Test.new()
1166
1167     test.run()
1168
1169
1170 end # module Evoruby
1171