bioinform 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile +12 -0
  3. data/Guardfile +9 -0
  4. data/README.md +7 -1
  5. data/TODO.txt +8 -0
  6. data/bioinform.gemspec +7 -5
  7. data/lib/bioinform.rb +1 -0
  8. data/lib/bioinform/cli.rb +12 -3
  9. data/lib/bioinform/cli/convert_motif.rb +108 -0
  10. data/lib/bioinform/cli/merge_into_collection.rb +6 -2
  11. data/lib/bioinform/cli/pcm2pwm.rb +1 -1
  12. data/lib/bioinform/cli/split_motifs.rb +1 -1
  13. data/lib/bioinform/conversion_algorithms/pcm2ppm_converter.rb +19 -0
  14. data/lib/bioinform/conversion_algorithms/pcm2pwm_converter.rb +20 -0
  15. data/lib/bioinform/conversion_algorithms/pcm2pwm_mara_converter.rb +0 -0
  16. data/lib/bioinform/conversion_algorithms/ppm2pcm_converter.rb +0 -0
  17. data/lib/bioinform/conversion_algorithms/ppm2pwm_converter.rb +0 -0
  18. data/lib/bioinform/data_models/collection.rb +21 -35
  19. data/lib/bioinform/data_models/motif.rb +56 -0
  20. data/lib/bioinform/data_models/pcm.rb +4 -8
  21. data/lib/bioinform/data_models/pm.rb +19 -48
  22. data/lib/bioinform/data_models/pwm.rb +16 -0
  23. data/lib/bioinform/formatters.rb +2 -0
  24. data/lib/bioinform/formatters/raw_formatter.rb +41 -0
  25. data/lib/bioinform/formatters/transfac_formatter.rb +39 -0
  26. data/lib/bioinform/parsers.rb +2 -1
  27. data/lib/bioinform/parsers/jaspar_parser.rb +35 -0
  28. data/lib/bioinform/parsers/string_parser.rb +1 -1
  29. data/lib/bioinform/parsers/trivial_parser.rb +2 -1
  30. data/lib/bioinform/parsers/yaml_parser.rb +1 -1
  31. data/lib/bioinform/support.rb +2 -1
  32. data/lib/bioinform/support/parameters.rb +27 -18
  33. data/lib/bioinform/support/strip_doc.rb +9 -0
  34. data/lib/bioinform/version.rb +1 -1
  35. data/spec/cli/convert_motif_spec.rb +107 -0
  36. data/spec/cli/data/merge_into_collection/collection.yaml.result +186 -183
  37. data/spec/cli/data/merge_into_collection/collection_pwm.yaml.result +186 -183
  38. data/spec/cli/data/split_motifs/collection.yaml +184 -193
  39. data/spec/cli/shared_examples/convert_motif/motif_list_empty.rb +18 -0
  40. data/spec/cli/shared_examples/convert_motif/several_motifs_specified.rb +14 -0
  41. data/spec/cli/shared_examples/convert_motif/single_motif_specified.rb +50 -0
  42. data/spec/cli/shared_examples/convert_motif/yield_help_string.rb +5 -0
  43. data/spec/cli/shared_examples/convert_motif/yield_motif_conversion_error.rb +4 -0
  44. data/spec/data_models/collection_spec.rb +36 -34
  45. data/spec/data_models/motif_spec.rb +224 -0
  46. data/spec/data_models/pcm_spec.rb +28 -17
  47. data/spec/data_models/pm_spec.rb +83 -121
  48. data/spec/data_models/pwm_spec.rb +38 -0
  49. data/spec/fabricators/collection_fabricator.rb +2 -2
  50. data/spec/fabricators/motif_fabricator.rb +33 -0
  51. data/spec/fabricators/motif_formats_fabricator.rb +125 -0
  52. data/spec/fabricators/pcm_fabricator.rb +25 -0
  53. data/spec/fabricators/pm_fabricator.rb +10 -1
  54. data/spec/fabricators/ppm_fabricator.rb +14 -0
  55. data/spec/fabricators/pwm_fabricator.rb +16 -0
  56. data/spec/parsers/trivial_parser_spec.rb +12 -12
  57. data/spec/parsers/yaml_parser_spec.rb +11 -11
  58. data/spec/spec_helper.rb +19 -49
  59. data/spec/spec_helper_source.rb +59 -0
  60. metadata +78 -7
