1
-
Removed:
(** Unit tests for {!Prescription}, authored against prescription.mli.
1
+
Added:
(** Unit tests for {!Prescription}, authored against the prescription.mli
2
+
Added:
contract. *)
2
3
3
-
Removed:
Under test: a prescription may only narrow the exercise's catalog whitelist,
4
-
Removed:
never widen it. *)
5
-
Removed:
6
4
let ok = function Ok v -> v | Error _ -> Alcotest.fail "expected Ok"
7
5
8
-
Removed:
let by_name n =
9
-
Removed:
match
10
-
Removed:
List.find_opt (fun ex -> String.equal (Exercise.name ex) n) Exercise.catalog
11
-
Removed:
with
12
-
Removed:
| Some ex -> ex
13
-
Removed:
| None -> Alcotest.failf "no exercise named %s" n
6
+
Added:
let get id =
7
+
Added:
match Exercise.find id with
8
+
Added:
| Some e -> e
9
+
Added:
| None -> Alcotest.failf "catalog is missing %S" id
14
10
15
-
Removed:
let target_reps () =
16
-
Removed:
ok
17
-
Removed:
(Units.Rep_range.make
18
-
Removed:
~min:(ok (Units.Reps.of_int 6))
19
-
Removed:
~max:(ok (Units.Reps.of_int 8)))
11
+
Added:
let range lo hi =
12
+
Added:
let reps n = ok (Units.Reps.of_int n) in
13
+
Added:
ok (Units.Rep_range.make ~min:(reps lo) ~max:(reps hi))
20
14
21
-
Removed:
let bench = by_name "Barbell Bench Press"
22
-
Removed:
and dumbbell_bench = by_name "Dumbbell Bench Press"
23
-
Removed:
and squat = by_name "Back Squat"
15
+
Added:
let six_to_ten = range 6 10
24
16
25
-
Removed:
let make_tests =
17
+
Added:
let single id =
18
+
Added:
Prescription.make
19
+
Added:
~delivery:(Prescription.Single (get id))
20
+
Added:
~rep_range:six_to_ten ~allowed_substitutes:[]
21
+
Added:
22
+
Added:
let delivery_tests =
26
23
[
27
-
Removed:
( "catalog substitute is accepted",
24
+
Added:
( "a single movement is prescribable",
28
25
`Quick,
29
26
fun () ->
30
-
Removed:
Alcotest.(check bool)
31
-
Removed:
"accepted" true
32
-
Removed:
(Result.is_ok
33
-
Removed:
(Prescription.make ~exercise:bench ~target_reps:(target_reps ())
34
-
Removed:
~allowed_substitutes:[ dumbbell_bench ])) );
35
-
Removed:
( "non-whitelisted exercise is rejected",
27
+
Added:
let p = ok (single "curls") in
28
+
Added:
match Prescription.delivery p with
29
+
Added:
| Prescription.Single e ->
30
+
Added:
Alcotest.(check string) "curls" "Curls" (Exercise.name e)
31
+
Added:
| Prescription.Pre_exhaust _ -> Alcotest.fail "expected Single" );
32
+
Added:
( "HD1's pec pre-exhaust is prescribable",
36
33
`Quick,
37
34
fun () ->
38
-
Removed:
Alcotest.(check bool)
39
-
Removed:
"rejected" true
40
-
Removed:
(Result.is_error
41
-
Removed:
(Prescription.make ~exercise:bench ~target_reps:(target_reps ())
42
-
Removed:
~allowed_substitutes:[ squat ])) );
43
-
Removed:
( "empty substitutes is always accepted",
35
+
Added:
let p =
36
+
Added:
ok
37
+
Added:
(Prescription.make
38
+
Added:
~delivery:
39
+
Added:
(Prescription.Pre_exhaust
40
+
Added:
{
41
+
Added:
isolation = get "dumbbell-flyes";
42
+
Added:
compound = get "incline-press";
43
+
Added:
})
44
+
Added:
~rep_range:six_to_ten ~allowed_substitutes:[])
45
+
Added:
in
46
+
Added:
Alcotest.(check int)
47
+
Added:
"two movements, isolation first" 2
48
+
Added:
(List.length (Prescription.exercises p));
49
+
Added:
Alcotest.(check string)
50
+
Added:
"isolation leads" "Dumbbell Flyes"
51
+
Added:
(Exercise.name (List.hd (Prescription.exercises p))) );
52
+
Added:
( "an invalid pairing is refused",
44
53
`Quick,
45
54
fun () ->
46
-
Removed:
Alcotest.(check bool)
47
-
Removed:
"accepted" true
48
-
Removed:
(Result.is_ok
49
-
Removed:
(Prescription.make ~exercise:bench ~target_reps:(target_reps ())
50
-
Removed:
~allowed_substitutes:[])) );
55
+
Added:
match
56
+
Added:
Prescription.make
57
+
Added:
~delivery:
58
+
Added:
(Prescription.Pre_exhaust
59
+
Added:
{ isolation = get "dumbbell-flyes"; compound = get "squats" })
60
+
Added:
~rep_range:six_to_ten ~allowed_substitutes:[]
61
+
Added:
with
62
+
Added:
| Ok _ -> Alcotest.fail "expected Error"
63
+
Added:
| Error (Prescription.Not_a_pre_exhaust _) -> ()
64
+
Added:
| Error _ -> Alcotest.fail "expected Not_a_pre_exhaust" );
51
65
]
52
66
53
-
Removed:
let accessor_tests =
67
+
Added:
let rep_window_tests =
54
68
[
55
-
Removed:
( "accessors round-trip",
69
+
Added:
( "rep_limits is HD1's 6-12 stimulus window",
56
70
`Quick,
57
71
fun () ->
58
-
Removed:
let reps = target_reps () in
72
+
Added:
Alcotest.(check int)
73
+
Added:
"min 6" 6
74
+
Added:
(Units.Reps.to_int (Units.Rep_range.min Prescription.rep_limits));
75
+
Added:
Alcotest.(check int)
76
+
Added:
"max 12" 12
77
+
Added:
(Units.Reps.to_int (Units.Rep_range.max Prescription.rep_limits)) );
78
+
Added:
( "a window inside the limits is accepted",
79
+
Added:
`Quick,
80
+
Added:
fun () ->
81
+
Added:
List.iter
82
+
Added:
(fun (lo, hi) ->
83
+
Added:
Alcotest.(check bool)
84
+
Added:
(Printf.sprintf "%d-%d accepted" lo hi)
85
+
Added:
true
86
+
Added:
(Result.is_ok
87
+
Added:
(Prescription.make
88
+
Added:
~delivery:(Prescription.Single (get "curls"))
89
+
Added:
~rep_range:(range lo hi) ~allowed_substitutes:[])))
90
+
Added:
[ (6, 10); (6, 12); (8, 12); (8, 8) ] );
91
+
Added:
( "a window escaping the limits is refused",
92
+
Added:
`Quick,
93
+
Added:
fun () ->
94
+
Added:
List.iter
95
+
Added:
(fun (lo, hi) ->
96
+
Added:
match
97
+
Added:
Prescription.make
98
+
Added:
~delivery:(Prescription.Single (get "curls"))
99
+
Added:
~rep_range:(range lo hi) ~allowed_substitutes:[]
100
+
Added:
with
101
+
Added:
| Error Prescription.Reps_outside_limits -> ()
102
+
Added:
| Error _ -> Alcotest.fail "expected Reps_outside_limits"
103
+
Added:
| Ok _ -> Alcotest.failf "%d-%d should be refused" lo hi)
104
+
Added:
[ (3, 5); (1, 3); (15, 20); (6, 20) ] );
105
+
Added:
]
106
+
Added:
107
+
Added:
let substitute_tests =
108
+
Added:
[
109
+
Added:
( "a whitelisted alternative may be allowed",
110
+
Added:
`Quick,
111
+
Added:
fun () ->
59
112
let p =
60
113
ok
61
-
Removed:
(Prescription.make ~exercise:bench ~target_reps:reps
62
-
Removed:
~allowed_substitutes:[ dumbbell_bench ])
114
+
Added:
(Prescription.make
115
+
Added:
~delivery:(Prescription.Single (get "dumbbell-flyes"))
116
+
Added:
~rep_range:six_to_ten
117
+
Added:
~allowed_substitutes:[ get "pec-deck" ])
63
118
in
64
119
Alcotest.(check bool)
65
-
Removed:
"exercise" true
66
-
Removed:
(Exercise.equal (Prescription.exercise p) bench);
120
+
Added:
"pec deck permitted" true
121
+
Added:
(Prescription.permits p (get "pec-deck"));
67
122
Alcotest.(check bool)
68
-
Removed:
"target_reps" true
69
-
Removed:
(Units.Rep_range.equal (Prescription.target_reps p) reps);
70
-
Removed:
Alcotest.(check int)
71
-
Removed:
"substitutes" 1
72
-
Removed:
(List.length (Prescription.allowed_substitutes p)) );
123
+
Added:
"flyes permitted" true
124
+
Added:
(Prescription.permits p (get "dumbbell-flyes"));
125
+
Added:
Alcotest.(check bool)
126
+
Added:
"squats not permitted" false
127
+
Added:
(Prescription.permits p (get "squats")) );
128
+
Added:
( "a substitute off the catalog whitelist is refused",
129
+
Added:
`Quick,
130
+
Added:
fun () ->
131
+
Added:
match
132
+
Added:
Prescription.make
133
+
Added:
~delivery:(Prescription.Single (get "dumbbell-flyes"))
134
+
Added:
~rep_range:six_to_ten
135
+
Added:
~allowed_substitutes:[ get "squats" ]
136
+
Added:
with
137
+
Added:
| Error (Prescription.Substitute_not_permitted id) ->
138
+
Added:
Alcotest.(check string) "squats" "squats" (id :> string)
139
+
Added:
| Error _ -> Alcotest.fail "expected Substitute_not_permitted"
140
+
Added:
| Ok _ -> Alcotest.fail "expected Error" );
141
+
Added:
( "a substitute for either half of a pre-exhaust is allowed",
142
+
Added:
`Quick,
143
+
Added:
fun () ->
144
+
Added:
Alcotest.(check bool)
145
+
Added:
"pec deck substitutes the isolation" true
146
+
Added:
(Result.is_ok
147
+
Added:
(Prescription.make
148
+
Added:
~delivery:
149
+
Added:
(Prescription.Pre_exhaust
150
+
Added:
{
151
+
Added:
isolation = get "dumbbell-flyes";
152
+
Added:
compound = get "incline-press";
153
+
Added:
})
154
+
Added:
~rep_range:six_to_ten
155
+
Added:
~allowed_substitutes:[ get "cable-crossovers" ])) );
73
156
]
74
157
75
158
let suite =
76
159
[
77
-
Removed:
("prescription.make", make_tests); ("prescription.accessors", accessor_tests);
160
+
Added:
("prescription.delivery", delivery_tests);
161
+
Added:
("prescription.rep_window", rep_window_tests);
162
+
Added:
("prescription.substitutes", substitute_tests);
78
163
]