bio 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. data/ChangeLog +3421 -0
  2. data/KNOWN_ISSUES.rdoc +88 -0
  3. data/README.rdoc +252 -0
  4. data/README_DEV.rdoc +285 -0
  5. data/Rakefile +143 -0
  6. data/bin/bioruby +0 -0
  7. data/bin/br_biofetch.rb +0 -0
  8. data/bin/br_bioflat.rb +12 -1
  9. data/bin/br_biogetseq.rb +0 -0
  10. data/bin/br_pmfetch.rb +4 -3
  11. data/bioruby.gemspec +477 -0
  12. data/bioruby.gemspec.erb +117 -0
  13. data/doc/Changes-0.7.rd +7 -0
  14. data/doc/Changes-1.3.rdoc +239 -0
  15. data/doc/Tutorial.rd +296 -184
  16. data/doc/Tutorial.rd.html +1031 -0
  17. data/doc/Tutorial.rd.ja +111 -45
  18. data/doc/Tutorial.rd.ja.html +2225 -0
  19. data/doc/bioruby.css +281 -0
  20. data/extconf.rb +2 -0
  21. data/lib/bio.rb +29 -4
  22. data/lib/bio/appl/blast.rb +306 -121
  23. data/lib/bio/appl/blast/ddbj.rb +142 -0
  24. data/lib/bio/appl/blast/format0.rb +35 -25
  25. data/lib/bio/appl/blast/format8.rb +2 -2
  26. data/lib/bio/appl/blast/genomenet.rb +263 -0
  27. data/lib/bio/appl/blast/ncbioptions.rb +220 -0
  28. data/lib/bio/appl/blast/remote.rb +106 -0
  29. data/lib/bio/appl/blast/report.rb +260 -9
  30. data/lib/bio/appl/blast/rexml.rb +12 -5
  31. data/lib/bio/appl/blast/rpsblast.rb +277 -0
  32. data/lib/bio/appl/blast/wublast.rb +133 -12
  33. data/lib/bio/appl/blast/xmlparser.rb +35 -18
  34. data/lib/bio/appl/blat/report.rb +46 -5
  35. data/lib/bio/appl/emboss.rb +62 -13
  36. data/lib/bio/appl/fasta.rb +9 -11
  37. data/lib/bio/appl/genscan/report.rb +3 -3
  38. data/lib/bio/appl/hmmer.rb +1 -1
  39. data/lib/bio/appl/hmmer/report.rb +10 -10
  40. data/lib/bio/appl/paml/baseml.rb +95 -0
  41. data/lib/bio/appl/paml/baseml/report.rb +32 -0
  42. data/lib/bio/appl/paml/codeml.rb +242 -0
  43. data/lib/bio/appl/paml/codeml/rates.rb +67 -0
  44. data/lib/bio/appl/paml/codeml/report.rb +67 -0
  45. data/lib/bio/appl/paml/common.rb +348 -0
  46. data/lib/bio/appl/paml/common_report.rb +38 -0
  47. data/lib/bio/appl/paml/yn00.rb +103 -0
  48. data/lib/bio/appl/paml/yn00/report.rb +32 -0
  49. data/lib/bio/appl/psort.rb +2 -2
  50. data/lib/bio/appl/pts1.rb +5 -5
  51. data/lib/bio/appl/tmhmm/report.rb +10 -1
  52. data/lib/bio/command.rb +297 -41
  53. data/lib/bio/compat/features.rb +157 -0
  54. data/lib/bio/compat/references.rb +128 -0
  55. data/lib/bio/db/biosql/biosql_to_biosequence.rb +67 -0
  56. data/lib/bio/db/biosql/sequence.rb +508 -0
  57. data/lib/bio/db/embl/common.rb +28 -12
  58. data/lib/bio/db/embl/embl.rb +107 -9
  59. data/lib/bio/db/embl/embl_to_biosequence.rb +85 -0
  60. data/lib/bio/db/embl/format_embl.rb +190 -0
  61. data/lib/bio/db/embl/sptr.rb +15 -16
  62. data/lib/bio/db/fantom.rb +6 -8
  63. data/lib/bio/db/fasta.rb +10 -507
  64. data/lib/bio/db/fasta/defline.rb +532 -0
  65. data/lib/bio/db/fasta/fasta_to_biosequence.rb +63 -0
  66. data/lib/bio/db/fasta/format_fasta.rb +97 -0
  67. data/lib/bio/db/genbank/common.rb +25 -8
  68. data/lib/bio/db/genbank/format_genbank.rb +187 -0
  69. data/lib/bio/db/genbank/genbank.rb +36 -1
  70. data/lib/bio/db/genbank/genbank_to_biosequence.rb +86 -0
  71. data/lib/bio/db/gff.rb +1791 -119
  72. data/lib/bio/db/kegg/glycan.rb +2 -6
  73. data/lib/bio/db/lasergene.rb +3 -3
  74. data/lib/bio/db/medline.rb +4 -1
  75. data/lib/bio/db/newick.rb +10 -10
  76. data/lib/bio/db/pdb/chain.rb +6 -2
  77. data/lib/bio/db/pdb/pdb.rb +12 -3
  78. data/lib/bio/db/rebase.rb +7 -8
  79. data/lib/bio/db/soft.rb +3 -3
  80. data/lib/bio/feature.rb +1 -88
  81. data/lib/bio/io/biosql/biodatabase.rb +64 -0
  82. data/lib/bio/io/biosql/bioentry.rb +29 -0
  83. data/lib/bio/io/biosql/bioentry_dbxref.rb +11 -0
  84. data/lib/bio/io/biosql/bioentry_path.rb +12 -0
  85. data/lib/bio/io/biosql/bioentry_qualifier_value.rb +10 -0
  86. data/lib/bio/io/biosql/bioentry_reference.rb +10 -0
  87. data/lib/bio/io/biosql/bioentry_relationship.rb +10 -0
  88. data/lib/bio/io/biosql/biosequence.rb +11 -0
  89. data/lib/bio/io/biosql/comment.rb +7 -0
  90. data/lib/bio/io/biosql/config/database.yml +20 -0
  91. data/lib/bio/io/biosql/dbxref.rb +13 -0
  92. data/lib/bio/io/biosql/dbxref_qualifier_value.rb +12 -0
  93. data/lib/bio/io/biosql/location.rb +32 -0
  94. data/lib/bio/io/biosql/location_qualifier_value.rb +11 -0
  95. data/lib/bio/io/biosql/ontology.rb +10 -0
  96. data/lib/bio/io/biosql/reference.rb +9 -0
  97. data/lib/bio/io/biosql/seqfeature.rb +32 -0
  98. data/lib/bio/io/biosql/seqfeature_dbxref.rb +11 -0
  99. data/lib/bio/io/biosql/seqfeature_path.rb +11 -0
  100. data/lib/bio/io/biosql/seqfeature_qualifier_value.rb +20 -0
  101. data/lib/bio/io/biosql/seqfeature_relationship.rb +11 -0
  102. data/lib/bio/io/biosql/taxon.rb +12 -0
  103. data/lib/bio/io/biosql/taxon_name.rb +9 -0
  104. data/lib/bio/io/biosql/term.rb +27 -0
  105. data/lib/bio/io/biosql/term_dbxref.rb +11 -0
  106. data/lib/bio/io/biosql/term_path.rb +12 -0
  107. data/lib/bio/io/biosql/term_relationship.rb +13 -0
  108. data/lib/bio/io/biosql/term_relationship_term.rb +11 -0
  109. data/lib/bio/io/biosql/term_synonym.rb +10 -0
  110. data/lib/bio/io/das.rb +7 -7
  111. data/lib/bio/io/ddbjxml.rb +57 -0
  112. data/lib/bio/io/ensembl.rb +2 -2
  113. data/lib/bio/io/fetch.rb +28 -14
  114. data/lib/bio/io/flatfile.rb +17 -853
  115. data/lib/bio/io/flatfile/autodetection.rb +545 -0
  116. data/lib/bio/io/flatfile/buffer.rb +237 -0
  117. data/lib/bio/io/flatfile/index.rb +17 -7
  118. data/lib/bio/io/flatfile/indexer.rb +30 -12
  119. data/lib/bio/io/flatfile/splitter.rb +297 -0
  120. data/lib/bio/io/hinv.rb +442 -0
  121. data/lib/bio/io/keggapi.rb +2 -2
  122. data/lib/bio/io/ncbirest.rb +733 -0
  123. data/lib/bio/io/pubmed.rb +34 -80
  124. data/lib/bio/io/registry.rb +2 -2
  125. data/lib/bio/io/sql.rb +178 -357
  126. data/lib/bio/io/togows.rb +458 -0
  127. data/lib/bio/location.rb +106 -11
  128. data/lib/bio/pathway.rb +120 -14
  129. data/lib/bio/reference.rb +115 -101
  130. data/lib/bio/sequence.rb +164 -183
  131. data/lib/bio/sequence/adapter.rb +108 -0
  132. data/lib/bio/sequence/common.rb +22 -45
  133. data/lib/bio/sequence/compat.rb +2 -2
  134. data/lib/bio/sequence/dblink.rb +54 -0
  135. data/lib/bio/sequence/format.rb +254 -77
  136. data/lib/bio/sequence/format_raw.rb +23 -0
  137. data/lib/bio/shell.rb +3 -1
  138. data/lib/bio/shell/core.rb +2 -2
  139. data/lib/bio/shell/plugin/entry.rb +33 -4
  140. data/lib/bio/shell/plugin/ncbirest.rb +64 -0
  141. data/lib/bio/shell/plugin/togows.rb +40 -0
  142. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/bioruby_generator.rb +0 -0
  143. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_classes.rhtml +0 -0
  144. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_log.rhtml +0 -0
  145. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_methods.rhtml +0 -0
  146. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_modules.rhtml +0 -0
  147. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/_variables.rhtml +0 -0
  148. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby-bg.gif +0 -0
  149. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby-gem.png +0 -0
  150. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby-link.gif +0 -0
  151. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby.css +0 -0
  152. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby.rhtml +0 -0
  153. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby_controller.rb +0 -0
  154. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/bioruby_helper.rb +0 -0
  155. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/commands.rhtml +0 -0
  156. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/history.rhtml +0 -0
  157. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/index.rhtml +0 -0
  158. data/lib/bio/shell/rails/vendor/plugins/{generators → bioruby/generators}/bioruby/templates/spinner.gif +0 -0
  159. data/lib/bio/tree.rb +4 -2
  160. data/lib/bio/util/color_scheme.rb +2 -2
  161. data/lib/bio/util/contingency_table.rb +2 -2
  162. data/lib/bio/util/restriction_enzyme.rb +2 -2
  163. data/lib/bio/util/restriction_enzyme/single_strand.rb +6 -5
  164. data/lib/bio/version.rb +25 -0
  165. data/rdoc.zsh +8 -0
  166. data/sample/any2fasta.rb +0 -0
  167. data/sample/biofetch.rb +0 -0
  168. data/sample/dbget +0 -0
  169. data/sample/demo_sequence.rb +158 -0
  170. data/sample/enzymes.rb +0 -0
  171. data/sample/fasta2tab.rb +0 -0
  172. data/sample/fastagrep.rb +72 -0
  173. data/sample/fastasort.rb +54 -0
  174. data/sample/fsplit.rb +0 -0
  175. data/sample/gb2fasta.rb +2 -3
  176. data/sample/gb2tab.rb +0 -0
  177. data/sample/gbtab2mysql.rb +0 -0
  178. data/sample/genes2nuc.rb +0 -0
  179. data/sample/genes2pep.rb +0 -0
  180. data/sample/genes2tab.rb +0 -0
  181. data/sample/genome2rb.rb +0 -0
  182. data/sample/genome2tab.rb +0 -0
  183. data/sample/goslim.rb +0 -0
  184. data/sample/gt2fasta.rb +0 -0
  185. data/sample/na2aa.rb +34 -0
  186. data/sample/pmfetch.rb +0 -0
  187. data/sample/pmsearch.rb +0 -0
  188. data/sample/ssearch2tab.rb +0 -0
  189. data/sample/tfastx2tab.rb +0 -0
  190. data/sample/vs-genes.rb +0 -0
  191. data/setup.rb +1596 -0
  192. data/test/data/blast/blastp-multi.m7 +188 -0
  193. data/test/data/command/echoarg2.bat +1 -0
  194. data/test/data/paml/codeml/control_file.txt +30 -0
  195. data/test/data/paml/codeml/output.txt +78 -0
  196. data/test/data/paml/codeml/rates +217 -0
  197. data/test/data/rpsblast/misc.rpsblast +193 -0
  198. data/test/data/soft/GDS100_partial.soft +0 -0
  199. data/test/data/soft/GSE3457_family_partial.soft +0 -0
  200. data/test/functional/bio/appl/test_pts1.rb +115 -0
  201. data/test/functional/bio/io/test_ensembl.rb +123 -80
  202. data/test/functional/bio/io/test_togows.rb +267 -0
  203. data/test/functional/bio/sequence/test_output_embl.rb +51 -0
  204. data/test/functional/bio/test_command.rb +301 -0
  205. data/test/runner.rb +17 -1
  206. data/test/unit/bio/appl/blast/test_ncbioptions.rb +112 -0
  207. data/test/unit/bio/appl/blast/test_report.rb +753 -35
  208. data/test/unit/bio/appl/blast/test_rpsblast.rb +398 -0
  209. data/test/unit/bio/appl/paml/codeml/test_rates.rb +45 -0
  210. data/test/unit/bio/appl/paml/codeml/test_report.rb +45 -0
  211. data/test/unit/bio/appl/paml/test_codeml.rb +174 -0
  212. data/test/unit/bio/appl/test_blast.rb +135 -4
  213. data/test/unit/bio/appl/test_fasta.rb +2 -2
  214. data/test/unit/bio/appl/test_pts1.rb +1 -64
  215. data/test/unit/bio/db/embl/test_common.rb +15 -15
  216. data/test/unit/bio/db/embl/test_embl.rb +4 -4
  217. data/test/unit/bio/db/embl/test_embl_rel89.rb +5 -5
  218. data/test/unit/bio/db/embl/test_embl_to_bioseq.rb +203 -0
  219. data/test/unit/bio/db/embl/test_sptr.rb +38 -1
  220. data/test/unit/bio/db/pdb/test_pdb.rb +2 -2
  221. data/test/unit/bio/db/test_gff.rb +1151 -25
  222. data/test/unit/bio/db/test_medline.rb +127 -0
  223. data/test/unit/bio/db/test_nexus.rb +5 -1
  224. data/test/unit/bio/db/test_prosite.rb +4 -4
  225. data/test/unit/bio/io/flatfile/test_autodetection.rb +375 -0
  226. data/test/unit/bio/io/flatfile/test_buffer.rb +251 -0
  227. data/test/unit/bio/io/flatfile/test_splitter.rb +369 -0
  228. data/test/unit/bio/io/test_ddbjxml.rb +8 -3
  229. data/test/unit/bio/io/test_fastacmd.rb +5 -5
  230. data/test/unit/bio/io/test_flatfile.rb +357 -106
  231. data/test/unit/bio/io/test_soapwsdl.rb +2 -2
  232. data/test/unit/bio/io/test_togows.rb +161 -0
  233. data/test/unit/bio/sequence/test_common.rb +210 -11
  234. data/test/unit/bio/sequence/test_compat.rb +3 -3
  235. data/test/unit/bio/sequence/test_dblink.rb +58 -0
  236. data/test/unit/bio/sequence/test_na.rb +2 -2
  237. data/test/unit/bio/test_command.rb +111 -50
  238. data/test/unit/bio/test_feature.rb +29 -1
  239. data/test/unit/bio/test_location.rb +566 -6
  240. data/test/unit/bio/test_pathway.rb +91 -65
  241. data/test/unit/bio/test_reference.rb +67 -13
  242. data/test/unit/bio/util/restriction_enzyme/analysis/test_calculated_cuts.rb +3 -3
  243. data/test/unit/bio/util/restriction_enzyme/analysis/test_cut_ranges.rb +3 -3
  244. data/test/unit/bio/util/restriction_enzyme/analysis/test_sequence_range.rb +3 -3
  245. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_aligned_strands.rb +4 -3
  246. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair.rb +3 -3
  247. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair_in_enzyme_notation.rb +3 -3
  248. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations.rb +3 -3
  249. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations_in_enzyme_notation.rb +3 -3
  250. data/test/unit/bio/util/restriction_enzyme/single_strand/test_cut_locations_in_enzyme_notation.rb +3 -3
  251. data/test/unit/bio/util/restriction_enzyme/test_analysis.rb +3 -3
  252. data/test/unit/bio/util/restriction_enzyme/test_cut_symbol.rb +4 -4
  253. data/test/unit/bio/util/restriction_enzyme/test_double_stranded.rb +3 -3
  254. data/test/unit/bio/util/restriction_enzyme/test_single_strand.rb +3 -3
  255. data/test/unit/bio/util/restriction_enzyme/test_single_strand_complement.rb +3 -3
  256. data/test/unit/bio/util/restriction_enzyme/test_string_formatting.rb +3 -3
  257. data/test/unit/bio/util/test_restriction_enzyme.rb +3 -3
  258. metadata +202 -167
  259. data/test/unit/bio/appl/blast/test_xmlparser.rb +0 -388
