rachinations 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +6 -0
  4. data/.travis.yml +8 -0
  5. data/.yardopts +1 -0
  6. data/Gemfile +19 -0
  7. data/Gemfile.lock +93 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +18 -0
  10. data/Rakefile +16 -0
  11. data/lib/rachinations.rb +49 -0
  12. data/lib/rachinations/domain/diagrams/diagram.rb +167 -0
  13. data/lib/rachinations/domain/diagrams/non_deterministic_diagram.rb +16 -0
  14. data/lib/rachinations/domain/diagrams/verbose_diagram.rb +9 -0
  15. data/lib/rachinations/domain/edge_collection.rb +12 -0
  16. data/lib/rachinations/domain/edges/edge.rb +159 -0
  17. data/lib/rachinations/domain/edges/random_edge.rb +4 -0
  18. data/lib/rachinations/domain/exceptions/bad_options.rb +3 -0
  19. data/lib/rachinations/domain/exceptions/no_elements_found.rb +2 -0
  20. data/lib/rachinations/domain/exceptions/no_elements_matching_condition_error.rb +2 -0
  21. data/lib/rachinations/domain/exceptions/no_elements_of_given_type.rb +3 -0
  22. data/lib/rachinations/domain/exceptions/unsupported_type_error.rb +2 -0
  23. data/lib/rachinations/domain/modules/common/hash_init.rb +88 -0
  24. data/lib/rachinations/domain/modules/common/invariant.rb +17 -0
  25. data/lib/rachinations/domain/modules/diagrams/verbose.rb +30 -0
  26. data/lib/rachinations/domain/node_collection.rb +30 -0
  27. data/lib/rachinations/domain/nodes/converter.rb +276 -0
  28. data/lib/rachinations/domain/nodes/gate.rb +6 -0
  29. data/lib/rachinations/domain/nodes/node.rb +166 -0
  30. data/lib/rachinations/domain/nodes/pool.rb +267 -0
  31. data/lib/rachinations/domain/nodes/resourceful_node.rb +96 -0
  32. data/lib/rachinations/domain/nodes/resourceless_node.rb +11 -0
  33. data/lib/rachinations/domain/nodes/sink.rb +17 -0
  34. data/lib/rachinations/domain/nodes/source.rb +161 -0
  35. data/lib/rachinations/domain/nodes/trader.rb +6 -0
  36. data/lib/rachinations/domain/resource_bag.rb +131 -0
  37. data/lib/rachinations/domain/resources/token.rb +51 -0
  38. data/lib/rachinations/domain/strategies/strategy.rb +5 -0
  39. data/lib/rachinations/domain/strategies/valid_types.rb +69 -0
  40. data/lib/rachinations/dsl/dsl.rb +63 -0
  41. data/lib/rachinations/extras/fifo.rb +27 -0
  42. data/lib/rachinations/version.rb +3 -0
  43. data/machinations_diagrams/apenas_bonito.xml +22 -0
  44. data/machinations_diagrams/behavior_converter.xml +53 -0
  45. data/machinations_diagrams/behavior_converter_fim.xml +10 -0
  46. data/machinations_diagrams/canon/README.md +8 -0
  47. data/machinations_diagrams/canon/converters_differences.xml +27 -0
  48. data/machinations_diagrams/canon/converters_differences2.xml +34 -0
  49. data/machinations_diagrams/canon/converters_similarities.xml +63 -0
  50. data/machinations_diagrams/canon/converters_similarities2.xml +21 -0
  51. data/machinations_diagrams/canon/nodes_and_edges_differences.xml +15 -0
  52. data/machinations_diagrams/canon/nodes_and_edges_similarities.xml +20 -0
  53. data/machinations_diagrams/deterministic_example.xml +46 -0
  54. data/machinations_diagrams/economies_of_scale.xml +32 -0
  55. data/machinations_diagrams/feature_ou_bug.xml +5 -0
  56. data/machinations_diagrams/loop_in_trigger.xml +21 -0
  57. data/machinations_diagrams/naficadevendo.xml +12 -0
  58. data/machinations_diagrams/noreporting_equivalent.xml +22 -0
  59. data/machinations_diagrams/pull_all_example.xml +7 -0
  60. data/machinations_diagrams/sketch_of_memory.xml +41 -0
  61. data/machinations_diagrams/software_engineering_process 2.xml +130 -0
  62. data/machinations_diagrams/software_engineering_process v3.xml +168 -0
  63. data/machinations_diagrams/software_engineering_process v4.xml +192 -0
  64. data/machinations_diagrams/software_engineering_process.xml +65 -0
  65. data/machinations_diagrams/software_engineering_process_with_rework_after_test.xml +195 -0
  66. data/machinations_diagrams/startup_marketing.xml +35 -0
  67. data/machinations_diagrams/triggers_allow_multiple_stages_at_same_round.xml +19 -0
  68. data/machinations_diagrams/um_de_cada_vez_vs_todos_de_uma_vez.xml +20 -0
  69. data/rachinations.gemspec +35 -0
  70. data/testing/features/step_definitions/step_definitions.rb +11 -0
  71. data/testing/simulations/modelo1.rb +20 -0
  72. data/testing/simulations/modelo2.rb +49 -0
  73. data/testing/simulations/noreporting.rb +51 -0
  74. data/testing/simulations/sequencial.rb +19 -0
  75. data/testing/simulations/sobonito.rb +28 -0
  76. data/testing/simulations/sobonitowhile.rb +28 -0
  77. data/testing/simulations/whatIwish1.rb +20 -0
  78. data/testing/spec/canon/converter_spec.rb +33 -0
  79. data/testing/spec/canon/pool_spec.rb +68 -0
  80. data/testing/spec/conditions_spec.rb +10 -0
  81. data/testing/spec/converter_spec.rb +223 -0
  82. data/testing/spec/diagram_spec.rb +671 -0
  83. data/testing/spec/edge_spec.rb +256 -0
  84. data/testing/spec/hash_init_spec.rb +59 -0
  85. data/testing/spec/node_spec.rb +31 -0
  86. data/testing/spec/non_deterministic_diagram_spec.rb +112 -0
  87. data/testing/spec/pool_spec.rb +233 -0
  88. data/testing/spec/source_spec.rb +132 -0
  89. data/testing/spec/spec_helper.rb +34 -0
  90. data/testing/spec/xexeo_spec.rb +193 -0
  91. metadata +283 -0