@@ -0,0 +1,18 @@
1
+ require_relative '../../../spec_helper'
2
+ require_relative 'yield_help_string'
3
+
4
+ shared_examples 'motif list is empty' do
5
+ context 'motif list is empty' do
6
+ Given(:motif_list) { [] }
7
+
8
+ context 'with options' do
9
+ Given(:options) { '--formatter default --silent' }
10
+ include_examples 'yield help string'
11
+ end
12
+
13
+ context 'without options' do
14
+ Given(:options){ '' }
15
+ include_examples 'yield help string'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ shared_examples 'several motifs specified' do
4
+ context 'several motifs specified' do
5
+ Given {
6
+ make_model_file(sp1_f1, 'pcm')
7
+ make_model_file(klf4_f2, 'pcm')
8
+ }
9
+ Given(:motif_list) { [sp1_f1, klf4_f2] }
10
+ Given(:model_from) { 'pcm' }
11
+ Given(:model_to) { 'pwm' }
12
+ Then { resulting_stdout.should == [sp1_f1.pwm, klf4_f2.pwm].join("\n") }
13
+ end
14
+ end
@@ -0,0 +1,50 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ shared_examples 'single motif specified' do
4
+ context 'single motif specified' do
5
+ Given {
6
+ make_model_file(sp1_f1, model_from)
7
+ }
8
+ Given(:motif_list) { [sp1_f1] }
9
+
10
+ context 'when input is a pcm' do
11
+ Given(:model_from) { 'pcm' }
12
+
13
+ context 'pwm conversion invoked' do
14
+ Given(:model_to) { 'pwm' }
15
+ Then { resulting_stdout.should == sp1_f1.pwm }
16
+ end
17
+
18
+ context 'ppm conversion invoked' do
19
+ Given(:model_to) { 'ppm' }
20
+ Then { resulting_stdout.should == sp1_f1.ppm }
21
+ end
22
+ end
23
+
24
+ context 'when input is a pwm' do
25
+ Given(:model_from) { 'pwm' }
26
+
27
+ context 'pcm conversion invoked' do
28
+ Given(:model_to) { 'pcm' }
29
+ include_examples 'yields motif conversion error'
30
+ end
31
+
32
+ context 'ppm conversion invoked' do
33
+ Given(:model_to) { 'ppm' }
34
+ include_examples 'yields motif conversion error'
35
+ end
36
+ end
37
+
38
+ context 'if there exist other files in current folder' do
39
+ Given {
40
+ make_model_file(sp1_f1, model_from)
41
+ make_model_file(klf4_f2, model_from)
42
+ }
43
+ Given(:model_from) { 'pcm' }
44
+ Given(:model_to) { 'pwm' }
45
+ Then { resulting_stdout.should == sp1_f1.pwm }
46
+ Then { resulting_stdout.should_not match(klf4_f2.pwm) }
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,5 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ shared_examples 'yield help string' do
4
+ Then { resulting_stdout.should match(/Usage:.*Options:/m) }
5
+ end
@@ -0,0 +1,4 @@
1
+ shared_examples 'yields motif conversion error' do
2
+ Then { resulting_stderr.should match "One can't convert from #{model_from} data-model to #{model_to} data-model" }
3
+ Then { resulting_stderr.should match "Error! Conversion wasn't performed" }
4
+ end
@@ -5,9 +5,9 @@ module Bioinform
5
5
  describe Collection do
6
6
  before :each do
7
7
  @collection = Collection.new(name: 'Main collection')
