sy 2.0.2 → 2.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sy.rb +8 -4
- data/lib/sy/absolute_magnitude.rb +10 -11
- data/lib/sy/composition.rb +23 -10
- data/lib/sy/dimension.rb +0 -1
- data/lib/sy/expressible_in_units.rb +0 -1
- data/lib/sy/fixed_assets_of_the_module.rb +0 -1
- data/lib/sy/imperial.rb +2 -0
- data/lib/sy/magnitude.rb +21 -21
- data/lib/sy/mapping.rb +103 -50
- data/lib/sy/measure.rb +135 -0
- data/lib/sy/quantity.rb +112 -107
- data/lib/sy/signed_magnitude.rb +5 -5
- data/lib/sy/unit.rb +12 -18
- data/lib/sy/version.rb +1 -1
- data/test/sy_test.rb +232 -232
- metadata +3 -2
data/lib/sy/signed_magnitude.rb
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
# Qualities specific to relative magnitudes.
|
4
4
|
#
|
5
5
|
module SY::SignedMagnitude
|
6
|
-
# Relative magnitude constructor takes :quantity (alias :of)
|
7
|
-
#
|
6
|
+
# Relative magnitude constructor takes :quantity (alias :of) argument and
|
7
|
+
# :amount argument. Amount is allowed to be negative.
|
8
8
|
#
|
9
|
-
def initialize
|
10
|
-
@quantity =
|
11
|
-
amnt =
|
9
|
+
def initialize **named_args
|
10
|
+
@quantity = named_args[:quantity] || named_args[:of]
|
11
|
+
amnt = named_args[:amount]
|
12
12
|
@amount = case amnt
|
13
13
|
when Numeric then amnt
|
14
14
|
when nil then 1
|
data/lib/sy/unit.rb
CHANGED
@@ -6,16 +6,15 @@
|
|
6
6
|
module SY::Unit
|
7
7
|
def self.pre_included target
|
8
8
|
class << target
|
9
|
-
# Overriding this method from NameMagic mixin
|
10
|
-
# subclasses
|
11
|
-
# parametrized subclass its own.
|
9
|
+
# Overriding this method from NameMagic mixin ensures, that all Unit
|
10
|
+
# subclasses use common namespace (Unit), rather than each their own.
|
12
11
|
#
|
13
12
|
def namespace
|
14
13
|
SY::Unit
|
15
14
|
end
|
16
15
|
|
17
|
-
# Tweaking instance accessor from NameMagic
|
18
|
-
# abbreviations
|
16
|
+
# Tweaking instance accessor from NameMagic to make it accept unit
|
17
|
+
# abbreviations and unit names regardless of capitalization
|
19
18
|
#
|
20
19
|
def instance arg
|
21
20
|
begin
|
@@ -101,14 +100,11 @@ module SY::Unit
|
|
101
100
|
# specified quantity. Note that :amount for standard units, if supplied, has
|
102
101
|
# special meaning of setting the relationship of that quantity.
|
103
102
|
#
|
104
|
-
def standard
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
else
|
110
|
-
qnt.new_standard_unit( args )
|
111
|
-
end
|
103
|
+
def standard( of: nil, **nn )
|
104
|
+
puts "Constructing a standard unit of #{of}." if SY::DEBUG
|
105
|
+
fail ArgumentError, ":of argument missing!" if of.nil?
|
106
|
+
qnt = SY::Quantity.instance( of )
|
107
|
+
nn.empty? ? qnt.standard_unit : qnt.new_standard_unit( **nn )
|
112
108
|
end
|
113
109
|
|
114
110
|
# Unit abbreviations as a hash of abbreviation => unit pairs.
|
@@ -165,10 +161,8 @@ module SY::Unit
|
|
165
161
|
# ambiguity with regard to standard prefixes and abbreviations thereof should
|
166
162
|
# also be avoided.
|
167
163
|
#
|
168
|
-
def initialize
|
169
|
-
|
170
|
-
@abbreviation = args.delete( :abbreviation ).to_sym
|
171
|
-
end
|
164
|
+
def initialize( short: nil, **nn )
|
165
|
+
@abbreviation = short.to_sym if short
|
172
166
|
|
173
167
|
# FIXME: Here, we would have to watch out for :amount being set
|
174
168
|
# if it is a number, amount is in standard units
|
@@ -176,7 +170,7 @@ module SY::Unit
|
|
176
170
|
# it estableshes a relationship between this and that quantity. It means that
|
177
171
|
# the unit amount automatically becomes ... one ... and such relationship can
|
178
172
|
# only be established for standard quantity
|
179
|
-
super
|
173
|
+
super( **nn )
|
180
174
|
end
|
181
175
|
|
182
176
|
# Addition: Unit is converted to a magnitude before the operation.
|
data/lib/sy/version.rb
CHANGED
data/test/sy_test.rb
CHANGED
@@ -65,17 +65,17 @@ describe SY::Dimension do
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
describe SY::
|
68
|
+
describe SY::Measure do
|
69
69
|
it "should" do
|
70
|
-
i = SY::
|
71
|
-
a, b = SY::
|
70
|
+
i = SY::Measure.identity
|
71
|
+
a, b = SY::Measure.new( ratio: 2 ), SY::Measure.new( ratio: 3 )
|
72
72
|
assert_equal 1, i.ratio
|
73
|
-
assert_equal 4, a.
|
74
|
-
assert_equal 3, b.
|
75
|
-
assert_equal 6, (a * b).
|
76
|
-
assert_equal 2, (a * b / b).
|
77
|
-
assert_equal 4, (a ** 2).
|
78
|
-
assert_equal 2, a.inverse.
|
73
|
+
assert_equal 4, a.r.( 8 )
|
74
|
+
assert_equal 3, b.w.( 1 )
|
75
|
+
assert_equal 6, (a * b).w.( 1 )
|
76
|
+
assert_equal 2, (a * b / b).w.( 1 )
|
77
|
+
assert_equal 4, (a ** 2).w.( 1 )
|
78
|
+
assert_equal 2, a.inverse.r.( 1 )
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -98,7 +98,7 @@ describe SY::Composition do
|
|
98
98
|
SY::Composition[ SY::Amount => 1, SY::Length => 1 ]
|
99
99
|
.to_quantity.dimension )
|
100
100
|
assert_equal SY.Dimension( 'L' ), l.dimension
|
101
|
-
assert_kind_of SY::
|
101
|
+
assert_kind_of SY::Measure, a.infer_measure
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
@@ -109,7 +109,7 @@ describe SY::Quantity, SY::Magnitude do
|
|
109
109
|
@amount_in_dozens = begin
|
110
110
|
SY.Quantity( "AmountInDozens" )
|
111
111
|
rescue
|
112
|
-
SY::Quantity.dimensionless
|
112
|
+
SY::Quantity.dimensionless amount: 12, ɴ: "AmountInDozens"
|
113
113
|
end
|
114
114
|
@inch_length = begin
|
115
115
|
SY.Quantity( "InchLength" )
|
@@ -129,15 +129,15 @@ describe SY::Quantity, SY::Magnitude do
|
|
129
129
|
@amount_in_dozens.must_be_kind_of SY::Quantity
|
130
130
|
d1 = @amount_in_dozens.magnitude 1
|
131
131
|
a12 = SY::Amount.magnitude 12
|
132
|
-
mda = @amount_in_dozens.
|
133
|
-
|
134
|
-
|
135
|
-
@amount_in_dozens.magnitude
|
136
|
-
|
132
|
+
mda = @amount_in_dozens.measure of: SY::Amount
|
133
|
+
r, w = mda.r, mda.w
|
134
|
+
ra = r.( a12.amount )
|
135
|
+
@amount_in_dozens.magnitude ra
|
136
|
+
ra = @amount_in_dozens.read( a12 )
|
137
137
|
assert_equal @amount_in_dozens.magnitude( 1 ),
|
138
|
-
@amount_in_dozens.
|
138
|
+
@amount_in_dozens.read( SY::Amount.magnitude( 12 ) )
|
139
139
|
assert_equal SY::Amount.magnitude( 12 ),
|
140
|
-
@amount_in_dozens.
|
140
|
+
@amount_in_dozens.write( 1, SY::Amount )
|
141
141
|
SY::Length.composition.must_equal SY::Composition.singular( :Length )
|
142
142
|
end
|
143
143
|
|
@@ -147,7 +147,7 @@ describe SY::Quantity, SY::Magnitude do
|
|
147
147
|
@inch = SY::Unit.standard( of: @inch_length, amount: 2.54.cm,
|
148
148
|
ɴ: 'inch', short: '”' )
|
149
149
|
@i1 = @inch_length.magnitude 1
|
150
|
-
@
|
150
|
+
@il_measure = @inch_length.measure( of: SY::Length )
|
151
151
|
end
|
152
152
|
|
153
153
|
it "should" do
|
@@ -155,12 +155,12 @@ describe SY::Quantity, SY::Magnitude do
|
|
155
155
|
@inch_length.colleague.name.must_equal :InchLength±
|
156
156
|
@m1.to_s.must_equal "1.m"
|
157
157
|
@i1.amount.must_equal 1
|
158
|
-
assert_kind_of SY::
|
159
|
-
assert_kind_of Numeric, @
|
160
|
-
assert_in_epsilon 0.0254, @
|
161
|
-
@
|
158
|
+
assert_kind_of SY::Measure, @il_measure
|
159
|
+
assert_kind_of Numeric, @il_measure.ratio
|
160
|
+
assert_in_epsilon 0.0254, @il_measure.ratio
|
161
|
+
@il_measure.w.( 1 ).must_be_within_epsilon 0.0254
|
162
162
|
begin
|
163
|
-
impossible_mapping = @inch_length.
|
163
|
+
impossible_mapping = @inch_length.measure( of: SY::Amount )
|
164
164
|
rescue SY::DimensionError
|
165
165
|
:dimension_error
|
166
166
|
end.must_equal :dimension_error
|
@@ -172,214 +172,214 @@ describe SY::Quantity, SY::Magnitude do
|
|
172
172
|
1.inch.in( :mm ).must_equal 25.4
|
173
173
|
end
|
174
174
|
end
|
175
|
-
end
|
176
|
-
|
177
|
-
describe "expected behavior" do
|
178
|
-
it "should" do
|
179
|
-
# Length quantity and typical units
|
180
|
-
SY::METRE.must_be_kind_of SY::Unit
|
181
|
-
SY::METRE.absolute?.must_equal true
|
182
|
-
1.metre.absolute.must_equal SY::METRE
|
183
|
-
assert 1.metre.absolute != 1.metre.relative
|
184
|
-
1.metre.relative.relative?.must_equal true
|
185
|
-
|
186
|
-
|
187
|
-
SY::METRE.relative.must_equal 1.metre
|
188
|
-
1.m.must_equal 1.metre
|
189
|
-
1.m.must_equal 1000.mm
|
190
|
-
SY::METRE.quantity.name.must_equal :Length
|
191
|
-
assert_in_delta 0.9.µm, 900.nm, 1e-6.nm
|
192
|
-
[ 1.m, 1.m ].min.must_equal 1.m
|
193
|
-
1.m + 1.m == 1.m
|
194
|
-
assert_in_epsilon 1.m, 1.m, 0.1
|
195
|
-
600.m.must_equal 0.6.km
|
196
|
-
SY::METRE.quantity.must_equal SY::Length
|
197
|
-
SY::Length.dimension.must_equal SY.Dimension( :L )
|
198
|
-
SY.Dimension( :L ).standard_quantity.must_equal SY::Length
|
199
|
-
SY::Length.standard_unit.must_equal SY::METRE
|
200
|
-
SY::METRE.amount.must_equal 1
|
201
|
-
SY::METRE.mili.amount.must_equal 0.001
|
202
|
-
3.km.in( :dm ).must_equal 30_000
|
203
|
-
( 1.m + 20.cm ).must_equal 1_200.mm
|
204
|
-
assert 1.mm.object_id != 1.mm.object_id
|
205
|
-
assert 1.mm == 1.mm
|
206
|
-
assert 1.01.m != 1.m
|
207
|
-
assert_equal 1, 1.01.m <=> 1.m
|
208
|
-
assert_equal 0, 1.00.m <=> 1.m
|
209
|
-
assert_equal -1, 0.99.m <=> 1.m
|
210
|
-
assert 0.9.mm < 1.mm
|
211
|
-
assert 1.1.mm > 1.09.mm
|
212
|
-
assert ( 0.1.m - ( 1.m - 0.9.m ) ).abs < 1.nm.abs
|
213
|
-
# Mass quantity and typical units
|
214
|
-
SY::KILOGRAM.must_be_kind_of SY::Unit
|
215
|
-
SY::GRAM.must_be_kind_of SY::Unit
|
216
|
-
assert SY::Mass.standard_unit.equal?( SY::KILOGRAM )
|
217
|
-
1.kilogram.must_be_kind_of SY::Magnitude
|
218
|
-
1.gram.must_be_kind_of SY::Magnitude
|
219
|
-
1.kilogram.absolute.quantity.must_equal SY::Mass
|
220
|
-
1.gram.absolute.quantity.must_equal SY::Mass
|
221
|
-
( SY::KILOGRAM * 1 ).must_equal SY::GRAM * 1000
|
222
|
-
1.kilogram.must_equal 1000.g
|
223
|
-
1.kg.to_f.must_equal 1
|
224
|
-
1.g.to_f.must_equal 0.001
|
225
|
-
1.miligram.must_equal 0.001.g
|
226
|
-
1.mg.must_equal 1.miligram
|
227
|
-
1.µg.must_equal 0.001.miligram
|
228
|
-
1.ng.must_equal 0.001.microgram
|
229
|
-
1.pg.quantity.must_equal 0.001.nanogram.quantity
|
230
|
-
1.pg.amount.must_be_within_epsilon 0.001.nanogram.amount, 1e-6
|
231
|
-
assert_equal 1.g, [1.g, 2.g].min
|
232
|
-
assert_equal 1.mg, 1.g * 0.001
|
233
|
-
1.pg.abs.must_be_within_epsilon 0.001.nanogram.abs, 1e-6
|
234
|
-
SY::TON.must_be_kind_of SY::Unit
|
235
|
-
1.ton.must_equal 1000.kg
|
236
|
-
1.t.must_equal 1.ton
|
237
|
-
1.kt.must_equal 1000.ton
|
238
|
-
1.Mt.must_equal 1000.kiloton
|
239
|
-
1.mm.quantity.name.must_equal :Length±
|
240
|
-
SY::Length.standard_unit.must_equal SY::METRE
|
241
|
-
SY::Length.standard_unit.name.must_equal :metre
|
242
|
-
SY::Length.standard_unit.must_equal SY::METRE
|
243
|
-
SY.Quantity( :Length ).object_id.must_equal SY::Length.object_id
|
244
|
-
SY::Length.relative.object_id.must_equal SY.Quantity( :Length± ).object_id
|
245
|
-
SY.Quantity( :Length± ).colleague.name.must_equal :Length
|
246
|
-
SY.Quantity( :Length± ).colleague.class.must_equal SY::Quantity
|
247
|
-
SY.Quantity( :Length± ).colleague.object_id.must_equal SY::Length.object_id
|
248
|
-
SY.Quantity( :Length± ).send( :Unit ).object_id
|
249
|
-
.must_equal SY::Length.send( :Unit ).object_id
|
250
|
-
1.mm.quantity.standard_unit.name.must_equal :metre
|
251
|
-
1.mm.to_s.must_equal "0.001.m"
|
252
|
-
1.mm.inspect.must_equal "#<±Magnitude: 0.001.m >"
|
253
|
-
1.µs.inspect.must_equal "#<±Magnitude: 1e-06.s >"
|
254
|
-
|
255
|
-
SY::Area.dimension.must_equal SY.Dimension( :L² )
|
256
|
-
SY::Area.composition.must_equal SY::Composition[ SY::Length => 2 ]
|
257
|
-
|
258
|
-
SY::AMPERE.name.must_equal :ampere
|
259
|
-
SY::AMPERE.abbreviation.must_equal :A
|
260
|
-
SY::AMPERE.dimension.must_equal 1.A.dimension
|
261
|
-
SY.Magnitude( of: SY::ElectricCurrent, amount: 1 ).must_equal 1.A.absolute
|
262
|
-
1.A.quantity.must_equal SY::ElectricCurrent.relative
|
263
|
-
1.A.quantity.standard_unit.name.must_equal :ampere
|
264
|
-
1.A.to_s( SY::AMPERE ).must_equal "1.A"
|
265
|
-
1.A.to_s.must_equal "1.A"
|
266
|
-
1.A.amount.must_equal 1
|
267
|
-
1.A.quantity.standard_unit.abbreviation.must_equal :A
|
268
|
-
1.A.inspect.must_equal "#<±Magnitude: 1.A >"
|
269
|
-
|
270
|
-
1.l⁻¹.reframe( SY::Molarity ).quantity.must_equal SY::Molarity
|
271
|
-
x = ( SY::Nᴀ / SY::LITRE )
|
272
|
-
x = x.reframe( SY::Molarity )
|
273
|
-
y = 1.molar.absolute
|
274
|
-
y.quantity.must_equal x.quantity
|
275
|
-
y.amount.must_equal y.amount
|
276
|
-
SY::MoleAmount.protected?.must_equal true
|
277
|
-
SY::LitreVolume.protected?.must_equal true
|
278
|
-
SY::MOLAR.quantity.name.must_equal :Molarity
|
279
|
-
m = 1.µM
|
280
|
-
1.µM.quantity.relative?.must_equal true
|
281
|
-
1.µM.quantity.name.must_equal :Molarity±
|
282
|
-
1.µM.quantity.absolute.name.must_equal :Molarity
|
283
|
-
7.µM.must_be_within_epsilon 5.µM + 2.µM, 1e-6
|
284
|
-
+1.s.must_equal 1.s
|
285
|
-
# -1.s.must_equal -1 * 1.s # must raise
|
286
|
-
assert_equal -(-(1.s)), +(1.s)
|
287
|
-
1.s⁻¹.quantity.must_equal ( 1.s ** -1 ).quantity
|
288
|
-
1.s⁻¹.quantity.must_equal ( 1 / 1.s ).quantity
|
289
|
-
1.s⁻¹.amount.must_equal ( 1.s ** -1 ).amount
|
290
|
-
1.s⁻¹.must_equal 1.s ** -1
|
291
|
-
q1 = ( 1.s⁻¹ ).quantity
|
292
|
-
q1.composition.to_hash.must_equal( { SY::Time => -1 } )
|
293
|
-
|
294
|
-
q2 = ( 1 / 1.s ).quantity
|
295
|
-
q2.composition.to_hash.must_equal( { SY::Time => -1 } )
|
296
|
-
|
297
|
-
q1.relative?.must_equal true
|
298
|
-
q2.relative?.must_equal true
|
299
|
-
|
300
|
-
q1.object_id.must_equal q2.object_id
|
301
|
-
( 1.s⁻¹ ).quantity.object_id.must_equal ( 1 / 1.s ).quantity.object_id
|
302
|
-
( 1 / 1.s ).must_equal 1.s⁻¹
|
303
|
-
1.s⁻¹.( SY::Frequency ).must_equal 1.Hz
|
304
|
-
# 7.°C.must_equal( 8.°C - 1.K )
|
305
|
-
# (-15).°C.must_equal 258.15.K
|
306
|
-
# 7000.µM.must_be_within_epsilon( 7.mM, 1e-9 )
|
307
|
-
::SY::Unit.instances.map do |i|
|
308
|
-
begin
|
309
|
-
i.abbreviation
|
310
|
-
rescue
|
311
|
-
end
|
312
|
-
end.must_include :M
|
313
|
-
SY::Unit.instance_names.must_include :mole
|
314
|
-
# Avogadro's number is defined directly in SY
|
315
|
-
1.mol.quantity.object_id.must_equal SY::Nᴀ.( SY::MoleAmount ).quantity.object_id
|
316
|
-
SY::Nᴀ.( SY::MoleAmount ).must_equal 1.mol
|
317
|
-
0.7.mol.l⁻¹.amount.must_equal 0.7
|
318
|
-
1.M.must_equal 1.mol.l⁻¹.( SY::Molarity )
|
319
|
-
# (if #reframe conversion method is not used, different quantities
|
320
|
-
# do not compare. Arithmetics is possible because Magnitude operators
|
321
|
-
# mostly give their results only in standard quantities.
|
322
|
-
|
323
|
-
# Avogadro's number is defined directly in SY
|
324
|
-
1.mol.must_equal SY::Nᴀ.unit.( SY::MoleAmount )
|
325
|
-
|
326
175
|
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
176
|
+
describe "expected behavior" do
|
177
|
+
it "should" do
|
178
|
+
# Length quantity and typical units
|
179
|
+
SY::METRE.must_be_kind_of SY::Unit
|
180
|
+
SY::METRE.absolute?.must_equal true
|
181
|
+
1.metre.absolute.must_equal SY::METRE
|
182
|
+
assert 1.metre.absolute != 1.metre.relative
|
183
|
+
1.metre.relative.relative?.must_equal true
|
184
|
+
|
185
|
+
|
186
|
+
SY::METRE.relative.must_equal 1.metre
|
187
|
+
1.m.must_equal 1.metre
|
188
|
+
1.m.must_equal 1000.mm
|
189
|
+
SY::METRE.quantity.name.must_equal :Length
|
190
|
+
assert_in_delta 0.9.µm, 900.nm, 1e-6.nm
|
191
|
+
[ 1.m, 1.m ].min.must_equal 1.m
|
192
|
+
1.m + 1.m == 1.m
|
193
|
+
assert_in_epsilon 1.m, 1.m, 0.1
|
194
|
+
600.m.must_equal 0.6.km
|
195
|
+
SY::METRE.quantity.must_equal SY::Length
|
196
|
+
SY::Length.dimension.must_equal SY.Dimension( :L )
|
197
|
+
SY.Dimension( :L ).standard_quantity.must_equal SY::Length
|
198
|
+
SY::Length.standard_unit.must_equal SY::METRE
|
199
|
+
SY::METRE.amount.must_equal 1
|
200
|
+
SY::METRE.mili.amount.must_equal 0.001
|
201
|
+
3.km.in( :dm ).must_equal 30_000
|
202
|
+
( 1.m + 20.cm ).must_equal 1_200.mm
|
203
|
+
assert 1.mm.object_id != 1.mm.object_id
|
204
|
+
assert 1.mm == 1.mm
|
205
|
+
assert 1.01.m != 1.m
|
206
|
+
assert_equal 1, 1.01.m <=> 1.m
|
207
|
+
assert_equal 0, 1.00.m <=> 1.m
|
208
|
+
assert_equal -1, 0.99.m <=> 1.m
|
209
|
+
assert 0.9.mm < 1.mm
|
210
|
+
assert 1.1.mm > 1.09.mm
|
211
|
+
assert ( 0.1.m - ( 1.m - 0.9.m ) ).abs < 1.nm.abs
|
212
|
+
# Mass quantity and typical units
|
213
|
+
SY::KILOGRAM.must_be_kind_of SY::Unit
|
214
|
+
SY::GRAM.must_be_kind_of SY::Unit
|
215
|
+
assert SY::Mass.standard_unit.equal?( SY::KILOGRAM )
|
216
|
+
1.kilogram.must_be_kind_of SY::Magnitude
|
217
|
+
1.gram.must_be_kind_of SY::Magnitude
|
218
|
+
1.kilogram.absolute.quantity.must_equal SY::Mass
|
219
|
+
1.gram.absolute.quantity.must_equal SY::Mass
|
220
|
+
( SY::KILOGRAM * 1 ).must_equal SY::GRAM * 1000
|
221
|
+
1.kilogram.must_equal 1000.g
|
222
|
+
1.kg.to_f.must_equal 1
|
223
|
+
1.g.to_f.must_equal 0.001
|
224
|
+
1.miligram.must_equal 0.001.g
|
225
|
+
1.mg.must_equal 1.miligram
|
226
|
+
1.µg.must_equal 0.001.miligram
|
227
|
+
1.ng.must_equal 0.001.microgram
|
228
|
+
1.pg.quantity.must_equal 0.001.nanogram.quantity
|
229
|
+
1.pg.amount.must_be_within_epsilon 0.001.nanogram.amount, 1e-6
|
230
|
+
assert_equal 1.g, [1.g, 2.g].min
|
231
|
+
assert_equal 1.mg, 1.g * 0.001
|
232
|
+
1.pg.abs.must_be_within_epsilon 0.001.nanogram.abs, 1e-6
|
233
|
+
SY::TON.must_be_kind_of SY::Unit
|
234
|
+
1.ton.must_equal 1000.kg
|
235
|
+
1.t.must_equal 1.ton
|
236
|
+
1.kt.must_equal 1000.ton
|
237
|
+
1.Mt.must_equal 1000.kiloton
|
238
|
+
1.mm.quantity.name.must_equal :Length±
|
239
|
+
SY::Length.standard_unit.must_equal SY::METRE
|
240
|
+
SY::Length.standard_unit.name.must_equal :metre
|
241
|
+
SY::Length.standard_unit.must_equal SY::METRE
|
242
|
+
SY.Quantity( :Length ).object_id.must_equal SY::Length.object_id
|
243
|
+
SY::Length.relative.object_id.must_equal SY.Quantity( :Length± ).object_id
|
244
|
+
SY.Quantity( :Length± ).colleague.name.must_equal :Length
|
245
|
+
SY.Quantity( :Length± ).colleague.class.must_equal SY::Quantity
|
246
|
+
SY.Quantity( :Length± ).colleague.object_id.must_equal SY::Length.object_id
|
247
|
+
SY.Quantity( :Length± ).send( :Unit ).object_id
|
248
|
+
.must_equal SY::Length.send( :Unit ).object_id
|
249
|
+
1.mm.quantity.standard_unit.name.must_equal :metre
|
250
|
+
1.mm.to_s.must_equal "0.001.m"
|
251
|
+
1.mm.inspect.must_equal "#<±Magnitude: 0.001.m >"
|
252
|
+
1.µs.inspect.must_equal "#<±Magnitude: 1e-06.s >"
|
253
|
+
|
254
|
+
SY::Area.dimension.must_equal SY.Dimension( :L² )
|
255
|
+
SY::Area.composition.must_equal SY::Composition[ SY::Length => 2 ]
|
256
|
+
|
257
|
+
SY::AMPERE.name.must_equal :ampere
|
258
|
+
SY::AMPERE.abbreviation.must_equal :A
|
259
|
+
SY::AMPERE.dimension.must_equal 1.A.dimension
|
260
|
+
SY.Magnitude( of: SY::ElectricCurrent, amount: 1 ).must_equal 1.A.absolute
|
261
|
+
1.A.quantity.must_equal SY::ElectricCurrent.relative
|
262
|
+
1.A.quantity.standard_unit.name.must_equal :ampere
|
263
|
+
1.A.to_s( SY::AMPERE ).must_equal "1.A"
|
264
|
+
1.A.to_s.must_equal "1.A"
|
265
|
+
1.A.amount.must_equal 1
|
266
|
+
1.A.quantity.standard_unit.abbreviation.must_equal :A
|
267
|
+
1.A.inspect.must_equal "#<±Magnitude: 1.A >"
|
268
|
+
|
269
|
+
1.l⁻¹.reframe( SY::Molarity ).quantity.must_equal SY::Molarity
|
270
|
+
x = ( SY::Nᴀ / SY::LITRE )
|
271
|
+
x = x.reframe( SY::Molarity )
|
272
|
+
y = 1.molar.absolute
|
273
|
+
y.quantity.must_equal x.quantity
|
274
|
+
y.amount.must_equal y.amount
|
275
|
+
SY::MoleAmount.protected?.must_equal true
|
276
|
+
SY::LitreVolume.protected?.must_equal true
|
277
|
+
SY::MOLAR.quantity.name.must_equal :Molarity
|
278
|
+
m = 1.µM
|
279
|
+
1.µM.quantity.relative?.must_equal true
|
280
|
+
1.µM.quantity.name.must_equal :Molarity±
|
281
|
+
1.µM.quantity.absolute.name.must_equal :Molarity
|
282
|
+
7.µM.must_be_within_epsilon 5.µM + 2.µM, 1e-6
|
283
|
+
+1.s.must_equal 1.s
|
284
|
+
# -1.s.must_equal -1 * 1.s # must raise
|
285
|
+
assert_equal -(-(1.s)), +(1.s)
|
286
|
+
1.s⁻¹.quantity.must_equal ( 1.s ** -1 ).quantity
|
287
|
+
1.s⁻¹.quantity.must_equal ( 1 / 1.s ).quantity
|
288
|
+
1.s⁻¹.amount.must_equal ( 1.s ** -1 ).amount
|
289
|
+
1.s⁻¹.must_equal 1.s ** -1
|
290
|
+
q1 = ( 1.s⁻¹ ).quantity
|
291
|
+
q1.composition.to_hash.must_equal( { SY::Time => -1 } )
|
292
|
+
|
293
|
+
q2 = ( 1 / 1.s ).quantity
|
294
|
+
q2.composition.to_hash.must_equal( { SY::Time => -1 } )
|
295
|
+
|
296
|
+
q1.relative?.must_equal true
|
297
|
+
q2.relative?.must_equal true
|
298
|
+
|
299
|
+
q1.object_id.must_equal q2.object_id
|
300
|
+
( 1.s⁻¹ ).quantity.object_id.must_equal ( 1 / 1.s ).quantity.object_id
|
301
|
+
( 1 / 1.s ).must_equal 1.s⁻¹
|
302
|
+
1.s⁻¹.( SY::Frequency ).must_equal 1.Hz
|
303
|
+
# 7.°C.must_equal( 8.°C - 1.K )
|
304
|
+
# (-15).°C.must_equal 258.15.K
|
305
|
+
# 7000.µM.must_be_within_epsilon( 7.mM, 1e-9 )
|
306
|
+
::SY::Unit.instances.map do |i|
|
307
|
+
begin
|
308
|
+
i.abbreviation
|
309
|
+
rescue
|
310
|
+
end
|
311
|
+
end.must_include :M
|
312
|
+
SY::Unit.instance_names.must_include :mole
|
313
|
+
# Avogadro's number is defined directly in SY
|
314
|
+
1.mol.quantity.object_id.must_equal SY::Nᴀ.( SY::MoleAmount ).quantity.object_id
|
315
|
+
SY::Nᴀ.( SY::MoleAmount ).must_equal 1.mol
|
316
|
+
0.7.mol.l⁻¹.amount.must_equal 0.7
|
317
|
+
1.M.must_equal 1.mol.l⁻¹.( SY::Molarity )
|
318
|
+
# (if #reframe conversion method is not used, different quantities
|
319
|
+
# do not compare. Arithmetics is possible because Magnitude operators
|
320
|
+
# mostly give their results only in standard quantities.
|
321
|
+
|
322
|
+
# Avogadro's number is defined directly in SY
|
323
|
+
1.mol.must_equal SY::Nᴀ.unit.( SY::MoleAmount )
|
324
|
+
|
325
|
+
|
326
|
+
0.7.M.must_equal 0.7.mol.l⁻¹.( SY::Molarity )
|
327
|
+
# (if #is_actually! conversion method is not used, current
|
328
|
+
# implementation will refuse to compare different quantities,
|
329
|
+
# even if their dimensions match)
|
330
|
+
|
331
|
+
30.Hz.must_equal 30.s⁻¹.( SY::Frequency )
|
332
|
+
|
333
|
+
# Dalton * Avogadro must be 1 gram
|
334
|
+
( 1.Da * SY::Nᴀ ).must_be_within_epsilon( 1.g, 1e-6 )
|
335
|
+
|
336
|
+
# kilogram
|
337
|
+
1.kg.must_equal 1000.g
|
338
|
+
SY::Speed.dimension.must_equal SY::Dimension( "L.T⁻¹" )
|
339
|
+
SY::Acceleration.dimension.must_equal SY::Dimension( "L.T⁻²" )
|
340
|
+
SY::Force.dimension.must_equal SY::Dimension( "L.M.T⁻²" )
|
341
|
+
( 1.kg * 1.m.s⁻² ).( SY::Force ).must_be_within_epsilon 1.N, 1e-9
|
342
|
+
|
343
|
+
# joule
|
344
|
+
( 1.N * 1.m ).( SY::Energy ).must_equal 1.J
|
345
|
+
1e-23.J.K⁻¹.must_equal 1.0e-20.mJ.K⁻¹
|
346
|
+
|
347
|
+
|
348
|
+
# pascal
|
349
|
+
( 1.N / 1.m ** 2 ).( SY::Pressure ).must_be_within_epsilon 1.Pa, 1e-9
|
350
|
+
|
351
|
+
# watt
|
352
|
+
( 1.V * 1.A ).( SY::Power ).must_be_within_epsilon 1.W, 1e-9
|
353
|
+
|
354
|
+
# pretty representation
|
355
|
+
( 1.m / 3.s ).to_s.must_equal( "0.333.m.s⁻¹" )
|
356
|
+
( 1.m / 7.01e7.s ).to_s.must_equal( "1.43e-08.m.s⁻¹" )
|
357
|
+
|
358
|
+
assert_equal 1.m, 1.s * 1.m.s⁻¹
|
359
|
+
assert_equal 1.µM.s⁻¹, 1.µM / 1.s
|
360
|
+
assert_equal 1.m.s⁻¹, 1.m.s( -1 )
|
361
|
+
assert_equal 2_000.mm.s⁻², 2.m.s( -2 )
|
362
|
+
assert_equal 3.µM, 1.µM + 2.µM
|
363
|
+
assert_equal SY::Amount, SY::Molarity / SY::Molarity
|
364
|
+
assert_equal SY::Amount( 1 ), 1.µM / 1.µM
|
365
|
+
assert_equal SY::Amount( 1 ), 1.µM / ( 1.µM + 0.µM )
|
366
|
+
assert_equal 1.µM, 1.µM * 1.µM / ( 1.µM + 0.µM )
|
367
|
+
assert_in_epsilon 1.µM, 1.µmol / 1.dm( 3 ).( SY::LitreVolume )
|
368
|
+
|
369
|
+
assert_equal SY::Molarity.relative, 1.mol.l⁻¹.quantity
|
370
|
+
|
371
|
+
assert_equal 1 / SY::Time, 1 / SY::Time
|
372
|
+
assert_equal 1 / SY::Time.relative, 1 / SY::Time
|
373
|
+
assert_equal ( 1 / SY::Time.relative ), 1.mol.s⁻¹.( 1 / SY::Time ).quantity
|
374
|
+
assert_equal ( 1 / SY::Time ).object_id,
|
375
|
+
( 1.0.µmol.min⁻¹.mg⁻¹ * 100.kDa ).( 1 / SY::Time ).quantity.object_id
|
376
|
+
assert_equal SY::Time.magnitude( 1 ), SY::SECOND
|
377
|
+
assert_equal Matrix[[60.mM], [60.mM]], Matrix[[1e-03.s⁻¹.M], [1e-3.s⁻¹.M]] * 60.s
|
378
|
+
|
379
|
+
assert_equal Matrix[[5.m]], Matrix[[1.m.s⁻¹, 2.m.s⁻¹]] * Matrix.column_vector( [1.s, 2.s] )
|
380
|
+
assert_equal Matrix[[2.m, 3.m], [4.m, 5.m]],
|
381
|
+
Matrix[[1.m, 2.m], [3.m, 4.m]] + Matrix[[1.m, 1.m], [1.m, 1.m]]
|
382
|
+
assert_equal Matrix[[5.µM]], Matrix[[1.µM]] + Matrix[[2.µM.s⁻¹]] * Matrix[[2.s]]
|
383
|
+
end
|
384
384
|
end
|
385
385
|
end
|