ellington 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/test/example.rb CHANGED
@@ -25,128 +25,128 @@ end
25
25
 
26
26
  # stations -----------------------------------------------------------------
27
27
  class Add10 < Ellington::Station
28
- def engage(passenger, options)
28
+ def engage(number, options)
29
29
  raise if rand(100) == 0
30
30
  if rand(100) > 5
31
- passenger.calc :+, 10
32
- pass passenger
31
+ number.calc :+, 10
32
+ pass_passenger number
33
33
  else
34
- fail passenger
34
+ fail_passenger number
35
35
  end
36
36
  rescue
37
- error passenger
37
+ error_passenger number
38
38
  end
39
39
  end
40
40
 
41
41
  class Add100 < Ellington::Station
42
- def engage(passenger, options)
42
+ def engage(number, options)
43
43
  raise if rand(100) == 0
44
44
  if rand(100) > 5
45
- passenger.calc :+, 100
46
- pass passenger
45
+ number.calc :+, 100
46
+ pass_passenger number
47
47
  else
48
- fail passenger
48
+ fail_passenger number
49
49
  end
50
50
  rescue
51
- error passenger
51
+ error_passenger number
52
52
  end
53
53
  end
54
54
 
55
55
  class Add1000 < Ellington::Station
56
- def engage(passenger, options)
56
+ def engage(number, options)
57
57
  raise if rand(100) == 0
58
58
  if rand(100) > 5
59
- passenger.calc :+, 1000
60
- pass passenger
59
+ number.calc :+, 1000
60
+ pass_passenger number
61
61
  else
62
- fail passenger
62
+ fail_passenger number
63
63
  end
64
64
  rescue
65
- error passenger
65
+ error_passenger number
66
66
  end
67
67
  end
68
68
 
69
69
  class MultiplyBy10 < Ellington::Station
70
- def engage(passenger, options)
70
+ def engage(number, options)
71
71
  raise if rand(100) == 0
72
72
  if rand(100) > 5
73
- passenger.calc :*, 10
74
- pass passenger
73
+ number.calc :*, 10
74
+ pass_passenger number
75
75
  else
76
- fail passenger
76
+ fail_passenger number
77
77
  end
78
78
  rescue
79
- error passenger
79
+ error_passenger number
80
80
  end
81
81
  end
82
82
 
83
83
  class MultiplyBy100 < Ellington::Station
84
- def engage(passenger, options)
84
+ def engage(number, options)
85
85
  raise if rand(100) == 0
86
86
  if rand(100) > 5
87
- passenger.calc :*, 100
88
- pass passenger
87
+ number.calc :*, 100
88
+ pass_passenger number
89
89
  else
90
- fail passenger
90
+ fail_passenger number
91
91
  end
92
92
  rescue
93
- error passenger
93
+ error_passenger number
94
94
  end
95
95
  end
96
96
 
97
97
  class MultiplyBy1000 < Ellington::Station
98
- def engage(passenger, options)
98
+ def engage(number, options)
99
99
  raise if rand(100) == 0
100
100
  if rand(100) > 5
101
- passenger.calc :*, 1000
102
- pass passenger
101
+ number.calc :*, 1000
102
+ pass_passenger number
103
103
  else
104
- fail passenger
104
+ fail_passenger number
105
105
  end
106
106
  rescue
107
- error passenger
107
+ error_passenger number
108
108
  end
109
109
  end
110
110
 
111
111
  class DivideBy10 < Ellington::Station
112
- def engage(passenger, options)
112
+ def engage(number, options)
113
113
  raise if rand(100) == 0
114
114
  if rand(100) > 5
115
- passenger.calc :/, 10.0
116
- pass passenger
115
+ number.calc :/, 10.0
116
+ pass_passenger number
117
117
  else
118
- fail passenger
118
+ fail_passenger number
119
119
  end
120
120
  rescue
121
- error passenger
121
+ error_passenger number
122
122
  end
123
123
  end
124
124
 
125
125
  class DivideBy100 < Ellington::Station