8
- @pm_1 = PM.new(matrix:[[1,1,1,1]],name:'Stub datamodel')
9
- @pm_2 = PM.new(matrix:[[1,2,3,4],[4,3,2,1]],name:'Second stub')
10
- @pm_3 = PM.new(matrix:[[11,12,13,14],[41,31,21,11]],name:'Third stub')
8
+ @pm_1 = Fabricate(:pm_1)
9
+ @pm_2 = Fabricate(:pm_2)
10
+ @pm_3 = Fabricate(:pm_3)
11
11
  end
12
12
  describe '#size' do
13
13
  it 'should return size of collection' do
@@ -20,51 +20,52 @@ module Bioinform
20
20
  @collection << @pm_1
21
21
  @collection << @pm_2
22
22
  @collection << @pm_3
23
- @collection.collection.map(&:first).should include(@pm_1, @pm_2, @pm_3)
23
+ @collection.should include(Motif.new(pm: @pm_1), Motif.new(pm: @pm_2), Motif.new(pm: @pm_3))
24
24
  end
25
25
  it 'should be chainable' do
26
26
  @collection << @pm_1 << @pm_2 << @pm_3
27
- @collection.collection.map(&:first).should include(@pm_1, @pm_2, @pm_3)
28
- end
29
- it 'should mark motif with name' do
30
- @collection << @pm_1 << @pm_2
31
- @pm_1.should be_tagged('Main collection')
32
- @pm_2.should be_tagged('Main collection')
33
- end
34
- it 'should mark motif with self' do
35
- @collection << @pm_1 << @pm_2
36
- @pm_1.should be_tagged(@collection)
37
- @pm_2.should be_tagged(@collection)
27
+ @collection.should include(Motif.new(pm: @pm_1), Motif.new(pm: @pm_2), Motif.new(pm: @pm_3))
38
28
  end
29
+ # it 'should mark motif with name' do
30
+ # @collection << @pm_1 << @pm_2
31
+ # @pm_1.should be_tagged('Main collection')
32
+ # @pm_2.should be_tagged('Main collection')
33
+ # end
34
+ # it 'should mark motif with self' do
35
+ # @collection << @pm_1 << @pm_2
36
+ # @pm_1.should be_tagged(@collection)
37
+ # @pm_2.should be_tagged(@collection)
38
+ # end
39
39
  end
40
40
 
41
- describe '#each_pm' do
41
+ describe '#each' do
42
42
  before :each do
43
43
  @collection << @pm_1 << @pm_2 << @pm_3
44
44
  end
45
45
  context 'with block given' do
46
- it 'should yield elements of collecton' do
47
- expect{|b| @collection.each_pm(&b)}.to yield_successive_args(@pm_1, @pm_2, @pm_3)
46
+ it 'should yield Motifs' do
47
+ expect{|b| @collection.each(&b)}.to yield_successive_args(Motif,Motif,Motif)
48
48
  end
49
49
  end
50
50
  context 'with block given' do
51
51
  it 'return an Enumerator' do
52
- @collection.each_pm.should be_kind_of(Enumerator)
52
+ @collection.each.should be_kind_of(Enumerator)
53
53
  end
54
54
  end
55
55
  end
56
- describe '#each_pcm' do
56
+
57
+ describe '#each(:pcm)' do
57
58
  before :each do
58
- @collection << @pm_1 << @pm_2 << @pm_3
59
+ @collection << @pm_1.as_pcm << @pm_2 << @pm_3.as_pcm
59
60
  end
60
61
  context 'with block given' do
61
62
  it 'should yield elements of collecton converted to pcm' do
62
- expect{|b| @collection.each_pcm(&b)}.to yield_successive_args(PCM, PCM, PCM)
63
+ expect{|b| @collection.each(:pcm, &b)}.to yield_successive_args(PCM, nil, PCM)
63
64
  end
64
65
  end
65
66
  context 'with block given' do
66
67
  it 'return an Enumerator' do
67
- @collection.each_pcm.should be_kind_of(Enumerator)
68
+ @collection.each(:pcm).should be_kind_of(Enumerator)
68
69
  end
