bioinform 0.0.1 → 0.1.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 (61) hide show
  1. data/.gitignore +18 -17
  2. data/Gemfile +4 -4
  3. data/LICENSE +21 -21
  4. data/README.md +29 -29
  5. data/Rakefile +5 -12
  6. data/bioinform.gemspec +21 -21
  7. data/lib/bioinform/data_models/collection.rb +2 -0
  8. data/lib/bioinform/data_models/{iupac.rb → old_style_models_TO_BE_REMOVED/iupac.rb} +1 -1
  9. data/lib/bioinform/data_models/{iupac_word.rb → old_style_models_TO_BE_REMOVED/iupac_word.rb} +0 -0
  10. data/lib/bioinform/data_models/{positional_count_matrix.rb → old_style_models_TO_BE_REMOVED/positional_count_matrix.rb} +0 -0
  11. data/lib/bioinform/data_models/{positional_matrix.rb → old_style_models_TO_BE_REMOVED/positional_matrix.rb} +3 -5
  12. data/lib/bioinform/data_models/{positional_probability_matrix.rb → old_style_models_TO_BE_REMOVED/positional_probability_matrix.rb} +0 -0
  13. data/lib/bioinform/data_models/{positional_weight_matrix.rb → old_style_models_TO_BE_REMOVED/positional_weight_matrix.rb} +0 -0
  14. data/lib/bioinform/data_models/parser.rb +41 -0
  15. data/lib/bioinform/data_models/parsers/array_parser.rb +17 -0
  16. data/lib/bioinform/data_models/parsers/hash_parser.rb +19 -0
  17. data/lib/bioinform/data_models/parsers/string_fantom_parser.rb +21 -0
  18. data/lib/bioinform/data_models/parsers/string_parser.rb +45 -0
  19. data/lib/bioinform/data_models/parsers.rb +4 -0
  20. data/lib/bioinform/data_models/pcm.rb +7 -0
  21. data/lib/bioinform/data_models/pm.rb +195 -0
  22. data/lib/bioinform/data_models/ppm.rb +8 -0
  23. data/lib/bioinform/data_models/pwm.rb +23 -0
  24. data/lib/bioinform/data_models.rb +5 -5
  25. data/lib/bioinform/support/callable_symbol.rb +33 -4
  26. data/lib/bioinform/support/collect_hash.rb +7 -0
  27. data/lib/bioinform/support/curry_except_self.rb +2 -2
  28. data/lib/bioinform/support/deep_dup.rb +5 -0
  29. data/lib/bioinform/support/delete_many.rb +14 -0
  30. data/lib/bioinform/support/has_keys.rb +14 -0
  31. data/lib/bioinform/support/inverf.rb +13 -0
  32. data/lib/bioinform/support/partial_sums.rb +6 -0
  33. data/lib/bioinform/support/{same.rb → same_by.rb} +1 -1
  34. data/lib/bioinform/support.rb +13 -5
  35. data/lib/bioinform/version.rb +3 -3
  36. data/lib/bioinform.rb +8 -7
  37. data/spec/data_models/parser_spec.rb +46 -0
  38. data/spec/data_models/parsers/array_parser_spec.rb +53 -0
  39. data/spec/data_models/parsers/hash_parser_spec.rb +60 -0
  40. data/spec/data_models/parsers/string_fantom_parser_spec.rb +38 -0
  41. data/spec/data_models/parsers/string_parser_spec.rb +112 -0
  42. data/spec/data_models/pm_spec.rb +369 -0
  43. data/spec/data_models/pwm_spec.rb +25 -0
  44. data/spec/spec_helper.rb +30 -0
  45. data/spec/support/callable_symbol_spec.rb +66 -0
  46. data/spec/support/collect_hash_spec.rb +15 -0
  47. data/spec/support/curry_except_self_spec.rb +9 -0
  48. data/spec/support/delete_many_spec.rb +44 -0
  49. data/spec/support/has_keys_spec.rb +48 -0
  50. data/spec/support/inverf_spec.rb +19 -0
  51. data/spec/support/multiline_squish_spec.rb +11 -0
  52. data/spec/support/partial_sums_spec.rb +9 -0
  53. data/spec/support/same_by_spec.rb +36 -0
  54. metadata +60 -21
  55. data/lib/bioinform/support/pmap.rb +0 -10
  56. data/lib/bioinform/support/ptap.rb +0 -7
  57. data/spec/callable_symbol_spec.rb +0 -37
  58. data/spec/pmap_test.rb +0 -24
  59. data/spec/positional_matrix_spec.rb +0 -169
  60. data/spec/ptap_spec.rb +0 -17
  61. data/spec/same_spec.rb +0 -19