126
- def engage(passenger, options)
126
+ def engage(number, options)
127
127
  raise if rand(100) == 0
128
128
  if rand(100) > 5
129
- passenger.calc :/, 100.0
130
- pass passenger
129
+ number.calc :/, 100.0
130
+ pass_passenger number
131
131
  else
132
- fail passenger
132
+ fail_passenger number
133
133
  end
134
134
  rescue
135
- error passenger
135
+ error_passenger number
136
136
  end
137
137
  end
138
138
 
139
139
  class DivideBy1000 < Ellington::Station
140
- def engage(passenger, options)
140
+ def engage(number, options)
141
141
  raise if rand(100) == 0
142
142
  if rand(100) > 5
143
- passenger.calc :/, 1000.0
144
- pass passenger
143
+ number.calc :/, 1000.0
144
+ pass_passenger number
145
145
  else
146
- fail passenger
146
+ fail_passenger number
147
147
  end
148
148
  rescue
149
- error passenger
149
+ error_passenger number
150
150
  end
151
151
  end
152
152
 
@@ -184,8 +184,8 @@ class BasicMath < Ellington::Route
184
184
 
185
185
  goal division.passed, multiplication.passed
186
186
 
187
- connect_to division, :if => addition.passed
188
- connect_to multiplication, :if => addition.failed
187
+ connect_to division, :if_any => addition.passed
188
+ connect_to multiplication, :if_any => addition.failed
189
189
 
190
190
  log_passenger_attrs :original_value, :current_value
191
191
  end
@@ -194,6 +194,7 @@ end
194
194
  class NumberConductor < Ellington::Conductor
195
195
 
196
196
  def gather_passengers
197
+ sleep 1
197
198
  (0..999).to_a.sample(10).map do |num|
198
199
  num = NumberWithHistory.new(num)
199
200
  passenger = Ellington::Passenger.new(num, route)
@@ -209,4 +210,7 @@ if ENV["START"]
209
210
  route = BasicMath.new
210
211
  conductor = NumberConductor.new(route)
211
212
  conductor.start
213
+ #conductor.wait
214
+ sleep 5
215
+ conductor.stop
212
216
  end
@@ -0,0 +1,78 @@
1
+ require_relative "test_helper"
2
+
3
+ class LineInfoTest < MicroTest::Test
4
+
5
+ before do
6
+ @route = BasicMath.new
7
+ @line = @route.lines.first
8
+ @station = @line.stations.first
9
+ @passenger = Ellington::Passenger.new(NumberWithHistory.new(0), @route)
10
+ @options = { :foo => :bar }
11
+ @transition_info = Ellington::TransitionInfo.new(@passenger, @route.initial_state, @station.passed)
12
+ @station_info = Ellington::StationInfo.new(@station, @passenger, @transition_info, @options)
13
+ @line_info = Ellington::LineInfo.new(@line, @station_info)
14
+ end
15
+
16
+ test "line" do
17
+ assert @line_info.line == @line
18
+ end
19
+
20
+ test "station_info" do
21
+ assert @line_info.station_info == @station_info
22
+ end
23
+
24
+ test "station" do
25
+ assert @line_info.station == @station
26
+ end
27
+
28
+ test "passenger" do
29
+ assert @line_info.passenger == @passenger
30
+ end
31
+
32
+ test "transition" do
33
+ assert @line_info.transition == @transition_info
34
+ end
35
+
36
+ test "options" do
37
+ assert @line_info.options == @options
38
+ end
39
+
40
+ test "station_full_name" do
41
+ assert @line_info.station_full_name == "Add10::Addition::BasicMath"
42
+ end
43
+
44
+ test "log_message" do
45
+ assert @line_info.log_message == "[original_value:0] [current_value:0]"
46
+ end
47
+
48
+ test "log_message with station_completed pass" do
49
+ @passenger.current_state = @station.passed
50
+ expected = "[STATION COMPLETED] [PASS] [Add10::Addition::BasicMath] [original_value:0] [current_value:0]"
51
+ assert @line_info.log_message(:station_completed => true) == expected
52
+ end
53
+
54
+ test "log_message with station_completed fail" do
55
+ @passenger.current_state = @station.failed
56
+ expected = "[STATION COMPLETED] [FAIL] [Add10::Addition::BasicMath] [original_value:0] [current_value:0]"
57
+ assert @line_info.log_message(:station_completed => true) == expected
58
+ end
59
+
60
+ test "log_message with station_completed error" do
61
+ @passenger.current_state = @station.errored
62
+ expected = "[STATION COMPLETED] [ERROR] [Add10::Addition::BasicMath] [original_value:0] [current_value:0]"
63
+ assert @line_info.log_message(:station_completed => true) == expected
64
+ end
65
+
66
+ test "log_message with line_completed pass" do
67
+ @passenger.current_state = @line.stations.last.passed
68
+ expected = "[LINE COMPLETED] [PASS] [Addition::BasicMath] [original_value:0] [current_value:0]"
69
+ assert @line_info.log_message(:line_completed => true) == expected
70
+ end
71
+
72
+ test "log_message with line_completed fail" do
73
+ @passenger.current_state = @line.stations.last.failed
74
+ expected = "[LINE COMPLETED] [FAIL] [Addition::BasicMath] [original_value:0] [current_value:0]"
75
+ assert @line_info.log_message(:line_completed => true) == expected
76
+ end
77
+
78
+ end
data/test/line_test.rb CHANGED
@@ -5,6 +5,28 @@ class LineTest < MicroTest::Test
5
5
  before do
