auom 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/.rspec +1 -0
- data/.travis.yml +13 -0
- data/Gemfile +10 -0
- data/Gemfile.devtools +52 -0
- data/Guardfile +8 -0
- data/LICENSE +20 -0
- data/README.md +92 -0
- data/Rakefile +5 -0
- data/TODO +3 -0
- data/auom.gemspec +21 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/heckle.yml +9 -0
- data/config/roodi.yml +20 -0
- data/config/site.reek +95 -0
- data/config/yardstick.yml +2 -0
- data/lib/auom.rb +287 -0
- data/lib/auom/algebra.rb +129 -0
- data/lib/auom/equalization.rb +90 -0
- data/lib/auom/inspection.rb +103 -0
- data/lib/auom/version.rb +3 -0
- data/spec/rcov.opts +7 -0
- data/spec/shared/command_method_behavior.rb +7 -0
- data/spec/shared/each_method_behaviour.rb +15 -0
- data/spec/shared/hash_method_behavior.rb +17 -0
- data/spec/shared/idempotent_method_behavior.rb +7 -0
- data/spec/shared/incompatible_operation_behavior.rb +5 -0
- data/spec/shared/invertible_method_behaviour.rb +9 -0
- data/spec/shared/operation_behavior.rb +12 -0
- data/spec/shared/sunits_shared.rb +6 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/unit/auom/add_spec.rb +0 -0
- data/spec/unit/auom/algebra/add_spec.rb +59 -0
- data/spec/unit/auom/algebra/divide_spec.rb +74 -0
- data/spec/unit/auom/algebra/multiply_spec.rb +74 -0
- data/spec/unit/auom/algebra/substract_spec.rb +59 -0
- data/spec/unit/auom/equalization/eql_spec.rb +40 -0
- data/spec/unit/auom/equalization/equal_value_spec.rb +57 -0
- data/spec/unit/auom/equalization/hash_spec.rb +13 -0
- data/spec/unit/auom/inspection/class_methods/prettify_unit_part_spec.rb +27 -0
- data/spec/unit/auom/inspection/inspect_spec.rb +41 -0
- data/spec/unit/auom/unit/class_methods/convert_spec.rb +35 -0
- data/spec/unit/auom/unit/class_methods/lookup_spec.rb +21 -0
- data/spec/unit/auom/unit/class_methods/new_spec.rb +156 -0
- data/spec/unit/auom/unit/class_methods/try_convert_spec.rb +31 -0
- data/spec/unit/auom/unit/class_methods/units_spec.rb +11 -0
- data/spec/unit/auom/unit/denominators_spec.rb +16 -0
- data/spec/unit/auom/unit/numerators_spec.rb +16 -0
- data/spec/unit/auom/unit/scalar_spec.rb +16 -0
- data/spec/unit/auom/unit/unit_spec.rb +16 -0
- data/spec/unit/auom/unit/unitless_spec.rb +18 -0
- metadata +164 -0
File without changes
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Algebra,'#add' do
|
4
|
+
subject { object.add(operand) }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Unit.new(*arguments) }
|
7
|
+
|
8
|
+
context 'when unit is unitless' do
|
9
|
+
let(:arguments) { [1] }
|
10
|
+
|
11
|
+
context 'and operand is a Fixnum' do
|
12
|
+
let(:operand) { 1 }
|
13
|
+
|
14
|
+
it_should_behave_like 'an operation'
|
15
|
+
|
16
|
+
it { should eql(AUOM::Unit.new(2)) }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'and operand is a unitless unit' do
|
20
|
+
let(:operand) { AUOM::Unit.new(1) }
|
21
|
+
|
22
|
+
it { should eql(AUOM::Unit.new(2)) }
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'and operand is a unitful unit' do
|
26
|
+
let(:operand) { AUOM::Unit.new(1,:meter) }
|
27
|
+
|
28
|
+
it_should_behave_like 'an incompatible operation'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when unit is unitful' do
|
33
|
+
let(:arguments) { [1,:meter] }
|
34
|
+
|
35
|
+
context 'and operand is a Fixnum' do
|
36
|
+
let(:operand) { 1 }
|
37
|
+
|
38
|
+
it_should_behave_like 'an incompatible operation'
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'and operand is a unitless unit' do
|
42
|
+
let(:operand) { AUOM::Unit.new(1) }
|
43
|
+
|
44
|
+
it_should_behave_like 'an incompatible operation'
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'and operand is a incompatible unit' do
|
48
|
+
let(:operand) { AUOM::Unit.new(1,:euro) }
|
49
|
+
|
50
|
+
it_should_behave_like 'an incompatible operation'
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'and operand is a compatible unit' do
|
54
|
+
let(:operand) { AUOM::Unit.new(1,:meter) }
|
55
|
+
|
56
|
+
it { should eql(AUOM::Unit.new(2,:meter)) }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Algebra,'#divide' do
|
4
|
+
subject { object.divide(operand) }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Unit.new(*arguments) }
|
7
|
+
|
8
|
+
context 'with unitless unit' do
|
9
|
+
let(:arguments) { [2] }
|
10
|
+
|
11
|
+
context 'when operand is a fixnum' do
|
12
|
+
let(:operand) { 1 }
|
13
|
+
|
14
|
+
it_should_behave_like 'an operation'
|
15
|
+
|
16
|
+
it { should eql(AUOM::Unit.new(2)) }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when operand is a unitless unit' do
|
20
|
+
let(:operand) { AUOM::Unit.new(1) }
|
21
|
+
|
22
|
+
it_should_behave_like 'an operation'
|
23
|
+
|
24
|
+
it { should eql(AUOM::Unit.new(2)) }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when operand is a unitful unit' do
|
28
|
+
let(:operand) { AUOM::Unit.new(1,:meter) }
|
29
|
+
|
30
|
+
it_should_behave_like 'an operation'
|
31
|
+
|
32
|
+
it { should eql(AUOM::Unit.new(2,[],:meter)) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'with unitful unit' do
|
37
|
+
let(:arguments) { [2,:meter] }
|
38
|
+
|
39
|
+
context 'when operand is a fixnum' do
|
40
|
+
let(:operand) { 1 }
|
41
|
+
|
42
|
+
it_should_behave_like 'an operation'
|
43
|
+
|
44
|
+
it { should eql(AUOM::Unit.new(2,:meter)) }
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when operand is a unitless unit' do
|
48
|
+
let(:operand) { AUOM::Unit.new(1) }
|
49
|
+
|
50
|
+
it_should_behave_like 'an operation'
|
51
|
+
|
52
|
+
it { should eql(AUOM::Unit.new(2,:meter)) }
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when operand is a unitful unit' do
|
56
|
+
|
57
|
+
context 'and units NOT cancle each other' do
|
58
|
+
let(:operand) { AUOM::Unit.new(1,:euro) }
|
59
|
+
|
60
|
+
it_should_behave_like 'an operation'
|
61
|
+
|
62
|
+
it { should eql(AUOM::Unit.new(2,:meter,:euro)) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'and untis cancle each other' do
|
66
|
+
let(:operand) { AUOM::Unit.new(1,:meter) }
|
67
|
+
|
68
|
+
it_should_behave_like 'an operation'
|
69
|
+
|
70
|
+
it { should eql(AUOM::Unit.new(2)) }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Algebra,'#multiply' do
|
4
|
+
subject { object.multiply(operand) }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Unit.new(*arguments) }
|
7
|
+
|
8
|
+
context 'with unitless unit' do
|
9
|
+
let(:arguments) { [1] }
|
10
|
+
|
11
|
+
context 'when operand is a fixnum' do
|
12
|
+
let(:operand) { 2 }
|
13
|
+
|
14
|
+
it_should_behave_like 'an operation'
|
15
|
+
|
16
|
+
it { should eql(AUOM::Unit.new(2)) }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when operand is a unitless unit' do
|
20
|
+
let(:operand) { AUOM::Unit.new(2) }
|
21
|
+
|
22
|
+
it_should_behave_like 'an operation'
|
23
|
+
|
24
|
+
it { should eql(AUOM::Unit.new(2)) }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when operand is a unitful unit' do
|
28
|
+
let(:operand) { AUOM::Unit.new(2,:meter) }
|
29
|
+
|
30
|
+
it_should_behave_like 'an operation'
|
31
|
+
|
32
|
+
it { should eql(AUOM::Unit.new(2,:meter)) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'with unitful unit' do
|
37
|
+
let(:arguments) { [1,:meter] }
|
38
|
+
|
39
|
+
context 'when operand is a fixnum' do
|
40
|
+
let(:operand) { 2 }
|
41
|
+
|
42
|
+
it_should_behave_like 'an operation'
|
43
|
+
|
44
|
+
it { should eql(AUOM::Unit.new(2,:meter)) }
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when operand is a unitless unit' do
|
48
|
+
let(:operand) { AUOM::Unit.new(2) }
|
49
|
+
|
50
|
+
it_should_behave_like 'an operation'
|
51
|
+
|
52
|
+
it { should eql(AUOM::Unit.new(2,:meter)) }
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when operand is a unitful unit' do
|
56
|
+
|
57
|
+
context 'and units NOT cancle each other' do
|
58
|
+
let(:operand) { AUOM::Unit.new(2,:meter) }
|
59
|
+
|
60
|
+
it_should_behave_like 'an operation'
|
61
|
+
|
62
|
+
it { should eql(AUOM::Unit.new(2,[:meter,:meter])) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'and units cancle each other' do
|
66
|
+
let(:operand) { AUOM::Unit.new(2,[],:meter) }
|
67
|
+
|
68
|
+
it_should_behave_like 'an operation'
|
69
|
+
|
70
|
+
it { should eql(AUOM::Unit.new(2)) }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Algebra,'#substract' do
|
4
|
+
subject { object.substract(operand) }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Unit.new(*arguments) }
|
7
|
+
|
8
|
+
context 'when unit is unitless' do
|
9
|
+
let(:arguments) { [1] }
|
10
|
+
|
11
|
+
context 'and operand is a Fixnum' do
|
12
|
+
let(:operand) { 1 }
|
13
|
+
|
14
|
+
it_should_behave_like 'an operation'
|
15
|
+
|
16
|
+
it { should eql(AUOM::Unit.new(0)) }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'and operand is a unitless unit' do
|
20
|
+
let(:operand) { AUOM::Unit.new(1) }
|
21
|
+
|
22
|
+
it { should eql(AUOM::Unit.new(0)) }
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'and operand is a unitful unit' do
|
26
|
+
let(:operand) { AUOM::Unit.new(1,:meter) }
|
27
|
+
|
28
|
+
it_should_behave_like 'an incompatible operation'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when unit is unitful' do
|
33
|
+
let(:arguments) { [1,:meter] }
|
34
|
+
|
35
|
+
context 'and operand is a Fixnum' do
|
36
|
+
let(:operand) { 1 }
|
37
|
+
|
38
|
+
it_should_behave_like 'an incompatible operation'
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'and operand is a unitless unit' do
|
42
|
+
let(:operand) { AUOM::Unit.new(1) }
|
43
|
+
|
44
|
+
it_should_behave_like 'an incompatible operation'
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'and operand is a incompatible unit' do
|
48
|
+
let(:operand) { AUOM::Unit.new(1,:euro) }
|
49
|
+
|
50
|
+
it_should_behave_like 'an incompatible operation'
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'and operand is a compatible unit' do
|
54
|
+
let(:operand) { AUOM::Unit.new(1,:meter) }
|
55
|
+
|
56
|
+
it { should eql(AUOM::Unit.new(0,:meter)) }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Equalization,'#eql?' do
|
4
|
+
subject { object.eql?(other) }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Unit.new(1,:meter) }
|
7
|
+
|
8
|
+
context 'when is other kind of object' do
|
9
|
+
let(:other) { Object.new }
|
10
|
+
|
11
|
+
it { should be(false) }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when is same kind of object' do
|
15
|
+
let(:other) { AUOM::Unit.new(scalar,*unit) }
|
16
|
+
|
17
|
+
let(:scalar) { 1 }
|
18
|
+
let(:unit) { [:meter] }
|
19
|
+
|
20
|
+
context 'and scalar and unit are the same' do
|
21
|
+
it { should be(true) }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'and scalar is differend' do
|
25
|
+
let(:scalar) { 2 }
|
26
|
+
it { should be(false) }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'and unit is differend' do
|
30
|
+
let(:unit) { [:euro] }
|
31
|
+
it { should be(false) }
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'and scalar and unit is differend' do
|
35
|
+
let(:scalar) { 2 }
|
36
|
+
let(:unit) { [:euro] }
|
37
|
+
it { should be(false) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Equalization,'#==' do
|
4
|
+
subject { object == other }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Unit.new(1,:meter) }
|
7
|
+
|
8
|
+
context 'when is other kind of object' do
|
9
|
+
|
10
|
+
context 'that cannot be converted' do
|
11
|
+
let(:other) { Object.new }
|
12
|
+
|
13
|
+
it { should be(false) }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'that can be converted' do
|
17
|
+
let(:other) { 1 }
|
18
|
+
|
19
|
+
context 'and does not have the same values' do
|
20
|
+
it { should be(false) }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'and does have the same values' do
|
24
|
+
let(:other) { 1 }
|
25
|
+
let(:object) { AUOM::Unit.new(1) }
|
26
|
+
it { should be(true) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when is same kind of object' do
|
32
|
+
let(:other) { AUOM::Unit.new(scalar,*unit) }
|
33
|
+
|
34
|
+
let(:scalar) { 1 }
|
35
|
+
let(:unit) { [:meter] }
|
36
|
+
|
37
|
+
context 'and scalar and unit are the same' do
|
38
|
+
it { should be(true) }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'and scalar is differend' do
|
42
|
+
let(:scalar) { 2 }
|
43
|
+
it { should be(false) }
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'and unit is differend' do
|
47
|
+
let(:unit) { [:euro] }
|
48
|
+
it { should be(false) }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'and scalar and unit is differend' do
|
52
|
+
let(:scalar) { 2 }
|
53
|
+
let(:unit) { [:euro] }
|
54
|
+
it { should be(false) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Equalization, '#hash' do
|
4
|
+
subject { object.hash }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Unit.new(1) }
|
7
|
+
|
8
|
+
it { should be_a(Fixnum) }
|
9
|
+
|
10
|
+
it_should_behave_like 'an idempotent method'
|
11
|
+
|
12
|
+
it { should be(Rational(1).hash ^ [[],[]].hash) }
|
13
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Inspection,'.prettify_unit_part' do
|
4
|
+
subject { object.prettify_unit_part(part) }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Inspection }
|
7
|
+
|
8
|
+
context 'with simple part' do
|
9
|
+
let(:part) { [:meter] }
|
10
|
+
it { should eql('meter') }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'with mixed part' do
|
14
|
+
let(:part) { [:meter,:euro] }
|
15
|
+
it { should eql('euro*meter') }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with complex part' do
|
19
|
+
let(:part) { [:meter,:meter,:euro] }
|
20
|
+
it { should eql('meter^2*euro') }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'with very complex part' do
|
24
|
+
let(:part) { [:meter,:meter,:euro,:euro,:kilogramm] }
|
25
|
+
it { should eql('euro^2*meter^2*kilogramm') }
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AUOM::Inspection,'#inspect' do
|
4
|
+
subject { object.inspect }
|
5
|
+
|
6
|
+
let(:object) { AUOM::Unit.new(scalar,*unit) }
|
7
|
+
let(:unit) { [] }
|
8
|
+
|
9
|
+
context 'when scalar is exact in decimal' do
|
10
|
+
let(:scalar) { 1 }
|
11
|
+
|
12
|
+
it { should eql("<AUOM::Unit @scalar=1>") }
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when scalar is NOT exact in decimal' do
|
16
|
+
let(:scalar) { Rational(1,3) }
|
17
|
+
|
18
|
+
it { should eql("<AUOM::Unit @scalar=~0.3333>") }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when has only numerator' do
|
22
|
+
let(:scalar) { Rational(1,3) }
|
23
|
+
let(:unit) { [:meter] }
|
24
|
+
|
25
|
+
it { should eql("<AUOM::Unit @scalar=~0.3333 meter>") }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when has only denominator' do
|
29
|
+
let(:scalar) { Rational(1,3) }
|
30
|
+
let(:unit) { [[],:meter] }
|
31
|
+
|
32
|
+
it { should eql("<AUOM::Unit @scalar=~0.3333 1/meter>") }
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when has numerator and denominator' do
|
36
|
+
let(:scalar) { Rational(1,3) }
|
37
|
+
let(:unit) { [:euro,:meter] }
|
38
|
+
|
39
|
+
it { should eql("<AUOM::Unit @scalar=~0.3333 euro/meter>") }
|
40
|
+
end
|
41
|
+
end
|