69
70
  end
70
71
  end
@@ -72,8 +73,8 @@ module Bioinform
72
73
  describe '#+' do
73
74
  before :each do
74
75
  @collection << @pm_1 << @pm_2 << @pm_3
75
- @pm_sec_1 = PM.new(matrix: [[1,0,1,0],[0,0,0,0],[1,2,3,4]], name: 'Secondary collection matrix 1')
76
- @pm_sec_2 = PM.new(matrix: [[1,2,1,2],[0,3,6,9],[1,2,3,4]], name: 'Secondary collection matrix 2')
76
+ @pm_sec_1 = Fabricate(:pm_4)
77
+ @pm_sec_2 = Fabricate(:pm_5)
77
78
  @secondary_collection = Collection.new(name: 'Secondary collection')
78
79
  @secondary_collection << @pm_sec_1 << @pm_sec_2
79
80
  @summary_collection = @collection + @secondary_collection
@@ -81,16 +82,17 @@ module Bioinform
81
82
  it 'should create a collection consisting of all elements of both collections' do
82
83
  @summary_collection.should be_kind_of(Collection)
83
84
  @summary_collection.size.should == (@collection.size + @secondary_collection.size)
84
- @summary_collection.collection.map(&:first).should include(@pm_1, @pm_2, @pm_3, @pm_sec_1, @pm_sec_2)
85
- end
86
- it 'should leave marks on motifs' do
87
- @pm_1.should be_tagged('Main collection')
88
- @pm_sec_1.should be_tagged('Secondary collection')
89
- end
90
- it 'should not mix marks of motifs in different collections' do
91
- @pm_1.should_not be_tagged('Secondary collection')
92
- @pm_sec_1.should_not be_tagged('Main collection')
85
+ @summary_collection.should include(Motif.new(pm: @pm_1), Motif.new(pm: @pm_2), Motif.new(pm: @pm_3),
86
+ Motif.new(pm: @pm_sec_1), Motif.new(pm: @pm_sec_2))
93
87
  end
88
+ # it 'should leave marks on motifs' do
89
+ # @pm_1.should be_tagged('Main collection')
90
+ # @pm_sec_1.should be_tagged('Secondary collection')
91
+ # end
92
+ # it 'should not mix marks of motifs in different collections' do
93
+ # @pm_1.should_not be_tagged('Secondary collection')
94
+ # @pm_sec_1.should_not be_tagged('Main collection')
95
+ # end
94
96
  end
95
97
  end
96
98
  end