6
6
  @route = BasicMath.new
7
7
  @line = @route.lines.first
8
+ @passenger = Ellington::Passenger.new(NumberWithHistory.new(0), @route)
9
+ end
10
+
11
+ test "must declare stations" do
12
+ class NoStationsLine < Ellington::Line
13
+ end
14
+ begin
15
+ NoStationsLine.new
16
+ rescue Ellington::NoStationsDeclared => e
17
+ end
18
+ assert !e.nil?
19
+ end
20
+
21
+ test "must declare goal" do
22
+ class NoGoalLine < Ellington::Line
23
+ stations << Add10.new
24
+ end
25
+ begin
26
+ NoGoalLine.new
27
+ rescue Ellington::NoGoalDeclared => e
28
+ end
29
+ assert !e.nil?
8
30
  end
9
31
 
10
32
  test "stations on class" do
@@ -31,7 +53,7 @@ class LineTest < MicroTest::Test
31
53
 
32
54
  test "stations are assigned line" do
33
55
  @line.stations.each do |station|
34
- assert station.line == @line.class
56
+ assert station.line == @line
35
57
  end
36
58
  end
37
59
 
@@ -92,4 +114,41 @@ class LineTest < MicroTest::Test
92
114
  assert line.fail_target == expected
93
115
  end
94
116
 
117
+ test "passed" do
118
+ assert @line.passed == ["PASS Add1000::Addition"]
119
+ end
120
+
121
+ test "state pass" do
122
+ @passenger.current_state = @line.passed.first
123
+ assert @line.state(@passenger) == "PASS"
124
+ end
125
+
126
+ test "failed" do
127
+ assert @line.failed == [
128
+ "PASS Add10::Addition",
129
+ "FAIL Add10::Addition",
130
+ "PASS Add100::Addition",
131
+ "FAIL Add100::Addition",
132
+ "FAIL Add1000::Addition"
133
+ ]
134
+ end
135
+
136
+ test "state fail" do
137
+ @passenger.current_state = @line.failed.first
138
+ assert @line.state(@passenger) == "FAIL"
139
+ end
140
+
141
+ test "errored" do
142
+ assert @line.errored == [
143
+ "ERROR Add10::Addition",
144
+ "ERROR Add100::Addition",
145
+ "ERROR Add1000::Addition"
146
+ ]
147
+ end
148
+
149
+ test "state error" do
150
+ @passenger.current_state = @line.errored.first
151
+ assert @line.state(@passenger) == "ERROR"
152
+ end
153
+
95
154
  end