@@ -0,0 +1,58 @@
1
+ #
2
+ # test/unit/bio/sequence/test_dblink.rb - Unit test for Bio::Sequencce::DBLink
3
+ #
4
+ # Copyright:: Copyright (C) 2008 Naohisa Goto <ng@bioruby.org>
5
+ # License:: The Ruby License
6
+ #
7
+ # $Id: test_dblink.rb,v 1.1.2.1 2008/06/17 15:44:22 ngoto Exp $
8
+ #
9
+
10
+ require 'pathname'
11
+ libpath = Pathname.new(File.join(File.dirname(__FILE__), ['..'] * 4, 'lib')).cleanpath.to_s
12
+ $:.unshift(libpath) unless $:.include?(libpath)
13
+
14
+ require 'test/unit'
15
+ require 'bio/sequence'
16
+ require 'bio/sequence/dblink'
17
+
18
+ module Bio
19
+ class TestSequenceDBLink < Test::Unit::TestCase
20
+ def setup
21
+ @xref = Bio::Sequence::DBLink.new('EMBL', 'Z14088', 'CAA78466.1',
22
+ '-', 'mRNA')
23
+ end
24
+
25
+ def test_database
26
+ assert_equal('EMBL', @xref.database)
27
+ end
28
+
29
+ def test_id
30
+ assert_equal('Z14088', @xref.id)
31
+ end
32
+
33
+ def test_secondary_ids
34
+ assert_equal([ 'CAA78466.1', '-', 'mRNA' ],
35
+ @xref.secondary_ids)
36
+ end
37
+ end #class
38
+
39
+ class TestSequenceDBLinkClassMethods < Test::Unit::TestCase
40
+ def test_parse_embl_DR_line
41
+ str = 'DR EPD; EP07077; HS_HBG1.'
42
+ xref = Bio::Sequence::DBLink.parse_embl_DR_line(str)
43
+ assert_equal('EPD', xref.database)
44
+ assert_equal('EP07077', xref.id)
45
+ assert_equal([ 'HS_HBG1' ], xref.secondary_ids)
46
+ end
47
+
48
+ def test_parse_uniprot_DR_line
49
+ str = 'DR EMBL; Z14088; CAA78466.1; -; mRNA.'
50
+ xref = Bio::Sequence::DBLink.parse_uniprot_DR_line(str)
51
+ assert_equal('EMBL', xref.database)
52
+ assert_equal('Z14088', xref.id)
53
+ assert_equal([ 'CAA78466.1', '-', 'mRNA' ],
54
+ xref.secondary_ids)
55
+ end
56
+ end #class
57
+
58
+ end #module Bio
@@ -5,7 +5,7 @@
5
5
  # Mitsuteru C. Nakao <n@bioruby.org>
