precedence 0.6.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +118 -0
- data/README +41 -9
- data/TODO +10 -5
- data/lib/precedence/activity.rb +429 -80
- data/lib/precedence/network.rb +223 -88
- data/lib/precedence/utilities.rb +44 -0
- data/lib/precedence.rb +1 -0
- data/tests/tc_activity.rb +287 -45
- data/tests/tc_network.rb +277 -39
- data/tests/ts_precedence.rb +2 -0
- metadata +3 -2
data/tests/tc_network.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
require('lib/precedence/network')
|
2
2
|
|
3
3
|
class TC_ActivityHash < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@start = Precedence::StartActivity.new
|
6
|
+
@finish = Precedence::FinishActivity.new
|
7
|
+
end
|
4
8
|
def test_all
|
5
9
|
activityHash = nil
|
6
|
-
assert_nothing_raised do
|
7
|
-
activityHash = Precedence::ActivityHash.new
|
10
|
+
assert_nothing_raised do
|
11
|
+
activityHash = Precedence::Utilities::ActivityHash.new(@start,@finish)
|
8
12
|
end
|
9
13
|
|
10
14
|
assert_nothing_raised do
|
@@ -19,9 +23,18 @@ class TC_Network < Test::Unit::TestCase
|
|
19
23
|
|
20
24
|
def setup
|
21
25
|
@network = Precedence::Network.new
|
22
|
-
@activity1 = Precedence::Activity.new('a1'
|
23
|
-
|
24
|
-
|
26
|
+
@activity1 = Precedence::Activity.new('a1') do |act1|
|
27
|
+
act1.expected_duration = 1
|
28
|
+
act1.description = 'Activity1'
|
29
|
+
end
|
30
|
+
@activity2 = Precedence::Activity.new('a2') do |act2|
|
31
|
+
act2.expected_duration = 2
|
32
|
+
act2.description = 'Activity2'
|
33
|
+
end
|
34
|
+
@activity3 = Precedence::Activity.new('a3') do |act3|
|
35
|
+
act3.expected_duration = 3
|
36
|
+
act3.description = 'Activity3'
|
37
|
+
end
|
25
38
|
end
|
26
39
|
|
27
40
|
def test_initialize
|
@@ -29,17 +42,10 @@ class TC_Network < Test::Unit::TestCase
|
|
29
42
|
assert_nothing_raised do
|
30
43
|
net = Precedence::Network.new
|
31
44
|
end
|
32
|
-
assert_equal(
|
45
|
+
assert_equal(0,net.activities.size)
|
33
46
|
assert_equal('start',net.activities[:start].reference)
|
34
47
|
assert_equal('finish',net.activities[:finish].reference)
|
35
|
-
|
36
|
-
assert_equal('Finish',net.activities[:finish].description)
|
37
|
-
|
38
|
-
assert_nothing_raised do
|
39
|
-
net = Precedence::Network.new('Begin','End')
|
40
|
-
end
|
41
|
-
assert_equal('Begin',net.activities[:start].description)
|
42
|
-
assert_equal('End',net.activities[:finish].description)
|
48
|
+
|
43
49
|
end
|
44
50
|
|
45
51
|
def test_new_activity
|
@@ -48,32 +54,44 @@ class TC_Network < Test::Unit::TestCase
|
|
48
54
|
end
|
49
55
|
|
50
56
|
assert_nothing_raised do
|
51
|
-
@network.new_activity('a1'
|
57
|
+
@network.new_activity('a1') do |act|
|
58
|
+
act.expected_duration = 1
|
59
|
+
end
|
52
60
|
end
|
53
|
-
assert_equal(
|
61
|
+
assert_equal(1,@network.activities.size)
|
54
62
|
assert_equal('a1',@network.activities['a1'].reference)
|
55
63
|
assert_equal(1,@network.activities['a1'].duration)
|
56
64
|
|
57
65
|
assert_nothing_raised do
|
58
|
-
@network.new_activity('a2'
|
66
|
+
@network.new_activity('a2') do |act|
|
67
|
+
act.expected_duration = 2
|
68
|
+
act.description = 'Activity Two'
|
69
|
+
end
|
59
70
|
end
|
60
|
-
assert_equal(
|
71
|
+
assert_equal(2,@network.activities.size)
|
61
72
|
assert_equal('a2',@network.activities['a2'].reference)
|
62
73
|
assert_equal('Activity Two',@network.activities['a2'].description)
|
63
74
|
assert_equal(2,@network.activities['a2'].duration)
|
64
75
|
|
65
76
|
assert_nothing_raised do
|
66
|
-
@network.new_activity('a3'
|
77
|
+
@network.new_activity('a3') do |act|
|
78
|
+
act.expected_duration = 3
|
79
|
+
act.description = 'Activity Three'
|
80
|
+
end
|
67
81
|
end
|
68
|
-
assert_equal(
|
82
|
+
assert_equal(3,@network.activities.size)
|
69
83
|
assert_equal('a3',@network.activities['a3'].reference)
|
70
84
|
assert_equal('Activity Three',@network.activities['a3'].description)
|
71
85
|
assert_equal(3,@network.activities['a3'].duration)
|
72
86
|
|
73
87
|
assert_nothing_raised do
|
74
|
-
@network.new_activity('a4'
|
88
|
+
@network.new_activity('a4') do |act|
|
89
|
+
act.expected_duration = 4
|
90
|
+
act.description = 'Activity Four'
|
91
|
+
end
|
92
|
+
@network.connect('a4','a3')
|
75
93
|
end
|
76
|
-
assert_equal(
|
94
|
+
assert_equal(4,@network.activities.size)
|
77
95
|
assert_equal('a4',@network.activities['a4'].reference)
|
78
96
|
assert_equal('Activity Four',@network.activities['a4'].description)
|
79
97
|
assert_equal(4,@network.activities['a4'].duration)
|
@@ -82,9 +100,14 @@ class TC_Network < Test::Unit::TestCase
|
|
82
100
|
assert_equal('a4',@network.activities['a3'].pre_activities[0].reference)
|
83
101
|
|
84
102
|
assert_nothing_raised do
|
85
|
-
@network.new_activity('a5'
|
103
|
+
@network.new_activity('a5') do |act|
|
104
|
+
act.expected_duration = 5
|
105
|
+
act.description = 'Activity Five'
|
106
|
+
end
|
107
|
+
@network.connect('a5','a3')
|
108
|
+
@network.connect('a4','a5')
|
86
109
|
end
|
87
|
-
assert_equal(
|
110
|
+
assert_equal(5,@network.activities.size)
|
88
111
|
assert_equal('a5',@network.activities['a5'].reference)
|
89
112
|
assert_equal('Activity Five',@network.activities['a5'].description)
|
90
113
|
assert_equal(5,@network.activities['a5'].duration)
|
@@ -96,11 +119,20 @@ class TC_Network < Test::Unit::TestCase
|
|
96
119
|
assert_equal('a5',@network.activities['a4'].post_activities[1].reference)
|
97
120
|
|
98
121
|
assert_raises(RuntimeError) do
|
99
|
-
@network.new_activity('a6'
|
122
|
+
@network.new_activity('a6') do |act|
|
123
|
+
act.expected_duration = 6
|
124
|
+
act.description = 'Activity Six'
|
125
|
+
@network.connect('a6','a7')
|
126
|
+
end
|
100
127
|
end
|
101
128
|
|
102
129
|
assert_raises(RuntimeError) do
|
103
|
-
@network.new_activity('a6'
|
130
|
+
@network.new_activity('a6') do |act|
|
131
|
+
act.expected_duration = 6
|
132
|
+
act.description = 'Activity Six'
|
133
|
+
@network.connect('a6','a5')
|
134
|
+
@network.connect('a6','a7')
|
135
|
+
end
|
104
136
|
end
|
105
137
|
assert_equal(nil,
|
106
138
|
@network.activities['a5'].pre_activities.detect do |activity|
|
@@ -108,7 +140,12 @@ class TC_Network < Test::Unit::TestCase
|
|
108
140
|
end)
|
109
141
|
|
110
142
|
assert_raises(RuntimeError) do
|
111
|
-
@network.new_activity('a6'
|
143
|
+
@network.new_activity('a6') do |act|
|
144
|
+
act.expected_duration = 6
|
145
|
+
act.description = 'Activity Six'
|
146
|
+
@network.connect('a5','a6')
|
147
|
+
@network.connect('a7','a6')
|
148
|
+
end
|
112
149
|
end
|
113
150
|
assert_equal(nil,
|
114
151
|
@network.activities['a5'].post_activities.detect do |activity|
|
@@ -120,7 +157,7 @@ class TC_Network < Test::Unit::TestCase
|
|
120
157
|
assert_nothing_raised do
|
121
158
|
@network.add_activity(@activity1)
|
122
159
|
end
|
123
|
-
assert_equal(
|
160
|
+
assert_equal(1,@network.activities.size)
|
124
161
|
assert_equal(@activity1,@network.activities[@activity1.reference])
|
125
162
|
|
126
163
|
assert_raises(RuntimeError) do
|
@@ -132,7 +169,7 @@ class TC_Network < Test::Unit::TestCase
|
|
132
169
|
assert_raises(RuntimeError) do
|
133
170
|
@network.add_activity(@activity1)
|
134
171
|
end
|
135
|
-
assert_equal(
|
172
|
+
assert_equal(0,@network.activities.size)
|
136
173
|
end
|
137
174
|
|
138
175
|
def test_connect
|
@@ -159,6 +196,33 @@ class TC_Network < Test::Unit::TestCase
|
|
159
196
|
assert_equal(1,@activity2.pre_activities.size)
|
160
197
|
assert_equal('a1',@activity2.pre_activities[0].reference)
|
161
198
|
end
|
199
|
+
|
200
|
+
def test_disconnect
|
201
|
+
@network.add_activity(@activity1)
|
202
|
+
@network.add_activity(@activity2)
|
203
|
+
@network.add_activity(@activity3)
|
204
|
+
@network.connect(@activity1.reference,@activity2.reference)
|
205
|
+
@network.connect(@activity1.reference,@activity3.reference)
|
206
|
+
|
207
|
+
assert_nothing_raised do
|
208
|
+
@network.disconnect(@activity1.reference,@activity2.reference,@activity3.reference)
|
209
|
+
end
|
210
|
+
assert_equal(0,@activity1.post_activities.size)
|
211
|
+
assert_equal(0,@activity2.pre_activities.size)
|
212
|
+
assert_equal(0,@activity3.pre_activities.size)
|
213
|
+
|
214
|
+
@network.connect(@activity1.reference,@activity2.reference)
|
215
|
+
|
216
|
+
assert_raises(RuntimeError) do
|
217
|
+
@network.disconnect(@activity1.reference,'bogus reference')
|
218
|
+
end
|
219
|
+
assert_equal(1,@activity1.post_activities.size)
|
220
|
+
|
221
|
+
assert_raises(RuntimeError) do
|
222
|
+
@network.disconnect('bogus reference',@activity2.reference)
|
223
|
+
end
|
224
|
+
assert_equal(1,@activity2.pre_activities.size)
|
225
|
+
end
|
162
226
|
|
163
227
|
def test_fix_connections!
|
164
228
|
@network.add_activity(@activity1)
|
@@ -175,15 +239,39 @@ class TC_Network < Test::Unit::TestCase
|
|
175
239
|
end
|
176
240
|
|
177
241
|
def test_to_dot
|
178
|
-
net = Precedence::Network.new
|
179
|
-
net.new_activity('act-1-1'
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
net.new_activity('act-
|
184
|
-
|
185
|
-
|
186
|
-
|
242
|
+
net = Precedence::Network.new
|
243
|
+
net.new_activity('act-1-1') do |act|
|
244
|
+
act.expected_duration = 3
|
245
|
+
act.description = 'System specification'
|
246
|
+
end
|
247
|
+
net.new_activity('act-1-2') do |act|
|
248
|
+
act.expected_duration = 2
|
249
|
+
act.description = 'Review'
|
250
|
+
end
|
251
|
+
net.new_activity('act-1-3') do |act|
|
252
|
+
act.expected_duration = 2
|
253
|
+
act.description = 'System re-specification'
|
254
|
+
end
|
255
|
+
net.new_activity('act-2-1') do |act|
|
256
|
+
act.expected_duration = 3
|
257
|
+
act.description = 'Test tool design'
|
258
|
+
end
|
259
|
+
net.new_activity('act-2-2') do |act|
|
260
|
+
act.expected_duration = 5
|
261
|
+
act.description = 'Test tool implementation'
|
262
|
+
end
|
263
|
+
net.new_activity('act-3-1') do |act|
|
264
|
+
act.expected_duration = 3
|
265
|
+
act.description = 'System design'
|
266
|
+
end
|
267
|
+
net.new_activity('act-3-2') do |act|
|
268
|
+
act.expected_duration = 12
|
269
|
+
act.description = 'System implementation'
|
270
|
+
end
|
271
|
+
net.new_activity('act-2-3') do |act|
|
272
|
+
act.expected_duration = 10
|
273
|
+
act.description = 'System testing'
|
274
|
+
end
|
187
275
|
net.connect('act-1-1','act-1-2')
|
188
276
|
net.connect('act-1-2','act-1-3')
|
189
277
|
net.connect('act-1-3','act-3-1')
|
@@ -205,4 +293,154 @@ class TC_Network < Test::Unit::TestCase
|
|
205
293
|
$stdout.puts("Test png file test_to_dot.png files generated.")
|
206
294
|
end
|
207
295
|
end
|
208
|
-
|
296
|
+
|
297
|
+
def test_to_yaml
|
298
|
+
@activity1.resources['coffee'] = 5
|
299
|
+
@activity1.resources['sugar'] = 10
|
300
|
+
@network.add_activity(@activity1)
|
301
|
+
@activity2.resources['coffee'] = 7.5
|
302
|
+
@network.add_activity(@activity2)
|
303
|
+
@network.connect('a1','a2')
|
304
|
+
@network.fix_connections!
|
305
|
+
activities=[]
|
306
|
+
yamlArray = YAML::load_documents(@network.to_yaml) do |doc|
|
307
|
+
activities << Precedence::Activity.from_yaml_object(doc)
|
308
|
+
end
|
309
|
+
assert_equal(2,activities.size)
|
310
|
+
|
311
|
+
act1 = activities.detect do |activity|
|
312
|
+
activity.reference == 'a1'
|
313
|
+
end
|
314
|
+
assert_equal(@activity1.reference,act1.reference)
|
315
|
+
assert_equal(@activity1.expected_duration,act1.expected_duration)
|
316
|
+
assert_equal(@activity1.description,act1.description)
|
317
|
+
|
318
|
+
act2 = activities.detect do |activity|
|
319
|
+
activity.reference == 'a2'
|
320
|
+
end
|
321
|
+
assert_equal(@activity2.reference,act2.reference)
|
322
|
+
assert_equal(@activity2.expected_duration,act2.expected_duration)
|
323
|
+
assert_equal(@activity2.description,act2.description)
|
324
|
+
|
325
|
+
assert_nothing_raised do
|
326
|
+
File.open('test_to_yaml.yaml',File::CREAT|File::TRUNC|File::WRONLY) do|f|
|
327
|
+
f.puts(@network.to_yaml)
|
328
|
+
end
|
329
|
+
end
|
330
|
+
$stdout.puts("\nTest yaml file test_to_yaml.yaml file generated.")
|
331
|
+
end
|
332
|
+
|
333
|
+
def test_from_yaml
|
334
|
+
@network.add_activity(@activity1)
|
335
|
+
@network.add_activity(@activity2)
|
336
|
+
@network.add_activity(@activity3)
|
337
|
+
@network.connect('a1','a2')
|
338
|
+
@network.connect('a1','a3')
|
339
|
+
|
340
|
+
|
341
|
+
network = Precedence::Network.from_yaml(@network.to_yaml)
|
342
|
+
assert_equal(3,network.activities.size)
|
343
|
+
network.fix_connections!
|
344
|
+
|
345
|
+
start = network.activities['start']
|
346
|
+
assert_equal('start',start.reference)
|
347
|
+
assert_equal(0,start.expected_duration)
|
348
|
+
assert_equal(1,start.post_activities.size)
|
349
|
+
assert_equal(0,start.pre_activities.size)
|
350
|
+
assert_equal(@activity1,start.post_activities[0])
|
351
|
+
|
352
|
+
a1 = network.activities['a1']
|
353
|
+
assert_equal('a1',a1.reference)
|
354
|
+
assert_equal(1,a1.expected_duration)
|
355
|
+
assert_equal('Activity1',a1.description)
|
356
|
+
assert_equal(2,a1.post_activities.size)
|
357
|
+
assert_equal(true,(((a1.post_activities[0].reference == 'a2') and (a1.post_activities[1].reference == 'a3'))or
|
358
|
+
((a1.post_activities[1].reference == 'a2') and (a1.post_activities[0].reference == 'a3'))))
|
359
|
+
|
360
|
+
a2 = network.activities['a2']
|
361
|
+
assert_equal('a2',a2.reference)
|
362
|
+
assert_equal(2,a2.expected_duration)
|
363
|
+
assert_equal('Activity2',a2.description)
|
364
|
+
assert_equal(1,a2.post_activities.size)
|
365
|
+
assert_equal(1,a2.pre_activities.size)
|
366
|
+
assert_equal('a1',a2.pre_activities[0].reference)
|
367
|
+
assert_equal('finish',a2.post_activities[0].reference)
|
368
|
+
|
369
|
+
a3 = network.activities['a3']
|
370
|
+
assert_equal('a3',a3.reference)
|
371
|
+
assert_equal(3,a3.expected_duration)
|
372
|
+
assert_equal('Activity3',a3.description)
|
373
|
+
assert_equal(1,a3.post_activities.size)
|
374
|
+
assert_equal(1,a3.pre_activities.size)
|
375
|
+
assert_equal('a1',a3.pre_activities[0].reference)
|
376
|
+
assert_equal('finish',a3.post_activities[0].reference)
|
377
|
+
|
378
|
+
finish = network.activities['finish']
|
379
|
+
assert_equal('finish',finish.reference)
|
380
|
+
assert_equal(0,finish.expected_duration)
|
381
|
+
assert_equal(0,finish.post_activities.size)
|
382
|
+
assert_equal(2,finish.pre_activities.size)
|
383
|
+
assert_equal(true,(((finish.pre_activities[0].reference == 'a2') and (finish.pre_activities[1].reference == 'a3'))or
|
384
|
+
((finish.pre_activities[1].reference == 'a2') and (finish.pre_activities[0].reference == 'a3'))))
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_activities_at_time
|
388
|
+
@network.add_activity(@activity1)
|
389
|
+
@network.add_activity(@activity2)
|
390
|
+
@network.add_activity(@activity3)
|
391
|
+
@network.connect('a1','a2')
|
392
|
+
@network.connect('a1','a3')
|
393
|
+
@network.fix_connections!
|
394
|
+
|
395
|
+
assert_equal([@activity1],@network.activities_at_time(0.5))
|
396
|
+
assert_equal([@activity2,@activity3],@network.activities_at_time(2.5))
|
397
|
+
assert_equal([@activity3],@network.activities_at_time(3))
|
398
|
+
end
|
399
|
+
|
400
|
+
def test_activities_during_time
|
401
|
+
@network.add_activity(@activity1)
|
402
|
+
@network.add_activity(@activity2)
|
403
|
+
@network.add_activity(@activity3)
|
404
|
+
@network.connect('a1','a2')
|
405
|
+
@network.connect('a1','a3')
|
406
|
+
@network.fix_connections!
|
407
|
+
|
408
|
+
assert_equal([@activity1],@network.activities_during_time(0..1.0))
|
409
|
+
assert_equal([@activity1,@activity2,@activity3],@network.activities_during_time(0..2.0))
|
410
|
+
assert_equal([@activity2,@activity3],@network.activities_during_time(1.0..2.0))
|
411
|
+
assert_equal([@activity2,@activity3],@network.activities_during_time(1.5..2.5))
|
412
|
+
|
413
|
+
assert_equal([],@network.activities_during_time(4.0..5.0))
|
414
|
+
end
|
415
|
+
|
416
|
+
def test_each_time
|
417
|
+
@network.add_activity(@activity1)
|
418
|
+
@network.add_activity(@activity2)
|
419
|
+
@network.add_activity(@activity3)
|
420
|
+
@network.connect('a1','a2')
|
421
|
+
@network.connect('a1','a3')
|
422
|
+
@network.fix_connections!
|
423
|
+
|
424
|
+
expected_activities = {0.0=>[@activity1],1.0=>[@activity2,@activity3],
|
425
|
+
2.0=>[@activity2,@activity3],3.0=>[@activity3]}
|
426
|
+
actual_activities = {}
|
427
|
+
|
428
|
+
day = 0.0
|
429
|
+
assert_nothing_raised do
|
430
|
+
@network.each_time_period do |activities|
|
431
|
+
actual_activities[day] = activities
|
432
|
+
day += 1
|
433
|
+
end
|
434
|
+
end
|
435
|
+
assert_equal(expected_activities,actual_activities)
|
436
|
+
|
437
|
+
actual_activities = {}
|
438
|
+
assert_nothing_raised do
|
439
|
+
@network.each_time_period_with_index do |activities,index|
|
440
|
+
actual_activities[index] = activities
|
441
|
+
end
|
442
|
+
end
|
443
|
+
assert_equal(expected_activities,actual_activities)
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
data/tests/ts_precedence.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: precedence
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.8.0
|
7
|
+
date: 2005-07-04
|
8
8
|
summary: A library for the creation manipulation and analysis of precedence networks.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,6 +31,7 @@ files:
|
|
31
31
|
- lib/precedence.rb
|
32
32
|
- lib/precedence/activity.rb
|
33
33
|
- lib/precedence/network.rb
|
34
|
+
- lib/precedence/utilities.rb
|
34
35
|
- tests/tc_activity.rb
|
35
36
|
- tests/tc_network.rb
|
36
37
|
- tests/ts_precedence.rb
|