@@ -0,0 +1,20 @@
1
+ require_relative "test_helper"
2
+ require "logger"
3
+
4
+ class LoggerTest < MicroTest::Test
5
+
6
+ before do
7
+ @orig_logger = Ellington.logger
8
+ @logger = Logger.new(STDOUT)
9
+ Ellington.logger = @logger
10
+ end
11
+
12
+ after do
13
+ Ellington.logger = @orig_logger
14
+ end
15
+
16
+ test "logger attr" do
17
+ assert Ellington.logger == @logger
18
+ end
19
+
20
+ end
@@ -70,4 +70,13 @@ class PassengerTest < MicroTest::Test
70
70
  assert watcher.info.new_state == "PASS Add10::Addition"
71
71
  end
72
72
 
73
+ test "state_history" do
74
+ @passenger.lock
75
+ @passenger.current_state = @route.initial_state
76
+ @passenger.transition_to @route.lines[0].states.keys.first
77
+ @passenger.transition_to @route.lines[2].states.keys.first
78
+ @passenger.unlock
79
+ assert @passenger.state_history == ["PASS Add10::Addition", "PASS MultiplyBy10::Multiplication"]
80
+ end
81
+
73
82
  end
@@ -0,0 +1,63 @@
1
+ require_relative "test_helper"
2
+
3
+ class RouteInfoTest < MicroTest::Test
4
+
5
+ before do
6
+ @route = BasicMath.new
7
+ @line = @route.lines.first
8
+ @station = @line.stations.first
9
+ @passenger = Ellington::Passenger.new(NumberWithHistory.new(0), @route)
10
+ @passenger.current_state = @route.lines.last.passed.first
11
+ @options = { :foo => :bar }
12
+ @transition_info = Ellington::TransitionInfo.new(@passenger, @route.initial_state, @station.passed)
13
+ @station_info = Ellington::StationInfo.new(@station, @passenger, @transition_info, @options)
14
+ @line_info = Ellington::LineInfo.new(@line, @station_info)
15
+ @route_info = Ellington::RouteInfo.new(@route, @line_info)
16
+ end
17
+
18
+ test "route" do
19
+ assert @route_info.route == @route
20
+ end
21
+
22
+ test "line" do
23
+ assert @route_info.line == @line
24
+ end
25
+
26
+ test "line_info" do
27
+ assert @route_info.line_info == @line_info
28
+ end
29
+
30
+ test "station_info" do
31
+ assert @route_info.station_info == @station_info
32
+ end
33
+
34
+ test "station" do
35
+ assert @route_info.station == @station
36
+ end
37
+
38
+ test "passenger" do
39
+ assert @route_info.passenger == @passenger
40
+ end
41
+
42
+ test "transition" do
43
+ assert @route_info.transition == @transition_info
44
+ end
45
+
46
+ test "options" do
47
+ assert @route_info.options == @options
48
+ end
49
+
50
+ test "station_full_name" do
51
+ assert @route_info.station_full_name == "Add10::Addition::BasicMath"
52
+ end
53
+
54
+ test "log_message route pass" do
55
+ assert @route_info.log_message == "[ROUTE COMPLETED] [PASS] [BasicMath] [original_value:0] [current_value:0]"
56
+ end
57
+
58
+ test "log_message route fail" do
59
+ @passenger.current_state = @station.failed
60
+ assert @route_info.log_message == "[ROUTE COMPLETED] [FAIL] [BasicMath] [original_value:0] [current_value:0]"
61
+ end
62
+
63
+ end
data/test/route_test.rb CHANGED
@@ -4,6 +4,28 @@ class RouteTest < MicroTest::Test
4
4
 
5
5
  before do
6
6
  @route = BasicMath.new