@@ -1,11 +1,40 @@
1
1
  require 'bioinform/support/curry_except_self'
2
2
 
3
+ # Useful extension for &:symbol - syntax to make it possible to pass arguments for method in block
4
+ # ['abc','','','def','ghi'].tap(&:delete.('')) # ==> ['abc','def','ghi']
5
+ # [1,2,3].map(&:to_s.(2)) # ==> ['1','10','11']
6
+ # ['abc','cdef','xy','z','wwww'].select(&:size.() == 4) # ==> ['cdef', 'wwww']
7
+ # ['abc','aaA','AaA','z'].count(&:upcase.().succ == 'AAB') # ==> 2
8
+ # [%w{1 2 3 4 5},%w{6 7 8 9}].map(&:join.().length) # ==> [5,4]
3
9
  class Symbol
4
- def call(*args)
5
- obj=Object.new.instance_exec(self,args){|sym,params| @sym=sym; @args = params; self}
6
- obj.define_singleton_method :to_proc do
7
- @sym.to_proc.curry_except_self(*@args)
10
+ def call(*args, &block)
11
+ obj=BasicObject.new.instance_exec(self,args,block) do |meth,params,block|
12
+ @postprocess_meth = [meth]
13
+ @postprocess_args = [params]
14
+ @postprocess_block = [block]
15
+ self
8
16
  end
17
+
18
+ def obj.to_proc
19
+ # proc/lambda are methods that cannot be used in BasicObject. It's possible to use ->(slf){...} syntax since ruby-1.9.3 p194 but it's too modern and not widely spreaded yet
20
+ ::Proc.new do |slf|
21
+ @postprocess_meth.zip(@postprocess_args,@postprocess_block).inject(slf) do |result,(call_meth,call_args,call_block)|
22
+ result.send(call_meth, *call_args,&call_block)
23
+ end
24
+ end
25
+ end
26
+
27
+ def obj.method_missing(meth,*args,&block)
28
+ @postprocess_meth << meth
29
+ @postprocess_args << args
30
+ @postprocess_block << block
31
+ self
32
+ end
33
+
34
+ def obj.==(other)
35
+ method_missing(:==, other)
36
+ end
37
+
9
38
  obj
10
39
  end
11
40
  end
@@ -0,0 +1,7 @@
1
+ module Enumerable
2
+ # %w{A C G T}.collect_hash{|k| [k*2, k*3] }
3
+ # # ==> {"AA" => "AAA", "CC" => "CCC", "GG" => "GGG", "TT" => "TTT"}
4
+ def collect_hash(&block)
5
+ block_given? ? Hash[ collect(&block) ] : Hash[ collect{|k,v| [k,v]} ]
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  class Proc
2
- def curry_except_self(*args)
3
- Proc.new{|slf| curry[slf,*args] }
2
+ def curry_except_self(*args, &block)
3
+ Proc.new{|slf| curry.call(slf, *args, &block) }
4
4
  end
5
5
  end