@@ -0,0 +1,671 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Diagram do
4
+
5
+ it 'can be empty' do
6
+ d = Diagram.new 'empty'
7
+ expect(d.name).to eq 'empty'
8
+ end
9
+
10
+ it 'should be created with a source and a pool and run n times with no errors' do
11
+
12
+ d=Diagram.new 'simple'
13
+
14
+ d.add_node! Source, {
15
+ :name => 'source'
16
+ }
17
+
18
+ d.add_node! Pool, {
19
+ :name => 'deposit',
20
+ :initial_value => 0
21
+ }
22
+
23
+ d.add_edge! Edge, {
24
+ :name => 'connector',
25
+ :from => 'source',
26
+ :to => 'deposit'
27
+ }
28
+
29
+ d.run!(10)
30
+
31
+ expect(d.resource_count).to eq 10
32
+ expect(d.get_node('deposit').resource_count).to eq 10
33
+
34
+ end
35
+
36
+ it "runs for 2 turns with two pools using PULL and there's the correct amount of resources at the end" do
37
+
38
+ d = Diagram.new 'some_name'
39
+
40
+ d.add_node! Pool, name: 'pool1', initial_value: 5
41
+
42
+ d.add_node! Pool, name: 'pool2', activation: :automatic
43
+
44
+ d.add_edge! Edge, name: 'edge', from: 'pool1', to: 'pool2'
45
+
46
+ d.run!(2)
47
+
48
+ expect(d.get_node('pool1').resource_count).to eq 3
49
+ expect(d.get_node('pool2').resource_count).to eq 2
50
+
51
+ end
52
+
53
+ it "runs for 2 turns with two pools using PULL and add the correct amount" do
54
+
55
+ d = Diagram.new 'some_name'
56
+
57
+ d.add_node! Pool, name: 'pool1', initial_value: 5
58
+
59
+ d.add_node! Pool, name: 'pool2', activation: :automatic
60
+
61
+ d.add_edge! Edge, name: 'edge', from: 'pool1', to: 'pool2'
62
+
63
+ d.run!(2)
64
+
65
+ expect(d.get_node('pool1').resources_added).to eq 0
66
+ expect(d.get_node('pool2').resources_added).to eq 2
67
+
68
+ expect(d.get_node('pool2').resources_removed).to eq 0
69
+ expect(d.get_node('pool1').resources_removed).to eq 2
70
+
71
+ end
72
+
73
+ it "runs for 2 turns with source and pool using PULL and add and remove the correct amount" do
74
+
75
+ d = Diagram.new 'some_name'
76
+
77
+ d.add_node! Source, name: 's1', activation: :automatic
78
+
79
+ d.add_node! Pool, name: 'pool2'
80
+
81
+ d.add_edge! Edge, name: 'edge', from: 's1', to: 'pool2'
82
+
83
+ d.run!(2)
84
+
85
+
86
+ expect(d.get_node('s1').resources_added).to eq 0
87
+ expect(d.get_node('pool2').resources_added).to eq 2
88
+ expect(d.get_node('pool2').resources_removed).to eq 0
89
+ expect(d.get_node('s1').resources_removed).to eq 2
90
+
91
+ end
92
+
93
+ it "runs for two turns with two pools using PUSH and there's the correct amount of resources at the end" do
94
+
95
+ d = Diagram.new 'some_name'
96
+
97
+ d.add_node! Pool, name: 'pool1', initial_value: 5, mode: :push_any, activation: :automatic
98
+
99
+ d.add_node! Pool, name: 'pool2'
100
+
101
+ d.add_edge! Edge, name: 'edge', from: 'pool1', to: 'pool2'
102
+
103
+ d.run!(2)
104
+
105
+ expect(d.get_node('pool1').resource_count).to eq 3
106
+ expect(d.get_node('pool2').resource_count).to eq 2
107
+
108
+ end
109
+
110
+ it "runs for a single turn with one source and two pools and there's the correct amount of resources at the end" do
111
+ p = Diagram.new('one source two pools')
112
+
113
+ p.add_node!(Source, {name: 'source'})
114
+
115
+ p.add_node!(Pool, {name: 'pool1'})
116
+
117
+ p.add_node!(Pool, {name: 'pool2', activation: :automatic})
118
+
119
+ p.add_edge!(Edge, {name: 'edge1', from: 'source', to: 'pool1'})
120
+
121
+ p.add_edge!(Edge, {name: 'connector2', from: 'pool1', to: 'pool2'})
122
+
123
+ p.run!(1)
124
+
125
+ expect(p.get_node('pool1').resource_count).to eq 1
126
+ expect(p.get_node('pool2').resource_count).to eq 0
127
+
128
+ end
129
+
130
+ it 'takes staging and commit steps into account when run with 3 pools for 1 turn only' do
131
+
132
+ d = Diagram.new 'some_name'
133
+
134
+ d.add_node! Pool, name: 'pool1', initial_value: 2, mode: :push_any, activation: :automatic
135
+
136
+ d.add_node! Pool, name: 'pool2'
137
+
138
+ d.add_node! Pool, name: 'pool3', activation: :automatic
139
+
140
+ d.add_edge! Edge, name: 'edge1', from: 'pool1', to: 'pool2'
141
+
142
+ d.add_edge! Edge, name: 'edge2', from: 'pool2', to: 'pool3'
143
+
144
+ d.run!(1)
145
+
146
+ expect(d.get_node('pool1').resource_count).to eq 1
147
+ expect(d.get_node('pool2').resource_count).to eq 1
148
+ expect(d.get_node('pool3').resource_count).to eq 0
149
+
150
+ end
151
+
152
+ it 'takes staging and commit steps into account when run with 3 pools for 4 turns' do
153
+
154
+ d = Diagram.new 'some_name'
155
+
156
+ d.add_node! Pool, name: 'pool1', initial_value: 10, mode: :push_any, activation: :automatic
157
+
158
+ d.add_node! Pool, name: 'pool2'
159
+
160
+ d.add_node! Pool, name: 'pool3', activation: :automatic
161
+
162
+ d.add_edge! Edge, name: 'edge1', from: 'pool1', to: 'pool2'
163
+
164
+ d.add_edge! Edge, name: 'edge2', from: 'pool2', to: 'pool3'
165
+
166
+
167
+ d.run!(4)
168
+
169
+ expect(d.get_node('pool1').resource_count).to eq 6
170
+ expect(d.get_node('pool2').resource_count).to eq 1
171
+ expect(d.get_node('pool3').resource_count).to eq 3
172
+
173
+
174
+ end
175
+
176
+ it 'runs with a source and a pool and have the expected amount of resources at the end' do
177
+
178
+ d=Diagram.new 'simple'
179
+
180
+
181
+ d.add_node! Source, {
182
+ :name => 'source'
183
+ }
184
+
185
+ d.add_node! Pool, {
186
+ :name => 'deposit',
187
+ }
188
+
189
+ d.add_edge! Edge, {
190
+ :name => 'connector',
191
+ :from => 'source',
192
+ :to => 'deposit'
193
+ }
194
+
195
+ d.run!(10)
196
+
197
+ expect(d.get_node('deposit').resource_count).to eq 10
198
+
199
+ end
200
+
201
+ it 'can be run until a given condition is true' do
202
+ d=Diagram.new 'simple'
203
+ d.add_node! Pool, {
204
+ :name => 'deposit',
205
+ :initial_value => 0
206
+ }
207
+ d.add_node! Source, {
208
+ :name => 'source'
209
+ }
210
+ d.add_edge! Edge, {
211
+ :name => 'connector',
212
+ :from => 'source',
213
+ :to => 'deposit'
214
+ }
215
+
216
+ d.run_while! { d.get_node('deposit').resource_count < 10 }
217
+ expect(d.get_node('deposit').resource_count).to eq 10
218
+
219
+ end
220
+
221
+ it 'aborts after specified turns as a safeguard against infinite loops given as stopping condition' do
222
+
223
+ d=Diagram.new 'simple'
224
+ d.max_iterations=9
225
+
226
+ d.add_node! Pool, {
227
+ :name => 'deposit',
228
+ :initial_value => 0
229
+ }
230
+ d.add_node! Source, {
231
+ :name => 'source'
232
+ }
233
+ d.add_edge! Edge, {
234
+ :name => 'connector',
235
+ :from => 'source',
236
+ :to => 'deposit'
237
+ }
238
+
239
+ d.run_while! { true == true }
240
+
241
+ #not hanging on forever is the success condition.
242
+ expect(d.get_node('deposit').resource_count).to eq 9
243
+
244
+ end
245
+
246
+ it 'does not raise errors when active pushes or pulls are not possible' do
247
+
248
+ d = Diagram.new 'no errors'
249
+
250
+ d.add_node! Pool, name: 'Poor fella', initial_value: 5
251
+
252
+ d.add_node! Pool, name: 'Hungry fella', activation: :automatic
253
+
254
+ d.add_edge! Edge, name: 'edge1', from: 'Poor fella', to: 'Hungry fella'
255
+
256
+ expect { d.run! 10 }.not_to raise_error
257
+
258
+ expect(d.get_node('Hungry fella').resource_count).to eq 5
259
+
260
+ end
261
+
262
+ it "raises an error in case users try to access a node that doesn't exist" do
263
+
264
+ p = Diagram.new('get invalid node')
265
+
266
+ p.add_node! Source, name: 'source'
267
+
268
+ p.add_node! Pool, name: 'pool1'
269
+
270
+ p.add_edge! Edge, {
271
+ name: 'connector1',
272
+ from: 'source',
273
+ to: 'pool1'
274
+ }
275
+
276
+ # use curly brackets instead of parentheses here.
277
+ expect { p.get_node('pool') }.to raise_error RuntimeError
278
+
279
+ end
280
+
281
+ it 'runs with typed nodes connected by typeless edges' do
282
+
283
+ p = Diagram.new('one source one pool typed')
284
+
285
+ p.add_node!(Source, name: 'source', :type => Green)
286
+ p.add_node!(Pool, name: 'pool1', :types => [Green, Red])
287
+ p.add_edge!(Edge, name: 'connector1', from: 'source', to: 'pool1')
288
+
289
+ p.run!(5)
290
+
291
+ expect(p.get_node('pool1').resource_count(Green)).to eq 5
292
+ expect(p.get_node('pool1').resource_count(Red)).to eq 0
293
+
294
+ end
295
+
296
+ it "allows untyped nodes to receive typed resources sent to them via untyped edges" do
297
+
298
+ p = Diagram.new 'balls'
299
+
300
+ p.add_node!(Source, name: 'source', :type => Football)
301
+
302
+ p.add_node!(Pool, name: 'pool1')
303
+
304
+ p.add_edge!(Edge, name: 'connector1', from: 'source', to: 'pool1')
305
+
306
+ p.run!(5)
307
+
308
+ expect(p.get_node('pool1').resource_count(Football)).to eq 5
309
+
310
+ end
311
+
312
+ it "allows untyped nodes to receive typed resources sent to them via typed edges" do
313
+
314
+ p = Diagram.new 'fruits'
315
+
316
+ #by declaring initial values, we're implicitly declaring types.
317
+ p.add_node! Pool, name: 'pool1', initial_value: {Peach => 20, Mango => 99}
318
+
319
+ p.add_node! Pool, name: 'pool2', activation: :automatic
320
+
321
+ p.add_edge!(Edge, name: 'connector1', from: 'pool1', to: 'pool2', types: [Peach])
322
+
323
+ p.run!(5)
324
+
325
+ expect(p.get_node('pool1').resource_count(Peach)).to eq 15
326
+ expect(p.get_node('pool1').resource_count(Mango)).to eq 99
327
+ expect(p.get_node('pool2').resource_count(Peach)).to eq 5
328
+
329
+ end
330
+
331
+ it "executes start nodes only once" do
332
+
333
+ d=Diagram.new 'simple'
334
+
335
+ d.add_node! Source, {
336
+ :name => 'source',
337
+ :activation => :start
338
+ }
339
+
340
+ d.add_node! Pool, {
341
+ :name => 'deposit',
342
+ :initial_value => 0
343
+ }
344
+
345
+ d.add_edge! Edge, {
346
+ :name => 'connector',
347
+ :from => 'source',
348
+ :to => 'deposit'
349
+ }
350
+
351
+ d.run!(10)
352
+
353
+
354
+ expect(d.get_node('deposit').resource_count).to eq 1
355
+
356
+ end
357
+
358
+ it 'does not run disabled nodes from the beginning' do
359
+
360
+ d=Diagram.new 'simple'
361
+
362
+ d.add_node! Source, {
363
+ :name => 'source'
364
+ }
365
+
366
+ d.add_node! Pool, {
367
+ :name => 'deposit',
368
+ :initial_value => 0
369
+ }
370
+
371
+
372
+ d.add_edge! Edge, {
373
+ :name => 'connector',
374
+ :from => 'source',
375
+ :to => 'deposit'
376
+ }
377
+
378
+ d.get_node('source').attach_condition(lambda { false })
379
+
380
+ d.run!(10)
381
+
382
+ expect(d.resource_count).to eq 0
383
+ expect(d.get_node('deposit').resource_count).to eq 0
384
+
385
+ end
386
+
387
+ it 'must not run disabled nodes at some point' do
388
+
389
+ #não entendi pra que serve esse teste
390
+
391
+ d=Diagram.new 'simple'
392
+
393
+ d.add_node! Source, {
394
+ :name => 'source'
395
+ }
396
+
397
+ d.add_node! Pool, {
398
+ :name => 'deposit',
399
+ :initial_value => 0
400
+ }
401
+
402
+
403
+ d.add_edge! Edge, {
404
+ :name => 'connector',
405
+ :from => 'source',
406
+ :to => 'deposit'
407
+ }
408
+
409
+ d.get_node('source').attach_condition(lambda { d.get_node('deposit').resource_count < 3 })
410
+
411
+ d.run!(10)
412
+
413
+ expect(d.resource_count).to eq 3
414
+ expect(d.get_node('deposit').resource_count).to eq 3
415
+
416
+ end
417
+
418
+ it 'runs when both ends (of an edge) are enabled' do
419
+
420
+ d=Diagram.new 'simple'
421
+
422
+ d.add_node! Source, {
423
+ :name => 'source'
424
+ }
425
+
426
+ d.add_node! Pool, {
427
+ :name => 'deposit',
428
+ :initial_value => 0
429
+ }
430
+
431
+
432
+ d.add_edge! Edge, {
433
+ :name => 'connector',
434
+ :from => 'source',
435
+ :to => 'deposit'
436
+ }
437
+
438
+ d.get_node('deposit').attach_condition(lambda { d.get_node('deposit').resource_count < 3 })
439
+
440
+ d.run!(10)
441
+
442
+ # expect(d.resource_count).to eq 3
443
+ expect(d.get_node('deposit').resource_count).to eq 3
444
+
445
+ end
446
+
447
+ it 'makes triggers trig!' do
448
+ d=Diagram.new 'simple'
449
+
450
+ d.add_node! Source, {
451
+ :name => 'source'
452
+ }
453
+
454
+ d.add_node! Pool, {
455
+ :name => 'deposit',
456
+ :initial_value => 0
457
+ }
458
+
459
+
460
+ d.add_edge! Edge, {
461
+ :name => 'connector',
462
+ :from => 'source',
463
+ :to => 'deposit'
464
+ }
465
+
466
+ d.get_node('deposit').attach_trigger([lambda { d.get_node('deposit').resource_count === 3 }, d.get_node('source')])
467
+
468
+ d.run!(10)
469
+
470
+ expect(d.resource_count).to eq 11
471
+ expect(d.get_node('deposit').resource_count).to eq 11
472
+
473
+ end
474
+
475
+ it 'makes triggers trig! more than once' do
476
+ d=Diagram.new 'simple'
477
+
478
+ d.add_node! Source, {
479
+ :name => 's1'
480
+ }
481
+
482
+ d.add_node! Pool, {
483
+ :name => 'd1',
484
+ :initial_value => 0
485
+ }
486
+
487
+
488
+ d.add_node! Source, {
489
+ :name => 's2',
490
+ :activation => :passive
491
+ }
492
+
493
+ d.add_edge! Edge, {
494
+ :name => 'c1',
495
+ :from => 's1',
496
+ :to => 'd1'
497
+ }
498
+
499
+ d.add_node! Pool, {
500
+ :name => 'd2',
501
+ :initial_value => 0
502
+ }
503
+
504
+
505
+ d.add_edge! Edge, {
506
+ :name => 'c2',
507
+ :from => 's2',
508
+ :to => 'd2'
509
+ }
510
+
511
+
512
+ d.get_node('d1').attach_trigger([lambda { d.get_node('d1').resource_count > 3 }, d.get_node('s1')])
513
+ d.get_node('d1').attach_trigger([lambda { d.get_node('d1').resource_count > 3 }, d.get_node('s2')])
514
+ #d.extend(Verbose)
515
+ d.run!(6)
516
+
517
+ expect(d.resource_count).to eq 10
518
+ expect(d.get_node('d1').resource_count).to eq 8
519
+ expect(d.get_node('d2').resource_count).to eq 2
520
+
521
+ end
522
+
523
+ it 'makes triggers trig! more than once with instant_resource_count' do
524
+ d=Diagram.new 'simple'
525
+
526
+ d.add_node! Source, {
527
+ :name => 's1'
528
+ }
529
+
530
+ d.add_node! Pool, {
531
+ :name => 'd1',
532
+ :initial_value => 0
533
+ }
534
+
535
+
536
+ d.add_node! Source, {
537
+ :name => 's2',
538
+ :activation => :passive
539
+ }
540
+
541
+ d.add_edge! Edge, {
542
+ :name => 'c1',
543
+ :from => 's1',
544
+ :to => 'd1'
545
+ }
546
+
547
+ d.add_node! Pool, {
548
+ :name => 'd2',
549
+ :initial_value => 0
550
+ }
551
+
552
+
553
+ d.add_edge! Edge, {
554
+ :name => 'c2',
555
+ :from => 's2',
556
+ :to => 'd2'
557
+ }
558
+
559
+
560
+ d.get_node('d1').attach_trigger([lambda { d.get_node('d1').instant_resource_count > 3 }, d.get_node('s1')])
561
+ d.get_node('d1').attach_trigger([lambda { d.get_node('d1').instant_resource_count > 3 }, d.get_node('s2')])
562
+ #d.extend(Verbose)
563
+ d.run!(6)
564
+
565
+ expect(d.resource_count).to eq 12
566
+ expect(d.get_node('d1').resource_count).to eq 9
567
+ expect(d.get_node('d2').resource_count).to eq 3
568
+
569
+ end
570
+
571
+ context 'integration' do
572
+
573
+ it ' makes a train run' do
574
+
575
+ d = Diagram.new 'dia'
576
+
577
+ d.add_node! Pool, {
578
+ name: 'p1',
579
+ mode: :push_any,
580
+ activation: :automatic,
581
+ initial_value: 8
582
+ }
583
+
584
+ d.add_node! Pool, {
585
+ name: 'p2',
586
+ mode: :push_any,
587
+ activation: :automatic
588
+ }
589
+
590
+ d.add_node! Pool, {
591
+ name: 'p3',
592
+ mode: :push_any,
593
+ activation: :automatic
594
+ }
595
+
596
+ d.add_node! Pool, {
597
+ name: 'p4',
598
+ mode: :push_any,
599
+ activation: :automatic
600
+ }
601
+
602
+ d.add_edge! Edge,{
603
+ name: 'e1',
604
+ from: 'p1',
605
+ to: 'p2'
606
+ }
607
+ d.add_edge! Edge,{
608
+ name: 'e2',
609
+ from: 'p2',
610
+ to: 'p3'
611
+ }
612
+ d.add_edge! Edge,{
613
+ name: 'e3',
614
+ from: 'p3',
615
+ to: 'p4'
616
+ }
617
+
618
+ d.run!(30)
619
+
620
+ expect(d.get_node('p1').resource_count).to eq 0
621
+ expect(d.get_node('p2').resource_count).to eq 0
622
+ expect(d.get_node('p3').resource_count).to eq 0
623
+ expect(d.get_node('p4').resource_count).to eq 8
624
+
625
+ end
626
+
627
+ end
628
+
629
+ context 'simple converter behaviour' do
630
+ it 'runs an untyped converter connected to two pools' do
631
+
632
+ d=Diagram.new 'simple'
633
+
634
+ d.add_node! Pool, {
635
+ :name => 'from',
636
+ :initial_value => 5
637
+ }
638
+
639
+ d.add_node! Pool, {
640
+ :name => 'to',
641
+ :initial_value => 0
642
+ }
643
+
644
+ d.add_node! Converter,{
645
+ :name => 'c',
646
+ :activation => :automatic
647
+ }
648
+
649
+ d.add_edge! Edge, {
650
+ :name => 'c1',
651
+ :from => 'from',
652
+ :to => 'c'
653
+ }
654
+
655
+ d.add_edge! Edge, {
656
+ :name => 'c2',
657
+ :from => 'c',
658
+ :to => 'to'
659
+ }
660
+
661
+ d.run!(4)
662
+
663
+ expect(d.get_node('to').resource_count).to eq 4
664
+
665
+ end
666
+
667
+
668
+ end
669
+
670
+
671
+ end