constants 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.
@@ -0,0 +1,77 @@
1
+ require File.join(File.dirname(__FILE__), '../constants_test_helper.rb')
2
+ require 'constants/constant'
3
+
4
+ class ConstantTest < Test::Unit::TestCase
5
+ include Constants
6
+
7
+ #
8
+ # parse test
9
+ #
10
+
11
+ def test_parse_documentation
12
+ assert_equal [1.0, 0.2], Constant.parse("1.0(2)").to_a
13
+ assert_equal [1.0078250321, 1/2500000000], Constant.parse("1.007 825 032 1(4)").to_a
14
+ assert_equal [6.62606896, nil], Constant.parse("6.626 068 96").to_a
15
+ end
16
+
17
+ def test_parse
18
+ assert_equal [1.0, nil], Constant.parse("1.0").to_a
19
+ assert_equal [1.0, 0], Constant.parse("1.0(0)").to_a
20
+ assert_equal [1.0, 0.1], Constant.parse("1.0(1)").to_a
21
+ assert_equal [100, 1], Constant.parse("100(1)").to_a
22
+ assert_equal [100, 11], Constant.parse("100(11)").to_a
23
+ assert_equal [1234.54789, 0.00011], Constant.parse("1234.54789(11)").to_a
24
+ assert_equal [1234.54789, 0.00011], Constant.parse("1234.547 89 (11)").to_a
25
+ assert_equal [1000, 100], Constant.parse("1.0(1)e3").to_a
26
+ assert_equal [0.001, 0.0001], Constant.parse("1.0(1)e-3").to_a
27
+ end
28
+
29
+ #
30
+ # == test
31
+ #
32
+
33
+ def test_equal_compares_Numerics_with_value
34
+ c = Constant.new(1.23)
35
+ assert c == 1.23
36
+ assert c != 1.24
37
+
38
+ assert_equal 1.23, c
39
+ assert_not_equal 1.24, c
40
+ end
41
+
42
+ def test_equal_compares_non_Numerics_directly
43
+ c1 = Constant.new(1.23)
44
+ c2 = Constant.new(1.23)
45
+ c3 = Constant.new(1.24)
46
+
47
+ assert c1 == c2
48
+ assert c1 != c3
49
+ end
50
+
51
+ #
52
+ # <=> test
53
+ #
54
+
55
+ def test_compare_compares_on_value
56
+ c1 = Constant.new(1.23)
57
+ c2 = Constant.new(1.23)
58
+ c3 = Constant.new(1.24)
59
+
60
+ assert_equal 0, c1 <=> c2
61
+ assert_equal -1, c1 <=> c3
62
+ assert_equal 1, c3 <=> c1
63
+ end
64
+
65
+ #
66
+ # to_a test
67
+ #
68
+
69
+ def test_to_a_returns_value_uncertainty_array
70
+ c = Constant.new(1.23)
71
+ assert_equal [1.23, nil], c.to_a
72
+
73
+ c = Constant.new(1.23, nil, 0.03)
74
+ assert_equal [1.23, 0.03], c.to_a
75
+ end
76
+
77
+ end
@@ -0,0 +1,207 @@
1
+ require File.join(File.dirname(__FILE__), '../../constants_test_helper.rb')
2
+ require 'constants/libraries/element'
3
+
4
+ class ElementTest < Test::Unit::TestCase
5
+ include Constants::Libraries
6
+
7
+ #
8
+ # documentation test
9
+ #
10
+
11
+ def test_documentation
12
+ e = Element::He
13
+ assert_equal "Helium", e.name
14
+ assert_equal "He", e.symbol
15
+ assert_equal 2, e.atomic_number
16
+ assert_equal 4.0026032497, e.mass
17
+ assert_equal [3, 4], e.isotopes
18
+ assert_equal [0.000137, 99.999863], e.abundances
19
+ end
20
+
21
+ #
22
+ # initialize test
23
+ #
24
+
25
+ def test_initialize
26
+ c = Element::C
27
+
28
+ assert_equal "C", c.symbol
29
+ assert_equal "Carbon", c.name
30
+ assert_equal 6, c.atomic_number
31
+ assert_equal [12, 13], c.isotopes
32
+ assert_equal [[12.0, 0], [13.0033548378, 0.000000001]], c.masses.collect {|m| m.to_a}
33
+ assert_equal [[98.93, 0.08], [1.07, 0.08]], c.abundances.collect {|m| m.to_a}
34
+ assert_equal 0, c.index_max_abundance
35
+ end
36
+
37
+ #
38
+ # lookup test
39
+ #
40
+
41
+ def test_lookup
42
+ c = Element::C
43
+ assert_equal c, Element['C']
44
+ assert_equal c, Element['Carbon']
45
+ assert_equal c, Element[6]
46
+ end
47
+
48
+ def test_lookup_is_nil_for_undefined_elements
49
+ assert_nil Element['Q']
50
+ assert_nil Element["Madeupium"]
51
+ assert_nil Element[102]
52
+ end
53
+
54
+ #
55
+ # methods test
56
+ #
57
+
58
+ def test_has_isotope?
59
+ assert Element::C.has_isotope?(12)
60
+ assert Element::C.has_isotope?(13)
61
+ assert !Element::C.has_isotope?(8)
62
+ end
63
+
64
+ def test_index_isotope
65
+ assert_equal 0, Element::C.index_isotope(12)
66
+ assert_equal 1, Element::C.index_isotope(13)
67
+ assert_equal nil, Element::C.index_isotope(8)
68
+ end
69
+
70
+ def test_mass
71
+ assert_equal 12, Element::C.mass
72
+ assert_equal 12, Element::C.mass(12)
73
+ assert_equal 13.0033548378, Element::C.mass(13)
74
+ assert_equal nil, Element::C.mass(8)
75
+ end
76
+
77
+ def test_abundance
78
+ assert_equal 98.93, Element::C.abundance
79
+ assert_equal 98.93, Element::C.abundance(12)
80
+ assert_equal 1.07, Element::C.abundance(13)
81
+ assert_equal nil, Element::C.abundance(8)
82
+ end
83
+
84
+ # vs the Proteome Commons Atom Reference, 2008-01-11
85
+ # http://www.proteomecommons.org/archive/1129086318745/docs/atom-reference.html
86
+ #
87
+ # The website states 'These values are taken from the NIST's list, http://physics.nist.gov'
88
+ def test_mass_values_vs_proteome_commons
89
+ str = %Q{
90
+ H 1.0078250321 0.999885
91
+ H2 2.014101778 1.15E-4
92
+ O 15.9949146221 0.9975700000000001
93
+ O17 16.9991315 3.7999999999999997E-4
94
+ O18 17.9991604 0.0020499999999999997
95
+ N14 14.0030740052 0.9963200000000001
96
+ N15 15.0001088984 0.00368
97
+ C12 12.0 0.9893000000000001
98
+ C13 13.0033548378 0.010700000000000001
99
+ P31 30.97376151 1.0
100
+ S32 31.97207069 0.9493
101
+ S33 32.9714585 0.0076
102
+ S34 33.96786683 0.0429
103
+ S36 35.96708088 2.0E-4}
104
+
105
+ atoms = str.split(/\n/)
106
+ atoms.each do |atom_str|
107
+ next if atom_str.empty?
108
+
109
+ name, mass, abundance = atom_str.split(/\s+/)
110
+ name =~ /(\w)(\d*)/
111
+ symbol = $1
112
+ isotope = $2.empty? ? nil : $2.to_i
113
+ mass = mass.to_f
114
+ abundance = abundance.to_f * 100
115
+
116
+ element = Element[symbol]
117
+ assert_not_nil element, atom_str
118
+ assert element.has_isotope?(isotope), atom_str unless isotope == nil
119
+
120
+ assert_in_delta mass, element.mass(isotope), delta_mass, atom_str
121
+ assert_in_delta abundance, element.abundance(isotope), delta_abundance, atom_str
122
+ end
123
+ end
124
+
125
+ # vs the Unimod Symbols and Mass Values, 2008-01-11
126
+ # http://www.unimod.org/masses.html
127
+ #
128
+ # The website states 'All mass values in Unimod are calculated
129
+ # from the IUPAC atomic weights and isotopic abundances
130
+ # tabulated by WebElements'
131
+ #
132
+ def test_mass_values_vs_unimod
133
+ str = %Q{
134
+ H Hydrogen 1.007825035 1.00794
135
+ 2H Deuterium 2.014101779 2.014101779
136
+ Li Lithium 7.016003 6.941
137
+ C Carbon 12 12.0107
138
+ 13C Carbon13 13.00335483 13.00335483
139
+ N Nitrogen 14.003074 14.0067
140
+ 15N Nitrogen15 15.00010897 15.00010897
141
+ O Oxygen 15.99491463 15.9994
142
+ 18O Oxygen18 17.9991603 17.9991603
143
+ F Fluorine 18.99840322 18.9984032
144
+ Na Sodium 22.9897677 22.98977
145
+ P Phosphorous 30.973762 30.973761
146
+ S Sulfur 31.9720707 32.065
147
+ Cl Chlorine 34.96885272 35.453
148
+ K Potassium 38.9637074 39.0983
149
+ Ca Calcium 39.9625906 40.078
150
+ Fe Iron 55.9349393 55.845
151
+ Ni Nickel 57.9353462 58.6934
152
+ Cu Copper 62.9295989 63.546
153
+ Zn Zinc 63.9291448 65.409
154
+ Br Bromine 78.9183361 79.904
155
+ Se Selenium 79.9165196 78.96
156
+ Mo Molybdenum 97.9054073 95.94
157
+ Ag Silver 106.905092 107.8682
158
+ I Iodine 126.904473 126.90447
159
+ Au Gold 196.966543 196.96655
160
+ Hg Mercury 201.970617 200.59}
161
+
162
+ atoms = str.split(/\n/)
163
+ atoms.each do |atom_str|
164
+ next if atom_str.empty?
165
+
166
+ symbol, name, monoisotopic, average = atom_str.split(/\s+/)
167
+ symbol =~ /(\d*)(\w+)/
168
+ isotope = $1.empty? ? nil : $1.to_i
169
+ symbol = $2
170
+ monoisotopic = monoisotopic.to_f
171
+ average = average.to_f
172
+
173
+ element = Element[symbol]
174
+ assert_not_nil element, atom_str
175
+ assert element.has_isotope?(isotope), atom_str unless isotope == nil
176
+
177
+ assert_in_delta monoisotopic, element.mass(isotope), delta_mass, atom_str
178
+ # TODO -- check average mass
179
+ end
180
+ end
181
+
182
+ # vs the VG Analytical Organic Mass Spectrometry reference, reference date unknown (prior to 2005)
183
+ # the data from the data sheet was copied manually to doc/VG Analytical DataSheet.txt
184
+ def test_mass_values_vs_vg_analytical
185
+ str = %Q{
186
+ H 1.0078250 1.00794
187
+ C 12 12.011
188
+ N 14.0030740 14.0067
189
+ O 15.9949146 15.9994
190
+ S 31.9720718 32.06}
191
+
192
+ atoms = str.split(/\n/)
193
+ atoms.each do |atom_str|
194
+ next if atom_str.empty?
195
+
196
+ symbol, monoisotopic, average = atom_str.split(/\s+/)
197
+ monoisotopic = monoisotopic.to_f
198
+ average = average.to_f
199
+
200
+ element = Element[symbol]
201
+ assert_not_nil element, atom_str
202
+ assert_in_delta monoisotopic, element.mass, delta_mass, atom_str
203
+ # TODO -- check average mass
204
+ end
205
+ end
206
+
207
+ end
@@ -0,0 +1,43 @@
1
+ require File.join(File.dirname(__FILE__), '../../constants_test_helper.rb')
2
+ require 'constants/libraries/particle'
3
+
4
+ class ParticleTest < Test::Unit::TestCase
5
+ include Constants::Libraries
6
+
7
+ #
8
+ # initialize test
9
+ #
10
+
11
+ def test_initialize
12
+ c = Particle::CHARM
13
+
14
+ assert_equal "Charm", c.name
15
+ assert_equal "Fermion", c.family
16
+ assert_equal "Quark", c.group
17
+ assert_equal "Second", c.generation
18
+ assert_equal 2.0/3, c.charge
19
+ assert_equal 0.5, c.spin
20
+
21
+ t = Particle::ANTITAU
22
+
23
+ assert_equal "Anti-Tau", t.name
24
+ assert_equal "Fermion", t.family
25
+ assert_equal "Lepton", t.group
26
+ assert_equal "Third", t.generation
27
+ assert_equal -1, t.charge
28
+ assert_equal 0.5, t.spin
29
+ end
30
+
31
+ #
32
+ # lookup test
33
+ #
34
+
35
+ def test_lookup
36
+ c = Particle::CHARM
37
+ assert_equal c, Particle['Charm']
38
+ end
39
+
40
+ def test_lookup_is_nil_for_undefined_particles
41
+ assert_nil Particle['Blop']
42
+ end
43
+ end
@@ -0,0 +1,32 @@
1
+ require File.join(File.dirname(__FILE__), '../../constants_test_helper.rb')
2
+ require 'constants/libraries/physical'
3
+
4
+ class PhysicalTest < Test::Unit::TestCase
5
+ include Constants::Libraries
6
+
7
+ #
8
+ # initialize test
9
+ #
10
+
11
+ def test_initialize
12
+ c = Physical::SPEED_OF_LIGHT_IN_VACUUM
13
+
14
+ assert_equal "speed of light in vacuum", c.name
15
+ assert_equal 299792458, c.value
16
+ assert_equal 0, c.uncertainty
17
+ assert_equal Unit.new("m/s"), c.unit
18
+ end
19
+
20
+ #
21
+ # lookup test
22
+ #
23
+
24
+ def test_lookup
25
+ c = Physical::SPEED_OF_LIGHT_IN_VACUUM
26
+ assert_equal c, Physical["speed of light in vacuum"]
27
+ end
28
+
29
+ def test_lookup_is_nil_for_undefined_constants
30
+ assert_nil Physical["made up blah in a blah"]
31
+ end
32
+ end
@@ -0,0 +1,125 @@
1
+ require File.join(File.dirname(__FILE__), '../constants_test_helper.rb')
2
+ require 'constants/library'
3
+
4
+ class Constants::LibraryTest < Test::Unit::TestCase
5
+ include Constants
6
+
7
+ #
8
+ # documentation test
9
+ #
10
+
11
+ module Color
12
+ RED = 'red'
13
+ GREEN = 'green'
14
+ BLUE = 'blue'
15
+ GREY = 'grey'
16
+
17
+ include Constants::Library
18
+ library.index_by('name') {|c| c }
19
+ end
20
+
21
+ def test_documentation
22
+ ###
23
+ assert_equal({
24
+ 'red' => Color::RED,
25
+ 'blue' => Color::BLUE,
26
+ 'green' => Color::GREEN,
27
+ 'grey' => Color::GREY},
28
+ Color.index('name'))
29
+
30
+ assert_equal Color::RED, Color['red']
31
+
32
+ ###
33
+ Color.library.index_by_attribute 'length'
34
+ const_ordered_assert_equal({
35
+ 3 => Color::RED,
36
+ 4 => [Color::BLUE, Color::GREY],
37
+ 5 => Color::GREEN},
38
+ Color.index('length'))
39
+
40
+ const_ordered_assert_equal [Color::BLUE, Color::GREY], Color[4]
41
+
42
+ ###
43
+ Color.library.collect('gstar') {|c| c =~ /^g/ ? c : nil }
44
+ const_ordered_assert_equal [Color::GREEN, Color::GREY], Color.collection('gstar')
45
+
46
+ Color.library.collect_attribute 'length'
47
+ const_ordered_assert_equal [3,5,4,4], Color.collection('length')
48
+
49
+ ###
50
+ Color.library.add('yellow')
51
+ const_ordered_assert_equal({
52
+ 3 => Color::RED,
53
+ 4 => [Color::BLUE, Color::GREY],
54
+ 5 => Color::GREEN,
55
+ 6 => 'yellow'},
56
+ Color.index('length'))
57
+
58
+ Color.module_eval %Q{
59
+ ORANGE = 'orange'
60
+ reset_library
61
+ }
62
+
63
+ const_ordered_assert_equal({
64
+ 3 => Color::RED,
65
+ 4 => [Color::BLUE, Color::GREY],
66
+ 5 => Color::GREEN,
67
+ 6 => Color::ORANGE},
68
+ Color.index('length'))
69
+ end
70
+
71
+ #
72
+ # extend test
73
+ #
74
+
75
+ module ExtendModule
76
+ end
77
+
78
+ def test_extend_initializes_library
79
+ ExtendModule.extend Library
80
+ assert ExtendModule.respond_to?(:library)
81
+ assert ExtendModule.library.kind_of?(ConstantLibrary)
82
+ end
83
+
84
+ #
85
+ # include test
86
+ #
87
+
88
+ module IncludeModule
89
+ include Constants::Library
90
+ end
91
+
92
+ def test_include_initializes_library
93
+ assert IncludeModule.respond_to?(:library)
94
+ assert IncludeModule.library.kind_of?(ConstantLibrary)
95
+ end
96
+
97
+ #
98
+ # benchmark tests
99
+ #
100
+
101
+ module BenchmarkModule
102
+ include Constants::Library
103
+ A = 'A'
104
+
105
+ library.index_by("name") {|value| value}
106
+ reset_library
107
+ end
108
+
109
+ def test_access_speed
110
+ benchmark_test(24) do |x|
111
+ n = 100
112
+ x.report("#{n}k BenchmarkModule::A") do
113
+ (n*10**3).times { BenchmarkModule::A }
114
+ end
115
+
116
+ x.report("#{n}k ['A']") do
117
+ (n*10**3).times { BenchmarkModule['A'] }
118
+ end
119
+
120
+ x.report("#{n}k index('name')['A']") do
121
+ (n*10**3).times { BenchmarkModule.index('name')['A'] }
122
+ end
123
+ end
124
+ end
125
+ end