@@ -0,0 +1,5 @@
1
+ class Object
2
+ def deep_dup
3
+ Marshal.load(Marshal.dump(self))
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ class Array
2
+ def delete_at_many(*indices)
3
+ indices.uniq.sort.reverse.each{|ind| delete_at ind}
4
+ end
5
+ def delete_many(*elements)
6
+ elements.each{|el| delete el}
7
+ end
8
+ end
9
+
10
+ class Hash
11
+ def delete_many(*keys)
12
+ keys.each{|el| delete el}
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class Hash
2
+ def has_all_keys?(*keys)
3
+ keys.all?{|key| has_key? key}
4
+ end
5
+ def has_any_key?(*keys)
6
+ keys.any?{|key| has_key? key}
7
+ end
8
+ def has_none_key?(*keys)
9
+ keys.none?{|key| has_key? key}
10
+ end
11
+ def has_one_key?(*keys)
12
+ keys.one?{|key| has_key? key}
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module Math
2
+ def self.inverf(x)
3
+ sign = x < 0 ? -1 : 1
4
+ x = x.abs
5
+ a = 8 / (3*Math::PI) * (Math::PI-3) / (4-Math::PI)
6
+ part0 = ( 2/(Math::PI*a) + (Math.log(1-x*x)) / 2 )**2
7
+ part = -2 / (Math::PI * a) - Math.log(1-x*x)/2 + Math.sqrt(-1/a * Math.log(1-x*x) + part0)
8
+ sign * Math.sqrt(part)
9
+ end
10
+ def inverf(x)
11
+ Math.inverf(x)
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ class Array
2
+ def partial_sums(initial = 0.0)
3
+ sums = initial
4
+ map{|el| sums += el}
5
+ end
6
+ end
@@ -1,5 +1,5 @@
1
1
  module Enumerable
2
- def same?(&block)
2
+ def same_by?(&block)
3
3
  return true if empty?
4
4
  if block_given?
5
5
  first_result = yield(first)
@@ -1,7 +1,15 @@
1
- require 'bioinform/support/curry_except_self'
1
+ require 'active_support/core_ext/string/filters'
2
+ require 'active_support/core_ext/hash/indifferent_access'
3
+
2
4
  require 'bioinform/support/callable_symbol'
3
- require 'bioinform/support/pmap'
4
- require 'bioinform/support/ptap'
5
- require 'bioinform/support/same'
5
+ require 'bioinform/support/collect_hash'
6
+ require 'bioinform/support/curry_except_self'
7
+ require 'bioinform/support/delete_many'
8
+ require 'bioinform/support/has_keys'
9
+ require 'bioinform/support/multiline_squish'
10
+ require 'bioinform/support/same_by'
6
11
  require 'bioinform/support/yaml_dump_file'