7
+ @passenger = Ellington::Passenger.new(NumberWithHistory.new(0), @route)
8
+ end
9
+
10
+ test "must declare lines" do
11
+ class NoLinesRoute < Ellington::Route
12
+ end
13
+ begin
14
+ NoLinesRoute.new
15
+ rescue Ellington::NoLinesDeclared => e
16
+ end
17
+ assert !e.nil?
18
+ end
19
+
20
+ test "must declare goal" do
21
+ class NoGoalRoute < Ellington::Route
22
+ lines << Addition.new
23
+ end
24
+ begin
25
+ NoGoalRoute.new
26
+ rescue Ellington::NoGoalDeclared => e
27
+ end
28
+ assert !e.nil?
7
29
  end
8
30
 
9
31
  test "lines on class" do
@@ -48,4 +70,62 @@ class RouteTest < MicroTest::Test
48
70
  assert @route.connections.last.states == @route.lines[0].fail_target
49
71
  end
50
72
 
73
+ test "passed" do
74
+ assert @route.passed == [
75
+ "PASS DivideBy1000::Division",
76
+ "PASS MultiplyBy1000::Multiplication"
77
+ ]
78
+ end
79
+
80
+ test "state pass" do
81
+ @passenger.current_state = @route.passed.first
82
+ assert @route.state(@passenger) == "PASS"
83
+ end
84
+
85
+ test "failed" do
86
+ assert @route.failed == [
87
+ "PRE BasicMath",
88
+ "PASS Add10::Addition",
89
+ "FAIL Add10::Addition",
90
+ "PASS Add100::Addition",
91
+ "FAIL Add100::Addition",
92
+ "PASS Add1000::Addition",
93
+ "FAIL Add1000::Addition",
94
+ "PASS DivideBy10::Division",
95
+ "FAIL DivideBy10::Division",
96
+ "PASS DivideBy100::Division",
97
+ "FAIL DivideBy100::Division",
98
+ "FAIL DivideBy1000::Division",
99
+ "PASS MultiplyBy10::Multiplication",
100
+ "FAIL MultiplyBy10::Multiplication",
101
+ "PASS MultiplyBy100::Multiplication",
102
+ "FAIL MultiplyBy100::Multiplication",
103
+ "FAIL MultiplyBy1000::Multiplication"
104
+ ]
105
+ end
106
+
107
+ test "state fail" do
108
+ @passenger.current_state = @route.failed.first
109
+ assert @route.state(@passenger) == "FAIL"
110
+ end
111
+
112
+ test "errored" do
113
+ assert @route.errored == [
114
+ "ERROR Add10::Addition",
115
+ "ERROR Add100::Addition",
116
+ "ERROR Add1000::Addition",
117
+ "ERROR DivideBy10::Division",
118
+ "ERROR DivideBy100::Division",
119
+ "ERROR DivideBy1000::Division",
120
+ "ERROR MultiplyBy10::Multiplication",
121
+ "ERROR MultiplyBy100::Multiplication",
122
+ "ERROR MultiplyBy1000::Multiplication"
123
+ ]
124
+ end
125
+
126
+ test "state error" do
127
+ @passenger.current_state = @route.errored.first
128
+ assert @route.state(@passenger) == "ERROR"
129
+ end
130
+
51
131
  end
@@ -0,0 +1,31 @@
1
+ require_relative "test_helper"
2
+
3
+ class StationInfoTest < MicroTest::Test
4
+
5
+ before do
6
+ @route = BasicMath.new
7
+ @line = @route.lines.first
8
+ @station = @line.stations.first
9
+ @passenger = Ellington::Passenger.new(NumberWithHistory.new(0), @route)
10
+ @options = { :foo => :bar }
11
+ @transition_info = Ellington::TransitionInfo.new(@passenger, @route.initial_state, @station.passed)
12
+ @station_info = Ellington::StationInfo.new(@station, @passenger, @transition_info, @options)
13
+ end
14
+
15
+ test "station" do
16
+ assert @station_info.station == @station
17
+ end
18
+
19
+ test "passenger" do
20
+ assert @station_info.passenger == @passenger
21
+ end
22
+
23
+ test "transition" do
24
+ assert @station_info.transition == @transition_info
25
+ end
26
+
27
+ test "options" do
28
+ assert @station_info.options == @options
29
+ end
30
+
31
+ end
data/test/station_test.rb CHANGED
@@ -61,19 +61,19 @@ class StationTest < MicroTest::Test
61
61
 