@@ -0,0 +1,224 @@
1
+ require_relative '../../lib/bioinform/data_models/motif'
2
+
3
+ shared_examples 'when pm is PM' do
4
+ context 'when pm-value is a PCM' do
5
+ let(:pm) { Fabricate(:pcm) }
6
+ it 'sets pcm-attribute to specified PM' do
7
+ subject.pcm.should == Fabricate(:pcm)
8
+ end
9
+ end
10
+ context 'when pm-value is a PWM' do
11
+ let(:pm) { Fabricate(:pwm) }
12
+ it 'sets pwm-attribute to specified PM' do
13
+ subject.pwm.should == Fabricate(:pwm)
14
+ end
15
+ end
16
+ context 'when pm-value is a PPM' do
17
+ let(:pm) { Fabricate(:ppm) }
18
+ it 'sets ppm-attribute to specified PM' do
19
+ subject.ppm.should == Fabricate(:ppm)
20
+ end
21
+ end
22
+ context 'when pm-value is a PM' do
23
+ let(:pm) { Fabricate(:pm) }
24
+ it 'sets only parameter pm attribute to specified PM' do
25
+ subject.parameters.pm.should == Fabricate(:pm)
26
+ subject.pcm.should be_nil
27
+ subject.pwm.should be_nil
28
+ subject.ppm.should be_nil
29
+ end
30
+ end
31
+ end
32
+
33
+
34
+ module Bioinform
35
+ describe Motif do
36
+ describe '.new' do
37
+ it 'accepts empty argument list' do
38
+ expect{ described_class.new }.to_not raise_error
39
+ end
40
+
41
+ context 'when argument is a Hash' do
42
+ subject{ described_class.new(hash) }
43
+ context 'which contains usual symbolic parameters' do
44
+ let(:hash){ {:a => 123, :key => 'value', :threshold => {0.1 => 15} } }
45
+ it 'sets its content as parameters' do
46
+ subject.parameters.a.should == 123
47
+ subject.parameters.key.should == 'value'
48
+ subject.parameters.threshold.should == {0.1 => 15}
49
+ end
50
+ end
51
+ context 'which contains any combination of :pwm, :pcm and :ppm keys' do
52
+ let(:hash) { {pcm: 'my_pcm', ppm: 'my_ppm'} }
53
+ it 'sets corresponding attributes to specified values' do
54
+ subject.pcm.should == 'my_pcm'
55
+ subject.ppm.should == 'my_ppm'
56
+ end
57
+ end
58
+ end
59
+
60
+ context 'when argument is a Hash with pm-key' do
61
+ subject{ described_class.new(pm: pm) }
62
+
63
+ include_examples 'when pm is PM'
64
+
65
+ context 'when pm-value is a usual object' do
66
+ let(:pm) { 'stub pm' }
67
+ it 'sets only parameter pm attribute to specified value' do
68
+ subject.parameters.pm.should == 'stub pm'
69
+ subject.pcm.should be_nil
70
+ subject.pwm.should be_nil
71
+ subject.ppm.should be_nil
72
+ end
73
+ end
74
+ end
75
+ context 'when argument is neither PM nor Hash' do
76
+ it 'raises ArgumentError' do
77
+ expect{ described_class.new('stub pm') }.to raise_error(ArgumentError)
78
+ end
79
+ end
80
+ end
81
+
82
+ ########################################################
83
+ describe '#pcm' do
84
+ subject { motif.pcm }
85
+ context 'when pcm is set' do
86
+ context 'when pwm and ppm aren\'t setted' do
87
+ let(:motif) { Fabricate(:motif_pcm) }
88
+ it 'returns setted pcm' do
89
+ subject.should == Fabricate(:pcm)
90
+ end
91
+ end
92
+ context 'when ppm also setted' do
93
+ let(:motif) { Fabricate(:motif_pcm_and_ppm) }
94
+ it 'returns setted pcm' do
95
+ subject.should == Fabricate(:pcm)
96
+ end
97
+ end
98
+ context 'when pwm also setted' do
99
+ let(:motif) { Fabricate(:motif_pcm_and_pwm) }
100
+ it 'returns setted pcm' do
101
+ subject.should == Fabricate(:pcm)
102
+ end
103
+ end
104
+ end
105
+
106
+ context 'when pcm isn\'t set' do
107
+ context 'when nothing set' do
108
+ let(:motif) { Fabricate(:motif) }
109
+ it 'returns nil' do
110
+ subject.should be_nil
111
+ end
112
+ end
113
+ context 'when pwm setted' do
114
+ let(:motif) { Fabricate(:motif_pwm) }
115
+ it 'returns nil' do
116
+ subject.should be_nil
117
+ end
118
+ end
119
+ context 'when ppm setted' do
120
+ let(:motif) { Fabricate(:motif_ppm) }
121
+ it 'returns nil' do
122
+ subject.should be_nil
123
+ end
124
+ end
125
+ end
126
+ end
127
+ ############################################
128
+ describe '#pwm' do
129
+ subject { motif.pwm }
130
+ context 'when pwm is set' do
131
+ context 'when pcm and ppm aren\'t setted' do
132
+ let(:motif) { Fabricate(:motif_pwm) }
133
+ it 'returns setted pwm' do
134
+ subject.should == Fabricate(:pwm)
135
+ end
136
+ end
137
+ context 'when ppm also setted' do
138
+ let(:motif) { Fabricate(:motif_pwm_and_ppm) }
139
+ it 'returns setted pwm' do
140
+ subject.should == Fabricate(:pwm)
141
+ end
142
+ end
143
+ context 'when pcm also setted' do
144
+ let(:motif) { Fabricate(:motif_pcm_and_pwm) }
145
+ it 'returns setted pwm' do
146
+ subject.should == Fabricate(:pwm)
147
+ end
148
+ end
149
+ end
150
+
151
+ context 'when pwm isn\'t set' do
152
+ context 'when nothing set' do
153
+ let(:motif) { Fabricate(:motif) }
154
+ it 'returns nil' do
155
+ subject.should be_nil
156
+ end
157
+ end
158
+ context 'when pcm setted' do
159
+ let(:motif) { Fabricate(:motif_pcm) }
160
+ it 'returns pcm converted to pwm' do
161
+ subject.should == Fabricate(:pwm_by_pcm)
162
+ end
163
+ end
164
+ context 'when ppm setted' do
165
+ let(:motif) { Fabricate(:motif_ppm) }
166
+ it 'returns nil' do
167
+ subject.should be_nil
168
+ end
169
+ end
170
+ end
171
+ end
172
+
173
+ ############################################
174
+ describe '#ppm' do
175
+ subject { motif.ppm }
176
+ context 'when ppm is set' do
177
+ context 'when pcm and pwm aren\'t setted' do
178
+ let(:motif) { Fabricate(:motif_ppm) }
179
+ it 'returns setted ppm' do
180
+ subject.should == Fabricate(:ppm)
181
+ end
182
+ end
183
+ context 'when pcm also setted' do
184
+ let(:motif) { Fabricate(:motif_pcm_and_ppm) }
185
+ it 'returns setted ppm' do
186
+ subject.should == Fabricate(:ppm)
187
+ end
188
+ end
189
+ context 'when pwm also setted' do
190
+ let(:motif) { Fabricate(:motif_pwm_and_ppm) }
191
+ it 'returns setted ppm' do
192
+ subject.should == Fabricate(:ppm)
193
+ end
194
+ end
195
+ end
196
+
197
+ context 'when ppm isn\'t set' do
198
+ context 'when nothing set' do
199
+ let(:motif) { Fabricate(:motif) }
200
+ it 'returns nil' do
201
+ subject.should be_nil
202
+ end
203
+ end
204
+ context 'when pcm setted' do
205
+ let(:motif) { Fabricate(:motif_pcm) }
206
+ it 'returns pcm converted to ppm' do
207
+ subject.should == Fabricate(:ppm_by_pcm)
208
+ end
209
+ end
210
+ context 'when pwm setted' do
211
+ let(:motif) { Fabricate(:motif_pwm) }
212
+ it 'returns nil' do
213
+ subject.should be_nil
214
+ end
215
+ end
216
+ end
217
+ end
218
+
219
+
220
+
221
+
222
+
223
+ end
224
+ end
@@ -5,38 +5,49 @@ module Bioinform
5
5
  describe PCM do
