-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmechanically_generated_test.cpp
More file actions
742 lines (728 loc) · 36.6 KB
/
mechanically_generated_test.cpp
File metadata and controls
742 lines (728 loc) · 36.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
// Generated using make-cpp-test.ts from https://github.com/staticvariablejames/InsugarTrading
#include "stock.h"
#include "catch2/catch.hpp"
#include "random.h"
using namespace CCCPP;
TEST_CASE("Stock::tick behaves as intended", "[stock][tick]") {
Stock goods[18];
goods[0].id(0);
goods[0].bank_level(5);
goods[0].value(55.62);
goods[0].delta(0.69);
goods[0].mode(StockMode::Chaotic);
goods[0].duration(7);
goods[1].id(1);
goods[1].bank_level(5);
goods[1].value(78.21);
goods[1].delta(0.19);
goods[1].mode(StockMode::SlowFall);
goods[1].duration(81);
goods[2].id(2);
goods[2].bank_level(5);
goods[2].value(50.28);
goods[2].delta(0.35);
goods[2].mode(StockMode::Chaotic);
goods[2].duration(1);
goods[3].id(3);
goods[3].bank_level(5);
goods[3].value(51.14);
goods[3].delta(0.6);
goods[3].mode(StockMode::SlowRise);
goods[3].duration(37);
goods[4].id(4);
goods[4].bank_level(5);
goods[4].value(59.62);
goods[4].delta(0.75);
goods[4].mode(StockMode::SlowRise);
goods[4].duration(6);
goods[5].id(5);
goods[5].bank_level(5);
goods[5].value(44.51);
goods[5].delta(0.2);
goods[5].mode(StockMode::SlowFall);
goods[5].duration(74);
goods[6].id(6);
goods[6].bank_level(5);
goods[6].value(64.83);
goods[6].delta(-0.04);
goods[6].mode(StockMode::SlowFall);
goods[6].duration(30);
goods[7].id(7);
goods[7].bank_level(5);
goods[7].value(72.98);
goods[7].delta(-0.13);
goods[7].mode(StockMode::FastFall);
goods[7].duration(71);
goods[8].id(8);
goods[8].bank_level(5);
goods[8].value(92.47);
goods[8].delta(-0.15);
goods[8].mode(StockMode::SlowFall);
goods[8].duration(71);
goods[9].id(9);
goods[9].bank_level(5);
goods[9].value(67.72);
goods[9].delta(0.45);
goods[9].mode(StockMode::Stable);
goods[9].duration(52);
goods[10].id(10);
goods[10].bank_level(5);
goods[10].value(47.3);
goods[10].delta(-0.21);
goods[10].mode(StockMode::FastFall);
goods[10].duration(65);
goods[11].id(11);
goods[11].bank_level(5);
goods[11].value(26.72);
goods[11].delta(-1.21);
goods[11].mode(StockMode::FastFall);
goods[11].duration(55);
goods[12].id(12);
goods[12].bank_level(5);
goods[12].value(142.75);
goods[12].delta(-0.3);
goods[12].mode(StockMode::SlowFall);
goods[12].duration(54);
goods[13].id(13);
goods[13].bank_level(5);
goods[13].value(111.73);
goods[13].delta(0.1);
goods[13].mode(StockMode::SlowRise);
goods[13].duration(50);
goods[14].id(14);
goods[14].bank_level(5);
goods[14].value(116.1);
goods[14].delta(0.46);
goods[14].mode(StockMode::SlowRise);
goods[14].duration(70);
goods[15].id(15);
goods[15].bank_level(5);
goods[15].value(136.78);
goods[15].delta(-0.39);
goods[15].mode(StockMode::Chaotic);
goods[15].duration(1);
goods[16].id(16);
goods[16].bank_level(5);
goods[16].value(141.23);
goods[16].delta(-0.07);
goods[16].mode(StockMode::Stable);
goods[16].duration(35);
goods[17].id(17);
goods[17].bank_level(5);
goods[17].value(179.85);
goods[17].delta(0.26);
goods[17].mode(StockMode::Chaotic);
goods[17].duration(13);
SECTION("When ticked 2000 times with dragonBoost = 0") {
prng rng("test0");
auto glob = Stock::generateGlobalParameters(rng, 0);
for(int i = 0; i < 18; i++) goods[i].singleStockTick(rng, glob, 0);
CHECK(goods[0].value() == Approx(56.79923554697938));
CHECK(goods[0].delta() == Approx(0.529580694589588));
CHECK(goods[0].mode() == StockMode::Chaotic);
CHECK(goods[0].duration() == 6);
CHECK(goods[1].value() == Approx(80.64088117114369));
CHECK(goods[1].delta() == Approx(0.16162441215721185));
CHECK(goods[1].mode() == StockMode::SlowFall);
CHECK(goods[1].duration() == 80);
CHECK(goods[2].value() == Approx(54.60321764990048));
CHECK(goods[2].delta() == Approx(0.47293394283502943));
CHECK(goods[2].mode() == StockMode::FastRise);
CHECK(goods[2].duration() == 466);
CHECK(goods[3].value() == Approx(51.676806231235055));
CHECK(goods[3].delta() == Approx(0.6099309789970809));
CHECK(goods[3].mode() == StockMode::SlowRise);
CHECK(goods[3].duration() == 36);
CHECK(goods[4].value() == Approx(60.504540424832555));
CHECK(goods[4].delta() == Approx(0.7782997653969267));
CHECK(goods[4].mode() == StockMode::SlowRise);
CHECK(goods[4].duration() == 5);
CHECK(goods[5].value() == Approx(44.86016405245618));
CHECK(goods[5].delta() == Approx(0.15575176418596534));
CHECK(goods[5].mode() == StockMode::SlowFall);
CHECK(goods[5].duration() == 73);
CHECK(goods[6].value() == Approx(64.89163990829186));
CHECK(goods[6].delta() == Approx(-0.04531263077970698));
CHECK(goods[6].mode() == StockMode::SlowFall);
CHECK(goods[6].duration() == 29);
CHECK(goods[7].value() == Approx(76.58349036389859));
CHECK(goods[7].delta() == Approx(-0.18190750141971054));
CHECK(goods[7].mode() == StockMode::FastFall);
CHECK(goods[7].duration() == 70);
CHECK(goods[8].value() == Approx(92.42401684924147));
CHECK(goods[8].delta() == Approx(-0.21320461897482013));
CHECK(goods[8].mode() == StockMode::SlowFall);
CHECK(goods[8].duration() == 70);
CHECK(goods[9].value() == Approx(68.47338320506142));
CHECK(goods[9].delta() == Approx(0.39058321153049547));
CHECK(goods[9].mode() == StockMode::Stable);
CHECK(goods[9].duration() == 51);
CHECK(goods[10].value() == Approx(46.06595523145855));
CHECK(goods[10].delta() == Approx(-0.26086160615328857));
CHECK(goods[10].mode() == StockMode::FastFall);
CHECK(goods[10].duration() == 64);
CHECK(goods[11].value() == Approx(24.372994701896843));
CHECK(goods[11].delta() == Approx(-1.306574789798925));
CHECK(goods[11].mode() == StockMode::FastFall);
CHECK(goods[11].duration() == 54);
CHECK(goods[12].value() == Approx(142.38149011691817));
CHECK(goods[12].delta() == Approx(-0.28100983641056043));
CHECK(goods[12].mode() == StockMode::SlowFall);
CHECK(goods[12].duration() == 53);
CHECK(goods[13].value() == Approx(112.62046155323243));
CHECK(goods[13].delta() == Approx(0.06738005004714588));
CHECK(goods[13].mode() == StockMode::SlowRise);
CHECK(goods[13].duration() == 49);
CHECK(goods[14].value() == Approx(116.76299540380866));
CHECK(goods[14].delta() == Approx(0.3663090176045577));
CHECK(goods[14].mode() == StockMode::SlowRise);
CHECK(goods[14].duration() == 69);
CHECK(goods[15].value() == Approx(132.20653588124722));
CHECK(goods[15].delta() == Approx(-0.5199657874481084));
CHECK(goods[15].mode() == StockMode::Stable);
CHECK(goods[15].duration() == 212);
CHECK(goods[16].value() == Approx(142.77993195601178));
CHECK(goods[16].delta() == Approx(-0.06966158849950445));
CHECK(goods[16].mode() == StockMode::Stable);
CHECK(goods[16].duration() == 34);
CHECK(goods[17].value() == Approx(180.6861289712878));
CHECK(goods[17].delta() == Approx(0.31112238111319507));
CHECK(goods[17].mode() == StockMode::Chaotic);
CHECK(goods[17].duration() == 12);
for(int loops = 1; loops < 2000; loops++) {
auto glob = Stock::generateGlobalParameters(rng, 0);
for(int i = 0; i < 18; i++) goods[i].singleStockTick(rng, glob, 0);
}
CHECK(goods[0].value() == Approx(41.347782733766394));
CHECK(goods[0].delta() == Approx(-0.2630727444514964));
CHECK(goods[0].mode() == StockMode::Chaotic);
CHECK(goods[0].duration() == 395);
CHECK(goods[1].value() == Approx(32.994621928429225));
CHECK(goods[1].delta() == Approx(1.9164969684099917));
CHECK(goods[1].mode() == StockMode::FastFall);
CHECK(goods[1].duration() == 564);
CHECK(goods[2].value() == Approx(123.22297795212415));
CHECK(goods[2].delta() == Approx(1.4320096621643086));
CHECK(goods[2].mode() == StockMode::Chaotic);
CHECK(goods[2].duration() == 337);
CHECK(goods[3].value() == Approx(85.123567176972));
CHECK(goods[3].delta() == Approx(0.7755574335832113));
CHECK(goods[3].mode() == StockMode::SlowRise);
CHECK(goods[3].duration() == 654);
CHECK(goods[4].value() == Approx(112.63366439503194));
CHECK(goods[4].delta() == Approx(0.2808347727247415));
CHECK(goods[4].mode() == StockMode::SlowRise);
CHECK(goods[4].duration() == 573);
CHECK(goods[5].value() == Approx(47.46970855009737));
CHECK(goods[5].delta() == Approx(-1.4481348700625412));
CHECK(goods[5].mode() == StockMode::SlowFall);
CHECK(goods[5].duration() == 509);
CHECK(goods[6].value() == Approx(64.92827991255831));
CHECK(goods[6].delta() == Approx(-0.531905531358815));
CHECK(goods[6].mode() == StockMode::Chaotic);
CHECK(goods[6].duration() == 177);
CHECK(goods[7].value() == Approx(53.12030483514503));
CHECK(goods[7].delta() == Approx(-1.389362708315573));
CHECK(goods[7].mode() == StockMode::SlowFall);
CHECK(goods[7].duration() == 476);
CHECK(goods[8].value() == Approx(118.83694644845761));
CHECK(goods[8].delta() == Approx(0.29970120236923137));
CHECK(goods[8].mode() == StockMode::Chaotic);
CHECK(goods[8].duration() == 357);
CHECK(goods[9].value() == Approx(130.85562970779583));
CHECK(goods[9].delta() == Approx(0.23711356740029557));
CHECK(goods[9].mode() == StockMode::SlowRise);
CHECK(goods[9].duration() == 88);
CHECK(goods[10].value() == Approx(118.31747582672189));
CHECK(goods[10].delta() == Approx(0.6010692900974667));
CHECK(goods[10].mode() == StockMode::Stable);
CHECK(goods[10].duration() == 662);
CHECK(goods[11].value() == Approx(130.8670447870391));
CHECK(goods[11].delta() == Approx(0.0007663144377272404));
CHECK(goods[11].mode() == StockMode::SlowFall);
CHECK(goods[11].duration() == 471);
CHECK(goods[12].value() == Approx(122.34694137679226));
CHECK(goods[12].delta() == Approx(0.7700767658647476));
CHECK(goods[12].mode() == StockMode::FastRise);
CHECK(goods[12].duration() == 483);
CHECK(goods[13].value() == Approx(97.43809089050166));
CHECK(goods[13].delta() == Approx(0.45106574230978563));
CHECK(goods[13].mode() == StockMode::SlowRise);
CHECK(goods[13].duration() == 198);
CHECK(goods[14].value() == Approx(116.48547876713964));
CHECK(goods[14].delta() == Approx(1.4894722759854286));
CHECK(goods[14].mode() == StockMode::SlowFall);
CHECK(goods[14].duration() == 166);
CHECK(goods[15].value() == Approx(70.411397382277));
CHECK(goods[15].delta() == Approx(-0.9347112753562262));
CHECK(goods[15].mode() == StockMode::FastFall);
CHECK(goods[15].duration() == 591);
CHECK(goods[16].value() == Approx(132.27141399826303));
CHECK(goods[16].delta() == Approx(-0.24868473861141785));
CHECK(goods[16].mode() == StockMode::SlowFall);
CHECK(goods[16].duration() == 420);
CHECK(goods[17].value() == Approx(145.18975828929385));
CHECK(goods[17].delta() == Approx(0.5891502613916274));
CHECK(goods[17].mode() == StockMode::Chaotic);
CHECK(goods[17].duration() == 78);
}
SECTION("When ticked 2000 times with dragonBoost = 0.1") {
prng rng("test0.1");
auto glob = Stock::generateGlobalParameters(rng, 0.1);
for(int i = 0; i < 18; i++) goods[i].singleStockTick(rng, glob, 0.1);
CHECK(goods[0].value() == Approx(59.74488977267764));
CHECK(goods[0].delta() == Approx(-0.2871710008956679));
CHECK(goods[0].mode() == StockMode::Chaotic);
CHECK(goods[0].duration() == 6);
CHECK(goods[1].value() == Approx(78.83328801131994));
CHECK(goods[1].delta() == Approx(0.18062705994218947));
CHECK(goods[1].mode() == StockMode::SlowFall);
CHECK(goods[1].duration() == 80);
CHECK(goods[2].value() == Approx(48.370501100142405));
CHECK(goods[2].delta() == Approx(0.4617309660507955));
CHECK(goods[2].mode() == StockMode::SlowFall);
CHECK(goods[2].duration() == 649);
CHECK(goods[3].value() == Approx(51.71357945344455));
CHECK(goods[3].delta() == Approx(0.6449794534417757));
CHECK(goods[3].mode() == StockMode::SlowRise);
CHECK(goods[3].duration() == 36);
CHECK(goods[4].value() == Approx(59.91939525070101));
CHECK(goods[4].delta() == Approx(0.7210944971660121));
CHECK(goods[4].mode() == StockMode::SlowRise);
CHECK(goods[4].duration() == 5);
CHECK(goods[5].value() == Approx(44.49183654671149));
CHECK(goods[5].delta() == Approx(0.2098940966676069));
CHECK(goods[5].mode() == StockMode::SlowFall);
CHECK(goods[5].duration() == 73);
CHECK(goods[6].value() == Approx(65.43270074408228));
CHECK(goods[6].delta() == Approx(-0.07843191140873694));
CHECK(goods[6].mode() == StockMode::SlowFall);
CHECK(goods[6].duration() == 29);
CHECK(goods[7].value() == Approx(73.46416443955111));
CHECK(goods[7].delta() == Approx(-0.2571394338163943));
CHECK(goods[7].mode() == StockMode::FastFall);
CHECK(goods[7].duration() == 70);
CHECK(goods[8].value() == Approx(92.28288222683666));
CHECK(goods[8].delta() == Approx(-0.20362101497249857));
CHECK(goods[8].mode() == StockMode::SlowFall);
CHECK(goods[8].duration() == 70);
CHECK(goods[9].value() == Approx(68.53691021383263));
CHECK(goods[9].delta() == Approx(0.4491460479423056));
CHECK(goods[9].mode() == StockMode::Stable);
CHECK(goods[9].duration() == 51);
CHECK(goods[10].value() == Approx(47.16393545272049));
CHECK(goods[10].delta() == Approx(-0.353270813412921));
CHECK(goods[10].mode() == StockMode::FastFall);
CHECK(goods[10].duration() == 64);
CHECK(goods[11].value() == Approx(23.784987799628375));
CHECK(goods[11].delta() == Approx(-1.2623614234375469));
CHECK(goods[11].mode() == StockMode::FastFall);
CHECK(goods[11].duration() == 54);
CHECK(goods[12].value() == Approx(142.71494134794918));
CHECK(goods[12].delta() == Approx(-0.2528364245270526));
CHECK(goods[12].mode() == StockMode::SlowFall);
CHECK(goods[12].duration() == 53);
CHECK(goods[13].value() == Approx(111.8501365643719));
CHECK(goods[13].delta() == Approx(0.11366572650213837));
CHECK(goods[13].mode() == StockMode::SlowRise);
CHECK(goods[13].duration() == 49);
CHECK(goods[14].value() == Approx(114.80879850154928));
CHECK(goods[14].delta() == Approx(0.36752056981166004));
CHECK(goods[14].mode() == StockMode::SlowRise);
CHECK(goods[14].duration() == 69);
CHECK(goods[15].value() == Approx(142.29386072597205));
CHECK(goods[15].delta() == Approx(0.30151740302790003));
CHECK(goods[15].mode() == StockMode::SlowRise);
CHECK(goods[15].duration() == 324);
CHECK(goods[16].value() == Approx(141.52136070729154));
CHECK(goods[16].delta() == Approx(-0.03633929276007247));
CHECK(goods[16].mode() == StockMode::Stable);
CHECK(goods[16].duration() == 34);
CHECK(goods[17].value() == Approx(176.09017914763518));
CHECK(goods[17].delta() == Approx(0.16376338863599496));
CHECK(goods[17].mode() == StockMode::Chaotic);
CHECK(goods[17].duration() == 12);
for(int loops = 1; loops < 2000; loops++) {
auto glob = Stock::generateGlobalParameters(rng, 0.1);
for(int i = 0; i < 18; i++) goods[i].singleStockTick(rng, glob, 0.1);
}
CHECK(goods[0].value() == Approx(11.13037104792796));
CHECK(goods[0].delta() == Approx(0.458147330700694));
CHECK(goods[0].mode() == StockMode::Chaotic);
CHECK(goods[0].duration() == 26);
CHECK(goods[1].value() == Approx(11.037880573240406));
CHECK(goods[1].delta() == Approx(-2.0904188784732107));
CHECK(goods[1].mode() == StockMode::SlowRise);
CHECK(goods[1].duration() == 106);
CHECK(goods[2].value() == Approx(67.17303658521213));
CHECK(goods[2].delta() == Approx(-0.25000395667375613));
CHECK(goods[2].mode() == StockMode::SlowFall);
CHECK(goods[2].duration() == 437);
CHECK(goods[3].value() == Approx(4.007447410148597));
CHECK(goods[3].delta() == Approx(-2.259559832243959));
CHECK(goods[3].mode() == StockMode::Chaotic);
CHECK(goods[3].duration() == 411);
CHECK(goods[4].value() == Approx(4.058879068690773));
CHECK(goods[4].delta() == Approx(-1.5543950931039001));
CHECK(goods[4].mode() == StockMode::Stable);
CHECK(goods[4].duration() == 228);
CHECK(goods[5].value() == Approx(6.623877922497186));
CHECK(goods[5].delta() == Approx(-1.3544030025140592));
CHECK(goods[5].mode() == StockMode::SlowRise);
CHECK(goods[5].duration() == 652);
CHECK(goods[6].value() == Approx(4.9320044150842));
CHECK(goods[6].delta() == Approx(-0.97770519074239));
CHECK(goods[6].mode() == StockMode::Chaotic);
CHECK(goods[6].duration() == 330);
CHECK(goods[7].value() == Approx(58.348765717455095));
CHECK(goods[7].delta() == Approx(-1.2902808563087689));
CHECK(goods[7].mode() == StockMode::SlowRise);
CHECK(goods[7].duration() == 606);
CHECK(goods[8].value() == Approx(72.33323682070615));
CHECK(goods[8].delta() == Approx(-2.8207136711724403));
CHECK(goods[8].mode() == StockMode::Chaotic);
CHECK(goods[8].duration() == 304);
CHECK(goods[9].value() == Approx(58.44943380552906));
CHECK(goods[9].delta() == Approx(-1.9476090161284074));
CHECK(goods[9].mode() == StockMode::Chaotic);
CHECK(goods[9].duration() == 126);
CHECK(goods[10].value() == Approx(113.71290243021117));
CHECK(goods[10].delta() == Approx(0.7526433595033143));
CHECK(goods[10].mode() == StockMode::Chaotic);
CHECK(goods[10].duration() == 460);
CHECK(goods[11].value() == Approx(103.63622337140971));
CHECK(goods[11].delta() == Approx(0.28725600113961347));
CHECK(goods[11].mode() == StockMode::FastFall);
CHECK(goods[11].duration() == 87);
CHECK(goods[12].value() == Approx(59.940811864257526));
CHECK(goods[12].delta() == Approx(-1.8482593557947116));
CHECK(goods[12].mode() == StockMode::SlowRise);
CHECK(goods[12].duration() == 272);
CHECK(goods[13].value() == Approx(12.320694193602622));
CHECK(goods[13].delta() == Approx(-0.5976864068092402));
CHECK(goods[13].mode() == StockMode::SlowRise);
CHECK(goods[13].duration() == 25);
CHECK(goods[14].value() == Approx(47.86900169057512));
CHECK(goods[14].delta() == Approx(-0.8437639817012401));
CHECK(goods[14].mode() == StockMode::SlowFall);
CHECK(goods[14].duration() == 192);
CHECK(goods[15].value() == Approx(8.629538314244229));
CHECK(goods[15].delta() == Approx(-2.2859378239304617));
CHECK(goods[15].mode() == StockMode::SlowRise);
CHECK(goods[15].duration() == 397);
CHECK(goods[16].value() == Approx(127.52875808476833));
CHECK(goods[16].delta() == Approx(0.0171558981033615));
CHECK(goods[16].mode() == StockMode::Chaotic);
CHECK(goods[16].duration() == 393);
CHECK(goods[17].value() == Approx(126.56569602361117));
CHECK(goods[17].delta() == Approx(-4.124820969171511));
CHECK(goods[17].mode() == StockMode::Chaotic);
CHECK(goods[17].duration() == 654);
}
SECTION("When ticked 2000 times with dragonBoost = 1") {
prng rng("test1");
auto glob = Stock::generateGlobalParameters(rng, 1);
for(int i = 0; i < 18; i++) goods[i].singleStockTick(rng, glob, 1);
CHECK(goods[0].value() == Approx(55.84868036599069));
CHECK(goods[0].delta() == Approx(0.6448803635848002));
CHECK(goods[0].mode() == StockMode::Chaotic);
CHECK(goods[0].duration() == 6);
CHECK(goods[1].value() == Approx(77.81072574865709));
CHECK(goods[1].delta() == Approx(0.09883180002766828));
CHECK(goods[1].mode() == StockMode::SlowFall);
CHECK(goods[1].duration() == 80);
CHECK(goods[2].value() == Approx(56.08338236850311));
CHECK(goods[2].delta() == Approx(1.86920068210918));
CHECK(goods[2].mode() == StockMode::Chaotic);
CHECK(goods[2].duration() == 372);
CHECK(goods[3].value() == Approx(51.661105567125354));
CHECK(goods[3].delta() == Approx(0.5925019995526958));
CHECK(goods[3].mode() == StockMode::SlowRise);
CHECK(goods[3].duration() == 36);
CHECK(goods[4].value() == Approx(60.3408035984185));
CHECK(goods[4].delta() == Approx(0.7772481265970274));
CHECK(goods[4].mode() == StockMode::SlowRise);
CHECK(goods[4].duration() == 5);
CHECK(goods[5].value() == Approx(44.85998952985155));
CHECK(goods[5].delta() == Approx(0.1546791996574968));
CHECK(goods[5].mode() == StockMode::SlowFall);
CHECK(goods[5].duration() == 73);
CHECK(goods[6].value() == Approx(64.89766473061434));
CHECK(goods[6].delta() == Approx(-0.024034883326396264));
CHECK(goods[6].mode() == StockMode::SlowFall);
CHECK(goods[6].duration() == 29);
CHECK(goods[7].value() == Approx(74.35675490678105));
CHECK(goods[7].delta() == Approx(-0.18831672854982373));
CHECK(goods[7].mode() == StockMode::FastFall);
CHECK(goods[7].duration() == 70);
CHECK(goods[8].value() == Approx(92.33989204932098));
CHECK(goods[8].delta() == Approx(-0.14540795180363197));
CHECK(goods[8].mode() == StockMode::SlowFall);
CHECK(goods[8].duration() == 70);
CHECK(goods[9].value() == Approx(68.48516613268814));
CHECK(goods[9].delta() == Approx(0.40236613268946236));
CHECK(goods[9].mode() == StockMode::Stable);
CHECK(goods[9].duration() == 51);
CHECK(goods[10].value() == Approx(43.18395382739157));
CHECK(goods[10].delta() == Approx(-0.15712202714533724));
CHECK(goods[10].mode() == StockMode::FastFall);
CHECK(goods[10].duration() == 64);
CHECK(goods[11].value() == Approx(27.047155029173904));
CHECK(goods[11].delta() == Approx(-1.2694095367829545));
CHECK(goods[11].mode() == StockMode::FastFall);
CHECK(goods[11].duration() == 54);
CHECK(goods[12].value() == Approx(141.61564332271908));
CHECK(goods[12].delta() == Approx(-0.2999794376880116));
CHECK(goods[12].mode() == StockMode::SlowFall);
CHECK(goods[12].duration() == 53);
CHECK(goods[13].value() == Approx(112.22310657998844));
CHECK(goods[13].delta() == Approx(0.1290555778353691));
CHECK(goods[13].mode() == StockMode::SlowRise);
CHECK(goods[13].duration() == 49);
CHECK(goods[14].value() == Approx(116.86082296771006));
CHECK(goods[14].delta() == Approx(0.38182335030454917));
CHECK(goods[14].mode() == StockMode::SlowRise);
CHECK(goods[14].duration() == 69);
CHECK(goods[15].value() == Approx(136.8022132963857));
CHECK(goods[15].delta() == Approx(-0.3699649984897357));
CHECK(goods[15].mode() == StockMode::Chaotic);
CHECK(goods[15].duration() == 364);
CHECK(goods[16].value() == Approx(141.510034514492));
CHECK(goods[16].delta() == Approx(-0.06871259582907865));
CHECK(goods[16].mode() == StockMode::Stable);
CHECK(goods[16].duration() == 34);
CHECK(goods[17].value() == Approx(181.05113569824206));
CHECK(goods[17].delta() == Approx(0.22728827936129675));
CHECK(goods[17].mode() == StockMode::Chaotic);
CHECK(goods[17].duration() == 12);
for(int loops = 1; loops < 2000; loops++) {
auto glob = Stock::generateGlobalParameters(rng, 1);
for(int i = 0; i < 18; i++) goods[i].singleStockTick(rng, glob, 1);
}
CHECK(goods[0].value() == Approx(29.7171786648093));
CHECK(goods[0].delta() == Approx(2.0049252561006683));
CHECK(goods[0].mode() == StockMode::Chaotic);
CHECK(goods[0].duration() == 364);
CHECK(goods[1].value() == Approx(4.41115534418423));
CHECK(goods[1].delta() == Approx(-1.2189741559007974));
CHECK(goods[1].mode() == StockMode::SlowRise);
CHECK(goods[1].duration() == 392);
CHECK(goods[2].value() == Approx(121.09840699912714));
CHECK(goods[2].delta() == Approx(0.6191317844559453));
CHECK(goods[2].mode() == StockMode::FastRise);
CHECK(goods[2].duration() == 105);
CHECK(goods[3].value() == Approx(132.78988641339149));
CHECK(goods[3].delta() == Approx(0.09650835244820964));
CHECK(goods[3].mode() == StockMode::FastRise);
CHECK(goods[3].duration() == 441);
CHECK(goods[4].value() == Approx(136.6358536893057));
CHECK(goods[4].delta() == Approx(-2.3683850624993825));
CHECK(goods[4].mode() == StockMode::Chaotic);
CHECK(goods[4].duration() == 484);
CHECK(goods[5].value() == Approx(96.2459629249774));
CHECK(goods[5].delta() == Approx(-0.6145874034436637));
CHECK(goods[5].mode() == StockMode::Chaotic);
CHECK(goods[5].duration() == 410);
CHECK(goods[6].value() == Approx(129.83381436877875));
CHECK(goods[6].delta() == Approx(-3.211680125140128));
CHECK(goods[6].mode() == StockMode::Chaotic);
CHECK(goods[6].duration() == 137);
CHECK(goods[7].value() == Approx(112.22702129175106));
CHECK(goods[7].delta() == Approx(0.1809244211057635));
CHECK(goods[7].mode() == StockMode::Stable);
CHECK(goods[7].duration() == 99);
CHECK(goods[8].value() == Approx(126.9543169100387));
CHECK(goods[8].delta() == Approx(1.5100150679907112));
CHECK(goods[8].mode() == StockMode::SlowFall);
CHECK(goods[8].duration() == 151);
CHECK(goods[9].value() == Approx(118.53759582368795));
CHECK(goods[9].delta() == Approx(0.2907964835525896));
CHECK(goods[9].mode() == StockMode::SlowRise);
CHECK(goods[9].duration() == 2);
CHECK(goods[10].value() == Approx(24.972298024713993));
CHECK(goods[10].delta() == Approx(-3.223230899067503));
CHECK(goods[10].mode() == StockMode::SlowFall);
CHECK(goods[10].duration() == 197);
CHECK(goods[11].value() == Approx(94.34212562005735));
CHECK(goods[11].delta() == Approx(0.9635609513204687));
CHECK(goods[11].mode() == StockMode::FastRise);
CHECK(goods[11].duration() == 356);
CHECK(goods[12].value() == Approx(149.04683196450912));
CHECK(goods[12].delta() == Approx(-0.43278283613246277));
CHECK(goods[12].mode() == StockMode::Chaotic);
CHECK(goods[12].duration() == 266);
CHECK(goods[13].value() == Approx(132.21798781163287));
CHECK(goods[13].delta() == Approx(0.45391420844200553));
CHECK(goods[13].mode() == StockMode::Stable);
CHECK(goods[13].duration() == 351);
CHECK(goods[14].value() == Approx(210.76418670843915));
CHECK(goods[14].delta() == Approx(0.32184976614769795));
CHECK(goods[14].mode() == StockMode::Stable);
CHECK(goods[14].duration() == 355);
CHECK(goods[15].value() == Approx(184.57414959655864));
CHECK(goods[15].delta() == Approx(0.5434499135187467));
CHECK(goods[15].mode() == StockMode::Chaotic);
CHECK(goods[15].duration() == 295);
CHECK(goods[16].value() == Approx(155.0936958226605));
CHECK(goods[16].delta() == Approx(0.7489781088859958));
CHECK(goods[16].mode() == StockMode::Chaotic);
CHECK(goods[16].duration() == 242);
CHECK(goods[17].value() == Approx(167.62334750589986));
CHECK(goods[17].delta() == Approx(-3.509046386287646));
CHECK(goods[17].mode() == StockMode::Chaotic);
CHECK(goods[17].duration() == 133);
}
SECTION("When ticked 2000 times with dragonBoost = 1.1") {
prng rng("test1.1");
auto glob = Stock::generateGlobalParameters(rng, 1.1);
for(int i = 0; i < 18; i++) goods[i].singleStockTick(rng, glob, 1.1);
CHECK(goods[0].value() == Approx(56.588952340025756));
CHECK(goods[0].delta() == Approx(0.6416375196585808));
CHECK(goods[0].mode() == StockMode::Chaotic);
CHECK(goods[0].duration() == 6);
CHECK(goods[1].value() == Approx(77.32366740183602));
CHECK(goods[1].delta() == Approx(0.12164073820216142));
CHECK(goods[1].mode() == StockMode::SlowFall);
CHECK(goods[1].duration() == 80);
CHECK(goods[2].value() == Approx(53.30680739441119));
CHECK(goods[2].delta() == Approx(0.2755599117971493));
CHECK(goods[2].mode() == StockMode::Chaotic);
CHECK(goods[2].duration() == 154);
CHECK(goods[3].value() == Approx(52.21094548498762));
CHECK(goods[3].delta() == Approx(0.5692562151782856));
CHECK(goods[3].mode() == StockMode::SlowRise);
CHECK(goods[3].duration() == 36);
CHECK(goods[4].value() == Approx(60.328747145072235));
CHECK(goods[4].delta() == Approx(0.772257319694786));
CHECK(goods[4].mode() == StockMode::SlowRise);
CHECK(goods[4].duration() == 5);
CHECK(goods[5].value() == Approx(44.87824450200826));
CHECK(goods[5].delta() == Approx(0.18073308152926637));
CHECK(goods[5].mode() == StockMode::SlowFall);
CHECK(goods[5].duration() == 73);
CHECK(goods[6].value() == Approx(67.66357742409923));
CHECK(goods[6].delta() == Approx(-0.05294217249921798));
CHECK(goods[6].mode() == StockMode::SlowFall);
CHECK(goods[6].duration() == 29);
CHECK(goods[7].value() == Approx(71.14042912535635));
CHECK(goods[7].delta() == Approx(0.017464616440522496));
CHECK(goods[7].mode() == StockMode::FastFall);
CHECK(goods[7].duration() == 70);
CHECK(goods[8].value() == Approx(92.704497338711));
CHECK(goods[8].delta() == Approx(-0.1804152841414075));
CHECK(goods[8].mode() == StockMode::SlowFall);
CHECK(goods[8].duration() == 70);
CHECK(goods[9].value() == Approx(68.47613670447882));
CHECK(goods[9].delta() == Approx(0.42535352420701517));
CHECK(goods[9].mode() == StockMode::Stable);
CHECK(goods[9].duration() == 51);
CHECK(goods[10].value() == Approx(43.14192091250421));
CHECK(goods[10].delta() == Approx(-0.2780148449551856));
CHECK(goods[10].mode() == StockMode::FastFall);
CHECK(goods[10].duration() == 64);
CHECK(goods[11].value() == Approx(22.883086864240013));
CHECK(goods[11].delta() == Approx(-1.1646454578843917));
CHECK(goods[11].mode() == StockMode::FastFall);
CHECK(goods[11].duration() == 54);
CHECK(goods[12].value() == Approx(142.37901695944404));
CHECK(goods[12].delta() == Approx(-0.28621992985642447));
CHECK(goods[12].mode() == StockMode::SlowFall);
CHECK(goods[12].duration() == 53);
CHECK(goods[13].value() == Approx(112.14672605989426));
CHECK(goods[13].delta() == Approx(0.09402575004931857));
CHECK(goods[13].mode() == StockMode::SlowRise);
CHECK(goods[13].duration() == 49);
CHECK(goods[14].value() == Approx(116.85075006888647));
CHECK(goods[14].delta() == Approx(0.36301899832942325));
CHECK(goods[14].mode() == StockMode::SlowRise);
CHECK(goods[14].duration() == 69);
CHECK(goods[15].value() == Approx(136.78180185801793));
CHECK(goods[15].delta() == Approx(-0.2703971472192049));
CHECK(goods[15].mode() == StockMode::Chaotic);
CHECK(goods[15].duration() == 30);
CHECK(goods[16].value() == Approx(141.535633870097));
CHECK(goods[16].delta() == Approx(-0.02136586745574462));
CHECK(goods[16].mode() == StockMode::Stable);
CHECK(goods[16].duration() == 34);
CHECK(goods[17].value() == Approx(180.15210120998157));
CHECK(goods[17].delta() == Approx(0.26060120998157277));
CHECK(goods[17].mode() == StockMode::Chaotic);
CHECK(goods[17].duration() == 12);
for(int loops = 1; loops < 2000; loops++) {
auto glob = Stock::generateGlobalParameters(rng, 1.1);
for(int i = 0; i < 18; i++) goods[i].singleStockTick(rng, glob, 1.1);
}
CHECK(goods[0].value() == Approx(44.72366981824373));
CHECK(goods[0].delta() == Approx(1.5825084010008375));
CHECK(goods[0].mode() == StockMode::Stable);
CHECK(goods[0].duration() == 139);
CHECK(goods[1].value() == Approx(53.598715557769864));
CHECK(goods[1].delta() == Approx(2.220187783630765));
CHECK(goods[1].mode() == StockMode::Chaotic);
CHECK(goods[1].duration() == 263);
CHECK(goods[2].value() == Approx(135.43356134215537));
CHECK(goods[2].delta() == Approx(2.2274515986522254));
CHECK(goods[2].mode() == StockMode::Chaotic);
CHECK(goods[2].duration() == 67);
CHECK(goods[3].value() == Approx(111.69051651761387));
CHECK(goods[3].delta() == Approx(-0.15616730721397304));
CHECK(goods[3].mode() == StockMode::Chaotic);
CHECK(goods[3].duration() == 301);
CHECK(goods[4].value() == Approx(112.59175582636536));
CHECK(goods[4].delta() == Approx(0.15118907940749396));
CHECK(goods[4].mode() == StockMode::Chaotic);
CHECK(goods[4].duration() == 332);
CHECK(goods[5].value() == Approx(70.53014889690314));
CHECK(goods[5].delta() == Approx(-1.5329000722055777));
CHECK(goods[5].mode() == StockMode::Chaotic);
CHECK(goods[5].duration() == 311);
CHECK(goods[6].value() == Approx(73.23347433168367));
CHECK(goods[6].delta() == Approx(-0.7039396518830737));
CHECK(goods[6].mode() == StockMode::SlowFall);
CHECK(goods[6].duration() == 352);
CHECK(goods[7].value() == Approx(119.18714784255124));
CHECK(goods[7].delta() == Approx(-0.2427448982798484));
CHECK(goods[7].mode() == StockMode::SlowFall);
CHECK(goods[7].duration() == 129);
CHECK(goods[8].value() == Approx(131.0596798395554));
CHECK(goods[8].delta() == Approx(0.9734290886073509));
CHECK(goods[8].mode() == StockMode::Chaotic);
CHECK(goods[8].duration() == 277);
CHECK(goods[9].value() == Approx(110.3969065837701));
CHECK(goods[9].delta() == Approx(-0.10739883359985489));
CHECK(goods[9].mode() == StockMode::Chaotic);
CHECK(goods[9].duration() == 386);
CHECK(goods[10].value() == Approx(126.92978045063965));
CHECK(goods[10].delta() == Approx(-0.05445631527110042));
CHECK(goods[10].mode() == StockMode::Chaotic);
CHECK(goods[10].duration() == 306);
CHECK(goods[11].value() == Approx(169.1341038738113));
CHECK(goods[11].delta() == Approx(-0.1673443907033748));
CHECK(goods[11].mode() == StockMode::Chaotic);
CHECK(goods[11].duration() == 200);
CHECK(goods[12].value() == Approx(45.617289240963586));
CHECK(goods[12].delta() == Approx(1.5169491071846206));
CHECK(goods[12].mode() == StockMode::Chaotic);
CHECK(goods[12].duration() == 405);
CHECK(goods[13].value() == Approx(36.713942404840765));
CHECK(goods[13].delta() == Approx(-2.7762402783619677));
CHECK(goods[13].mode() == StockMode::Chaotic);
CHECK(goods[13].duration() == 129);
CHECK(goods[14].value() == Approx(128.29139814220758));
CHECK(goods[14].delta() == Approx(1.3792362950944579));
CHECK(goods[14].mode() == StockMode::Chaotic);
CHECK(goods[14].duration() == 315);
CHECK(goods[15].value() == Approx(87.22354573347206));
CHECK(goods[15].delta() == Approx(-3.987603790387816));
CHECK(goods[15].mode() == StockMode::FastFall);
CHECK(goods[15].duration() == 322);
CHECK(goods[16].value() == Approx(147.92364125706086));
CHECK(goods[16].delta() == Approx(-3.253220041202839));
CHECK(goods[16].mode() == StockMode::Chaotic);
CHECK(goods[16].duration() == 177);
CHECK(goods[17].value() == Approx(108.49055335981821));
CHECK(goods[17].delta() == Approx(-2.7567112228130495));
CHECK(goods[17].mode() == StockMode::Chaotic);
CHECK(goods[17].duration() == 178);
}
}