6
6
  # License:: The Ruby License
7
7
  #
8
- # $Id: test_na.rb,v 1.6 2007/12/03 06:19:12 nakao Exp $
8
+ # $Id:$
9
9
  #
10
10
 
11
11
  require 'pathname'
@@ -175,7 +175,7 @@ module Bio
175
175
 
176
176
  end
177
177
 
178
- class TestSequenceCommon < Test::Unit::TestCase
178
+ class TestSequenceNACommon < Test::Unit::TestCase
179
179
 
180
180
  def setup
181
181
  @obj = Bio::Sequence::NA.new('atgcatgcatgcatgcaaaa')
@@ -1,12 +1,13 @@
1
1
  #
2
- # test/unit/bio/test_command.rb - Unit test for external command execution methods
2
+ # test/unit/bio/test_command.rb - Unit test for Bio::Command
3
3
  #
4
- # Copyright:: Copyright (C) 2005-2006
4
+ # Copyright:: Copyright (C) 2005-2008
5
5
  # Mitsuteru Nakao <n@bioruby.org>,
6
- # Naohisa Goto <ng@bioruby.org>
6
+ # Naohisa Goto <ng@bioruby.org>,
7
+ # Toshiaki Katayama <k@bioruby.org>
7
8
  # License:: The Ruby License
8
9
  #
9
- # $Id: test_command.rb,v 1.5 2007/04/05 23:35:42 trevor Exp $
10
+ # $Id:$
10
11
  #
11
12
 
12
13
  require 'pathname'
@@ -21,9 +22,9 @@ module Bio
21
22
  class TestCommand < Test::Unit::TestCase
22
23
 
23
24
  def test_command_constants
24
- Bio::Command::UNSAFE_CHARS_UNIX
25
- Bio::Command::QUOTE_CHARS_WINDOWS
26
- Bio::Command::UNESCAPABLE_CHARS
25
+ assert(Bio::Command::UNSAFE_CHARS_UNIX)
26
+ assert(Bio::Command::QUOTE_CHARS_WINDOWS)
27
+ assert(Bio::Command::UNESCAPABLE_CHARS)
27
28
  end
28
29
 
29
30
  def test_escape_shell_windows
@@ -94,40 +95,28 @@ module Bio
94
95
  Bio::Command.make_command_line_unix(ary))
95
96
  end
96
97
 
97
- def test_call_command
98
+ def test_safe_command_line_array
99
+ ary1 = [ 'test' ]
100
+ assert_equal([ [ 'test', 'test' ] ],
101
+ Bio::Command.safe_command_line_array(ary1))
102
+ ary1a = [ [ 'test/test1a', 'test' ] ]
103
+ assert_equal(ary1a,
104
+ Bio::Command.safe_command_line_array(ary1a))
98
105
  end
99
106
 
100
- def test_call_command_popen
101
- end
102
-
103
- def test_call_command_fork
104
- end
105
-
106
- def test_call_command_open3
107
- end
108
-
109
- def test_query_command
110
- end
111
-
112
- def test_query_command_popen
113
- end
114
-
115
- def test_query_command_fork
116
- end
117
-
118
- def test_query_command_open3
119
- end
120
-
121
- def test_read_uri
122
- end
123
-
124
- def test_start_http
125
- end
126
-
127
- def test_new_http
128
- end
129
-
130
- def test_post_form
107
+ def test_safe_command_line_array_passthrough
108
+ ary0 = []
109
+ assert_equal(ary0,
110
+ Bio::Command.safe_command_line_array(ary0))
111
+ ary2 = [ 'cmd', 'arg0' ]
112
+ assert_equal(ary2,
113
+ Bio::Command.safe_command_line_array(ary2))
114
+ ary2a = [ [ 'cmd', 'display name' ], 'arg0' ]
115
+ assert_equal(ary2a,
116
+ Bio::Command.safe_command_line_array(ary2a))
117
+ ary3 = [ 'cmd', 'arg0', 'arg1' ]
118
+ assert_equal(ary3,
119
+ Bio::Command.safe_command_line_array(ary3))
131
120
  end
132
121
 
133
122
  def test_make_cgi_params_by_hash_in_symbol
@@ -142,7 +131,8 @@ module Bio
142
131
  "action=export",
143
132
  "_format=Text",
144
133
  "output=txt",
145
- "submit=Continue%20%3E%3E",
134
+ "submit=Continue+%3E%3E",
135
+ "ab%3Dcd%26ef%3Dgh%23ij=pq%3D12%26rs%3D34%23tu",
146
136
  ]