6
6
  describe '#count' do
7
7
  it 'should be equal to sum of elements at position' do
8
- PCM.new([[1, 2, 3, 1],[4, 0, 1, 2]]).count.should == 7
9
- PCM.new([[1, 2.3, 3.2, 1],[4.4, 0.1, 1, 2]]).count.should == 7.5
8
+ Fabricate(:pcm).count.should == 7
9
+ Fabricate(:pcm_with_floats).count.should == 7.5
10
10
  end
11
11
  end
12
12
 
13
13
  describe '#to_pwm' do
14
+ subject{ Fabricate(:pcm) }
14
15
  it 'should return PWM' do
15
- PCM.new([[1, 2, 3, 1],[4, 0, 1, 2]]).to_pwm.should be_kind_of(PWM)
16
+ Fabricate(:pcm).to_pwm.should be_kind_of(PWM)
16
17
  end
17
18
  it 'should make transformation: el --> log( (el + p_i*pseudocount) / (p_i*(count + pseudocount)) )' do
18
- PCM.new([[1, 2, 3, 1],[4, 0, 1, 2]]).to_pwm(1).matrix.map{|line|line.map{|el| el.round(3)}}.should == [[-0.47, 0.118, 0.486, -0.47],[0.754, -2.079, -0.47, 0.118]]
19
- PCM.new([[1, 2, 3, 1],[4, 0, 1, 2]]).to_pwm(10).matrix.map{|line|line.map{|el| el.round(3)}}.should == [[-0.194, 0.057, 0.258, -0.194],[0.425, -0.531, -0.194, 0.057]]
19
+ subject.to_pwm(1).matrix.map{|line|line.map{|el| el.round(3)}}.should == Fabricate(:rounded_upto_3_digits_pwm_by_pcm_with_pseudocount_1).matrix
20
+ subject.to_pwm(10).matrix.map{|line|line.map{|el| el.round(3)}}.should == Fabricate(:rounded_upto_3_digits_pwm_by_pcm_with_pseudocount_10).matrix
20
21
  end
