Source file test_promote.ml
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
open! Core
open! Import
module Runqueue = Parallel.For_testing.Runqueue
let%expect_test "max promotions" =
let q = Runqueue.create () in
let job (_ : Parallel.t) = () in
Runqueue.with_jobs q [ job; job; job; job; job ] ~f:(fun q ->
Runqueue.with_jobs q [ job; job ] ~f:(fun q ->
Runqueue.with_jobs q [ job ] ~f:(fun q ->
Runqueue.with_jobs q [ job ] ~f:(fun q ->
Runqueue.with_jobs q [ job ] ~f:(fun q ->
let promote ~tokens:_ = print_endline "promoted" in
Runqueue.promote q ~n:1 ~f:promote;
[%expect
{|
promoted
promoted
promoted
promoted
promoted
|}];
Runqueue.promote q ~n:2 ~f:promote;
[%expect
{|
promoted
promoted
|}];
Runqueue.promote q ~n:2 ~f:promote;
[%expect
{|
promoted
promoted
|}];
Runqueue.promote q ~n:1 ~f:promote;
[%expect {| promoted |}];
Runqueue.promote q ~n:3 ~f:promote;
[%expect {| |}])))))
[@nontail]
;;
let%expect_test "token distribution" =
let q = Runqueue.create () in
let job (_ : Parallel.t) = () in
let test jobs =
Runqueue.with_jobs q jobs ~f:(fun q ->
let promote ~tokens = printf "tokens: %d\n" tokens in
Runqueue.promote q ~n:19 ~f:promote;
printf "remaining: %d\n" (Runqueue.tokens q))
in
test [ job ];
[%expect
{|
tokens: 9
remaining: 9
|}];
test [ job; job ];
[%expect
{|
tokens: 5
tokens: 5
remaining: 7
|}];
test [ job; job; job ];
[%expect
{|
tokens: 4
tokens: 4
tokens: 4
remaining: 4
|}];
test [ job; job; job; job ];
[%expect
{|
tokens: 3
tokens: 3
tokens: 3
tokens: 3
remaining: 3
|}];
test [ job; job; job; job; job ];
[%expect
{|
tokens: 2
tokens: 2
tokens: 2
tokens: 2
tokens: 2
remaining: 4
|}];
test [ job; job; job; job; job; job ];
[%expect
{|
tokens: 1
tokens: 1
tokens: 1
tokens: 1
tokens: 1
tokens: 1
remaining: 7
|}]
;;
let%expect_test "negative tokens" =
let q = Runqueue.create () in
let job (_ : Parallel.t) = () in
Runqueue.with_jobs q [ job; job; job ] ~f:(fun q ->
let promote ~tokens = printf "tokens: %d\n" tokens in
Runqueue.promote q ~n:1 ~f:promote;
printf "remaining: %d\n" (Runqueue.tokens q));
[%expect
{|
tokens: 0
tokens: 0
tokens: 0
remaining: -2
|}]
;;