147
137
  hash = {
148
138
  :type1 => 'bp',
@@ -155,11 +145,27 @@ module Bio
155
145
  :_format => 'Text',
156
146
  :output => 'txt',
157
147
  :submit => 'Continue >>',
148
+ :"ab=cd&ef=gh#ij" => 'pq=12&rs=34#tu',
158
149
  }
159
150
  result = Bio::Command.make_cgi_params(hash)
160
151
  ary.each do |str|
161
- assert_match(str, result)
152
+ assert_match(Regexp.new(Regexp.escape(str)), result)
153
+ end
154
+
155
+ # round-trip test
156
+ result_hash = {}
157
+ CGI.parse(result).each do |k, v|
158
+ v = case v.size
159
+ when 0
160
+ ''
161
+ when 1
162
+ v[0]
163
+ else
164
+ v
165
+ end
166
+ result_hash[k.intern] = v
162
167
  end
168
+ assert_equal(hash, result_hash)
163
169
  end
164
170
 
165
171
  def test_make_cgi_params_by_hash_in_string
@@ -174,7 +180,8 @@ module Bio
174
180
  "action=export",
175
181
  "_format=Text",
176
182
  "output=txt",
177
- "submit=Continue%20%3E%3E",
183
+ "submit=Continue+%3E%3E",
184
+ "ab%3Dcd%26ef%3Dgh%23ij=pq%3D12%26rs%3D34%23tu",
178
185
  ]
179
186
  hash = {
180
187
  "type1" => 'bp',
@@ -187,11 +194,27 @@ module Bio
187
194
  "_format" => 'Text',
188
195
  "output" => 'txt',
189
196
  "submit" => 'Continue >>',
197
+ 'ab=cd&ef=gh#ij' => 'pq=12&rs=34#tu',
190
198
  }
191
199
  result = Bio::Command.make_cgi_params(hash)
192
200
  ary.each do |str|
193
- assert_match(str, result)
201
+ assert_match(Regexp.new(Regexp.escape(str)), result)
202
+ end
203
+
204
+ # round-trip test
205
+ result_hash = {}
206
+ CGI.parse(result).each do |k, v|
207
+ v = case v.size
208
+ when 0
209
+ ''
210
+ when 1
211
+ v[0]
212
+ else
213
+ v
214
+ end
215
+ result_hash[k] = v
194
216
  end
217
+ assert_equal(hash, result_hash)
195
218
  end
196
219
 
197
220
  def test_make_cgi_params_by_array_of_array
@@ -206,7 +229,8 @@ module Bio
206
229
  "action=export",
207
230
  "_format=Text",
208
231
  "output=txt",
209
- "submit=Continue%20%3E%3E",
232
+ "submit=Continue+%3E%3E",
233
+ "ab%3Dcd%26ef%3Dgh%23ij=pq%3D12%26rs%3D34%23tu",
210
234
  ]
211
235
  array_of_array = [
212
236
  ["type1", 'bp'],
@@ -219,11 +243,26 @@ module Bio
219
243
  ["_format", 'Text'],
220
244
  ["output", 'txt'],
221
245
  ["submit", 'Continue >>'],
246
+ [ 'ab=cd&ef=gh#ij', 'pq=12&rs=34#tu' ],
222
247
  ]
223
248
  result = Bio::Command.make_cgi_params(array_of_array)
224
- ary.each do |str|
225
- assert_match(str, result)
249
+ # When array of array, order is guaranteed.
250
+ assert_equal(ary.join('&'), result)
251
+
252
+ # round-trip test
253
+ result_array = []
254
+ CGI.parse(result).each do |k, v|
255
+ v = case v.size
256
+ when 0
257
+ ''
258
+ when 1
259
+ v[0]
260
+ else
261
+ v
262
+ end
263
+ result_array.push([ k, v ])
226
264
  end
265
+ assert_equal(array_of_array.sort, result_array.sort)
227
266
  end
228
267
 
229
268
  def test_make_cgi_params_by_array_of_hash
@@ -238,7 +277,8 @@ module Bio
238
277
  "action=export",
239
278
  "_format=Text",
240
279
  "output=txt",
241
- "submit=Continue%20%3E%3E",
280
+ "submit=Continue+%3E%3E",
281
+ "ab%3Dcd%26ef%3Dgh%23ij=pq%3D12%26rs%3D34%23tu",
242
282
  ]
243
283
  array_of_hash = [
244
284
  {"type1" => 'bp'},
@@ -251,15 +291,31 @@ module Bio
251
291
  {"_format" => 'Text'},
252
292
  {"output" => 'txt'},
253
293
  {"submit" => 'Continue >>'},
294
+ {'ab=cd&ef=gh#ij' => 'pq=12&rs=34#tu'},
254
295
  ]
255
296
  result = Bio::Command.make_cgi_params(array_of_hash)
256
- ary.each do |str|
257
- assert_match(str, result)
297
+ # When array of hash, order is guaranteed.
298
+ assert_equal(ary.join('&'), result)
299
+
300
+ # round-trip test
301
+ result_array = []
302
+ CGI.parse(result).each do |k, v|
303
+ v = case v.size
304
+ when 0
305
+ ''
306
+ when 1
307
+ v[0]
308
+ else
309
+ v
310
+ end
311
+ result_array.push({ k => v })
258
312
  end
313
+ assert_equal(array_of_hash.sort { |x,y| x.keys[0] <=> y.keys[0] },
314
+ result_array.sort { |x,y| x.keys[0] <=> y.keys[0] })
259
315
  end
260
316
 
261
317
  def test_make_cgi_params_by_array_of_string
262
- str = "type1=bp&type2=bp&downstream=&upstream=&format=fasta&options=similarity&options=gene&action=export&_format=Text&output=txt&submit=Continue%20%3E%3E"
318
+ str = "type1=bp&type2=bp&downstream=&upstream=&format=fasta&options=similarity&options=gene&action=export&_format=Text&output=txt&submit=Continue+%3E%3E&ab=cd%26ef%3Dgh%23ij%3Dpq%3D12%26rs%3D34%23tu"
263
319
  array_of_string = [
264
320
  "type1=bp",
265
321
  "type2=bp",
@@ -272,6 +328,10 @@ module Bio
272
328
  "_format=Text",
273
329
  "output=txt",
274
330
  "submit=Continue >>",
331
+ # In the following case, 'ab' is regarded as
332
+ # the form key, and rest of the string is
333
+ # regarded as the value.
334
+ 'ab=cd&ef=gh#ij=pq=12&rs=34#tu',
275
335
  ]
276
336
  result = Bio::Command.make_cgi_params(array_of_string)
277
337
  assert_equal(str, result)
@@ -279,6 +339,7 @@ module Bio
279
339
 
280
340
  def test_make_cgi_params_by_string
281
341
  string = "type1=bp&type2=bp&downstream=&upstream=&format=fasta&options=similarity&options=gene&action=export&_format=Text&output=txt&submit=Continue%20%3E%3E"
342
+ # In this case, only URI escaping is performed.
282
343
  query = " type1=bp&type2=bp&downstream=&upstream=&format=fasta&options=similarity&options=gene&action=export&_format=Text&output=txt&submit=Continue >> "
283
344
  result = Bio::Command.make_cgi_params(query)
284
345
  assert_equal(string, result)
@@ -5,7 +5,7 @@
5
5
  # Mitsuteru Nakao <n@bioruby.org>
6
6
  # License:: The Ruby License
7
7
  #
8
- # $Id: test_feature.rb,v 1.5 2007/04/05 23:35:42 trevor Exp $
8
+ # $Id: test_feature.rb,v 1.5.2.1 2008/05/08 05:38:01 ngoto Exp $
9
9
  #
10
10
 
11
11
  require 'pathname'
@@ -14,6 +14,7 @@ $:.unshift(libpath) unless $:.include?(libpath)
14
14
 
15
15
  require 'test/unit'
16
16
  require 'bio/feature'
17
+ require 'bio/compat/features'
17
18
 
18
19
 
19
20
  module Bio
@@ -88,10 +89,37 @@ module Bio
88
89
  end
89
90
  end
90
91
 
92
+ class NullStderr
93
+ def initialize
94
+ @log = []
95
+ end
96
+
97
+ def write(*arg)
98
+ #p arg
99
+ @log.push([ :write, *arg ])
100
+ nil
101
+ end
102
+
103
+ def method_missing(*arg)
104
+ #p arg
105
+ @log.push arg
106
+ nil
107
+ end
108
+ end
109
+
91
110
  class TestFeatures < Test::Unit::TestCase