62
62
  test "pass properly transitions passenger's state" do
63
63
  @passenger.current_state = @route.initial_state
64
- @station.pass @passenger
64
+ @station.pass_passenger @passenger
65
65
  assert @passenger.current_state == @station.passed
66
66
  end
67
67
 
68
68
  test "fail properly transitions passenger's state" do
69
69
  @passenger.current_state = @route.initial_state
70
- @station.fail @passenger
70
+ @station.fail_passenger @passenger
71
71
  assert @passenger.current_state == @station.failed
72
72
  end
73
73
 
74
74
  test "error properly transitions passenger's state" do
75
75
  @passenger.current_state = @route.initial_state
76
- @station.error @passenger
76
+ @station.error_passenger @passenger
77
77
  assert @passenger.current_state == @station.errored
78
78
  end
79
79
 
@@ -91,8 +91,8 @@ class StationTest < MicroTest::Test
91
91
 
92
92
  test "engage" do
93
93
  @passenger.current_state = @route.initial_state
94
- @station.engage(@passenger, :pass => true)
95
- assert @passenger.current_state == @station.passed
94
+ @station.engage(@passenger, nil)
95
+ assert @passenger.current_state != @route.initial_state
96
96
  end
97
97
 
98
98
  test "observers are notified after a station completes" do
@@ -103,13 +103,13 @@ class StationTest < MicroTest::Test
103
103
  end
104
104
  @station.add_observer observer
105
105
  @passenger.current_state = @route.initial_state
106
- @station.call(@passenger, :pass => true)
106
+ @station.call(@passenger)
107
107
  assert observer.callbacks.length == 1
108
108
  info = observer.callbacks.first
109
109
  assert info.station == @station
110
110
  assert info.passenger == @passenger
111
111
  assert info.transition.old_state == @route.initial_state
112
- assert info.transition.new_state == @station.passed
112
+ assert info.transition.new_state != @route.initial_state
113
113
  end
114
114
 
115
115
  end
data/test/test_helper.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require "logger"
2
2
  require "delegate"
3
- require 'pry-exception_explorer'
4
3
  require_relative "../lib/ellington"
5
4
  require_relative "example"
6
5
 
@@ -0,0 +1,25 @@
1
+ require_relative "test_helper"
2
+
3
+ class TransitionInfoTest < MicroTest::Test
4
+
5
+ before do
6
+ @route = BasicMath.new
7
+ @line = @route.lines.first
8
+ @station = @line.stations.first
9
+ @passenger = Ellington::Passenger.new(NumberWithHistory.new(0), @route)
10
+ @transition_info = Ellington::TransitionInfo.new(@passenger, @route.initial_state, @station.passed)
11
+ end
12
+
13
+ test "passenger" do
14
+ assert @transition_info.passenger == @passenger
15
+ end
16
+
17
+ test "old_state" do
18
+ assert @transition_info.old_state == @route.initial_state
19
+ end
20
+
21
+ test "new_state" do
22
+ assert @transition_info.new_state == @station.passed
23
+ end
24
+
25
+ end
@@ -0,0 +1,32 @@
1
+ require_relative "test_helper"
2
+
3
+ class UniqueTypeArrayTest < MicroTest::Test
4
+
5
+ before do
6
+ @list = Ellington::UniqueTypeArray.new
7
+ end
8
+
9
+ test "accepts values of different types" do
10
+ @list.push 1
11
+ @list.push 1.0
12
+ @list.push true
13
+ @list.push "hi"
14
+ @list.push :foo
15
+ end
16
+
17
+ test "can only push 1 entry with the same type" do
18
+ @list.push 1
19
+ begin
20
+ @list.push 2
21
+ rescue Ellington::ListAlreadyContainsType => e
22
+ end
23
+ assert !e.nil?
24
+ end
25
+
26
+ test "contains_a?" do
27
+ @list.push :foo
28
+ assert @list.contains_a?(Symbol)
29
+ end
30
+
31
+ end
32
+