7
- require 'bioinform/support/multiline_squish'
12
+ require 'bioinform/support/inverf'
13
+ require 'bioinform/support/deep_dup'
14
+
15
+ require 'bioinform/support/partial_sums'
@@ -1,3 +1,3 @@
1
- module Bioinform
2
- VERSION = "0.0.1"
3
- end
1
+ module Bioinform
2
+ VERSION = "0.1.0"
3
+ end
data/lib/bioinform.rb CHANGED
@@ -1,7 +1,8 @@
1
- require 'bioinform/version'
2
- require 'bioinform/support'
3
- require 'bioinform/data_models'
4
-
5
- module Bioinform
6
- # Your code goes here...
7
- end
1
+ require 'bioinform/version'
2
+ require 'bioinform/support'
3
+ require 'bioinform/data_models'
4
+ require 'bioinform/data_models/parsers'
5
+
6
+ module Bioinform
7
+ # Your code goes here...
8
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+ require 'bioinform/data_models/parser'
3
+
4
+ module Bioinform
5
+ describe PM::Parser do
6
+ include PM::Parser::Helpers
7
+
8
+ before :each do
9
+ parser_stub :ParserBad, false, { matrix: [[0,0,0,0],[1,1,1,1]], name: 'Bad' }
10
+ parser_stub :ParserGood, true, { matrix: [[1,1,1,1],[1,1,1,1]], name: 'Good' }
11
+ end
12
+ after :each do
13
+ parser_subclasses_cleanup
14
+ end
15
+
16
+ context 'when subklass created' do
17
+ it 'PM::Parser.subclasses should contain all subclasses' do
18
+ PM::Parser.subclasses.should include ParserBad
19
+ PM::Parser.subclasses.should include ParserGood
20
+ end
21
+ end
22
+
23
+ describe '#initialize' do
24
+ it 'should save argument `input`'do
25
+ parser = ParserGood.new('my stub input')
26
+ parser.input.should == 'my stub input'
27
+ end
28
+ end
29
+
30
+ describe '#parse' do
31
+ it 'should raise an error unless reimplemented' do
32
+ parser = PM::Parser.new('my stub input')
33
+ expect{ parser.parse }.to raise_error
34
+ end
35
+
36
+ context 'in a subclass' do
37
+ it '!!! USELESS TEST - see TODO and make LINT for subclasses!!! should return hash with key `matrix`' do
38
+ parser = ParserGood.new('my stub input')
39
+ parse_result = parser.parse
40
+ parse_result.should be_kind_of Hash
41
+ parse_result.should have_key :matrix
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ require 'bioinform/data_models/parsers/array_parser'
3
+
4
+ module Bioinform
5
+ describe ArrayParser do
6
+ before :each do
7
+ @matrix = [[1,4,7,10], [2,5,8,11], [3,6,9,12]]
8
+
9
+ @valid_input = [[1,4,7,10], [2,5,8,11], [3,6,9,12]]
10
+ @valid_input_transposed = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
11
+
12
+ @invalid_array_of_hashes = [{A: 1, C: 4, G: 7, T: 10}, {A: 2, C: 5, G: 8, T: 11}, {A: 3, C: 6, G: 9, T: 12}]
13
+ @invalid_input_hash = {A: [1,2,3], C: [4,5,6], G: [7,8,9], T: [10,11,12]}
14
+
15
+ @invalid_input_array_different_size = [[1,4,7,10], [2,5,8,11], [3,6]]
16
+ @invalid_input_array_transposed_different_size = [[1,2,3],[4,5,6],[7,8,9],[10]]
17
+
18
+ @invalid_not_hash_string = "1 2 3\n4 5 6\n7 8 9\n10 11 12"
19
+ @invalid_not_hash_string_transposed = "1 2 3 4\n5 6 7 8\n9 10 11 12"
20
+ end
21
+
22
+ describe '#can_parse?' do
23
+ it 'should be true for a valid array' do
24
+ ArrayParser.new(@valid_input).can_parse?.should be_true
25
+ ArrayParser.new(@valid_input_transposed).can_parse?.should be_true
26
+ end
27
+ it 'should be false for invalid input' do
28
+ ArrayParser.new(@invalid_array_of_hashes).can_parse?.should be_false
29
+ ArrayParser.new(@invalid_input_hash).can_parse?.should be_false
30
+
31
+ ArrayParser.new(@invalid_input_array_different_size).can_parse?.should be_false
32
+ ArrayParser.new(@invalid_input_array_transposed_different_size).can_parse?.should be_false
33
+
34
+ ArrayParser.new(@invalid_not_hash_string).can_parse?.should be_false
35
+ ArrayParser.new(@invalid_not_hash_string_transposed).can_parse?.should be_false
36
+ end
37
+ end
38
+ describe '#parse' do
39
+ it 'should raise an ArgumentError for invalid input' do
40
+ expect{ ArrayParser.new(@invalid_array_of_hashes).parse }.to raise_error ArgumentError
41
+ expect{ ArrayParser.new(@invalid_input_hash).parse }.to raise_error ArgumentError
42
+ expect{ ArrayParser.new(@invalid_input_array_different_size).parse }.to raise_error ArgumentError
43
+ expect{ ArrayParser.new(@invalid_input_array_transposed_different_size).parse }.to raise_error ArgumentError
44
+ expect{ ArrayParser.new(@invalid_not_hash_string).parse }.to raise_error ArgumentError
45
+ expect{ ArrayParser.new(@invalid_not_hash_string_transposed).parse }.to raise_error ArgumentError
46
+ end
47
+ it 'should return hash with `matrix` key for valid input' do
48
+ ArrayParser.new(@valid_input).parse.should == {matrix: @matrix}
49
+ ArrayParser.new(@valid_input_transposed).parse.should == {matrix: @matrix}
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+ require 'bioinform/data_models/parsers/hash_parser'
3
+
4
+ module Bioinform
5
+ describe HashParser do
6
+ before :each do
7
+ @matrix = [[1,4,7,10], [2,5,8,11], [3,6,9,12]]
8
+
9
+ @valid_input_symbolic_keys = {A: [1,2,3], C: [4,5,6], G: [7,8,9], T: [10,11,12]}
10
+ @valid_input_string_keys = {'A' => [1,2,3], 'C' => [4,5,6], 'G' => [7,8,9], 'T' => [10,11,12]}
11
+ @valid_array_of_hashes = [{A: 1, C: 4, G: 7, T: 10}, {A: 2, C: 5, G: 8, T: 11}, {A: 3, C: 6, G: 9, T: 12}]
12
+
13
+ @invalid_array_of_hashes_missing_keys = [{A: 1, C: 4, G: 7, T: 10}, {C: 5, T: 11}, {A: 3, C: 6, G: 9, T: 12}]
14
+
15
+ @invalid_input_different_length = {A: [1,2,3], C: [4,5,6], G: [7,8,9], T: [10]}
16
+ @invalid_input_not_all_keys = {A: [1,2,3], C: [4,5,6], G: [7,8,9]}
17
+
18
+ @invalid_not_hash_array = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
19
+ @invalid_not_hash_array_transposed = [[1,4,7,10], [2,5,8,11], [3,6,9,12]]
20
+
21
+ @invalid_not_hash_string = "1 2 3\n4 5 6\n7 8 9\n10 11 12"
22
+ @invalid_not_hash_string_transposed = "1 2 3 4\n5 6 7 8\n9 10 11 12"
23
+ end
24
+ describe '#can_parse?' do
25
+ it 'should be true for a valid hash or array of hashes' do
26
+ HashParser.new(@valid_input_symbolic_keys).can_parse?.should be_true
27
+ HashParser.new(@valid_input_string_keys).can_parse?.should be_true
28
+ HashParser.new(@valid_array_of_hashes).can_parse?.should be_true
29
+ end
30
+ it 'should be false for invalid input' do
31
+ HashParser.new(@invalid_array_of_hashes_missing_keys).can_parse?.should be_false
32
+ HashParser.new(@invalid_input_different_length).can_parse?.should be_false
33
+ HashParser.new(@invalid_input_not_all_keys).can_parse?.should be_false
34
+
35
+ HashParser.new(@invalid_not_hash_array).can_parse?.should be_false
36
+ HashParser.new(@invalid_not_hash_array_transposed).can_parse?.should be_false
37
+
38
+ HashParser.new(@invalid_not_hash_string).can_parse?.should be_false
39
+ HashParser.new(@invalid_not_hash_string_transposed).can_parse?.should be_false
40
+ end
41
+ end
42
+ describe '#parse' do
43
+ it 'should raise an ArgumentError for invalid input' do
44
+ expect{ HashParser.new(@invalid_input_different_length).parse }.to raise_error ArgumentError
45
+ expect{ HashParser.new(@invalid_input_not_all_keys).parse }.to raise_error ArgumentError
46
+
47
+ expect{ HashParser.new(@invalid_not_hash_array).parse }.to raise_error ArgumentError
48
+ expect{ HashParser.new(@invalid_not_hash_array_transposed).parse }.to raise_error ArgumentError
49
+
50
+ expect{ HashParser.new(@invalid_not_hash_string).parse }.to raise_error ArgumentError
51
+ expect{ HashParser.new(@invalid_not_hash_string_transposed).parse }.to raise_error ArgumentError
52
+ end
53
+ it 'should return hash with `matrix` key for valid input' do
54
+ HashParser.new(@valid_input_symbolic_keys).parse.should == {matrix: @matrix}
55
+ HashParser.new(@valid_input_string_keys).parse.should == {matrix: @matrix}
56
+ HashParser.new(@valid_array_of_hashes).parse.should == {matrix: @matrix}
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ require 'bioinform/data_models/parsers/string_fantom_parser'
3
+
4
+ module Bioinform
5
+ describe StringFantomParser do
6
+ before :each do
7
+ @matrix = [[0.0, 1878368.0, 0.0, 0.0],
8
+ [0.0, 0.0, 0.0, 1878368.0],
9
+ [469592.0, 469592.0, 469592.0, 469592.0],
10
+ [0.0, 1878368.0, 0.0, 0.0],
11
+ [1878368.0, 0.0, 0.0, 0.0],
12
+ [0.0, 0.0, 1878368.0, 0.0]]
13
+
14
+ @good_input = <<-EOS
15
+ NA motif_CTNCAG
16
+ P0 A C G T
17
+ P1 0 1878368 0 0
18
+ P2 0 0 0 1878368
19
+ P3 469592 469592 469592 469592
20
+ P4 0 1878368 0 0
21
+ P5 1878368 0 0 0
22
+ P6 0 0 1878368 0
23
+ EOS
24
+ end
25
+
26
+ describe '#can_parse?' do
27
+ it 'should parse particular kind of string' do
28
+ StringFantomParser.new(@good_input).can_parse?.should be_true
29
+ end
30
+ end
31
+
32
+ describe '#parse' do
33
+ it 'should parse particular kind of string' do
34
+ StringFantomParser.new(@good_input).parse.should == { matrix: @matrix, name: 'motif_CTNCAG'}
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+ require 'bioinform/data_models/parsers/string_parser'
3
+
4
+ module Bioinform
5
+ describe StringParser do
6
+ before :each do
7
+ @matrix = [[1.23, 4.56, 7.8, 9.0],[9.0, -8.7, 6.54, -3210.0]]
8
+
9
+ @input_with_name = <<-EOS
10
+ Testmatrix
11
+ 1.23 4.56 7.8 9.0
12
+ 9 -8.7 6.54 -3210
13
+ EOS
14
+
15
+ @input_with_name_with_introduction_sign = <<-EOS
16
+ > Testmatrix
17
+ 1.23 4.56 7.8 9.0
18
+ 9 -8.7 6.54 -3210
19
+ EOS
20
+
21
+ @input_with_name_with_special_characters = <<-EOS
22
+ Testmatrix_first:subname+sub-subname
23
+ 1.23 4.56 7.8 9.0
24
+ 9 -8.7 6.54 -3210
25
+ EOS
26
+
27
+ @input_with_tabs_and_multiple_spaces = <<-EOS
28
+ > \tTestmatrix
29
+ 1.23 \t 4.56 7.8\t\t 9.0
30
+ 9 -8.7 6.54 -3210
31
+ EOS
32
+
33
+ @input_with_windows_crlf = <<-EOS
34
+ > Testmatrix\r
35
+ 1.23 4.56 7.8 9.0
36
+ 9 -8.7 6.54 -3210\r
37
+ EOS
38
+
39
+ @input_with_leading_and_finishing_spaces_and_newlines = <<-EOS
40
+ \n\n
41
+ \t1.23 4.56 7.8 9.0
42
+ 9 -8.7 6.54 -3210
43
+ \t\r\n\t\n
44
+ EOS
45
+
46
+ @input_without_name = <<-EOS
47
+ 1.23 4.56 7.8 9.0
48
+ 9 -8.7 6.54 -3210
49
+ EOS
50
+
51
+ @input_transposed = <<-EOS
52
+ 1.23 9
53
+ 4.56 -8.7
54
+ 7.8 6.54
55
+ 9.0 -3210
56
+ EOS
57
+
58
+ @bad_input_not_numeric = <<-EOS
59
+ 1.23 4.56 aaa 9.0
60
+ 9 -8.7 6.54 -3210
61
+ EOS
62
+
63
+ @bad_input_different_row_size = <<-EOS
64
+ 1.23 4.56 7.8
65
+ 9 -8.7 6.54 -3210
66
+ EOS
67
+
68
+ @bad_input_not_4_rows_and_cols = <<-EOS
69
+ 1.23 4.56 7.8
70
+ 9 -8.7 6.54
71
+ 10 2 10
72
+ 4 5 6
73
+ 1 1 1
74
+ EOS
75
+ end
76
+
77
+ describe '#can_parse?' do
78
+ it 'should return true for valid input string' do
79
+ StringParser.new(@input_with_name).can_parse?.should be_true
80
+ StringParser.new(@input_with_name_with_introduction_sign).can_parse?.should be_true
81
+ StringParser.new(@input_with_name_with_special_characters).can_parse?.should be_true
82
+ StringParser.new(@input_with_tabs_and_multiple_spaces).can_parse?.should be_true
83
+ StringParser.new(@input_with_windows_crlf).can_parse?.should be_true
84
+ StringParser.new(@input_with_leading_and_finishing_spaces_and_newlines).can_parse?.should be_true
85
+ StringParser.new(@input_without_name).can_parse?.should be_true
86
+ StringParser.new(@input_transposed).can_parse?.should be_true
87
+ end
88
+ it 'should return false for invalid input string' do
89
+ StringParser.new(@bad_input_not_numeric).can_parse?.should be_false
90
+ StringParser.new(@bad_input_different_row_size).can_parse?.should be_false
91
+ StringParser.new(@bad_input_not_4_rows_and_cols).can_parse?.should be_false
92
+ end
93
+ end
94
+ describe '#parse' do
95
+ it 'should return a hash with matrix and possibly name keys for valid input string' do
96
+ StringParser.new(@input_with_name).parse.should == {matrix: @matrix, name: 'Testmatrix'}
97
+ StringParser.new(@input_with_name_with_introduction_sign).parse.should == {matrix: @matrix, name: 'Testmatrix'}
98
+ StringParser.new(@input_with_name_with_special_characters).parse.should == {matrix: @matrix, name: 'Testmatrix_first:subname+sub-subname'}
99
+ StringParser.new(@input_with_tabs_and_multiple_spaces).parse.should == {matrix: @matrix, name: 'Testmatrix'}
100
+ StringParser.new(@input_with_windows_crlf).parse.should == {matrix: @matrix, name: 'Testmatrix'}
101
+ StringParser.new(@input_with_leading_and_finishing_spaces_and_newlines).parse.should == {matrix: @matrix}
102
+ StringParser.new(@input_without_name).parse.should == {matrix: @matrix}
103
+ StringParser.new(@input_transposed).parse.should == {matrix: @matrix}
104
+ end
105
+ it 'should raise an error for invalid input string' do
106
+ expect{ StringParser.new(@bad_input_not_numeric).parse }.to raise_error ArgumentError
107
+ expect{ StringParser.new(@bad_input_different_row_size).parse }.to raise_error ArgumentError
108
+ expect{ StringParser.new(@bad_input_not_4_rows_and_cols).parse }.to raise_error ArgumentError
109
+ end
110
+ end
111
+ end
112
+ end