92
111
  def setup
112
+ # To suppress warning messages, $stderr is replaced by dummy object.
113
+ @stderr_orig = $stderr
114
+ $stderr = NullStderr.new
115
+
93
116
  @obj = Bio::Features.new([Bio::Feature.new('gene', '1..615', [])])
94
117
  end
118
+
119
+ def teardown
120
+ # bring back $stderr
121
+ $stderr = @stderr_orig
122
+ end
95
123
 
96
124
  def test_features
97
125
  assert_equal(1, @obj.features.size)
@@ -1,27 +1,41 @@
1
1
  #
2
- # test/unit/bio/test_location.rb - Unit test for Bio::Location
2
+ # test/unit/bio/test_location.rb - Unit test for Bio::Location and Bio::Locations
3
3
  #
4
- # Copyright:: Copyright (C) 2004
5
- # Moses Hohman <mmhohman@northwestern.edu>
4
+ # Copyright:: Copyright (C) 2004 Moses Hohman <mmhohman@northwestern.edu>
5
+ # 2008 Naohisa Goto <ng@bioruby.org>
6
6
  # License:: The Ruby License
7
7
  #
8
- # $Id: test_location.rb,v 1.4 2007/04/05 23:35:42 trevor Exp $
8
+ # $Id:$
9
9
  #
10
10
 
11
11
  require 'pathname'
12
- libpath = Pathname.new(File.join(File.dirname(__FILE__), ['..'] * 2, 'lib')).cleanpath.to_s
12
+ libpath = Pathname.new(File.join(File.dirname(__FILE__), ['..'] * 3, 'lib')).cleanpath.to_s
13
13
  $:.unshift(libpath) unless $:.include?(libpath)
14
14
 
15
15
  require 'test/unit'
16
16
  require 'bio/location'
17
17
 
18
18
  module Bio
19
- class TestLocation < Test::Unit::TestCase
19
+ class TestLocations < Test::Unit::TestCase
20
+ def test_should_not_modify_argument
21
+ assert_nothing_raised {
22
+ Locations.new(' 123..456 '.freeze)
23
+ }
24
+ end
25
+
26
+ def test_normal
27
+ loc = Locations.new('123..456')
28
+ assert_equal([123, 456], loc.span)
29
+ assert_equal(123..456, loc.range)
30
+ assert_equal(1, loc[0].strand)
31
+ end
32
+
20
33
  def test_hat
21
34
  loc = Locations.new('754^755')
22
35
  assert_equal([754, 755], loc.span, "span wrong")
23
36
  assert_equal(754..755, loc.range, "range wrong")
24
37
  assert_equal(1, loc[0].strand, "strand wrong")
38
+ assert_equal(true, loc[0].carat, "carat wrong")
25
39
  end
26
40
 
27
41
  def test_complement
@@ -29,6 +43,7 @@ module Bio
29
43
  assert_equal([53, 54], loc.span, "span wrong")
30
44
  assert_equal(53..54, loc.range, "range wrong")
31
45
  assert_equal(-1, loc[0].strand, "strand wrong")
46
+ assert_equal(true, loc[0].carat, "carat wrong")
32
47
  end
33
48
 
34
49
  def test_replace_single_base
@@ -36,4 +51,549 @@ module Bio
36
51
  assert_equal("a", loc[0].sequence)
37
52
  end
38
53
  end