21
22
  it 'should use default pseudocount equal to log(count)' do
22
- PCM.new([[1, 2, 3, 1],[4, 0, 1, 2]]).to_pwm.should == PCM.new([[1, 2, 3, 1],[4, 0, 1, 2]]).to_pwm(Math.log(7))
23
+ Fabricate(:pcm).to_pwm.should == Fabricate(:pcm).to_pwm(Math.log(7))
23
24
  end
24
25
  it 'should preserve name' do
25
- PCM.new(matrix: [[1, 2, 3, 1],[4, 0, 1, 2]], name: nil).to_pwm.name.should be_nil
26
- PCM.new(matrix: [[1, 2, 3, 1],[4, 0, 1, 2]], name: 'Stub name').to_pwm.name.should == 'Stub name'
26
+ Fabricate(:pcm, name: nil).to_pwm.name.should be_nil
27
+ Fabricate(:pcm, name: 'Stub name').to_pwm.name.should == 'Stub name'
27
28
  end
28
29
  end
29
30
 
30
31
  describe '#to_ppm' do
31
- it 'should return PPM' do
32
- PCM.new([[1, 2, 3, 1],[4, 0, 1, 2]]).to_ppm.should be_kind_of(PPM)
33
- end
34
- it 'should make transformation el --> el / count' do
35
- PCM.new([[1, 2, 3, 1],[4, 0, 1, 2]]).to_ppm.should == PPM.new([[1.0/7, 2.0/7, 3.0/7, 1.0/7],[4.0/7, 0.0/7, 1.0/7, 2.0/7]])
36
- end
37
- it 'should preserve name' do
38
- PCM.new(matrix: [[1, 2, 3, 1],[4, 0, 1, 2]], name: nil).to_ppm.name.should be_nil
39
- PCM.new(matrix: [[1, 2, 3, 1],[4, 0, 1, 2]], name: 'Stub name').to_ppm.name.should == 'Stub name'
32
+ let(:pcm_motif) { Fabricate(:pcm) }
33
+ context 'returned object' do
34
+ subject{ pcm_motif.to_ppm }
35
+ it { should be_kind_of(PPM)}
36
+ it 'should have matrix transformed with el --> el / count' do
37
+ subject.matrix.should == Fabricate(:ppm_pcm_divided_by_count).matrix
38
+ end
39
+ context 'when source PCM name is absent' do
40
+ let(:pcm_motif) { Fabricate(:pcm, name: nil) }
41
+ it 'should have no name' do
42
+ subject.name.should be_nil
43
+ end
44
+ end
45
+ context 'when source PCM has name' do
46
+ let(:pcm_motif) { Fabricate(:pcm, name: 'Stub-name') }
47
+ it 'should has the same name' do
48
+ subject.name.should == 'Stub-name'
49
+ end
50
+ end
40
51
  end
41
52
  end
42
53