amee-data-abstraction 2.1.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +3 -0
- data/README.txt +26 -14
- data/VERSION +1 -1
- data/amee-data-abstraction.gemspec +7 -6
- data/lib/amee-data-abstraction/calculation.rb +1 -1
- data/lib/amee-data-abstraction/calculation_set.rb +152 -10
- data/lib/amee-data-abstraction/input.rb +10 -0
- data/lib/amee-data-abstraction/ongoing_calculation.rb +1 -1
- data/lib/amee-data-abstraction/term.rb +31 -13
- data/spec/amee-data-abstraction/calculation_set_spec.rb +247 -9
- data/spec/amee-data-abstraction/calculation_spec.rb +24 -19
- data/spec/amee-data-abstraction/drill_spec.rb +14 -9
- data/spec/amee-data-abstraction/input_spec.rb +113 -73
- data/spec/amee-data-abstraction/metadatum_spec.rb +1 -1
- data/spec/amee-data-abstraction/ongoing_calculation_spec.rb +38 -30
- data/spec/amee-data-abstraction/profile_spec.rb +4 -2
- data/spec/amee-data-abstraction/prototype_calculation_spec.rb +13 -8
- data/spec/amee-data-abstraction/term_spec.rb +45 -4
- data/spec/amee-data-abstraction/terms_list_spec.rb +23 -12
- data/spec/config/amee_units_spec.rb +1 -2
- data/spec/core-extensions/class_spec.rb +18 -18
- data/spec/core-extensions/hash_spec.rb +1 -2
- data/spec/core-extensions/ordered_hash_spec.rb +1 -2
- data/spec/core-extensions/proc_spec.rb +1 -1
- data/spec/fixtures/config/calculations/electricity.rb +35 -0
- data/spec/fixtures/config/calculations/electricity_and_transport.rb +53 -0
- data/spec/fixtures/{transport.rb → config/calculations/transport.rb} +2 -2
- data/spec/fixtures/{electricity.rb → config/electricity.rb} +1 -1
- data/spec/spec_helper.rb +30 -2
- metadata +28 -27
- data/spec/fixtures/electricity_and_transport.rb +0 -55
@@ -1,53 +1,58 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
|
+
|
2
3
|
describe Calculation do
|
3
|
-
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@calc = CalculationSet.find("transport")[:transport]
|
7
|
+
end
|
8
|
+
|
4
9
|
it 'can create an instance' do
|
5
|
-
|
10
|
+
@calc.should be_a Calculation
|
6
11
|
end
|
7
12
|
it 'should have ordered terms, with labels' do
|
8
|
-
|
13
|
+
@calc.terms.labels.should eql [:fuel,:size,:distance,:co2]
|
9
14
|
end
|
10
15
|
it 'should have amee paths for the terms' do
|
11
|
-
|
16
|
+
@calc.terms.paths.should eql ['fuel','size','distance','default']
|
12
17
|
end
|
13
18
|
it 'should have human names for the terms' do
|
14
|
-
|
19
|
+
@calc.terms.names.
|
15
20
|
should eql ['Fuel Type','Vehicle Size','Distance Driven','Carbon Dioxide']
|
16
21
|
end
|
17
22
|
it 'should return the inputs' do
|
18
|
-
|
23
|
+
@calc.inputs.labels.should eql [:fuel,:size,:distance]
|
19
24
|
end
|
20
25
|
it 'should return the outputs' do
|
21
|
-
|
26
|
+
@calc.outputs.labels.should eql [:co2]
|
22
27
|
end
|
23
28
|
it 'should generate an discover URL' do
|
24
|
-
|
29
|
+
@calc.discover_url.should eql 'http://discover.amee.com/categories/transport/car/generic'
|
25
30
|
end
|
26
31
|
it 'should redirect to discover URL' do
|
27
|
-
|
32
|
+
@calc.explorer_url.should eql 'http://discover.amee.com/categories/transport/car/generic'
|
28
33
|
end
|
29
34
|
it 'can return a term via []' do
|
30
|
-
|
35
|
+
@calc[:co2].label.should eql :co2
|
31
36
|
end
|
32
37
|
it 'when copied, should deep copy the values' do
|
33
|
-
x
|
38
|
+
x=@calc.clone
|
34
39
|
x[:co2].value :somevalue
|
35
40
|
x[:co2].value.should eql :somevalue
|
36
|
-
|
41
|
+
@calc[:co2].value.should be_nil
|
37
42
|
end
|
38
43
|
it 'knows to get terms that come before or after others' do
|
39
|
-
t
|
44
|
+
t=@calc.clone
|
40
45
|
t.before(:distance).labels.
|
41
46
|
should eql [:fuel,:size]
|
42
47
|
t.after(:distance).map(&:label).
|
43
48
|
should eql [:co2]
|
44
49
|
end
|
45
50
|
it 'delegates selectors to terms list' do
|
46
|
-
t
|
51
|
+
t=@calc.clone
|
47
52
|
t.drills.labels.should eql [:fuel,:size]
|
48
53
|
end
|
49
54
|
it 'can find its amee data category' do
|
50
|
-
t
|
55
|
+
t=@calc.clone
|
51
56
|
mocker=AMEEMocker.new self,:path=>'transport/car/generic'
|
52
57
|
mocker.data_category
|
53
58
|
t.send(:amee_data_category).path.should eql '/data/transport/car/generic'
|
@@ -55,18 +60,18 @@ describe Calculation do
|
|
55
60
|
it 'can find its amee item definition' do
|
56
61
|
mocker=AMEEMocker.new self,:path=>'transport/car/generic'
|
57
62
|
mocker.item_definition(:my_itemdef_name).data_category
|
58
|
-
t
|
63
|
+
t=@calc.clone
|
59
64
|
t.send(:amee_item_definition).name.should eql :my_itemdef_name
|
60
65
|
end
|
61
66
|
it 'can give item value definition list' do
|
62
67
|
mocker=AMEEMocker.new self,:path=>'transport/car/generic'
|
63
68
|
mocker.item_value_definition('distance').item_value_definitions.
|
64
69
|
item_definition.data_category
|
65
|
-
t
|
70
|
+
t=@calc.clone
|
66
71
|
t.send(:amee_ivds).first.path.should eql 'distance'
|
67
72
|
end
|
68
73
|
it 'can memoise access to AMEE' do
|
69
|
-
t
|
74
|
+
t=@calc.clone
|
70
75
|
#AMEE::Data::Category.get(connection, "/data#{path}")
|
71
76
|
flexmock(AMEE::Data::Category).should_receive(:get).
|
72
77
|
with(AMEE::DataAbstraction.connection,'/data/transport/car/generic').
|
@@ -1,24 +1,29 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
|
+
|
2
3
|
describe Drill do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@calc = CalculationSet.find("transport")[:transport]
|
7
|
+
end
|
3
8
|
|
4
9
|
it 'knows its options when it is the first choice' do
|
5
10
|
AMEEMocker.new(self,:path=>'transport/car/generic',
|
6
11
|
:selections=>[],
|
7
12
|
:choices=>['diesel','petrol']).drill
|
8
|
-
|
13
|
+
@calc.begin_calculation[:fuel].send(:choices).should eql ['diesel','petrol']
|
9
14
|
end
|
10
15
|
|
11
16
|
it 'knows its options when it is a later choice' do
|
12
17
|
AMEEMocker.new(self,:path=>'transport/car/generic',
|
13
18
|
:selections=>[['fuel','diesel']],
|
14
19
|
:choices=>['large','small']).drill
|
15
|
-
t
|
20
|
+
t=@calc.begin_calculation
|
16
21
|
t[:fuel].value 'diesel'
|
17
22
|
t[:size].send(:choices).should eql ['large','small']
|
18
23
|
end
|
19
24
|
|
20
|
-
it 'is enabled
|
21
|
-
t
|
25
|
+
it 'is enabled if it is the next choice or has been chosen' do
|
26
|
+
t=@calc.begin_calculation
|
22
27
|
t[:fuel].enabled?.should be_true
|
23
28
|
t[:size].enabled?.should be_false
|
24
29
|
t[:fuel].value 'diesel'
|
@@ -29,11 +34,11 @@ describe Drill do
|
|
29
34
|
t[:size].enabled?.should be_true
|
30
35
|
end
|
31
36
|
|
32
|
-
it 'is valid
|
37
|
+
it 'is valid if assigned a choice in the choices' do
|
33
38
|
AMEEMocker.new(self,:path=>'transport/car/generic',
|
34
39
|
:selections=>[],
|
35
40
|
:choices=>['diesel','petrol']).drill
|
36
|
-
t
|
41
|
+
t=@calc.begin_calculation
|
37
42
|
t[:fuel].value 'diesel'
|
38
43
|
t[:fuel].send(:valid?).should be_true
|
39
44
|
t[:fuel].value 'banana'
|
@@ -41,7 +46,7 @@ describe Drill do
|
|
41
46
|
end
|
42
47
|
|
43
48
|
it "should set and get custom choices" do
|
44
|
-
t
|
49
|
+
t=@calc.begin_calculation
|
45
50
|
t[:fuel].choices 'anthracite', 'lignite'
|
46
51
|
t[:fuel].choices.should eql ['anthracite', 'lignite']
|
47
52
|
end
|
@@ -50,7 +55,7 @@ describe Drill do
|
|
50
55
|
mocker = AMEEMocker.new(self,:path=>'transport/car/generic',
|
51
56
|
:selections=>[['fuel','diesel']])
|
52
57
|
mocker.drill_with_skip('size'=>'small')
|
53
|
-
t
|
58
|
+
t=@calc.begin_calculation
|
54
59
|
t[:fuel].value 'diesel'
|
55
60
|
t[:fuel].should_not be_disabled
|
56
61
|
t[:size].choices.should eql ['small']
|
@@ -1,77 +1,117 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Input do
|
4
|
-
it 'can be given a fixed value' do
|
5
|
-
i=Input.new{fixed 6}
|
6
|
-
i.value.should eql 6
|
7
|
-
i.fixed?.should be_true
|
8
|
-
lambda{i.value 7}.should raise_error Exceptions::FixedValueInterference
|
9
|
-
end
|
10
|
-
it 'raises exception when invalid' do
|
11
|
-
i=Input.new{validation /bark/}
|
12
|
-
i.value 'barking'
|
13
|
-
lambda{i.validate!}.should_not raise_error
|
14
|
-
i.value.should eql 'barking'
|
15
|
-
i.value 'marking'
|
16
|
-
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation
|
17
|
-
j=Input.new{}
|
18
|
-
j.value 'marking'
|
19
|
-
j.value.should eql 'marking'
|
20
|
-
end
|
21
|
-
it "can accept a numeric symbol validation" do
|
22
|
-
i=Input.new{validation :numeric}
|
23
|
-
i.value 3
|
24
|
-
lambda{i.validate!}.should_not raise_error
|
25
|
-
i.value '3'
|
26
|
-
lambda{i.validate!}.should_not raise_error
|
27
|
-
i.value 'e'
|
28
|
-
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation
|
29
|
-
end
|
30
|
-
it "can accept a date symbol validation" do
|
31
|
-
i=Input.new{validation :date}
|
32
|
-
i.value Date.today
|
33
|
-
lambda{i.validate!}.should_not raise_error
|
34
|
-
i.value '2011-01-01'
|
35
|
-
lambda{i.validate!}.should_not raise_error
|
36
|
-
i.value 'e'
|
37
|
-
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation
|
38
|
-
end
|
39
4
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
5
|
+
it 'can be given a fixed value' do
|
6
|
+
i=Input.new{fixed 6}
|
7
|
+
i.value.should eql 6
|
8
|
+
i.fixed?.should be_true
|
9
|
+
lambda{i.value 7}.should raise_error Exceptions::FixedValueInterference
|
10
|
+
end
|
11
|
+
|
12
|
+
it "can be made optional" do
|
13
|
+
i=Input.new{label :mass; value 6}
|
14
|
+
i.should_not be_optional
|
15
|
+
i.should be_compulsory
|
16
|
+
i.optional!
|
17
|
+
i.should be_optional
|
18
|
+
i.should_not be_compulsory
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can be made compulsory" do
|
22
|
+
i=Input.new{label :mass; value 6}
|
23
|
+
i.should_not be_optional
|
24
|
+
i.optional!
|
25
|
+
i.should be_optional
|
26
|
+
i.should_not be_compulsory
|
27
|
+
i.compulsory!
|
28
|
+
i.should_not be_optional
|
29
|
+
i.should be_compulsory
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'raises exception when invalid' do
|
33
|
+
i=Input.new{validation /bark/}
|
34
|
+
i.value 'barking'
|
35
|
+
lambda{i.validate!}.should_not raise_error
|
36
|
+
i.value.should eql 'barking'
|
37
|
+
i.value 'marking'
|
38
|
+
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation
|
39
|
+
j=Input.new{}
|
40
|
+
j.value 'marking'
|
41
|
+
j.value.should eql 'marking'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "can accept a numeric symbol validation" do
|
45
|
+
i=Input.new{validation :numeric}
|
46
|
+
i.value 3
|
47
|
+
lambda{i.validate!}.should_not raise_error
|
48
|
+
i.value '3'
|
49
|
+
lambda{i.validate!}.should_not raise_error
|
50
|
+
i.value 'e'
|
51
|
+
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation
|
52
|
+
end
|
53
|
+
|
54
|
+
it "can accept a date symbol validation" do
|
55
|
+
i=Input.new{validation :date}
|
56
|
+
i.value Date.today
|
57
|
+
lambda{i.validate!}.should_not raise_error
|
58
|
+
i.value '2011-01-01'
|
59
|
+
lambda{i.validate!}.should_not raise_error
|
60
|
+
i.value 'e'
|
61
|
+
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation
|
62
|
+
end
|
63
|
+
|
64
|
+
it "can accept a time symbol validation" do
|
65
|
+
i=Input.new{validation :datetime}
|
66
|
+
i.value DateTime.now
|
67
|
+
lambda{i.validate!}.should_not raise_error
|
68
|
+
i.value '2011-01-01 09:00:00'
|
69
|
+
lambda{i.validate!}.should_not raise_error
|
70
|
+
i.value 'e'
|
71
|
+
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'can have custom validation message' do
|
75
|
+
i=Input.new{label :woof; validation /bark/; validation_message {"#{value} does not match pattern /bark/"}}
|
76
|
+
i.value 'marking'
|
77
|
+
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation,"marking does not match pattern /bark/"
|
78
|
+
j=Input.new{}
|
79
|
+
j.value 'marking'
|
80
|
+
j.value.should eql 'marking'
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'can have default validation message' do
|
84
|
+
i=Input.new{label :woof; validation /bark/}
|
85
|
+
i.value 'barking'
|
86
|
+
lambda{i.validate!}.should_not raise_error
|
87
|
+
i.value.should eql 'barking'
|
88
|
+
i.value 'marking'
|
89
|
+
lambda{i.validate!}.should raise_error Exceptions::ChoiceValidation,"Woof is invalid."
|
90
|
+
j=Input.new{}
|
91
|
+
j.value 'marking'
|
92
|
+
j.value.should eql 'marking'
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'is always valid if it is fixed' do
|
96
|
+
i=Input.new{fixed 5; validation /7/}
|
97
|
+
lambda{i.validate!}.should_not raise_error
|
98
|
+
i.value.should eql 5
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'is always disabled if it is fixed' do
|
102
|
+
i=Input.new{fixed 5}
|
103
|
+
i.disabled?.should eql true
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should start with dirty set as false" do
|
107
|
+
i=Input.new{fixed 5}
|
108
|
+
i.dirty?.should eql false
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should be dirty when the value is changed" do
|
112
|
+
i=Input.new
|
113
|
+
i.value 5
|
114
|
+
i.dirty?.should eql true
|
115
|
+
end
|
116
|
+
|
77
117
|
end
|
@@ -1,7 +1,15 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
|
+
|
2
3
|
describe OngoingCalculation do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@elec = CalculationSet.find("electricity")[:electricity]
|
7
|
+
@transport = CalculationSet.find("transport")[:transport]
|
8
|
+
@elec_and_transport = CalculationSet.find("electricity_and_transport")
|
9
|
+
end
|
10
|
+
|
3
11
|
it 'can return set and unset inputs' do
|
4
|
-
d
|
12
|
+
d=@elec.begin_calculation
|
5
13
|
d.inputs.set.labels.should eql [:country]
|
6
14
|
d.inputs.unset.labels.should eql [:energy_used]
|
7
15
|
d[:energy_used].value :somevalue
|
@@ -9,7 +17,7 @@ describe OngoingCalculation do
|
|
9
17
|
d.inputs.unset.labels.should eql []
|
10
18
|
end
|
11
19
|
it 'can return set and unset terms' do
|
12
|
-
d
|
20
|
+
d=@elec.begin_calculation
|
13
21
|
d.set.labels.should eql [:country]
|
14
22
|
d.unset.labels.should eql [:energy_used,:co2]
|
15
23
|
d[:energy_used].value :somevalue
|
@@ -17,7 +25,7 @@ describe OngoingCalculation do
|
|
17
25
|
d.unset.labels.should eql [:co2]
|
18
26
|
end
|
19
27
|
it 'can return set and unset outputs' do
|
20
|
-
d
|
28
|
+
d=@elec.begin_calculation
|
21
29
|
d.outputs.set.labels.should eql []
|
22
30
|
d.outputs.unset.labels.should eql [:co2]
|
23
31
|
d[:co2].value 5
|
@@ -25,7 +33,7 @@ describe OngoingCalculation do
|
|
25
33
|
d.outputs.unset.labels.should eql []
|
26
34
|
end
|
27
35
|
it 'can clear outputs' do
|
28
|
-
d
|
36
|
+
d=@elec.begin_calculation
|
29
37
|
d.outputs.unset.labels.should eql [:co2]
|
30
38
|
d[:co2].value 5
|
31
39
|
d[:co2].value.should eql 5
|
@@ -37,7 +45,7 @@ describe OngoingCalculation do
|
|
37
45
|
:selections=>[['country','argentina']],
|
38
46
|
:choices=>[]).drill
|
39
47
|
|
40
|
-
d
|
48
|
+
d=@elec.begin_calculation
|
41
49
|
|
42
50
|
d.inputs.set.values.should eql ['argentina']
|
43
51
|
d.inputs.unset.values.should eql [nil]
|
@@ -51,7 +59,7 @@ describe OngoingCalculation do
|
|
51
59
|
AMEEMocker.new(self,:path=>'business/energy/electricity/grid',
|
52
60
|
:selections=>[['country','argentina']],
|
53
61
|
:choices=>[]).drill
|
54
|
-
d
|
62
|
+
d=@elec.begin_calculation
|
55
63
|
d.satisfied?.should be_false
|
56
64
|
d.choose!(:energy_used=>5.0)
|
57
65
|
d.satisfied?.should be_true
|
@@ -66,7 +74,7 @@ describe OngoingCalculation do
|
|
66
74
|
mocker.select('size'=>'large')
|
67
75
|
mocker.choices=[]
|
68
76
|
mocker.drill
|
69
|
-
t
|
77
|
+
t=@transport.begin_calculation
|
70
78
|
t.terms.labels.should eql [:fuel,:size,:distance,:co2]
|
71
79
|
t.satisfied?.should be_false
|
72
80
|
|
@@ -75,13 +83,13 @@ describe OngoingCalculation do
|
|
75
83
|
t.inputs.unset.labels.should eql [:size,:distance]
|
76
84
|
t.satisfied?.should be_false
|
77
85
|
|
78
|
-
t2
|
86
|
+
t2=@transport.begin_calculation
|
79
87
|
t2.choose!('fuel'=>'diesel','size'=>'large')
|
80
88
|
t2.inputs.set.labels.should eql [:fuel,:size]
|
81
89
|
t2.inputs.unset.labels.should eql [:distance]
|
82
90
|
t2.satisfied?.should be_false
|
83
91
|
|
84
|
-
t3
|
92
|
+
t3=@transport.begin_calculation
|
85
93
|
t3.choose!('fuel'=>'diesel','size'=>'large','distance'=>5)
|
86
94
|
t3.inputs.set.labels.should eql [:fuel,:size,:distance]
|
87
95
|
t3.inputs.unset.labels.should eql []
|
@@ -100,7 +108,7 @@ describe OngoingCalculation do
|
|
100
108
|
mocker.choices=[]
|
101
109
|
mocker.drill
|
102
110
|
mocker.profile_list.profile_category.timestamp.create_and_get
|
103
|
-
mycalc
|
111
|
+
mycalc=@transport.begin_calculation
|
104
112
|
mycalc.choose!('fuel'=>'diesel','size'=>'large','distance'=>5)
|
105
113
|
mycalc.calculate!
|
106
114
|
mycalc.outputs.first.value.should eql :somenumber
|
@@ -118,7 +126,7 @@ describe OngoingCalculation do
|
|
118
126
|
mocker.choices=[]
|
119
127
|
mocker.drill
|
120
128
|
mocker.profile_list.profile_category.timestamp.create_and_get
|
121
|
-
mycalc
|
129
|
+
mycalc=@elec_and_transport[:transport].begin_calculation
|
122
130
|
mycalc.choose!('fuel'=>'diesel','size'=>'large','distance'=>5,'department'=>'stuff')
|
123
131
|
mycalc.calculate!
|
124
132
|
mycalc.outputs.first.value.should eql :somenumber
|
@@ -142,7 +150,7 @@ describe OngoingCalculation do
|
|
142
150
|
#end
|
143
151
|
|
144
152
|
it 'can be supplied just a UID, and recover PIVs and drill values from AMEE' do
|
145
|
-
mycalc
|
153
|
+
mycalc=@transport.begin_calculation
|
146
154
|
mocker=AMEEMocker.new(self,:path=>'transport/car/generic',
|
147
155
|
:result=>:somenumber,
|
148
156
|
:existing=>{'distance'=>5},:choices=>['petrol','diesel'])
|
@@ -159,7 +167,7 @@ describe OngoingCalculation do
|
|
159
167
|
end
|
160
168
|
|
161
169
|
it 'refuses to load values from AMEE which conflict with local drill values' do
|
162
|
-
mycalc
|
170
|
+
mycalc=@transport.begin_calculation
|
163
171
|
mocker=AMEEMocker.new(self,:path=>'transport/car/generic',
|
164
172
|
:result=>:somenumber,
|
165
173
|
:existing=>{'distance'=>7},
|
@@ -195,7 +203,7 @@ describe OngoingCalculation do
|
|
195
203
|
mocker.choices=[]
|
196
204
|
mocker.drill
|
197
205
|
mocker.profile_list.update.get(true)
|
198
|
-
mycalc
|
206
|
+
mycalc=@transport.begin_calculation
|
199
207
|
mycalc.choose!(:profile_item_uid=>mocker.uid,'fuel'=>'diesel','size'=>'large','distance'=>9)
|
200
208
|
mycalc.calculate!
|
201
209
|
mycalc[:distance].value.should eql 9
|
@@ -219,7 +227,7 @@ describe OngoingCalculation do
|
|
219
227
|
mocker.params={'distance'=>9}
|
220
228
|
mocker.update.get(true)
|
221
229
|
|
222
|
-
mycalc
|
230
|
+
mycalc=@transport.begin_calculation
|
223
231
|
mycalc.choose!('fuel'=>'diesel','size'=>'large','distance'=>5)
|
224
232
|
mycalc.calculate!
|
225
233
|
mycalc.choose!('fuel'=>'diesel','size'=>'large','distance'=>9)
|
@@ -244,7 +252,7 @@ describe OngoingCalculation do
|
|
244
252
|
mocker.select('size'=>'small')
|
245
253
|
mocker.drill.create_and_get
|
246
254
|
|
247
|
-
mycalc
|
255
|
+
mycalc=@transport.begin_calculation
|
248
256
|
mycalc.choose!('fuel'=>'diesel','size'=>'large','distance'=>5)
|
249
257
|
mycalc.calculate!
|
250
258
|
mycalc.choose!('fuel'=>'diesel','size'=>'small')
|
@@ -253,7 +261,7 @@ describe OngoingCalculation do
|
|
253
261
|
end
|
254
262
|
|
255
263
|
it 'memoizes profile information, but not across a pass' do
|
256
|
-
mycalc
|
264
|
+
mycalc=@transport.begin_calculation
|
257
265
|
mocker=AMEEMocker.new(self,:path=>'transport/car/generic',
|
258
266
|
:result=>:somenumber,
|
259
267
|
:existing=>{'distance'=>5},:choices=>['petrol','diesel'])
|
@@ -285,7 +293,7 @@ describe OngoingCalculation do
|
|
285
293
|
mocker.choices=[]
|
286
294
|
mocker.drill
|
287
295
|
mocker.profile_list.profile_category.timestamp.create_and_get
|
288
|
-
myproto
|
296
|
+
myproto=@transport.clone
|
289
297
|
myproto.instance_eval{
|
290
298
|
start_and_end_dates
|
291
299
|
}
|
@@ -308,7 +316,7 @@ describe OngoingCalculation do
|
|
308
316
|
mocker.select('size'=>'large')
|
309
317
|
mocker.choices=[]
|
310
318
|
mocker.drill
|
311
|
-
myproto
|
319
|
+
myproto=@transport.clone
|
312
320
|
myproto.instance_eval{
|
313
321
|
start_and_end_dates
|
314
322
|
}
|
@@ -318,7 +326,7 @@ describe OngoingCalculation do
|
|
318
326
|
end
|
319
327
|
|
320
328
|
it 'starts off dirty' do
|
321
|
-
mycalc
|
329
|
+
mycalc=@transport.begin_calculation
|
322
330
|
mycalc.should be_dirty
|
323
331
|
end
|
324
332
|
|
@@ -335,7 +343,7 @@ describe OngoingCalculation do
|
|
335
343
|
mocker.choices=[]
|
336
344
|
mocker.drill
|
337
345
|
mocker.profile_list.profile_category.timestamp.create_and_get
|
338
|
-
mycalc
|
346
|
+
mycalc=@transport.begin_calculation
|
339
347
|
mycalc.should be_dirty
|
340
348
|
mycalc.choose!('fuel'=>'diesel','size'=>'large','distance'=>5)
|
341
349
|
mycalc.calculate!
|
@@ -357,7 +365,7 @@ describe OngoingCalculation do
|
|
357
365
|
mocker.choices=[]
|
358
366
|
mocker.drill
|
359
367
|
mocker.profile_list.profile_category.timestamp.create_and_get
|
360
|
-
mycalc
|
368
|
+
mycalc=@transport.begin_calculation
|
361
369
|
mycalc.should be_dirty
|
362
370
|
mycalc.choose!('fuel'=>'diesel','size'=>'large','distance'=>5)
|
363
371
|
mycalc.calculate!
|
@@ -380,7 +388,7 @@ describe OngoingCalculation do
|
|
380
388
|
mocker.select('size'=>'marge')
|
381
389
|
mocker.choices=[]
|
382
390
|
mocker.drill
|
383
|
-
mycalc
|
391
|
+
mycalc=@transport.begin_calculation
|
384
392
|
lambda{mycalc.choose!('fuel'=>'diesel','size'=>'marge','distance'=>5)}.should raise_error Exceptions::ChoiceValidation
|
385
393
|
mycalc.invalidity_messages.keys.should eql [:size]
|
386
394
|
end
|
@@ -397,7 +405,7 @@ describe OngoingCalculation do
|
|
397
405
|
mocker.select('size'=>'marge')
|
398
406
|
mocker.choices=[]
|
399
407
|
mocker.drill
|
400
|
-
mycalc
|
408
|
+
mycalc=@transport.begin_calculation
|
401
409
|
mycalc.choose('fuel'=>'diesel','size'=>'marge','distance'=>5).should be_false
|
402
410
|
mycalc.invalidity_messages.keys.should eql [:size]
|
403
411
|
end
|
@@ -414,12 +422,12 @@ describe OngoingCalculation do
|
|
414
422
|
mocker.select('size'=>'large')
|
415
423
|
mocker.choices=[]
|
416
424
|
mocker.drill
|
417
|
-
mycalc
|
425
|
+
mycalc=@transport.begin_calculation
|
418
426
|
mycalc.choose('fuel'=>'diesel','size'=>'large','distance'=>5).should be_true
|
419
427
|
end
|
420
428
|
|
421
429
|
it 'can blank individual term attributes with empty string' do
|
422
|
-
myproto
|
430
|
+
myproto=@transport.clone
|
423
431
|
mycalc=myproto.begin_calculation
|
424
432
|
mycalc.choose_without_validation!('fuel'=>'diesel','size'=>'large','distance'=>{:value =>5, :unit=> Unit.km})
|
425
433
|
mycalc['fuel'].value.should eql 'diesel'
|
@@ -434,7 +442,7 @@ describe OngoingCalculation do
|
|
434
442
|
end
|
435
443
|
|
436
444
|
it 'can blank individual term attributes with nil' do
|
437
|
-
myproto
|
445
|
+
myproto=@transport.clone
|
438
446
|
mycalc=myproto.begin_calculation
|
439
447
|
mycalc.choose_without_validation!('fuel'=>'diesel','size'=>'large','distance'=>{:value =>5, :unit=> Unit.km})
|
440
448
|
mycalc['fuel'].value.should eql 'diesel'
|
@@ -449,7 +457,7 @@ describe OngoingCalculation do
|
|
449
457
|
end
|
450
458
|
|
451
459
|
it 'can update individual term attributes without nullifying others' do
|
452
|
-
myproto
|
460
|
+
myproto=@transport.clone
|
453
461
|
mycalc=myproto.begin_calculation
|
454
462
|
mycalc.choose_without_validation!('fuel'=>'diesel','size'=>'large','distance'=>{:value =>5, :unit=> Unit.km})
|
455
463
|
mycalc['fuel'].value.should eql 'diesel'
|
@@ -490,7 +498,7 @@ describe OngoingCalculation do
|
|
490
498
|
mocker.select('size'=>'marge')
|
491
499
|
mocker.choices=[]
|
492
500
|
mocker.drill
|
493
|
-
mycalc
|
501
|
+
mycalc=@transport.begin_calculation
|
494
502
|
mycalc.choose('fuel'=>'diesel','size'=>'marge','distance'=>5).should be_false
|
495
503
|
mycalc.invalidity_messages.keys.should eql [:size]
|
496
504
|
mycalc[:size].value.should eql 'marge'
|