54
+
55
+ class TestLocationsRoundTrip < Test::Unit::TestCase
56
+
57
+ class TestLoc
58
+ def initialize(*arg)
59
+ @xref_id = nil
60
+ @lt = nil
61
+ @from = nil
62
+ @gt = nil
63
+ @to = nil
64
+ @carat = nil
65
+ @sequence = nil
66
+ @strand = 1
67
+ arg.each do |x|
68
+ case x
69
+ when :complement
70
+ @strand = -1
71
+ when '<'
72
+ @lt = true
73
+ when '>'
74
+ @gt = true
75
+ when '..'
76
+ # do nothing
77
+ when '^'
78
+ @carat = true
79
+ when Integer
80
+ @from ||= x
81
+ @to = x
82
+ when Hash
83
+ @sequence ||= x[:sequence]
84
+ else
85
+ @xref_id ||= x
86
+ end
87
+ end
88
+ end
89
+
90
+ def to_location
91
+ loc = Bio::Location.new
92
+ loc.from = @from
93
+ loc.to = @to
94
+ loc.gt = @gt
95
+ loc.lt = @lt
96
+ loc.strand = @strand
97
+ loc.xref_id = @xref_id
98
+ loc.sequence = @sequence
99
+ loc.carat = @carat
100
+ loc
101
+ end
102
+ end #class TestLoc
103
+
104
+ TestData =
105
+ [
106
+ # (C) n^m
107
+ #
108
+ # * [AB015179] 754^755
109
+ [ 'AB015179', '754^755',
110
+ nil,
111
+ TestLoc.new(754, '^', 755)
112
+ ],
113
+
114
+ # * [AF179299] complement(53^54)
115
+ # (see below)
116
+
117
+ # * [CELXOL1ES] replace(4480^4481,"")
118
+ # (see below)
119
+
120
+ # * [ECOUW87] replace(4792^4793,"a")
121
+ # (see below)
122
+
123
+ # * [APLPCII] replace(1905^1906,"acaaagacaccgccctacgcc")
124
+ # (see below)
125
+
126
+ # (n.m) and one-of() are not supported.
127
+ # (D) (n.m)
128
+ #
129
+ # * [HACSODA] 157..(800.806)
130
+ # * [HALSODB] (67.68)..(699.703)
131
+ # * [AP001918] (45934.45974)..46135
132
+ # * [BACSPOJ] <180..(731.761)
133
+ # * [BBU17998] (88.89)..>1122
134
+ # * [ECHTGA] complement((1700.1708)..(1715.1721))
135
+ # * [ECPAP17] complement(<22..(255.275))
136
+ # * [LPATOVGNS] complement((64.74)..1525)
137
+ # * [PIP404CG] join((8298.8300)..10206,1..855)
138
+ # * [BOVMHDQBY4] join(M30006.1:(392.467)..575,M30005.1:415..681,M30004.1:129..410,M30004.1:907..1017,521..534)
139
+ # * [HUMMIC2A] replace((651.655)..(651.655),"")
140
+ # * [HUMSOD102] order(L44135.1:(454.445)..>538,<1..181)
141
+ #
142
+ # (n.m) and one-of() are not supported.
143
+ # (E) one-of
144
+ #
145
+ # * [ECU17136] one-of(898,900)..983
146
+ # * [CELCYT1A] one-of(5971..6308,5971..6309)
147
+ # * [DMU17742] 8050..one-of(10731,10758,10905,11242)
148
+ # * [PFU27807] one-of(623,627,632)..one-of(628,633,637)
149
+ # * [BTBAINH1] one-of(845,953,963,1078,1104)..1354
150
+ # * [ATU39449] join(one-of(969..1094,970..1094,995..1094,1018..1094),1518..1587,1726..2119,2220..2833,2945..3215)
151
+ #
152
+
153
+ # (F) join, order, group
154
+ #
155
+ # * [AB037374S2] join(AB037374.1:1..177,1..807)
156
+ [ 'AB037374S2', 'join(AB037374.1:1..177,1..807)',
157
+ nil,
158
+ TestLoc.new('AB037374.1', 1, 177),
159
+ TestLoc.new(1, 807)
160
+ ],
161
+
162
+ # * [AP000001] join(complement(1..61),complement(AP000007.1:252907..253505))
163
+ # (see below)
164
+
165
+ # * [ASNOS11] join(AF130124.1:<2563..2964,AF130125.1:21..157,AF130126.1:12..174,AF130127.1:21..112,AF130128.1:21..162,AF130128.1:281..595,AF130128.1:661..842,AF130128.1:916..1030,AF130129.1:21..115,AF130130.1:21..165,AF130131.1:21..125,AF130132.1:21..428,AF130132.1:492..746,AF130133.1:21..168,AF130133.1:232..401,AF130133.1:475..906,AF130133.1:970..1107,AF130133.1:1176..1367,21..>128)
166
+ [ 'ASNOS11', 'join(AF130124.1:<2563..2964,AF130125.1:21..157,AF130126.1:12..174,AF130127.1:21..112,AF130128.1:21..162,AF130128.1:281..595,AF130128.1:661..842,AF130128.1:916..1030,AF130129.1:21..115,AF130130.1:21..165,AF130131.1:21..125,AF130132.1:21..428,AF130132.1:492..746,AF130133.1:21..168,AF130133.1:232..401,AF130133.1:475..906,AF130133.1:970..1107,AF130133.1:1176..1367,21..>128)',
167
+ nil,
168
+ TestLoc.new('AF130124.1', '<', 2563, 2964),
169
+ TestLoc.new('AF130125.1', 21, 157),
170
+ TestLoc.new('AF130126.1', 12, 174),
171
+ TestLoc.new('AF130127.1', 21, 112),
172
+ TestLoc.new('AF130128.1', 21, 162),
173
+ TestLoc.new('AF130128.1', 281, 595),
174
+ TestLoc.new('AF130128.1', 661, 842),
175
+ TestLoc.new('AF130128.1', 916, 1030),
176
+ TestLoc.new('AF130129.1', 21, 115),
177
+ TestLoc.new('AF130130.1', 21, 165),
178
+ TestLoc.new('AF130131.1', 21, 125),
179
+ TestLoc.new('AF130132.1', 21, 428),
180
+ TestLoc.new('AF130132.1', 492, 746),
181
+ TestLoc.new('AF130133.1', 21, 168),
182
+ TestLoc.new('AF130133.1', 232, 401),
183
+ TestLoc.new('AF130133.1', 475, 906),
184
+ TestLoc.new('AF130133.1', 970, 1107),
185
+ TestLoc.new('AF130133.1', 1176, 1367),
186
+ TestLoc.new(21, '>', 128)
187
+ ],
188
+
189
+ # * [AARPOB2] order(AF194507.1:<1..510,1..>871)
190
+ # (see below)
191
+
192
+ # * [AF006691] order(912..1918,20410..21416)
193
+ [ 'AF006691', 'order(912..1918,20410..21416)',
194
+ :order,
195
+ TestLoc.new(912,1918),
196
+ TestLoc.new(20410,21416)
197
+ ],
198
+
199
+ # * [AF024666] complement(order(13965..14892,18919..19224))
200
+ # (Note that in older version of GenBank, the order of
201
+ # "order" and "complement" was different.)
202
+ # * [AF024666] order(complement(18919..19224),complement(13965..14892))
203
+ [ 'AF024666', 'complement(order(13965..14892,18919..19224))',
204
+ :complement_order,
205
+ TestLoc.new(13965, 14892),
206
+ TestLoc.new(18919, 19224)
207
+ ],
208
+
209
+ # * [AF264948] order(27066..27076,27089..27099,27283..27314,27330..27352)
210
+ [ 'AF264948',
211
+ 'order(27066..27076,27089..27099,27283..27314,27330..27352)',
212
+ :order,
213
+ TestLoc.new(27066, 27076),
214
+ TestLoc.new(27089, 27099),
215
+ TestLoc.new(27283, 27314),
216
+ TestLoc.new(27330, 27352)
217
+ ],
218
+
219
+ # * [D63363] order(3..26,complement(964..987))
220
+ # (see below)
221
+
222
+ # * [ECOCURLI2] order(complement(1009..>1260),complement(AF081827.1:<1..177))
223
+ [ 'ECOCURLI2',
224
+ 'order(complement(1009..>1260),complement(AF081827.1:<1..177))',
225
+ :order,
226
+ TestLoc.new(:complement, 1009, '>', 1260),
227
+ TestLoc.new(:complement, 'AF081827.1', '<', 1, 177)
228
+ ],
229
+
230
+ # * [S72388S2] order(join(S72388.1:757..911,S72388.1:609..1542),1..>139)
231
+ # (not supported)
232
+
233
+ # * [HEYRRE07] order(complement(1..38),complement(M82666.1:1..140),complement(M82665.1:1..176),complement(M82664.1:1..215),complement(M82663.1:1..185),complement(M82662.1:1..49),complement(M82661.1:1..133))
234
+ [ 'HEYRRE07',
235
+ 'order(complement(1..38),complement(M82666.1:1..140),complement(M82665.1:1..176),complement(M82664.1:1..215),complement(M82663.1:1..185),complement(M82662.1:1..49),complement(M82661.1:1..133))',
236
+ :order,
237
+ TestLoc.new(:complement, 1, 38),
238
+ TestLoc.new(:complement, 'M82666.1', 1, 140),
239
+ TestLoc.new(:complement, 'M82665.1', 1, 176),
240
+ TestLoc.new(:complement, 'M82664.1', 1, 215),
241
+ TestLoc.new(:complement, 'M82663.1', 1, 185),
242
+ TestLoc.new(:complement, 'M82662.1', 1, 49),
243
+ TestLoc.new(:complement, 'M82661.1', 1, 133)
244
+ ],
245
+
246
+ # * [COL11A1G34] order(AF101079.1:558..1307,AF101080.1:1..749,AF101081.1:1..898,AF101082.1:1..486,AF101083.1:1..942,AF101084.1:1..1734,AF101085.1:1..2385,AF101086.1:1..1813,AF101087.1:1..2287,AF101088.1:1..1073,AF101089.1:1..989,AF101090.1:1..5017,AF101091.1:1..3401,AF101092.1:1..1225,AF101093.1:1..1072,AF101094.1:1..989,AF101095.1:1..1669,AF101096.1:1..918,AF101097.1:1..1114,AF101098.1:1..1074,AF101099.1:1..1709,AF101100.1:1..986,AF101101.1:1..1934,AF101102.1:1..1699,AF101103.1:1..940,AF101104.1:1..2330,AF101105.1:1..4467,AF101106.1:1..1876,AF101107.1:1..2465,AF101108.1:1..1150,AF101109.1:1..1170,AF101110.1:1..1158,AF101111.1:1..1193,1..611)
247
+ [ 'COL11A1G34',
248
+ 'order(AF101079.1:558..1307,AF101080.1:1..749,AF101081.1:1..898,AF101082.1:1..486,AF101083.1:1..942,AF101084.1:1..1734,AF101085.1:1..2385,AF101086.1:1..1813,AF101087.1:1..2287,AF101088.1:1..1073,AF101089.1:1..989,AF101090.1:1..5017,AF101091.1:1..3401,AF101092.1:1..1225,AF101093.1:1..1072,AF101094.1:1..989,AF101095.1:1..1669,AF101096.1:1..918,AF101097.1:1..1114,AF101098.1:1..1074,AF101099.1:1..1709,AF101100.1:1..986,AF101101.1:1..1934,AF101102.1:1..1699,AF101103.1:1..940,AF101104.1:1..2330,AF101105.1:1..4467,AF101106.1:1..1876,AF101107.1:1..2465,AF101108.1:1..1150,AF101109.1:1..1170,AF101110.1:1..1158,AF101111.1:1..1193,1..611)',
249
+ :order,
250
+ TestLoc.new('AF101079.1', 558, 1307),
251
+ TestLoc.new('AF101080.1', 1, 749),
252
+ TestLoc.new('AF101081.1', 1, 898),
253
+ TestLoc.new('AF101082.1', 1, 486),
254
+ TestLoc.new('AF101083.1', 1, 942),
255
+ TestLoc.new('AF101084.1', 1, 1734),
256
+ TestLoc.new('AF101085.1', 1, 2385),
257
+ TestLoc.new('AF101086.1', 1, 1813),
258
+ TestLoc.new('AF101087.1', 1, 2287),
259
+ TestLoc.new('AF101088.1', 1, 1073),
260
+ TestLoc.new('AF101089.1', 1, 989),
261
+ TestLoc.new('AF101090.1', 1, 5017),
262
+ TestLoc.new('AF101091.1', 1, 3401),
263
+ TestLoc.new('AF101092.1', 1, 1225),
264
+ TestLoc.new('AF101093.1', 1, 1072),
265
+ TestLoc.new('AF101094.1', 1, 989),
266
+ TestLoc.new('AF101095.1', 1, 1669),
267
+ TestLoc.new('AF101096.1', 1, 918),
268
+ TestLoc.new('AF101097.1', 1, 1114),
269
+ TestLoc.new('AF101098.1', 1, 1074),
270
+ TestLoc.new('AF101099.1', 1, 1709),
271
+ TestLoc.new('AF101100.1', 1, 986),
272
+ TestLoc.new('AF101101.1', 1, 1934),
273
+ TestLoc.new('AF101102.1', 1, 1699),
274
+ TestLoc.new('AF101103.1', 1, 940),
275
+ TestLoc.new('AF101104.1', 1, 2330),
276
+ TestLoc.new('AF101105.1', 1, 4467),
277
+ TestLoc.new('AF101106.1', 1, 1876),
278
+ TestLoc.new('AF101107.1', 1, 2465),
279
+ TestLoc.new('AF101108.1', 1, 1150),
280
+ TestLoc.new('AF101109.1', 1, 1170),
281
+ TestLoc.new('AF101110.1', 1, 1158),
282
+ TestLoc.new('AF101111.1', 1, 1193),
283
+ TestLoc.new(1, 611)
284
+ ],
285
+
286
+ # group() are found in the COMMENT field only (in GenBank 122.0)
287
+ #
288
+ # gbpat2.seq: FT repeat_region group(598..606,611..619)
289
+ # gbpat2.seq: FT repeat_region group(8..16,1457..1464).
290
+ # gbpat2.seq: FT variation group(t1,t2)
291
+ # gbpat2.seq: FT variation group(t1,t3)
292
+ # gbpat2.seq: FT variation group(t1,t2,t3)
293
+ # gbpat2.seq: FT repeat_region group(11..202,203..394)
294
+ # gbpri9.seq:COMMENT Residues reported = 'group(1..2145);'.
295
+ #
296
+
297
+ # (G) ID:location
298
+ # * [AARPOB2] order(AF194507.1:<1..510,1..>871)
299
+ [ 'AARPOB2', 'order(AF194507.1:<1..510,1..>871)',
300
+ :order,
301
+ TestLoc.new('AF194507.1', '<', 1, 510),
302
+ TestLoc.new(1, '>', 871)
303
+ ],
304
+ # * [AF178221S4] join(AF178221.1:<1..60,AF178222.1:1..63,AF178223.1:1..42,1..>90)
305
+ [ 'AF178221S4',
306
+ 'join(AF178221.1:<1..60,AF178222.1:1..63,AF178223.1:1..42,1..>90)',
307
+ nil,
308
+ TestLoc.new('AF178221.1', '<', 1, 60),
309
+ TestLoc.new('AF178222.1', 1, 63),
310
+ TestLoc.new('AF178223.1', 1, 42),
311
+ TestLoc.new( 1, '>', 90)
312
+ ],
313
+ # * [BOVMHDQBY4] join(M30006.1:(392.467)..575,M30005.1:415..681,M30004.1:129..410,M30004.1:907..1017,521..534)
314
+ # not supported
315
+
316
+ # * [HUMSOD102] order(L44135.1:(454.445)..>538,<1..181)
317
+ # not supported
318
+
319
+ # * [SL16SRRN1] order(<1..>267,X67092.1:<1..>249,X67093.1:<1..>233)
320
+ [ 'SL16SRRN1',
321
+ 'order(<1..>267,X67092.1:<1..>249,X67093.1:<1..>233)',
322
+ :order,
323
+ TestLoc.new( '<', 1, '>', 267),
324
+ TestLoc.new('X67092.1', '<', 1, '>', 249),
325
+ TestLoc.new('X67093.1', '<', 1, '>', 233)
326
+ ],
327
+
328
+ # (I) <, >
329
+ # * [A5U48871] <1..>318
330
+ [ 'A5U48871', '<1..>318',
331
+ nil,
332
+ TestLoc.new('<', 1, '>', 318)
333
+ ],
334
+
335
+ # * [AA23SRRNP] <1..388
336
+ [ 'AA23SRRNP', '<1..388',
337
+ nil,
338
+ TestLoc.new('<', 1, 388)
339
+ ],
340
+
341
+ # * [AA23SRRNP] 503..>1010
342
+ [ 'AA23SRRNP', '503..>1010',
343
+ nil,
344
+ TestLoc.new(503, '>', 1010)
345
+ ],
346
+
347
+ # * [AAM5961] complement(<1..229)
348
+ [ 'AAM5961', 'complement(<1..229)',
349
+ nil,
350
+ TestLoc.new(:complement, '<', 1, 229)
351
+ ],
352
+
353
+ # * [AAM5961] complement(5231..>5598)
354
+ [ 'AAM5961', 'complement(5231..>5598)',
355
+ nil,
356
+ TestLoc.new(:complement, 5231, '>', 5598)
357
+ ],
358
+
359
+ # * [AF043934] join(<1,60..99,161..241,302..370,436..594,676..887,993..1141,1209..1329,1387..1559,1626..1646,1708..>1843)
360
+ [ 'AF043934', 'join(<1,60..99,161..241,302..370,436..594,676..887,993..1141,1209..1329,1387..1559,1626..1646,1708..>1843)',
361
+ nil,
362
+ TestLoc.new('<', 1),
363
+ TestLoc.new(60, 99),
364
+ TestLoc.new(161,241),
365
+ TestLoc.new(302,370),
366
+ TestLoc.new(436,594),
367
+ TestLoc.new(676,887),
368
+ TestLoc.new(993,1141),
369
+ TestLoc.new(1209,1329),
370
+ TestLoc.new(1387,1559),
371
+ TestLoc.new(1626,1646),
372
+ TestLoc.new(1708, '>', 1843)
373
+ ],
374
+
375
+ # * [BACSPOJ] <180..(731.761)
376
+ # not supported
377
+
378
+ # * [BBU17998] (88.89)..>1122
379
+ # not supported
380
+
381
+ # * [AARPOB2] order(AF194507.1:<1..510,1..>871)
382
+ # (see above)
383
+
384
+ # * [SL16SRRN1] order(<1..>267,X67092.1:<1..>249,X67093.1:<1..>233)
385
+ # (see above)
386
+
387
+ # (J) complement
388
+ # * [AF179299] complement(53^54)
389
+ [ 'AF179299', 'complement(53^54)',
390
+ nil,
391
+ TestLoc.new(:complement, 53, '^', 54)
392
+ ],
393
+
394
+ # * [AP000001] join(complement(1..61),complement(AP000007.1:252907..253505))
395
+ [ 'AP000001',
396
+ 'join(complement(1..61),complement(AP000007.1:252907..253505))',
397
+ nil,
398
+ TestLoc.new(:complement, 1, 61),
399
+ TestLoc.new(:complement, 'AP000007.1', 252907, 253505)
400
+ ],
401
+
402
+ # * [AF209868S2] order(complement(1..>308),complement(AF209868.1:75..336))
403
+ [ 'AF209868S2',
404
+ 'order(complement(1..>308),complement(AF209868.1:75..336))',
405
+ :order,
406
+ TestLoc.new(:complement, 1, '>', 308),
407
+ TestLoc.new(:complement, 'AF209868.1', 75, 336)
408
+ ],
409
+
410
+ # * [CPPLCG] complement(<1..(1093.1098))
411
+ # not supported
412
+
413
+ # * [D63363] order(3..26,complement(964..987))
414
+ [ 'D63363]', 'order(3..26,complement(964..987))',
415
+ :order,
416
+ TestLoc.new(3,26),
417
+ TestLoc.new(:complement, 964, 987)
418
+ ],
419
+
420
+ # * [ECHTGA] complement((1700.1708)..(1715.1721))
421
+ # not supported
422
+
423
+ # * [ECOUXW] complement(order(1636..1641,1658..1663))
424
+ # (Note that in older version of GenBank, the order of
425
+ # "order" and "complement" was different.)
426
+ # * [ECOUXW] order(complement(1658..1663),complement(1636..1641))
427
+ #
428
+ [ 'ECOUXW', 'complement(order(1636..1641,1658..1663))',
429
+ :complement_order,
430
+ TestLoc.new(:complement, 1636, 1641),
431
+ TestLoc.new(:complement, 1658, 1663)
432
+ ],
433
+
434
+ # * [LPATOVGNS] complement((64.74)..1525)
435
+ # not supported
436
+
437
+ # * [AF129075] complement(join(71606..71829,75327..75446,76039..76203,76282..76353,76914..77029,77114..77201,77276..77342,78138..78316,79755..79892,81501..81562,81676..81856,82341..82490,84208..84287,85032..85122,88316..88403))
438
+ [ 'AF129075',
439
+ 'complement(join(71606..71829,75327..75446,76039..76203,76282..76353,76914..77029,77114..77201,77276..77342,78138..78316,79755..79892,81501..81562,81676..81856,82341..82490,84208..84287,85032..85122,88316..88403))',
440
+ :complement_join,
441
+ TestLoc.new(71606,71829),
442
+ TestLoc.new(75327,75446),
443
+ TestLoc.new(76039,76203),
444
+ TestLoc.new(76282,76353),
445
+ TestLoc.new(76914,77029),
446
+ TestLoc.new(77114,77201),
447
+ TestLoc.new(77276,77342),
448
+ TestLoc.new(78138,78316),
449
+ TestLoc.new(79755,79892),
450
+ TestLoc.new(81501,81562),
451
+ TestLoc.new(81676,81856),
452
+ TestLoc.new(82341,82490),
453
+ TestLoc.new(84208,84287),
454
+ TestLoc.new(85032,85122),
455
+ TestLoc.new(88316,88403)
456
+ ],
457
+
458
+ # * [ZFDYST2] join(AF137145.1:<1..18,complement(<1..99))
459
+ [ 'ZFDYST2', 'join(AF137145.1:<1..18,complement(<1..99))',
460
+ nil,
461
+ TestLoc.new('AF137145.1', '<', 1, 18),
462
+ TestLoc.new(:complement, '<', 1, 99)
463
+ ],
464
+
465
+ # (K) replace
466
+ # * [CSU27710] replace(64,"A")
467
+ [ 'CSU27710', 'replace(64,"a")',
468
+ nil,
469
+ TestLoc.new(64, :sequence => "a")
470
+ ],
471
+
472
+ # * [CELXOL1ES] replace(5256,"t")
473
+ [ 'CELXOL1ES', 'replace(5256,"t")',
474
+ nil,
475
+ TestLoc.new(5256,:sequence => "t")
476
+ ],
477
+
478
+ # * [ANICPC] replace(1..468,"")
479
+ [ 'ANICPC', 'replace(1..468,"")',
480
+ nil,
481
+ TestLoc.new(1, 468, :sequence => "")
482
+ ],
483
+
484
+ # * [CSU27710] replace(67..68,"GC")
485
+ [ 'CSU27710', 'replace(67..68,"gc")',
486
+ nil,
487
+ TestLoc.new(67, 68, :sequence => "gc")
488
+ ],
489
+
490
+ # * [CELXOL1ES] replace(4480^4481,"") <= ? only one case in GenBank 122.0
491
+ [ 'CELXOL1ES', 'replace(4480^4481,"")',
492
+ nil,
493
+ TestLoc.new(4480, '^', 4481, :sequence => "")
494
+ ],
495
+
496
+ # * [ECOUW87] replace(4792^4793,"a")
497
+ [ 'ECOUW87', 'replace(4792^4793,"a")',
498
+ nil,
499
+ TestLoc.new(4792, '^', 4793, :sequence => "a")
500
+ ],
501
+
502
+ # * [CEU34893] replace(1..22,"ggttttaacccagttactcaag")
503
+ [ 'CEU34893', 'replace(1..22,"ggttttaacccagttactcaag")',
504
+ nil,
505
+ TestLoc.new(1, 22, :sequence => "ggttttaacccagttactcaag")
506
+ ],
507
+
508
+ # * [APLPCII] replace(1905^1906,"acaaagacaccgccctacgcc")
509
+ [ 'APLPCII', 'replace(1905^1906,"acaaagacaccgccctacgcc")',
510
+ nil,
511
+ TestLoc.new(1905, '^', 1906, :sequence => "acaaagacaccgccctacgcc")
512
+ ],
513
+
514
+ # * [MBDR3S1] replace(1400..>9281,"")
515
+ [ 'MBDR3S1', 'replace(1400..>9281,"")',
516
+ nil,
517
+ TestLoc.new(1400, '>', 9281, :sequence => "")
518
+ ],
519
+
520
+ # * [HUMMHDPB1F] replace(complement(36..37),"ttc")
521
+ [ 'HUMMHDPB1F', 'replace(complement(36..37),"ttc")',
522
+ nil,
523
+ TestLoc.new(:complement, 36, 37, :sequence => "ttc")
524
+ ],
525
+
526
+ # * [HUMMIC2A] replace((651.655)..(651.655),"")
527
+ # not supported
528
+
529
+ # * [LEIMDRPGP] replace(1..1554,"L01572")
530
+ # not supported
531
+
532
+ # * [TRBND3] replace(376..395,"atttgtgtgtggtaatta")
533
+ [ 'TRBND3', 'replace(376..395,"atttgtgtgtggtaatta")',
534
+ nil,
535
+ TestLoc.new(376, 395, :sequence => "atttgtgtgtggtaatta")
536
+ ],
537
+
538
+ # * [TRBND3] replace(376..395,"atttgtgtgggtaatttta")
539
+ # * [TRBND3] replace(376..395,"attttgttgttgttttgttttgaatta")
540
+ # * [TRBND3] replace(376..395,"atgtgtggtgaatta")
541
+ # * [TRBND3] replace(376..395,"atgtgtgtggtaatta")
542
+ # * [TRBND3] replace(376..395,"gatttgttgtggtaatttta")
543
+ # (see above)
544
+
545
+ # * [MSU09460] replace(193,"t")
546
+ [ 'MSU09460', 'replace(193,"t")',
547
+ nil,
548
+ TestLoc.new(193, :sequence => "t")
549
+ ],
550
+
551
+ # * [HUMMAGE12X] replace(3002..3003, "GC")
552
+ [ 'HUMMAGE12X', 'replace(3002..3003,"gc")',
553
+ nil,
554
+ TestLoc.new(3002, 3003, :sequence => "gc")
555
+ ],
556
+
557
+ # * [ADR40FIB] replace(510..520, "taatcctaccg")
558
+ [ 'ADR40FIB', 'replace(510..520,"taatcctaccg")',
559
+ nil,
560
+ TestLoc.new(510, 520, :sequence => "taatcctaccg")
561
+ ],
562
+
563
+ # * [RATDYIIAAB] replace(1306..1443,"aagaacatccacggagtcagaactgggctcttcacgccggatttggcgttcgaggccattgtgaaaaagcaggcaatgcaccagcaagctcagttcctacccctgcgtggacctggttatccaggagctaatcagtacagttaggtggtcaagctgaaagagccctgtctgaaa")
564
+ [ 'RATDYIIAAB', 'replace(1306..1443,"aagaacatccacggagtcagaactgggctcttcacgccggatttggcgttcgaggccattgtgaaaaagcaggcaatgcaccagcaagctcagttcctacccctgcgtggacctggttatccaggagctaatcagtacagttaggtggtcaagctgaaagagccctgtctgaaa")',
565
+ nil,
566
+ TestLoc.new(1306, 1443, :sequence => "aagaacatccacggagtcagaactgggctcttcacgccggatttggcgttcgaggccattgtgaaaaagcaggcaatgcaccagcaagctcagttcctacccctgcgtggacctggttatccaggagctaatcagtacagttaggtggtcaagctgaaagagccctgtctgaaa")
567
+ ]
568
+ ] #TestData=
569
+
570
+ def test_locations_to_s
571
+ TestData.each do |a|
572
+ label = a[0]
573
+ str = a[1]
574
+ op = a[2]
575
+ locs = a[3..-1]
576
+ locs.collect! { |x| x.to_location }
577
+ case op
578
+ when :complement_join, :complement_order
579
+ locs.reverse!
580
+ locs.each { |loc| loc.strand = -1 }
581
+ op = op.to_s.sub(/complement_/, '').intern
582
+ end
583
+ locations = Bio::Locations.new(locs)
584
+ locations.operator = op if op
585
+ assert_equal(str, locations.to_s, "to_s: wrong for #{label}")
586
+ end
587
+ end
588
+
589
+ def test_locations_roundtrip
590
+ TestData.each do |a|
591
+ label = a[0]
592
+ str = a[1]
593
+ locations = Bio::Locations.new(str)
594
+ assert_equal(str, locations.to_s, "round trip: wrong for #{label}")
595
+ end
596
+ end
597
+
598
+ end
39
599
  end