[Pharo] Personal fitness tracker web app.
Add tests for Core package.
82.7% coverage.
Changed files
- src/MyFitnessTracker-Core-Tests/MFTEquipmentTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTExerciseTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTMuscleGroupTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTMuscleTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTObjectTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTRepSchemeTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTRoutineTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTSetGroupLogTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTSetGroupPrescriptionTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTSetLogTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTSetPrescriptionTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTTraineeTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTWorkoutLogBookTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTWorkoutLogTest.class.st
- src/MyFitnessTracker-Core-Tests/MFTWorkoutPrescriptionTest.class.st
- src/MyFitnessTracker-Core-Tests/package.st
- src/MyFitnessTracker-Core/MFTExercise.class.st
- src/MyFitnessTracker-Core/MFTMuscle.class.st
- src/MyFitnessTracker-Core/MFTMuscleGroup.class.st
- src/MyFitnessTracker-Core/MFTPreExhaustSupersetGroupPrescription.class.st
- src/MyFitnessTracker-Core/MFTSetGroupLog.class.st
- src/MyFitnessTracker-Core/MFTWorkoutLog.class.st
- src/MyFitnessTracker-Core/MFTWorkoutPrescription.class.st
src/MyFitnessTracker-Core-Tests/MFTEquipmentTest.class.st
@@ -0,0 +1,141 @@
1
Added:
"
2
Added:
A MFTEquipmentTest is a test class for testing the behavior of MFTEquipment
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTEquipmentTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Base',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Base'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTEquipmentTest >> equipmentFactorySelectors [
14
Added:
15
Added:
^ #( barbell cable dumbbell ezBar legExtensionMachine
16
Added:
pecDeck seatedLegCurlMachine )
17
Added:
]
18
Added:
19
Added:
{ #category : 'tests' }
20
Added:
MFTEquipmentTest >> testEnglishNameCanBeAssigned [
21
Added:
22
Added:
| equipment |
23
Added:
equipment := MFTEquipment new englishName: 'barbell'.
24
Added:
25
Added:
self assert: equipment englishName equals: 'barbell'.
26
Added:
self assert: equipment canonicalName equals: 'barbell'
27
Added:
]
28
Added:
29
Added:
{ #category : 'tests' }
30
Added:
MFTEquipmentTest >> testEquipmentIsNotEqualToObjectOfAnotherClass [
31
Added:
32
Added:
self deny: MFTEquipment barbell equals: 'barbell'
33
Added:
]
34
Added:
35
Added:
{ #category : 'tests' }
36
Added:
MFTEquipmentTest >> testEquipmentWithDifferentEnglishNamesAreNotEqual [
37
Added:
38
Added:
| first second |
39
Added:
first := MFTEquipment new englishName: 'barbell'.
40
Added:
second := MFTEquipment new englishName: 'dumbbell'.
41
Added:
42
Added:
self deny: first equals: second
43
Added:
]
44
Added:
45
Added:
{ #category : 'tests' }
46
Added:
MFTEquipmentTest >> testEquipmentWithSameEnglishNameAreEqual [
47
Added:
48
Added:
| first second |
49
Added:
first := MFTEquipment new englishName: 'barbell'.
50
Added:
second := MFTEquipment new englishName: 'barbell'.
51
Added:
52
Added:
self deny: first == second.
53
Added:
self assert: first equals: second.
54
Added:
self assert: first hash equals: second hash
55
Added:
]
56
Added:
57
Added:
{ #category : 'tests' }
58
Added:
MFTEquipmentTest >> testEzBarFactoryKeepsExpectedCapitalization [
59
Added:
60
Added:
| equipment |
61
Added:
equipment := MFTEquipment ezBar.
62
Added:
63
Added:
self assert: equipment englishName equals: 'EZ bar'.
64
Added:
self assert: equipment canonicalName equals: 'EZ bar'
65
Added:
]
66
Added:
67
Added:
{ #category : 'tests' }
68
Added:
MFTEquipmentTest >> testFactoryCreatesFreshButEqualEquipment [
69
Added:
70
Added:
| first second |
71
Added:
first := MFTEquipment barbell.
72
Added:
second := MFTEquipment barbell.
73
Added:
74
Added:
self deny: first == second.
75
Added:
self assert: first equals: second.
76
Added:
self assert: first hash equals: second hash
77
Added:
]
78
Added:
79
Added:
{ #category : 'tests' }
80
Added:
MFTEquipmentTest >> testFactoryEquipmentEnglishNamesAreUnique [
81
Added:
82
Added:
| equipment duplicates duplicateNames |
83
Added:
equipment := self equipmentFactorySelectors collect: [ :selector |
84
Added:
MFTEquipment perform: selector ].
85
Added:
duplicates := equipment groupedBy: #englishName.
86
Added:
duplicateNames := duplicates associations select: [ :association |
87
Added:
association value size > 1 ].
88
Added:
89
Added:
self
90
Added:
assert: duplicateNames isEmpty
91
Added:
description:
92
Added:
'Duplicate equipment English names: ' , duplicateNames printString
93
Added:
]
94
Added:
95
Added:
{ #category : 'tests' }
96
Added:
MFTEquipmentTest >> testFactoryEquipmentHaveEnglishName [
97
Added:
98
Added:
self equipmentFactorySelectors do: [ :selector |
99
Added:
| equipment |
100
Added:
equipment := MFTEquipment perform: selector.
101
Added:
self
102
Added:
deny: equipment englishName isEmptyOrNil
103
Added:
description: selector asString , ' should set an English name' ]
104
Added:
]
105
Added:
106
Added:
{ #category : 'tests' }
107
Added:
MFTEquipmentTest >> testKnownFactoryNames [
108
Added:
109
Added:
self assert: MFTEquipment barbell englishName equals: 'barbell'.
110
Added:
self assert: MFTEquipment dumbbell englishName equals: 'dumbbell'.
111
Added:
self assert: MFTEquipment cable englishName equals: 'cable'.
112
Added:
self assert: MFTEquipment pecDeck englishName equals: 'pec deck'.
113
Added:
self
114
Added:
assert: MFTEquipment legExtensionMachine englishName
115
Added:
equals: 'leg extension machine'.
116
Added:
self
117
Added:
assert: MFTEquipment seatedLegCurlMachine englishName
118
Added:
equals: 'seated leg curl machine'
119
Added:
]
120
Added:
121
Added:
{ #category : 'tests' }
122
Added:
MFTEquipmentTest >> testNewEquipmentHasNoEnglishName [
123
Added:
124
Added:
| equipment |
125
Added:
equipment := MFTEquipment new.
126
Added:
127
Added:
self assert: equipment englishName isNil.
128
Added:
self assert: equipment canonicalName isNil
129
Added:
]
130
Added:
131
Added:
{ #category : 'tests' }
132
Added:
MFTEquipmentTest >> testNewWithEnglishNameUsesCallingSelector [
133
Added:
134
Added:
| equipment |
135
Added:
equipment := MFTEquipment seatedLegCurlMachine.
136
Added:
137
Added:
self assert: equipment englishName equals: 'seated leg curl machine'.
138
Added:
self
139
Added:
assert: equipment canonicalName
140
Added:
equals: 'seated leg curl machine'
141
Added:
]
src/MyFitnessTracker-Core-Tests/MFTExerciseTest.class.st
@@ -0,0 +1,153 @@
1
Added:
"
2
Added:
A MFTExerciseTest is a test class for testing the behavior of MFTExercise
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTExerciseTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Base',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Base'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTExerciseTest >> testActivatingOneMuscleGroupMakesItMain [
14
Added:
15
Added:
| exercise mainGroups |
16
Added:
exercise := MFTExercise new.
17
Added:
exercise activates: MFTMuscleGroup chest.
18
Added:
19
Added:
mainGroups := exercise mainActivatedMuscleGroups.
20
Added:
21
Added:
self assert: mainGroups size equals: 1.
22
Added:
self assert: (mainGroups includes: MFTMuscleGroup chest)
23
Added:
]
24
Added:
25
Added:
{ #category : 'tests' }
26
Added:
MFTExerciseTest >> testBarbellBenchPressFactoryIsComplete [
27
Added:
28
Added:
| exercise mainGroups |
29
Added:
exercise := MFTExercise barbellBenchPress.
30
Added:
mainGroups := exercise mainActivatedMuscleGroups.
31
Added:
32
Added:
self assert: exercise englishName equals: 'barbell bench press'.
33
Added:
self assert: exercise equipment equals: MFTEquipment barbell.
34
Added:
self assert: (mainGroups includes: MFTMuscleGroup chest)
35
Added:
]
36
Added:
37
Added:
{ #category : 'tests' }
38
Added:
MFTExerciseTest >> testCloseGripPalmsUpPulldownFactoryIsComplete [
39
Added:
40
Added:
| exercise mainGroups |
41
Added:
exercise := MFTExercise closeGripPalmsUpPulldown.
42
Added:
mainGroups := exercise mainActivatedMuscleGroups.
43
Added:
44
Added:
self
45
Added:
assert: exercise englishName
46
Added:
equals: 'close-grip palms-up pulldown'.
47
Added:
self assert: exercise equipment equals: MFTEquipment cable.
48
Added:
self assert: (mainGroups includes: MFTMuscleGroup back)
49
Added:
]
50
Added:
51
Added:
{ #category : 'tests' }
52
Added:
MFTExerciseTest >> testEquipmentCanBeAssigned [
53
Added:
54
Added:
| exercise |
55
Added:
exercise := MFTExercise new.
56
Added:
exercise equipment: MFTEquipment dumbbell.
57
Added:
58
Added:
self assert: exercise equipment equals: MFTEquipment dumbbell
59
Added:
]
60
Added:
61
Added:
{ #category : 'tests' }
62
Added:
MFTExerciseTest >> testExerciseWithNoMuscleGroupsHasNoMainActivatedMuscleGroups [
63
Added:
64
Added:
| exercise |
65
Added:
exercise := MFTExercise new.
66
Added:
self assert: exercise mainActivatedMuscleGroups equals: nil
67
Added:
]
68
Added:
69
Added:
{ #category : 'tests' }
70
Added:
MFTExerciseTest >> testExercisesWithDifferentEnglishNamesAreNotEqual [
71
Added:
72
Added:
| first second |
73
Added:
first := MFTExercise new
74
Added:
englishName: 'barbell bench press';
75
Added:
equipment: MFTEquipment barbell.
76
Added:
second := MFTExercise new
77
Added:
englishName: 'barbell squat';
78
Added:
equipment: MFTEquipment barbell.
79
Added:
80
Added:
self deny: first equals: second
81
Added:
]
82
Added:
83
Added:
{ #category : 'tests' }
84
Added:
MFTExerciseTest >> testExercisesWithDifferentEquipmentAreNotEqual [
85
Added:
86
Added:
| first second |
87
Added:
first := MFTExercise new
88
Added:
englishName: 'bench press';
89
Added:
equipment: MFTEquipment barbell.
90
Added:
second := MFTExercise new
91
Added:
englishName: 'bench press';
92
Added:
equipment: MFTEquipment dumbbell.
93
Added:
94
Added:
self deny: first equals: second
95
Added:
]
96
Added:
97
Added:
{ #category : 'tests' }
98
Added:
MFTExerciseTest >> testExercisesWithSameEnglishNameAndEquipmentAreEqual [
99
Added:
100
Added:
| first second |
101
Added:
first := MFTExercise new
102
Added:
englishName: 'barbell bench press';
103
Added:
equipment: MFTEquipment barbell.
104
Added:
second := MFTExercise new
105
Added:
englishName: 'barbell bench press';
106
Added:
equipment: MFTEquipment barbell.
107
Added:
108
Added:
self assert: first equals: second.
109
Added:
self assert: first hash equals: second hash
110
Added:
]
111
Added:
112
Added:
{ #category : 'tests' }
113
Added:
MFTExerciseTest >> testMainActivatedMuscleGroupsReturnsAllTiedHighestActivations [
114
Added:
115
Added:
| exercise mainGroups |
116
Added:
exercise := MFTExercise new.
117
Added:
exercise
118
Added:
activates: MFTMuscleGroup chest percent: 100;
119
Added:
activates: MFTMuscleGroup arm percent: 100;
120
Added:
activates: MFTMuscleGroup shoulder percent: 50.
121
Added:
122
Added:
mainGroups := exercise mainActivatedMuscleGroups.
123
Added:
124
Added:
self assert: mainGroups size equals: 2.
125
Added:
self assert: (mainGroups includes: MFTMuscleGroup chest).
126
Added:
self assert: (mainGroups includes: MFTMuscleGroup arm).
127
Added:
self deny: (mainGroups includes: MFTMuscleGroup shoulder)
128
Added:
]
129
Added:
130
Added:
{ #category : 'tests' }
131
Added:
MFTExerciseTest >> testMainActivatedMuscleGroupsReturnsHighestActivationOnly [
132
Added:
133
Added:
| exercise mainGroups |
134
Added:
exercise := MFTExercise new.
135
Added:
exercise
136
Added:
activates: MFTMuscleGroup chest percent: 100;
137
Added:
activates: MFTMuscleGroup arm percent: 50.
138
Added:
139
Added:
mainGroups := exercise mainActivatedMuscleGroups.
140
Added:
141
Added:
self assert: mainGroups size equals: 1.
142
Added:
self assert: (mainGroups includes: MFTMuscleGroup chest).
143
Added:
self deny: (mainGroups includes: MFTMuscleGroup arm)
144
Added:
]
145
Added:
146
Added:
{ #category : 'tests' }
147
Added:
MFTExerciseTest >> testNewWithEnglishNameUsesCallingSelector [
148
Added:
149
Added:
| exercise |
150
Added:
exercise := MFTExercise bicepCurl.
151
Added:
152
Added:
self assert: exercise englishName equals: 'bicep curl'
153
Added:
]
src/MyFitnessTracker-Core-Tests/MFTMuscleGroupTest.class.st
@@ -0,0 +1,227 @@
1
Added:
"
2
Added:
A MFTMuscleGroupTest is a test class for testing the behavior of MFTMuscleGroup
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTMuscleGroupTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Anatomy',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Anatomy'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTMuscleGroupTest >> muscleGroupFactorySelectors [
14
Added:
15
Added:
^ #( abdominal arm back calf chest forearm hips leg shoulder )
16
Added:
]
17
Added:
18
Added:
{ #category : 'tests' }
19
Added:
MFTMuscleGroupTest >> testBackFactoryIsComplete [
20
Added:
21
Added:
| group |
22
Added:
group := MFTMuscleGroup back.
23
Added:
24
Added:
self assert: group englishName equals: 'back'.
25
Added:
self assert: group muscles asBag equals: {
26
Added:
MFTMuscle latissimusDorsi.
27
Added:
MFTMuscle trapezius.
28
Added:
MFTMuscle erectorSpinae } asBag
29
Added:
]
30
Added:
31
Added:
{ #category : 'tests' }
32
Added:
MFTMuscleGroupTest >> testChestFactoryIsComplete [
33
Added:
34
Added:
| group |
35
Added:
group := MFTMuscleGroup chest.
36
Added:
37
Added:
self assert: group englishName equals: 'chest'.
38
Added:
self assert: group muscles asBag equals: {
39
Added:
MFTMuscle pectoralisMajor.
40
Added:
MFTMuscle pectoralisMinor } asBag
41
Added:
]
42
Added:
43
Added:
{ #category : 'tests' }
44
Added:
MFTMuscleGroupTest >> testEveryFactoryMuscleHasLatinName [
45
Added:
46
Added:
self muscleGroupFactorySelectors do: [ :selector |
47
Added:
| group musclesWithoutLatinName |
48
Added:
group := MFTMuscleGroup perform: selector.
49
Added:
musclesWithoutLatinName := group muscles select: [ :muscle |
50
Added:
muscle latinName isEmpty ].
51
Added:
self
52
Added:
assert: musclesWithoutLatinName isEmpty
53
Added:
description: (' ' join: {
54
Added:
selector asString.
55
Added:
'contains muscles without Latin name:'.
56
Added:
musclesWithoutLatinName printString }) ]
57
Added:
]
58
Added:
59
Added:
{ #category : 'tests' }
60
Added:
MFTMuscleGroupTest >> testFactoryGroupEnglishNamesAreUnique [
61
Added:
62
Added:
| groups duplicates |
63
Added:
groups := self muscleGroupFactorySelectors collect: [ :selector |
64
Added:
MFTMuscleGroup perform: selector ].
65
Added:
duplicates := groups groupedBy: #englishName.
66
Added:
67
Added:
self
68
Added:
assert: (duplicates associations noneSatisfy: [ :association |
69
Added:
association value size > 1 ])
70
Added:
description:
71
Added:
'Duplicate muscle group English names: ' , duplicates printString
72
Added:
]
73
Added:
74
Added:
{ #category : 'tests' }
75
Added:
MFTMuscleGroupTest >> testFactoryGroupsDoNotContainDuplicateMuscles [
76
Added:
77
Added:
self muscleGroupFactorySelectors do: [ :selector |
78
Added:
| group |
79
Added:
group := MFTMuscleGroup perform: selector.
80
Added:
self
81
Added:
assert: group muscles size = group muscles asSet size
82
Added:
description: ('' join: {
83
Added:
selector asString.
84
Added:
' should not contain duplicate muscles' }) ]
85
Added:
]
86
Added:
87
Added:
{ #category : 'tests' }
88
Added:
MFTMuscleGroupTest >> testFactoryGroupsHaveAtLeastOneMuscle [
89
Added:
90
Added:
self muscleGroupFactorySelectors do: [ :selector |
91
Added:
| group |
92
Added:
group := MFTMuscleGroup perform: selector.
93
Added:
self
94
Added:
deny: group muscles isEmpty
95
Added:
description:
96
Added:
selector asString , ' should contain at least one muscle' ]
97
Added:
]
98
Added:
99
Added:
{ #category : 'tests' }
100
Added:
MFTMuscleGroupTest >> testFactoryGroupsHaveEnglishName [
101
Added:
102
Added:
self muscleGroupFactorySelectors do: [ :selector |
103
Added:
| group |
104
Added:
group := MFTMuscleGroup perform: selector.
105
Added:
self
106
Added:
deny: group englishName isEmpty
107
Added:
description: selector asString , ' should set an English name' ]
108
Added:
]
109
Added:
110
Added:
{ #category : 'tests' }
111
Added:
MFTMuscleGroupTest >> testGroupsWithDifferentMusclesAreNotEqual [
112
Added:
113
Added:
self deny: MFTMuscleGroup chest equals: MFTMuscleGroup arm
114
Added:
]
115
Added:
116
Added:
{ #category : 'tests' }
117
Added:
MFTMuscleGroupTest >> testGroupsWithSameMusclesInDifferentOrderAreEqual [
118
Added:
"A muscle group represents membership, not display order.
119
Added:
This test intentionally protects against equality drifting back to ordered collection equality."
120
Added:
121
Added:
| first second |
122
Added:
first := MFTMuscleGroup new
123
Added:
englishName: 'chest';
124
Added:
muscles: {
125
Added:
MFTMuscle pectoralisMajor.
126
Added:
MFTMuscle pectoralisMinor };
127
Added:
yourself.
128
Added:
second := MFTMuscleGroup new
129
Added:
englishName: 'chest';
130
Added:
muscles: {
131
Added:
MFTMuscle pectoralisMinor.
132
Added:
MFTMuscle pectoralisMajor };
133
Added:
yourself.
134
Added:
self assert: first equals: second.
135
Added:
self assert: first hash equals: second hash
136
Added:
]
137
Added:
138
Added:
{ #category : 'tests' }
139
Added:
MFTMuscleGroupTest >> testGroupsWithSameMusclesInSameOrderAreEqual [
140
Added:
141
Added:
| first second |
142
Added:
first := MFTMuscleGroup chest.
143
Added:
second := MFTMuscleGroup chest.
144
Added:
145
Added:
self deny: first == second.
146
Added:
self assert: first equals: second.
147
Added:
self assert: first hash equals: second hash
148
Added:
]
149
Added:
150
Added:
{ #category : 'tests' }
151
Added:
MFTMuscleGroupTest >> testIncludesMuscleUsingMuscleEquality [
152
Added:
153
Added:
| group |
154
Added:
group := MFTMuscleGroup chest.
155
Added:
156
Added:
self assert: (group includes: MFTMuscle pectoralisMajor).
157
Added:
self assert: (group includes: MFTMuscle pectoralisMinor).
158
Added:
self deny: (group includes: MFTMuscle bicepsBrachii)
159
Added:
]
160
Added:
161
Added:
{ #category : 'tests' }
162
Added:
MFTMuscleGroupTest >> testLegFactoryIsComplete [
163
Added:
164
Added:
| group |
165
Added:
group := MFTMuscleGroup leg.
166
Added:
167
Added:
self assert: group englishName equals: 'leg'.
168
Added:
self assert: group muscles asBag equals: {
169
Added:
MFTMuscle quadricepsFemoris.
170
Added:
MFTMuscle hamstring } asBag
171
Added:
]
172
Added:
173
Added:
{ #category : 'tests' }
174
Added:
MFTMuscleGroupTest >> testMuscleGroupIsNotEqualToObjectOfAnotherClass [
175
Added:
176
Added:
self deny: MFTMuscleGroup chest equals: 'chest'
177
Added:
]
178
Added:
179
Added:
{ #category : 'tests' }
180
Added:
MFTMuscleGroupTest >> testMusclesAreStoredAsOrderedCollection [
181
Added:
182
Added:
| group muscles |
183
Added:
muscles := {
184
Added:
MFTMuscle pectoralisMajor.
185
Added:
MFTMuscle pectoralisMinor }.
186
Added:
group := MFTMuscleGroup new muscles: muscles.
187
Added:
188
Added:
self assert: group muscles class equals: OrderedCollection.
189
Added:
self assert: group muscles asArray equals: muscles
190
Added:
]
191
Added:
192
Added:
{ #category : 'tests' }
193
Added:
MFTMuscleGroupTest >> testNamesCanBeAssigned [
194
Added:
195
Added:
| group |
196
Added:
group := MFTMuscleGroup new.
197
Added:
198
Added:
group
199
Added:
englishName: 'chest';
200
Added:
frenchName: 'pectoraux'.
201
Added:
202
Added:
self assert: group englishName equals: 'chest'.
203
Added:
self assert: group frenchName equals: 'pectoraux'.
204
Added:
self assert: group canonicalName equals: 'chest'
205
Added:
]
206
Added:
207
Added:
{ #category : 'tests' }
208
Added:
MFTMuscleGroupTest >> testNewMuscleGroupHasEmptyNamesAndNoMuscles [
209
Added:
210
Added:
| group |
211
Added:
group := MFTMuscleGroup new.
212
Added:
213
Added:
self assert: group englishName equals: ''.
214
Added:
self assert: group frenchName equals: ''.
215
Added:
self assert: group canonicalName equals: ''.
216
Added:
self assert: group muscles isEmpty
217
Added:
]
218
Added:
219
Added:
{ #category : 'tests' }
220
Added:
MFTMuscleGroupTest >> testNewWithEnglishNameUsesCallingSelector [
221
Added:
222
Added:
| group |
223
Added:
group := MFTMuscleGroup chest.
224
Added:
225
Added:
self assert: group englishName equals: 'chest'.
226
Added:
self assert: group canonicalName equals: 'chest'
227
Added:
]
src/MyFitnessTracker-Core-Tests/MFTMuscleTest.class.st
@@ -0,0 +1,187 @@
1
Added:
"
2
Added:
A MFTMuscleTest is a test class for testing the behavior of MFTMuscle
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTMuscleTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Anatomy',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Anatomy'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTMuscleTest >> muscleFactorySelectors [
14
Added:
15
Added:
^ #( bicepsBrachii brachioRadialis deltoidAnterior deltoidMedial
16
Added:
deltoidPosterior erectorSpinae extensorCarpiRadialiasBrevis
17
Added:
extensorCarpiRadialisLongus extensorCarpiUlnaris
18
Added:
flexorCarpiRadialis flexorCarpiUlnaris gastrocnemius
19
Added:
gluteusMaximus gluteusMedius gluteusMinimus hamstring latissimusDorsi
20
Added:
obliquusExternusAbdominis obliquusInternusAbdominis
21
Added:
pectoralisMajor pectoralisMinor quadricepsFemoris
22
Added:
rectusAbdominis rotatorCuff soleus transversusAbdominis
23
Added:
trapezius tricepsBrachii )
24
Added:
]
25
Added:
26
Added:
{ #category : 'tests' }
27
Added:
MFTMuscleTest >> testFactoryCreatesFreshButEqualMuscles [
28
Added:
29
Added:
| first second |
30
Added:
first := MFTMuscle pectoralisMajor.
31
Added:
second := MFTMuscle pectoralisMajor.
32
Added:
33
Added:
self deny: first identicalTo: second.
34
Added:
self assert: first equals: second.
35
Added:
self assert: first hash equals: second hash
36
Added:
]
37
Added:
38
Added:
{ #category : 'tests' }
39
Added:
MFTMuscleTest >> testFactoryMuscleLatinNamesAreUniqueExceptKnownRegionalVariants [
40
Added:
41
Added:
| muscles duplicates allowedDuplicateLatinNames unexpectedDuplicates |
42
Added:
muscles := self muscleFactorySelectors collect: [ :selector |
43
Added:
MFTMuscle perform: selector ].
44
Added:
duplicates := muscles groupedBy: #latinName.
45
Added:
allowedDuplicateLatinNames := #( 'deltoideus' ).
46
Added:
47
Added:
unexpectedDuplicates := duplicates associations select: [
48
Added:
:association |
49
Added:
association value size > 1 and: [
50
Added:
(allowedDuplicateLatinNames includes:
51
Added:
association key) not ] ].
52
Added:
53
Added:
self
54
Added:
assert: unexpectedDuplicates isEmpty
55
Added:
description: 'Unexpected duplicate Latin muscle names: '
56
Added:
, unexpectedDuplicates printString
57
Added:
]
58
Added:
59
Added:
{ #category : 'tests' }
60
Added:
MFTMuscleTest >> testFactoryMusclesHaveEnglishName [
61
Added:
62
Added:
self muscleFactorySelectors do: [ :selector |
63
Added:
| muscle |
64
Added:
muscle := MFTMuscle perform: selector.
65
Added:
self
66
Added:
deny: muscle englishName isEmpty
67
Added:
description: selector asString , ' should set an English name' ]
68
Added:
]
69
Added:
70
Added:
{ #category : 'tests' }
71
Added:
MFTMuscleTest >> testFactoryMusclesHaveLatinName [
72
Added:
73
Added:
self muscleFactorySelectors do: [ :selector |
74
Added:
| muscle |
75
Added:
muscle := MFTMuscle perform: selector.
76
Added:
self
77
Added:
deny: muscle latinName isEmpty
78
Added:
description: selector asString , ' should set a Latin name' ]
79
Added:
]
80
Added:
81
Added:
{ #category : 'tests' }
82
Added:
MFTMuscleTest >> testMuscleIsNotEqualToObjectOfAnotherClass [
83
Added:
84
Added:
self deny: MFTMuscle pectoralisMajor equals: 'pectoralis major'
85
Added:
]
86
Added:
87
Added:
{ #category : 'tests' }
88
Added:
MFTMuscleTest >> testMusclesWithDifferentEnglishNamesAreNotEqual [
89
Added:
90
Added:
| first second |
91
Added:
first := MFTMuscle new
92
Added:
latinName: 'pectoralis major';
93
Added:
englishName: 'pecs'.
94
Added:
second := MFTMuscle new
95
Added:
latinName: 'pectoralis major';
96
Added:
englishName: 'chest'.
97
Added:
98
Added:
self deny: first identicalTo: second.
99
Added:
self deny: first hash identicalTo: second hash
100
Added:
]
101
Added:
102
Added:
{ #category : 'tests' }
103
Added:
MFTMuscleTest >> testMusclesWithDifferentLatinNamesAreNotEqual [
104
Added:
105
Added:
| first second |
106
Added:
first := MFTMuscle new latinName: 'pectoralis major'.
107
Added:
second := MFTMuscle new latinName: 'pectoralis minor'.
108
Added:
109
Added:
self deny: first equals: second
110
Added:
]
111
Added:
112
Added:
{ #category : 'tests' }
113
Added:
MFTMuscleTest >> testMusclesWithSameLatinAndEnglishNamesAreEqual [
114
Added:
115
Added:
| first second |
116
Added:
first := MFTMuscle new
117
Added:
latinName: 'pectoralis major';
118
Added:
englishName: 'pecs'.
119
Added:
second := MFTMuscle new
120
Added:
latinName: 'pectoralis major';
121
Added:
englishName: 'pecs'.
122
Added:
123
Added:
self assert: first equals: second.
124
Added:
self assert: first hash equals: second hash
125
Added:
]
126
Added:
127
Added:
{ #category : 'tests' }
128
Added:
MFTMuscleTest >> testNamesAndDescriptionCanBeAssigned [
129
Added:
130
Added:
| muscle |
131
Added:
muscle := MFTMuscle new.
132
Added:
133
Added:
muscle
134
Added:
latinName: 'pectoralis major';
135
Added:
englishName: 'pectoral';
136
Added:
description: 'Large chest muscle.'.
137
Added:
138
Added:
self assert: muscle latinName equals: 'pectoralis major'.
139
Added:
self assert: muscle englishName equals: 'pectoral'.
140
Added:
self assert: muscle description equals: 'Large chest muscle.'.
141
Added:
self assert: muscle canonicalName equals: 'pectoralis major'
142
Added:
]
143
Added:
144
Added:
{ #category : 'tests' }
145
Added:
MFTMuscleTest >> testNewMuscleHasEmptyNamesAndDescription [
146
Added:
147
Added:
| muscle |
148
Added:
muscle := MFTMuscle new.
149
Added:
150
Added:
self assert: muscle latinName equals: ''.
151
Added:
self assert: muscle englishName equals: ''.
152
Added:
self assert: muscle description equals: ''.
153
Added:
self assert: muscle canonicalName equals: ''
154
Added:
]
155
Added:
156
Added:
{ #category : 'tests' }
157
Added:
MFTMuscleTest >> testNewWithLatinNameUsesCallingSelector [
158
Added:
159
Added:
| muscle |
160
Added:
muscle := MFTMuscle bicepsBrachii.
161
Added:
162
Added:
self assert: muscle latinName equals: 'biceps brachii'.
163
Added:
self assert: muscle canonicalName equals: 'biceps brachii'
164
Added:
]
165
Added:
166
Added:
{ #category : 'tests' }
167
Added:
MFTMuscleTest >> testPectoralisMajorFactoryIsComplete [
168
Added:
169
Added:
| muscle |
170
Added:
muscle := MFTMuscle pectoralisMajor.
171
Added:
172
Added:
self assert: muscle latinName equals: 'pectoralis major'.
173
Added:
self assert: muscle englishName equals: 'pectoral'.
174
Added:
self deny: muscle description isEmpty
175
Added:
]
176
Added:
177
Added:
{ #category : 'tests' }
178
Added:
MFTMuscleTest >> testTerminologiaAnatomicaLinkUsesLatinName [
179
Added:
180
Added:
| muscle |
181
Added:
muscle := MFTMuscle new latinName: 'pectoralis major'.
182
Added:
183
Added:
self
184
Added:
assert: muscle linkTerminologiaAnatomica
185
Added:
equals:
186
Added:
'http://terminologia-anatomica.org/en/Search?query=musculus pectoralis major'
187
Added:
]
src/MyFitnessTracker-Core-Tests/MFTObjectTest.class.st
@@ -0,0 +1,59 @@
1
Added:
"
2
Added:
A MFTObjectTest is a test class for testing the behavior of MFTObject
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTObjectTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Base',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Base'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTObjectTest >> testCanonicalNameIsAbstract [
14
Added:
15
Added:
self should: [ MFTObject new canonicalName ] raise: Error
16
Added:
]
17
Added:
18
Added:
{ #category : 'tests' }
19
Added:
MFTObjectTest >> testIdDefaultsToNil [
20
Added:
21
Added:
self assert: MFTObject new id isNil
22
Added:
]
23
Added:
24
Added:
{ #category : 'tests' }
25
Added:
MFTObjectTest >> testIdSetterStoresAnyObjectIdentity [
26
Added:
27
Added:
| object idObject |
28
Added:
object := MFTObject new.
29
Added:
idObject := Object new.
30
Added:
31
Added:
object id: idObject.
32
Added:
33
Added:
self assert: object id identicalTo: idObject
34
Added:
]
35
Added:
36
Added:
{ #category : 'tests' }
37
Added:
MFTObjectTest >> testIdSetterStoresId [
38
Added:
39
Added:
| object |
40
Added:
object := MFTObject new.
41
Added:
42
Added:
object id: 42.
43
Added:
44
Added:
self assert: object id equals: 42
45
Added:
]
46
Added:
47
Added:
{ #category : 'tests' }
48
Added:
MFTObjectTest >> testPrintOnIsAbstractThroughCanonicalName [
49
Added:
50
Added:
self should: [ MFTObject new printString ] raise: Error
51
Added:
]
52
Added:
53
Added:
{ #category : 'tests' }
54
Added:
MFTObjectTest >> testPrintOnUsesConcreteCanonicalName [
55
Added:
56
Added:
self
57
Added:
assert: MFTTrainee new printString
58
Added:
equals: MFTTrainee new canonicalName
59
Added:
]
src/MyFitnessTracker-Core-Tests/MFTRepSchemeTest.class.st
@@ -0,0 +1,123 @@
1
Added:
"
2
Added:
A MFTRepSchemeTest is a test class for testing the behavior of MFTRepScheme
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTRepSchemeTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Prescription',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Prescription'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTRepSchemeTest >> testCanonicalNameUsesRepRange [
14
Added:
15
Added:
| repScheme |
16
Added:
repScheme := MFTRepScheme from: 6 to: 10.
17
Added:
18
Added:
self assert: repScheme canonicalName equals: '6–10'
19
Added:
]
20
Added:
21
Added:
{ #category : 'tests' }
22
Added:
MFTRepSchemeTest >> testFromToSetsMinimumAndMaximumReps [
23
Added:
24
Added:
| repScheme |
25
Added:
repScheme := MFTRepScheme from: 6 to: 10.
26
Added:
27
Added:
self assert: repScheme minReps equals: 6.
28
Added:
self assert: repScheme maxReps equals: 10
29
Added:
]
30
Added:
31
Added:
{ #category : 'tests' }
32
Added:
MFTRepSchemeTest >> testIncludesAnswersTrueForMaximumBoundary [
33
Added:
34
Added:
| repScheme |
35
Added:
repScheme := MFTRepScheme from: 6 to: 10.
36
Added:
37
Added:
self assert: (repScheme includes: 10)
38
Added:
]
39
Added:
40
Added:
{ #category : 'tests' }
41
Added:
MFTRepSchemeTest >> testIncludesAnswersTrueForMinimumBoundary [
42
Added:
43
Added:
| repScheme |
44
Added:
repScheme := MFTRepScheme from: 6 to: 10.
45
Added:
46
Added:
self assert: (repScheme includes: 6)
47
Added:
]
48
Added:
49
Added:
{ #category : 'tests' }
50
Added:
MFTRepSchemeTest >> testIncludesReps [
51
Added:
52
Added:
| scheme |
53
Added:
scheme := MFTRepScheme from: 6 to: 10.
54
Added:
self
55
Added:
assert: (scheme includes: 6);
56
Added:
assert: (scheme includes: 10);
57
Added:
deny: (scheme includes: 5);
58
Added:
deny: (scheme includes: 11)
59
Added:
]
60
Added:
61
Added:
{ #category : 'tests' }
62
Added:
MFTRepSchemeTest >> testMaxRepsAccessor [
63
Added:
64
Added:
| repScheme |
65
Added:
repScheme := MFTRepScheme new.
66
Added:
67
Added:
repScheme maxReps: 10.
68
Added:
69
Added:
self assert: repScheme maxReps equals: 10
70
Added:
]
71
Added:
72
Added:
{ #category : 'tests' }
73
Added:
MFTRepSchemeTest >> testMinRepsAccessor [
74
Added:
75
Added:
| repScheme |
76
Added:
repScheme := MFTRepScheme new.
77
Added:
78
Added:
repScheme minReps: 6.
79
Added:
80
Added:
self assert: repScheme minReps equals: 6
81
Added:
]
82
Added:
83
Added:
{ #category : 'tests' }
84
Added:
MFTRepSchemeTest >> testRepSchemeProgressionFor [
85
Added:
86
Added:
| scheme |
87
Added:
scheme := MFTRepScheme from: 6 to: 10.
88
Added:
self
89
Added:
assert: (scheme progressionFor: 11) equals: #increaseLoad;
90
Added:
assert: (scheme progressionFor: 5) equals: #decreaseLoad;
91
Added:
assert: (scheme progressionFor: 6) equals: #keepLoad;
92
Added:
assert: (scheme progressionFor: 10) equals: #keepLoad
93
Added:
]
94
Added:
95
Added:
{ #category : 'tests' }
96
Added:
MFTRepSchemeTest >> testSetLogIsLoggedAndVolume [
97
Added:
98
Added:
| log |
99
Added:
log := MFTSetLog reps: 8 load: 100.
100
Added:
101
Added:
self assert: log isLogged.
102
Added:
self assert: log volume equals: 800.
103
Added:
104
Added:
log reps: nil.
105
Added:
self deny: log isLogged
106
Added:
]
107
Added:
108
Added:
{ #category : 'tests' }
109
Added:
MFTRepSchemeTest >> testSetPrescriptionEqualityAndHash [
110
Added:
111
Added:
| exercise scheme a b c |
112
Added:
exercise := MFTExercise dumbbellFly.
113
Added:
scheme := MFTRepScheme from: 6 to: 10.
114
Added:
115
Added:
a := MFTSetPrescription exercise: exercise repScheme: scheme.
116
Added:
b := MFTSetPrescription exercise: exercise repScheme: scheme.
117
Added:
c := MFTSetPrescription exercise: MFTExercise barbellSquat repScheme: scheme.
118
Added:
119
Added:
self assert: a equals: b.
120
Added:
self assert: a hash equals: b hash.
121
Added:
122
Added:
self deny: a equals: c
123
Added:
]
src/MyFitnessTracker-Core-Tests/MFTRoutineTest.class.st
@@ -0,0 +1,94 @@
1
Added:
"
2
Added:
A MFTRoutineTest is a test class for testing the behavior of MFTRoutine
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTRoutineTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Prescription',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Prescription'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTRoutineTest >> testCanonicalNameAnswersTitle [
14
Added:
15
Added:
| routine |
16
Added:
routine := MFTRoutine new.
17
Added:
18
Added:
routine title: 'Heavy Duty I'.
19
Added:
20
Added:
self assert: routine canonicalName equals: 'Heavy Duty I'
21
Added:
]
22
Added:
23
Added:
{ #category : 'tests' }
24
Added:
MFTRoutineTest >> testInitializeCreatesEmptyWorkoutCollection [
25
Added:
26
Added:
| routine |
27
Added:
routine := MFTRoutine new.
28
Added:
29
Added:
self assert: routine workouts isEmpty
30
Added:
]
31
Added:
32
Added:
{ #category : 'tests' }
33
Added:
MFTRoutineTest >> testTitleAccessor [
34
Added:
35
Added:
| routine |
36
Added:
routine := MFTRoutine new.
37
Added:
38
Added:
routine title: 'Heavy Duty I'.
39
Added:
40
Added:
self assert: routine title equals: 'Heavy Duty I'
41
Added:
]
42
Added:
43
Added:
{ #category : 'tests' }
44
Added:
MFTRoutineTest >> testWorkoutAfterAnswersNilWhenRoutineHasNoWorkouts [
45
Added:
46
Added:
| routine |
47
Added:
routine := MFTRoutine new.
48
Added:
49
Added:
self assert: (routine workoutAfter: #unknown) isNil
50
Added:
]
51
Added:
52
Added:
{ #category : 'tests' }
53
Added:
MFTRoutineTest >> testWorkoutAfterKnownWorkoutAnswersFollowingWorkout [
54
Added:
55
Added:
| routine |
56
Added:
routine := MFTRoutine new.
57
Added:
routine workouts: #( day1 day2 day3 ).
58
Added:
59
Added:
self assert: (routine workoutAfter: #day1) equals: #day2.
60
Added:
self assert: (routine workoutAfter: #day2) equals: #day3
61
Added:
]
62
Added:
63
Added:
{ #category : 'tests' }
64
Added:
MFTRoutineTest >> testWorkoutAfterLastWorkoutWrapsToFirstWorkout [
65
Added:
66
Added:
| routine |
67
Added:
routine := MFTRoutine new.
68
Added:
routine workouts: #( day1 day2 day3 ).
69
Added:
70
Added:
self assert: (routine workoutAfter: #day3) equals: #day1
71
Added:
]
72
Added:
73
Added:
{ #category : 'tests' }
74
Added:
MFTRoutineTest >> testWorkoutAfterUnknownWorkoutAnswersFirstWorkout [
75
Added:
76
Added:
| routine |
77
Added:
routine := MFTRoutine new.
78
Added:
routine workouts: #( day1 day2 day3 ).
79
Added:
80
Added:
self assert: (routine workoutAfter: #unknown) equals: #day1
81
Added:
]
82
Added:
83
Added:
{ #category : 'tests' }
84
Added:
MFTRoutineTest >> testWorkoutsSetterStoresAnArray [
85
Added:
86
Added:
| routine workouts |
87
Added:
routine := MFTRoutine new.
88
Added:
workouts := OrderedCollection with: #day1 with: #day2.
89
Added:
90
Added:
routine workouts: workouts.
91
Added:
92
Added:
self assert: routine workouts class equals: Array.
93
Added:
self assert: routine workouts equals: #( day1 day2 )
94
Added:
]
src/MyFitnessTracker-Core-Tests/MFTSetGroupLogTest.class.st
@@ -0,0 +1,142 @@
1
Added:
"
2
Added:
A MFTSetGroupLogTest is a test class for testing the behavior of MFTSetGroupLog
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTSetGroupLogTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Logging',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Logging'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTSetGroupLogTest >> testAddSetAppendsSetLog [
14
Added:
15
Added:
| groupLog firstSet secondSet |
16
Added:
groupLog := MFTSetGroupLog new.
17
Added:
firstSet := MFTSetLog new.
18
Added:
secondSet := MFTSetLog new.
19
Added:
20
Added:
groupLog addSet: firstSet.
21
Added:
groupLog addSet: secondSet.
22
Added:
23
Added:
self assert: groupLog sets asArray equals: {
24
Added:
firstSet.
25
Added:
secondSet }
26
Added:
]
27
Added:
28
Added:
{ #category : 'tests' }
29
Added:
MFTSetGroupLogTest >> testEmptyGroupLogIsCompletelyLogged [
30
Added:
31
Added:
| groupLog |
32
Added:
groupLog := MFTSetGroupLog new.
33
Added:
34
Added:
self assert: groupLog isCompletelyLogged
35
Added:
]
36
Added:
37
Added:
{ #category : 'tests' }
38
Added:
MFTSetGroupLogTest >> testGroupLogIsCompletelyLoggedWhenAllSetsAreLogged [
39
Added:
40
Added:
| groupLog |
41
Added:
groupLog := MFTSetGroupLog new.
42
Added:
groupLog sets: {
43
Added:
(MFTSetLog reps: 6 load: 100).
44
Added:
(MFTSetLog reps: 5 load: 110) }.
45
Added:
46
Added:
self assert: groupLog isCompletelyLogged
47
Added:
]
48
Added:
49
Added:
{ #category : 'tests' }
50
Added:
MFTSetGroupLogTest >> testGroupLogIsNotCompletelyLoggedWhenAnySetIsUnlogged [
51
Added:
52
Added:
| groupLog |
53
Added:
groupLog := MFTSetGroupLog new.
54
Added:
groupLog sets: {
55
Added:
(MFTSetLog reps: 6 load: 100).
56
Added:
MFTSetLog new }.
57
Added:
58
Added:
self deny: groupLog isCompletelyLogged
59
Added:
]
60
Added:
61
Added:
{ #category : 'tests' }
62
Added:
MFTSetGroupLogTest >> testNewGroupLogStartsWithEmptySetsAndNotes [
63
Added:
64
Added:
| groupLog |
65
Added:
groupLog := MFTSetGroupLog new.
66
Added:
67
Added:
self assert: groupLog sets isEmpty.
68
Added:
self assert: groupLog notes equals: String new
69
Added:
]
70
Added:
71
Added:
{ #category : 'tests' }
72
Added:
MFTSetGroupLogTest >> testNotesCanBeRecorded [
73
Added:
74
Added:
| groupLog |
75
Added:
groupLog := MFTSetGroupLog new.
76
Added:
groupLog notes: 'Felt strong, but recovery still incomplete.'.
77
Added:
78
Added:
self
79
Added:
assert: groupLog notes
80
Added:
equals: 'Felt strong, but recovery still incomplete.'
81
Added:
]
82
Added:
83
Added:
{ #category : 'tests' }
84
Added:
MFTSetGroupLogTest >> testPrescriptionCanBeRecorded [
85
Added:
86
Added:
| groupLog prescription |
87
Added:
groupLog := MFTSetGroupLog new.
88
Added:
prescription := Object new.
89
Added:
groupLog prescription: prescription.
90
Added:
91
Added:
self assert: groupLog prescription identicalTo: prescription
92
Added:
]
93
Added:
94
Added:
{ #category : 'tests' }
95
Added:
MFTSetGroupLogTest >> testSetLogForPrescriptionRaisesErrorWhenPrescriptionIsUnknown [
96
Added:
97
Added:
| groupLog knownPrescription unknownPrescription knownLog |
98
Added:
groupLog := MFTSetGroupLog new.
99
Added:
knownPrescription := Object new.
100
Added:
unknownPrescription := Object new.
101
Added:
knownLog := MFTSetLog forPrescription: knownPrescription.
102
Added:
groupLog addSet: knownLog.
103
Added:
104
Added:
self
105
Added:
should: [ groupLog setLogForPrescription: unknownPrescription ]
106
Added:
raise: Error
107
Added:
]
108
Added:
109
Added:
{ #category : 'tests' }
110
Added:
MFTSetGroupLogTest >> testSetLogForPrescriptionReturnsMatchingSetLogByIdentity [
111
Added:
112
Added:
| groupLog firstPrescription secondPrescription firstLog secondLog |
113
Added:
groupLog := MFTSetGroupLog new.
114
Added:
firstPrescription := Object new.
115
Added:
secondPrescription := Object new.
116
Added:
firstLog := MFTSetLog forPrescription: firstPrescription.
117
Added:
secondLog := MFTSetLog forPrescription: secondPrescription.
118
Added:
groupLog sets: {
119
Added:
firstLog.
120
Added:
secondLog }.
121
Added:
122
Added:
self
123
Added:
assert: (groupLog setLogForPrescription: secondPrescription)
124
Added:
identicalTo: secondLog
125
Added:
]
126
Added:
127
Added:
{ #category : 'tests' }
128
Added:
MFTSetGroupLogTest >> testSetsSetterCopiesAsOrderedCollection [
129
Added:
130
Added:
| groupLog firstSet secondSet sourceCollection |
131
Added:
groupLog := MFTSetGroupLog new.
132
Added:
firstSet := MFTSetLog new.
133
Added:
secondSet := MFTSetLog new.
134
Added:
sourceCollection := {
135
Added:
firstSet.
136
Added:
secondSet }.
137
Added:
138
Added:
groupLog sets: sourceCollection.
139
Added:
140
Added:
self assert: groupLog sets class equals: OrderedCollection.
141
Added:
self assert: groupLog sets asArray equals: sourceCollection
142
Added:
]
src/MyFitnessTracker-Core-Tests/MFTSetGroupPrescriptionTest.class.st
@@ -0,0 +1,83 @@
1
Added:
"
2
Added:
A MFTSetGroupPrescriptionTest is a test class for testing the behavior of MFTSetGroupPrescription
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTSetGroupPrescriptionTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Prescription',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Prescription'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTSetGroupPrescriptionTest >> testInitializeCreatesEmptySetCollection [
14
Added:
15
Added:
| group |
16
Added:
group := MFTSetGroupPrescription new.
17
Added:
18
Added:
self assert: group sets isEmpty.
19
Added:
self assert: group sets class equals: OrderedCollection
20
Added:
]
21
Added:
22
Added:
{ #category : 'tests' }
23
Added:
MFTSetGroupPrescriptionTest >> testNewGroupHasZeroSetCount [
24
Added:
25
Added:
| group |
26
Added:
group := MFTSetGroupPrescription new.
27
Added:
28
Added:
self assert: group setCount equals: 0
29
Added:
]
30
Added:
31
Added:
{ #category : 'tests' }
32
Added:
MFTSetGroupPrescriptionTest >> testSetsAccessorStoresGivenCollection [
33
Added:
34
Added:
| group sets |
35
Added:
group := MFTSetGroupPrescription new.
36
Added:
sets := OrderedCollection with: Object new with: Object new.
37
Added:
38
Added:
group sets: sets.
39
Added:
40
Added:
self assert: group sets identicalTo: sets.
41
Added:
self assert: group setCount equals: 2
42
Added:
]
43
Added:
44
Added:
{ #category : 'tests' }
45
Added:
MFTSetGroupPrescriptionTest >> testSetsCollectionCanBeMutatedThroughAccessor [
46
Added:
47
Added:
| group set |
48
Added:
group := MFTSetGroupPrescription new.
49
Added:
set := Object new.
50
Added:
51
Added:
group sets add: set.
52
Added:
53
Added:
self assert: group setCount equals: 1.
54
Added:
self assert: group sets first identicalTo: set
55
Added:
]
56
Added:
57
Added:
{ #category : 'tests' }
58
Added:
MFTSetGroupPrescriptionTest >> testUniqueExercisesInSetsAnswersEmptySetWhenThereAreNoSets [
59
Added:
60
Added:
| group uniqueExercises |
61
Added:
group := MFTSetGroupPrescription new.
62
Added:
63
Added:
uniqueExercises := group uniqueExercisesInSets.
64
Added:
65
Added:
self assert: uniqueExercises isEmpty.
66
Added:
self assert: uniqueExercises class equals: Set
67
Added:
]
68
Added:
69
Added:
{ #category : 'tests' }
70
Added:
MFTSetGroupPrescriptionTest >> testValidateIsAbstract [
71
Added:
72
Added:
self
73
Added:
should: [ MFTSetGroupPrescription new validate ]
74
Added:
raise: SubclassResponsibility
75
Added:
]
76
Added:
77
Added:
{ #category : 'tests' }
78
Added:
MFTSetGroupPrescriptionTest >> testWithSetsRequiresConcreteValidation [
79
Added:
80
Added:
self
81
Added:
should: [ MFTSetGroupPrescription withSets: #( 1 2 3 ) ]
82
Added:
raise: SubclassResponsibility
83
Added:
]
src/MyFitnessTracker-Core-Tests/MFTSetLogTest.class.st
@@ -0,0 +1,105 @@
1
Added:
"
2
Added:
A MFTSetLogTest is a test class for testing the behavior of MFTSetLog
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTSetLogTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Logging',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Logging'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTSetLogTest >> testFailureAchievedCanBeCleared [
14
Added:
15
Added:
| log |
16
Added:
log := MFTSetLog new.
17
Added:
log failureAchieved: true.
18
Added:
log failureAchieved: false.
19
Added:
20
Added:
self deny: log failureAchieved
21
Added:
]
22
Added:
23
Added:
{ #category : 'tests' }
24
Added:
MFTSetLogTest >> testFailureAchievedCanBeRecorded [
25
Added:
26
Added:
| log |
27
Added:
log := MFTSetLog new.
28
Added:
log failureAchieved: true.
29
Added:
30
Added:
self assert: log failureAchieved
31
Added:
]
32
Added:
33
Added:
{ #category : 'tests' }
34
Added:
MFTSetLogTest >> testNewSetLogIsInitiallyUnlogged [
35
Added:
36
Added:
| log |
37
Added:
log := MFTSetLog new.
38
Added:
39
Added:
self deny: log isLogged.
40
Added:
self assert: log canonicalName equals: 'unlogged set'
41
Added:
]
42
Added:
43
Added:
{ #category : 'tests' }
44
Added:
MFTSetLogTest >> testOnlyLoadIsNotEnoughToBeLogged [
45
Added:
46
Added:
| log |
47
Added:
log := MFTSetLog new.
48
Added:
log load: 100.
49
Added:
50
Added:
self deny: log isLogged.
51
Added:
self assert: log canonicalName equals: 'unlogged set'
52
Added:
]
53
Added:
54
Added:
{ #category : 'tests' }
55
Added:
MFTSetLogTest >> testOnlyRepsIsNotEnoughToBeLogged [
56
Added:
57
Added:
| log |
58
Added:
log := MFTSetLog new.
59
Added:
log reps: 10.
60
Added:
61
Added:
self deny: log isLogged.
62
Added:
self assert: log canonicalName equals: 'unlogged set'
63
Added:
]
64
Added:
65
Added:
{ #category : 'tests' }
66
Added:
MFTSetLogTest >> testRepsAndLoadCanBeRecorded [
67
Added:
68
Added:
| log |
69
Added:
log := MFTSetLog new.
70
Added:
log reps: 8.
71
Added:
log load: 100.
72
Added:
73
Added:
self assert: log reps equals: 8.
74
Added:
self assert: log load equals: 100.
75
Added:
self assert: log isLogged
76
Added:
]
77
Added:
78
Added:
{ #category : 'tests' }
79
Added:
MFTSetLogTest >> testRepsLoadConstructorCreatesLoggedSet [
80
Added:
81
Added:
| log |
82
Added:
log := MFTSetLog reps: 6 load: 120.
83
Added:
84
Added:
self assert: log reps equals: 6.
85
Added:
self assert: log load equals: 120.
86
Added:
self assert: log isLogged
87
Added:
]
88
Added:
89
Added:
{ #category : 'tests' }
90
Added:
MFTSetLogTest >> testVolumeIsRepsMultipliedByLoad [
91
Added:
92
Added:
| log |
93
Added:
log := MFTSetLog reps: 7 load: 85.
94
Added:
95
Added:
self assert: log volume equals: 595
96
Added:
]
97
Added:
98
Added:
{ #category : 'tests' }
99
Added:
MFTSetLogTest >> testVolumeSupportsDecimalLoads [
100
Added:
101
Added:
| log |
102
Added:
log := MFTSetLog reps: 10 load: 42.5.
103
Added:
104
Added:
self assert: log volume equals: 425.0
105
Added:
]
src/MyFitnessTracker-Core-Tests/MFTSetPrescriptionTest.class.st
@@ -0,0 +1,139 @@
1
Added:
"
2
Added:
A MFTSetPrescriptionTest is a test class for testing the behavior of MFTSetPrescription
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTSetPrescriptionTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Prescription',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Prescription'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTSetPrescriptionTest >> testCanonicalNameCombinesRepSchemeAndExerciseNames [
14
Added:
15
Added:
| exercise repScheme prescription |
16
Added:
exercise := MFTRepScheme from: 1 to: 1.
17
Added:
repScheme := MFTRepScheme from: 6 to: 10.
18
Added:
prescription := MFTSetPrescription new.
19
Added:
prescription
20
Added:
instVarNamed: 'exercise' put: exercise;
21
Added:
repScheme: repScheme.
22
Added:
23
Added:
self assert: prescription canonicalName equals: '6–10 reps 1–1'
24
Added:
]
25
Added:
26
Added:
{ #category : 'tests' }
27
Added:
MFTSetPrescriptionTest >> testEqualPrescriptionsHaveSameHash [
28
Added:
29
Added:
| exercise repScheme first second |
30
Added:
exercise := MFTRepScheme from: 1 to: 1.
31
Added:
repScheme := MFTRepScheme from: 6 to: 10.
32
Added:
first := MFTSetPrescription new.
33
Added:
second := MFTSetPrescription new.
34
Added:
first
35
Added:
instVarNamed: 'exercise' put: exercise;
36
Added:
repScheme: repScheme.
37
Added:
second
38
Added:
instVarNamed: 'exercise' put: exercise;
39
Added:
repScheme: repScheme.
40
Added:
41
Added:
self assert: first hash equals: second hash
42
Added:
]
43
Added:
44
Added:
{ #category : 'tests' }
45
Added:
MFTSetPrescriptionTest >> testExerciseInitiallyNil [
46
Added:
47
Added:
| prescription |
48
Added:
prescription := MFTSetPrescription new.
49
Added:
50
Added:
self assert: prescription exercise isNil
51
Added:
]
52
Added:
53
Added:
{ #category : 'tests' }
54
Added:
MFTSetPrescriptionTest >> testExerciseRepSchemeConstructorSetsExerciseAndRepScheme [
55
Added:
56
Added:
| exercise repScheme prescription |
57
Added:
exercise := MFTRepScheme from: 1 to: 1.
58
Added:
repScheme := MFTRepScheme from: 6 to: 10.
59
Added:
60
Added:
prescription := MFTSetPrescription
61
Added:
exercise: exercise
62
Added:
repScheme: repScheme.
63
Added:
64
Added:
self assert: prescription exercise identicalTo: exercise.
65
Added:
self assert: prescription repScheme identicalTo: repScheme
66
Added:
]
67
Added:
68
Added:
{ #category : 'tests' }
69
Added:
MFTSetPrescriptionTest >> testPrescriptionIsNotEqualToDifferentClass [
70
Added:
71
Added:
| prescription |
72
Added:
prescription := MFTSetPrescription new.
73
Added:
prescription
74
Added:
instVarNamed: 'exercise' put: (MFTRepScheme from: 1 to: 1);
75
Added:
repScheme: (MFTRepScheme from: 6 to: 10).
76
Added:
self deny: prescription equals: Object new
77
Added:
]
78
Added:
79
Added:
{ #category : 'tests' }
80
Added:
MFTSetPrescriptionTest >> testPrescriptionsWithDifferentExerciseAreNotEqual [
81
Added:
82
Added:
| repScheme first second |
83
Added:
repScheme := MFTRepScheme from: 6 to: 10.
84
Added:
first := MFTSetPrescription new.
85
Added:
second := MFTSetPrescription new.
86
Added:
first
87
Added:
instVarNamed: 'exercise' put: (MFTRepScheme from: 1 to: 1);
88
Added:
repScheme: repScheme.
89
Added:
second
90
Added:
instVarNamed: 'exercise' put: (MFTRepScheme from: 2 to: 2);
91
Added:
repScheme: repScheme.
92
Added:
self deny: first equals: second
93
Added:
]
94
Added:
95
Added:
{ #category : 'tests' }
96
Added:
MFTSetPrescriptionTest >> testPrescriptionsWithDifferentRepSchemeAreNotEqual [
97
Added:
98
Added:
| exercise first second |
99
Added:
exercise := MFTRepScheme from: 1 to: 1.
100
Added:
first := MFTSetPrescription new.
101
Added:
second := MFTSetPrescription new.
102
Added:
first
103
Added:
instVarNamed: 'exercise' put: exercise;
104
Added:
repScheme: (MFTRepScheme from: 6 to: 10).
105
Added:
second
106
Added:
instVarNamed: 'exercise' put: exercise;
107
Added:
repScheme: (MFTRepScheme from: 8 to: 12).
108
Added:
self deny: first equals: second
109
Added:
]
110
Added:
111
Added:
{ #category : 'tests' }
112
Added:
MFTSetPrescriptionTest >> testPrescriptionsWithSameExerciseAndRepSchemeAreEqual [
113
Added:
114
Added:
| exercise repScheme first second |
115
Added:
exercise := MFTRepScheme from: 1 to: 1.
116
Added:
repScheme := MFTRepScheme from: 6 to: 10.
117
Added:
first := MFTSetPrescription new.
118
Added:
second := MFTSetPrescription new.
119
Added:
first
120
Added:
instVarNamed: 'exercise' put: exercise;
121
Added:
repScheme: repScheme.
122
Added:
second
123
Added:
instVarNamed: 'exercise' put: exercise;
124
Added:
repScheme: repScheme.
125
Added:
126
Added:
self assert: first equals: second
127
Added:
]
128
Added:
129
Added:
{ #category : 'tests' }
130
Added:
MFTSetPrescriptionTest >> testRepSchemeAccessor [
131
Added:
132
Added:
| prescription repScheme |
133
Added:
prescription := MFTSetPrescription new.
134
Added:
repScheme := MFTRepScheme from: 6 to: 10.
135
Added:
136
Added:
prescription repScheme: repScheme.
137
Added:
138
Added:
self assert: prescription repScheme identicalTo: repScheme
139
Added:
]
src/MyFitnessTracker-Core-Tests/MFTTraineeTest.class.st
@@ -0,0 +1,171 @@
1
Added:
"
2
Added:
A MFTTraineeTest is a test class for testing the behavior of MFTTrainee
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTTraineeTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Base',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Base'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTTraineeTest >> newWorkoutPrescriptionNamed: aString [
14
Added:
15
Added:
^ MFTWorkoutPrescription new
16
Added:
title: aString;
17
Added:
yourself
18
Added:
]
19
Added:
20
Added:
{ #category : 'tests' }
21
Added:
MFTTraineeTest >> testCanonicalName [
22
Added:
23
Added:
self assert: MFTTrainee new canonicalName equals: 'trainee'
24
Added:
]
25
Added:
26
Added:
{ #category : 'tests' }
27
Added:
MFTTraineeTest >> testInitializeCreatesRoutineAndLogBook [
28
Added:
29
Added:
| trainee |
30
Added:
trainee := MFTTrainee new.
31
Added:
32
Added:
self assert: trainee routine class equals: MFTRoutine.
33
Added:
self assert: trainee routine workouts isEmpty.
34
Added:
self assert: trainee logBook class equals: MFTWorkoutLogBook.
35
Added:
self assert: trainee logBook workoutLogs isEmpty
36
Added:
]
37
Added:
38
Added:
{ #category : 'tests' }
39
Added:
MFTTraineeTest >> testIsRecoveredAnswersFalseWhenLastWorkoutFinishedLessThanTwoDaysAgo [
40
Added:
41
Added:
| trainee log |
42
Added:
trainee := MFTTrainee new.
43
Added:
log := MFTWorkoutLog new.
44
Added:
log finish: DateAndTime now - 1 day.
45
Added:
trainee logWorkout: log.
46
Added:
47
Added:
self deny: trainee isRecovered
48
Added:
]
49
Added:
50
Added:
{ #category : 'tests' }
51
Added:
MFTTraineeTest >> testIsRecoveredAnswersTrueWhenLastWorkoutFinishedMoreThanTwoDaysAgo [
52
Added:
53
Added:
| trainee log |
54
Added:
trainee := MFTTrainee new.
55
Added:
log := MFTWorkoutLog new.
56
Added:
log finish: DateAndTime now - 3 days.
57
Added:
trainee logWorkout: log.
58
Added:
59
Added:
self assert: trainee isRecovered
60
Added:
]
61
Added:
62
Added:
{ #category : 'tests' }
63
Added:
MFTTraineeTest >> testIsRecoveredAnswersTrueWithoutWorkoutLogs [
64
Added:
65
Added:
self assert: MFTTrainee new isRecovered
66
Added:
]
67
Added:
68
Added:
{ #category : 'tests' }
69
Added:
MFTTraineeTest >> testLogBookAccessorCanReplaceLogBook [
70
Added:
71
Added:
| trainee logBook |
72
Added:
trainee := MFTTrainee new.
73
Added:
logBook := MFTWorkoutLogBook new.
74
Added:
75
Added:
trainee logBook: logBook.
76
Added:
77
Added:
self assert: trainee logBook identicalTo: logBook
78
Added:
]
79
Added:
80
Added:
{ #category : 'tests' }
81
Added:
MFTTraineeTest >> testLogWorkoutAddsWorkoutToLogBook [
82
Added:
83
Added:
| trainee log |
84
Added:
trainee := MFTTrainee new.
85
Added:
log := MFTWorkoutLog new.
86
Added:
87
Added:
trainee logWorkout: log.
88
Added:
89
Added:
self assert: trainee logBook workoutLogs size equals: 1.
90
Added:
self assert: trainee logBook workoutLogs first identicalTo: log
91
Added:
]
92
Added:
93
Added:
{ #category : 'tests' }
94
Added:
MFTTraineeTest >> testNextWorkoutPrescriptionAnswersFirstWorkoutWhenNoWorkoutHasBeenLogged [
95
Added:
96
Added:
| trainee routine firstWorkout secondWorkout |
97
Added:
trainee := MFTTrainee new.
98
Added:
firstWorkout := self newWorkoutPrescriptionNamed: 'Day 1'.
99
Added:
secondWorkout := self newWorkoutPrescriptionNamed: 'Day 2'.
100
Added:
routine := MFTRoutine new.
101
Added:
routine workouts: {
102
Added:
firstWorkout.
103
Added:
secondWorkout }.
104
Added:
trainee routine: routine.
105
Added:
106
Added:
self
107
Added:
assert: trainee nextWorkoutPrescription
108
Added:
identicalTo: firstWorkout
109
Added:
]
110
Added:
111
Added:
{ #category : 'tests' }
112
Added:
MFTTraineeTest >> testNextWorkoutPrescriptionAnswersNilForEmptyRoutine [
113
Added:
114
Added:
self assert: MFTTrainee new nextWorkoutPrescription isNil
115
Added:
]
116
Added:
117
Added:
{ #category : 'tests' }
118
Added:
MFTTraineeTest >> testNextWorkoutPrescriptionFollowsLastLoggedPrescription [
119
Added:
120
Added:
| trainee routine firstWorkout secondWorkout log |
121
Added:
trainee := MFTTrainee new.
122
Added:
firstWorkout := self newWorkoutPrescriptionNamed: 'Day 1'.
123
Added:
secondWorkout := self newWorkoutPrescriptionNamed: 'Day 2'.
124
Added:
routine := MFTRoutine new.
125
Added:
routine workouts: {
126
Added:
firstWorkout.
127
Added:
secondWorkout }.
128
Added:
trainee routine: routine.
129
Added:
log := MFTWorkoutLog new.
130
Added:
log prescription: firstWorkout.
131
Added:
log finish: DateAndTime now.
132
Added:
trainee logWorkout: log.
133
Added:
134
Added:
self
135
Added:
assert: trainee nextWorkoutPrescription
136
Added:
identicalTo: secondWorkout
137
Added:
]
138
Added:
139
Added:
{ #category : 'tests' }
140
Added:
MFTTraineeTest >> testNextWorkoutPrescriptionWrapsAfterLastWorkout [
141
Added:
142
Added:
| trainee routine firstWorkout secondWorkout log |
143
Added:
trainee := MFTTrainee new.
144
Added:
firstWorkout := self newWorkoutPrescriptionNamed: 'Day 1'.
145
Added:
secondWorkout := self newWorkoutPrescriptionNamed: 'Day 2'.
146
Added:
routine := MFTRoutine new.
147
Added:
routine workouts: {
148
Added:
firstWorkout.
149
Added:
secondWorkout }.
150
Added:
trainee routine: routine.
151
Added:
log := MFTWorkoutLog new.
152
Added:
log prescription: secondWorkout.
153
Added:
log finish: DateAndTime now.
154
Added:
trainee logWorkout: log.
155
Added:
156
Added:
self
157
Added:
assert: trainee nextWorkoutPrescription
158
Added:
identicalTo: firstWorkout
159
Added:
]
160
Added:
161
Added:
{ #category : 'tests' }
162
Added:
MFTTraineeTest >> testRoutineAccessorCanReplaceRoutine [
163
Added:
164
Added:
| trainee routine |
165
Added:
trainee := MFTTrainee new.
166
Added:
routine := MFTRoutine new.
167
Added:
168
Added:
trainee routine: routine.
169
Added:
170
Added:
self assert: trainee routine identicalTo: routine
171
Added:
]
src/MyFitnessTracker-Core-Tests/MFTWorkoutLogBookTest.class.st
@@ -0,0 +1,205 @@
1
Added:
"
2
Added:
A MFTWorkoutLogBookTest is a test class for testing the behavior of MFTWorkoutLogBook
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTWorkoutLogBookTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Logging',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Logging'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTWorkoutLogBookTest >> testCanonicalNameReturnsWorkoutLogsCollection [
14
Added:
15
Added:
| logBook |
16
Added:
logBook := MFTWorkoutLogBook new.
17
Added:
18
Added:
self assert: logBook canonicalName identicalTo: logBook workoutLogs
19
Added:
]
20
Added:
21
Added:
{ #category : 'tests' }
22
Added:
MFTWorkoutLogBookTest >> testDurationSinceLastWorkoutIsNilWhenLogBookIsEmpty [
23
Added:
24
Added:
| logBook |
25
Added:
logBook := MFTWorkoutLogBook new.
26
Added:
27
Added:
self assert: logBook durationSinceLastWorkout isNil
28
Added:
]
29
Added:
30
Added:
{ #category : 'tests' }
31
Added:
MFTWorkoutLogBookTest >> testDurationSinceLastWorkoutUsesLastWorkoutFinish [
32
Added:
33
Added:
| logBook olderLog newerLog olderFinish newerFinish duration |
34
Added:
logBook := MFTWorkoutLogBook new.
35
Added:
olderFinish := DateAndTime now - 2 hours.
36
Added:
newerFinish := DateAndTime now - 1 minute.
37
Added:
olderLog := MFTWorkoutLog new.
38
Added:
newerLog := MFTWorkoutLog new.
39
Added:
olderLog finish: olderFinish.
40
Added:
newerLog finish: newerFinish.
41
Added:
42
Added:
logBook logWorkout: olderLog.
43
Added:
logBook logWorkout: newerLog.
44
Added:
duration := logBook durationSinceLastWorkout.
45
Added:
46
Added:
self assert: duration >= 1 minute.
47
Added:
self assert: duration < 2 minutes
48
Added:
]
49
Added:
50
Added:
{ #category : 'tests' }
51
Added:
MFTWorkoutLogBookTest >> testLastLogForPrescriptionIsNilWhenNoMatchingPrescriptionExists [
52
Added:
53
Added:
| logBook knownPrescription unknownPrescription log |
54
Added:
logBook := MFTWorkoutLogBook new.
55
Added:
knownPrescription := Object new.
56
Added:
unknownPrescription := Object new.
57
Added:
log := MFTWorkoutLog new.
58
Added:
log
59
Added:
prescription: knownPrescription;
60
Added:
finish: (DateAndTime
61
Added:
year: 2026
62
Added:
month: 5
63
Added:
day: 1
64
Added:
hour: 10
65
Added:
minute: 0
66
Added:
second: 0
67
Added:
offset: 0 hours).
68
Added:
logBook logWorkout: log.
69
Added:
70
Added:
self assert:
71
Added:
(logBook lastLogForPrescription: unknownPrescription) isNil
72
Added:
]
73
Added:
74
Added:
{ #category : 'tests' }
75
Added:
MFTWorkoutLogBookTest >> testLastLogForPrescriptionReturnsMostRecentMatchingWorkoutByFinish [
76
Added:
77
Added:
| logBook prescription olderMatching newerMatching otherLog |
78
Added:
logBook := MFTWorkoutLogBook new.
79
Added:
prescription := Object new.
80
Added:
olderMatching := MFTWorkoutLog new.
81
Added:
newerMatching := MFTWorkoutLog new.
82
Added:
otherLog := MFTWorkoutLog new.
83
Added:
olderMatching
84
Added:
prescription: prescription;
85
Added:
finish: (DateAndTime
86
Added:
year: 2026
87
Added:
month: 5
88
Added:
day: 1
89
Added:
hour: 10
90
Added:
minute: 0
91
Added:
second: 0
92
Added:
offset: 0 hours).
93
Added:
newerMatching
94
Added:
prescription: prescription;
95
Added:
finish: (DateAndTime
96
Added:
year: 2026
97
Added:
month: 5
98
Added:
day: 3
99
Added:
hour: 10
100
Added:
minute: 0
101
Added:
second: 0
102
Added:
offset: 0 hours).
103
Added:
otherLog
104
Added:
prescription: Object new;
105
Added:
finish: (DateAndTime
106
Added:
year: 2026
107
Added:
month: 5
108
Added:
day: 4
109
Added:
hour: 10
110
Added:
minute: 0
111
Added:
second: 0
112
Added:
offset: 0 hours).
113
Added:
114
Added:
logBook logWorkout: newerMatching.
115
Added:
logBook logWorkout: otherLog.
116
Added:
logBook logWorkout: olderMatching.
117
Added:
118
Added:
self
119
Added:
assert: (logBook lastLogForPrescription: prescription)
120
Added:
identicalTo: newerMatching
121
Added:
]
122
Added:
123
Added:
{ #category : 'tests' }
124
Added:
MFTWorkoutLogBookTest >> testLogWorkoutAppendsWorkoutLog [
125
Added:
126
Added:
| logBook firstLog secondLog |
127
Added:
logBook := MFTWorkoutLogBook new.
128
Added:
firstLog := MFTWorkoutLog new.
129
Added:
secondLog := MFTWorkoutLog new.
130
Added:
131
Added:
logBook logWorkout: firstLog.
132
Added:
logBook logWorkout: secondLog.
133
Added:
134
Added:
self assert: logBook workoutLogs asArray equals: {
135
Added:
firstLog.
136
Added:
secondLog }
137
Added:
]
138
Added:
139
Added:
{ #category : 'tests' }
140
Added:
MFTWorkoutLogBookTest >> testNewLogBookStartsWithEmptyWorkoutLogs [
141
Added:
142
Added:
| logBook |
143
Added:
logBook := MFTWorkoutLogBook new.
144
Added:
145
Added:
self assert: logBook workoutLogs isEmpty
146
Added:
]
147
Added:
148
Added:
{ #category : 'tests' }
149
Added:
MFTWorkoutLogBookTest >> testRemoveWorkoutLogRemovesExistingWorkoutLog [
150
Added:
151
Added:
| logBook firstLog secondLog |
152
Added:
logBook := MFTWorkoutLogBook new.
153
Added:
firstLog := MFTWorkoutLog new.
154
Added:
secondLog := MFTWorkoutLog new.
155
Added:
logBook logWorkout: firstLog.
156
Added:
logBook logWorkout: secondLog.
157
Added:
158
Added:
logBook removeWorkoutLog: firstLog.
159
Added:
160
Added:
self assert: logBook workoutLogs asArray equals: { secondLog }
161
Added:
]
162
Added:
163
Added:
{ #category : 'tests' }
164
Added:
MFTWorkoutLogBookTest >> testWorkoutLogIsInProgressWhenLastWorkoutHasNoFinish [
165
Added:
166
Added:
| logBook finishedLog unfinishedLog |
167
Added:
logBook := MFTWorkoutLogBook new.
168
Added:
finishedLog := MFTWorkoutLog new.
169
Added:
unfinishedLog := MFTWorkoutLog new.
170
Added:
finishedLog finish: (DateAndTime
171
Added:
year: 2026
172
Added:
month: 5
173
Added:
day: 1
174
Added:
hour: 10
175
Added:
minute: 0
176
Added:
second: 0
177
Added:
offset: 0 hours).
178
Added:
179
Added:
logBook logWorkout: finishedLog.
180
Added:
logBook logWorkout: unfinishedLog.
181
Added:
182
Added:
self assert: logBook workoutLogIsInProgress
183
Added:
]
184
Added:
185
Added:
{ #category : 'tests' }
186
Added:
MFTWorkoutLogBookTest >> testWorkoutLogIsNotInProgressWhenLastWorkoutHasFinish [
187
Added:
188
Added:
| logBook unfinishedLog finishedLog |
189
Added:
logBook := MFTWorkoutLogBook new.
190
Added:
unfinishedLog := MFTWorkoutLog new.
191
Added:
finishedLog := MFTWorkoutLog new.
192
Added:
finishedLog finish: (DateAndTime
193
Added:
year: 2026
194
Added:
month: 5
195
Added:
day: 1
196
Added:
hour: 10
197
Added:
minute: 0
198
Added:
second: 0
199
Added:
offset: 0 hours).
200
Added:
201
Added:
logBook logWorkout: unfinishedLog.
202
Added:
logBook logWorkout: finishedLog.
203
Added:
204
Added:
self deny: logBook workoutLogIsInProgress
205
Added:
]
src/MyFitnessTracker-Core-Tests/MFTWorkoutLogTest.class.st
@@ -0,0 +1,280 @@
1
Added:
"
2
Added:
A MFTWorkoutLogTest is a test class for testing the behavior of MFTWorkoutLog
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTWorkoutLogTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Logging',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Logging'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTWorkoutLogTest >> testAddSetGroupAppendsGroupLog [
14
Added:
15
Added:
| workoutLog firstGroup secondGroup |
16
Added:
workoutLog := MFTWorkoutLog new.
17
Added:
firstGroup := MFTSetGroupLog new.
18
Added:
secondGroup := MFTSetGroupLog new.
19
Added:
20
Added:
workoutLog addSetGroup: firstGroup.
21
Added:
workoutLog addSetGroup: secondGroup.
22
Added:
23
Added:
self assert: workoutLog setGroups asArray equals: {
24
Added:
firstGroup.
25
Added:
secondGroup }
26
Added:
]
27
Added:
28
Added:
{ #category : 'tests' }
29
Added:
MFTWorkoutLogTest >> testCanonicalNameWithoutPrescription [
30
Added:
31
Added:
| workoutLog |
32
Added:
workoutLog := MFTWorkoutLog new.
33
Added:
34
Added:
self assert: workoutLog canonicalName equals: 'no prescription'
35
Added:
]
36
Added:
37
Added:
{ #category : 'tests' }
38
Added:
MFTWorkoutLogTest >> testDurationIsZeroWhenWorkoutHasNotStarted [
39
Added:
40
Added:
| workoutLog |
41
Added:
workoutLog := MFTWorkoutLog new.
42
Added:
43
Added:
self assert: workoutLog duration equals: Duration zero
44
Added:
]
45
Added:
46
Added:
{ #category : 'tests' }
47
Added:
MFTWorkoutLogTest >> testDurationRunsFromStartToNowWhenFinishIsMissing [
48
Added:
49
Added:
| workoutLog start |
50
Added:
workoutLog := MFTWorkoutLog new.
51
Added:
start := DateAndTime now - 1 minute.
52
Added:
workoutLog start: start.
53
Added:
54
Added:
self assert: workoutLog duration >= 1 minute
55
Added:
]
56
Added:
57
Added:
{ #category : 'tests' }
58
Added:
MFTWorkoutLogTest >> testDurationUsesFinishWhenPresent [
59
Added:
60
Added:
| workoutLog start finish |
61
Added:
workoutLog := MFTWorkoutLog new.
62
Added:
start := DateAndTime
63
Added:
year: 2026
64
Added:
month: 5
65
Added:
day: 1
66
Added:
hour: 10
67
Added:
minute: 0
68
Added:
second: 0
69
Added:
offset: 0 hours.
70
Added:
finish := DateAndTime
71
Added:
year: 2026
72
Added:
month: 5
73
Added:
day: 1
74
Added:
hour: 11
75
Added:
minute: 30
76
Added:
second: 0
77
Added:
offset: 0 hours.
78
Added:
79
Added:
workoutLog
80
Added:
start: start;
81
Added:
finish: finish.
82
Added:
83
Added:
self assert: workoutLog duration equals: 90 minutes
84
Added:
]
85
Added:
86
Added:
{ #category : 'tests' }
87
Added:
MFTWorkoutLogTest >> testEmptyWorkoutLogIsCompletelyLogged [
88
Added:
89
Added:
| workoutLog |
90
Added:
workoutLog := MFTWorkoutLog new.
91
Added:
92
Added:
self assert: workoutLog isCompletelyLogged
93
Added:
]
94
Added:
95
Added:
{ #category : 'tests' }
96
Added:
MFTWorkoutLogTest >> testFinishNowRecordsFinishDateAndTime [
97
Added:
98
Added:
| workoutLog |
99
Added:
workoutLog := MFTWorkoutLog new.
100
Added:
101
Added:
workoutLog finishNow.
102
Added:
103
Added:
self assert: workoutLog finish isNotNil.
104
Added:
self assert: (workoutLog finish isKindOf: DateAndTime)
105
Added:
]
106
Added:
107
Added:
{ #category : 'tests' }
108
Added:
MFTWorkoutLogTest >> testNewWorkoutLogStartsWithEmptySetGroups [
109
Added:
110
Added:
| workoutLog |
111
Added:
workoutLog := MFTWorkoutLog new.
112
Added:
113
Added:
self assert: workoutLog setGroups isEmpty
114
Added:
]
115
Added:
116
Added:
{ #category : 'tests' }
117
Added:
MFTWorkoutLogTest >> testPrescriptionCanBeRecorded [
118
Added:
119
Added:
| workoutLog prescription |
120
Added:
workoutLog := MFTWorkoutLog new.
121
Added:
prescription := Object new.
122
Added:
workoutLog prescription: prescription.
123
Added:
124
Added:
self assert: workoutLog prescription identicalTo: prescription
125
Added:
]
126
Added:
127
Added:
{ #category : 'tests' }
128
Added:
MFTWorkoutLogTest >> testSetForPrescriptionRaisesErrorWhenPrescriptionIsUnknown [
129
Added:
130
Added:
| workoutLog knownPrescription unknownPrescription knownSet groupLog |
131
Added:
workoutLog := MFTWorkoutLog new.
132
Added:
knownPrescription := Object new.
133
Added:
unknownPrescription := Object new.
134
Added:
knownSet := MFTSetLog forPrescription: knownPrescription.
135
Added:
groupLog := MFTSetGroupLog new.
136
Added:
groupLog addSet: knownSet.
137
Added:
workoutLog addSetGroup: groupLog.
138
Added:
139
Added:
self
140
Added:
should: [ workoutLog setForPrescription: unknownPrescription ]
141
Added:
raise: Error
142
Added:
]
143
Added:
144
Added:
{ #category : 'tests' }
145
Added:
MFTWorkoutLogTest >> testSetForPrescriptionReturnsMatchingSetLogByEquality [
146
Added:
147
Added:
| workoutLog firstPrescription secondPrescription firstSet secondSet groupLog |
148
Added:
workoutLog := MFTWorkoutLog new.
149
Added:
firstPrescription := Object new.
150
Added:
secondPrescription := Object new.
151
Added:
firstSet := MFTSetLog forPrescription: firstPrescription.
152
Added:
secondSet := MFTSetLog forPrescription: secondPrescription.
153
Added:
groupLog := MFTSetGroupLog new.
154
Added:
groupLog sets: {
155
Added:
firstSet.
156
Added:
secondSet }.
157
Added:
workoutLog addSetGroup: groupLog.
158
Added:
159
Added:
self
160
Added:
assert: (workoutLog setForPrescription: secondPrescription)
161
Added:
identicalTo: secondSet
162
Added:
]
163
Added:
164
Added:
{ #category : 'tests' }
165
Added:
MFTWorkoutLogTest >> testSetGroupsSetterCopiesAsOrderedCollection [
166
Added:
167
Added:
| workoutLog firstGroup secondGroup sourceCollection |
168
Added:
workoutLog := MFTWorkoutLog new.
169
Added:
firstGroup := MFTSetGroupLog new.
170
Added:
secondGroup := MFTSetGroupLog new.
171
Added:
sourceCollection := {
172
Added:
firstGroup.
173
Added:
secondGroup }.
174
Added:
175
Added:
workoutLog setGroups: sourceCollection.
176
Added:
177
Added:
self assert: workoutLog setGroups class equals: OrderedCollection.
178
Added:
self assert: workoutLog setGroups asArray equals: sourceCollection
179
Added:
]
180
Added:
181
Added:
{ #category : 'tests' }
182
Added:
MFTWorkoutLogTest >> testSetsFlattensAllGroupSetsInOrder [
183
Added:
184
Added:
| workoutLog firstGroup secondGroup firstSet secondSet thirdSet |
185
Added:
workoutLog := MFTWorkoutLog new.
186
Added:
firstGroup := MFTSetGroupLog new.
187
Added:
secondGroup := MFTSetGroupLog new.
188
Added:
firstSet := MFTSetLog new.
189
Added:
secondSet := MFTSetLog new.
190
Added:
thirdSet := MFTSetLog new.
191
Added:
firstGroup sets: {
192
Added:
firstSet.
193
Added:
secondSet }.
194
Added:
secondGroup sets: { thirdSet }.
195
Added:
196
Added:
workoutLog setGroups: {
197
Added:
firstGroup.
198
Added:
secondGroup }.
199
Added:
200
Added:
self assert: workoutLog sets asArray equals: {
201
Added:
firstSet.
202
Added:
secondSet.
203
Added:
thirdSet }
204
Added:
]
205
Added:
206
Added:
{ #category : 'tests' }
207
Added:
MFTWorkoutLogTest >> testStartAndFinishCanBeRecorded [
208
Added:
209
Added:
| workoutLog start finish |
210
Added:
workoutLog := MFTWorkoutLog new.
211
Added:
start := DateAndTime
212
Added:
year: 2026
213
Added:
month: 5
214
Added:
day: 1
215
Added:
hour: 10
216
Added:
minute: 0
217
Added:
second: 0
218
Added:
offset: 0 hours.
219
Added:
finish := DateAndTime
220
Added:
year: 2026
221
Added:
month: 5
222
Added:
day: 1
223
Added:
hour: 10
224
Added:
minute: 45
225
Added:
second: 0
226
Added:
offset: 0 hours.
227
Added:
228
Added:
workoutLog
229
Added:
start: start;
230
Added:
finish: finish.
231
Added:
232
Added:
self assert: workoutLog start equals: start.
233
Added:
self assert: workoutLog finish equals: finish
234
Added:
]
235
Added:
236
Added:
{ #category : 'tests' }
237
Added:
MFTWorkoutLogTest >> testStartNowRecordsStartDateAndTime [
238
Added:
239
Added:
| workoutLog |
240
Added:
workoutLog := MFTWorkoutLog new.
241
Added:
242
Added:
workoutLog startNow.
243
Added:
244
Added:
self assert: workoutLog start isNotNil.
245
Added:
self assert: (workoutLog start isKindOf: DateAndTime)
246
Added:
]
247
Added:
248
Added:
{ #category : 'tests' }
249
Added:
MFTWorkoutLogTest >> testWorkoutLogIsCompletelyLoggedWhenAllGroupsAreLogged [
250
Added:
251
Added:
| workoutLog firstGroup secondGroup |
252
Added:
workoutLog := MFTWorkoutLog new.
253
Added:
firstGroup := MFTSetGroupLog new.
254
Added:
secondGroup := MFTSetGroupLog new.
255
Added:
firstGroup sets: { (MFTSetLog reps: 6 load: 100) }.
256
Added:
secondGroup sets: { (MFTSetLog reps: 5 load: 110) }.
257
Added:
258
Added:
workoutLog setGroups: {
259
Added:
firstGroup.
260
Added:
secondGroup }.
261
Added:
262
Added:
self assert: workoutLog isCompletelyLogged
263
Added:
]
264
Added:
265
Added:
{ #category : 'tests' }
266
Added:
MFTWorkoutLogTest >> testWorkoutLogIsNotCompletelyLoggedWhenAnyGroupIsIncomplete [
267
Added:
268
Added:
| workoutLog completeGroup incompleteGroup |
269
Added:
workoutLog := MFTWorkoutLog new.
270
Added:
completeGroup := MFTSetGroupLog new.
271
Added:
incompleteGroup := MFTSetGroupLog new.
272
Added:
completeGroup sets: { (MFTSetLog reps: 6 load: 100) }.
273
Added:
incompleteGroup sets: { MFTSetLog new }.
274
Added:
275
Added:
workoutLog setGroups: {
276
Added:
completeGroup.
277
Added:
incompleteGroup }.
278
Added:
279
Added:
self deny: workoutLog isCompletelyLogged
280
Added:
]
src/MyFitnessTracker-Core-Tests/MFTWorkoutPrescriptionTest.class.st
@@ -0,0 +1,127 @@
1
Added:
"
2
Added:
A MFTWorkoutPrescriptionTest is a test class for testing the behavior of MFTWorkoutPrescription
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTWorkoutPrescriptionTest',
6
Added:
#superclass : 'TestCase',
7
Added:
#category : 'MyFitnessTracker-Core-Tests-Prescription',
8
Added:
#package : 'MyFitnessTracker-Core-Tests',
9
Added:
#tag : 'Prescription'
10
Added:
}
11
Added:
12
Added:
{ #category : 'tests' }
13
Added:
MFTWorkoutPrescriptionTest >> newSetPrescription [
14
Added:
"Use a real MFTSetPrescription instance without invoking the currently incomplete class-side constructors."
15
Added:
16
Added:
^ MFTSetPrescription basicNew
17
Added:
]
18
Added:
19
Added:
{ #category : 'tests' }
20
Added:
MFTWorkoutPrescriptionTest >> testCanonicalNameAnswersTitle [
21
Added:
22
Added:
| workout |
23
Added:
workout := MFTWorkoutPrescription new.
24
Added:
workout title: 'Chest and Back'.
25
Added:
26
Added:
self assert: workout canonicalName equals: 'Chest and Back'
27
Added:
]
28
Added:
29
Added:
{ #category : 'tests' }
30
Added:
MFTWorkoutPrescriptionTest >> testInitializeCreatesEmptySetGroups [
31
Added:
32
Added:
| workout |
33
Added:
workout := MFTWorkoutPrescription new.
34
Added:
35
Added:
self assert: workout setGroups isEmpty.
36
Added:
self assert: workout sets isEmpty
37
Added:
]
38
Added:
39
Added:
{ #category : 'tests' }
40
Added:
MFTWorkoutPrescriptionTest >> testPrescribePreExhaustSupersetAddsPreExhaustGroup [
41
Added:
42
Added:
| workout firstSet secondSet group |
43
Added:
workout := MFTWorkoutPrescription new.
44
Added:
firstSet := self newSetPrescription.
45
Added:
secondSet := self newSetPrescription.
46
Added:
47
Added:
workout prescribePreExhaustSuperset: {
48
Added:
firstSet.
49
Added:
secondSet }.
50
Added:
group := workout setGroups first.
51
Added:
52
Added:
self assert: workout setGroups size equals: 1.
53
Added:
self
54
Added:
assert: group class
55
Added:
equals: MFTPreExhaustSupersetGroupPrescription.
56
Added:
self assert: group sets asArray equals: {
57
Added:
firstSet.
58
Added:
secondSet }.
59
Added:
self assert: workout sets asArray equals: {
60
Added:
firstSet.
61
Added:
secondSet }
62
Added:
]
63
Added:
64
Added:
{ #category : 'tests' }
65
Added:
MFTWorkoutPrescriptionTest >> testPrescribeStraightSetAddsStraightSetGroup [
66
Added:
67
Added:
| workout set group |
68
Added:
workout := MFTWorkoutPrescription new.
69
Added:
set := self newSetPrescription.
70
Added:
71
Added:
workout prescribeStraightSet: set.
72
Added:
group := workout setGroups first.
73
Added:
74
Added:
self assert: workout setGroups size equals: 1.
75
Added:
self assert: group class equals: MFTStraightSetGroupPrescription.
76
Added:
self assert: group sets size equals: 1.
77
Added:
self assert: group sets first identicalTo: set.
78
Added:
self assert: workout sets asArray equals: { set }
79
Added:
]
80
Added:
81
Added:
{ #category : 'tests' }
82
Added:
MFTWorkoutPrescriptionTest >> testPrescribeSupersetAddsSupersetGroup [
83
Added:
84
Added:
| workout firstSet secondSet group |
85
Added:
workout := MFTWorkoutPrescription new.
86
Added:
firstSet := self newSetPrescription.
87
Added:
secondSet := self newSetPrescription.
88
Added:
89
Added:
workout prescribeSuperset: {
90
Added:
firstSet.
91
Added:
secondSet }.
92
Added:
group := workout setGroups first.
93
Added:
94
Added:
self assert: workout setGroups size equals: 1.
95
Added:
self assert: group class equals: MFTSupersetGroupPrescription.
96
Added:
self assert: group sets asArray equals: {
97
Added:
firstSet.
98
Added:
secondSet }.
99
Added:
self assert: workout sets asArray equals: {
100
Added:
firstSet.
101
Added:
secondSet }
102
Added:
]
103
Added:
104
Added:
{ #category : 'tests' }
105
Added:
MFTWorkoutPrescriptionTest >> testSetGroupsCanBeReplaced [
106
Added:
107
Added:
| workout set group groups |
108
Added:
workout := MFTWorkoutPrescription new.
109
Added:
set := self newSetPrescription.
110
Added:
group := MFTStraightSetGroupPrescription withSet: set.
111
Added:
groups := OrderedCollection with: group.
112
Added:
113
Added:
workout setGroups: groups.
114
Added:
115
Added:
self assert: workout setGroups identicalTo: groups.
116
Added:
self assert: workout sets asArray equals: { set }
117
Added:
]
118
Added:
119
Added:
{ #category : 'tests' }
120
Added:
MFTWorkoutPrescriptionTest >> testTitleAccessor [
121
Added:
122
Added:
| workout |
123
Added:
workout := MFTWorkoutPrescription new.
124
Added:
workout title: 'Heavy Duty Day 1'.
125
Added:
126
Added:
self assert: workout title equals: 'Heavy Duty Day 1'
127
Added:
]
src/MyFitnessTracker-Core-Tests/package.st
@@ -0,0 +1,1 @@
1
Added:
Package { #name : 'MyFitnessTracker-Core-Tests' }
src/MyFitnessTracker-Core/MFTExercise.class.st
@@ -1,11 +1,5 @@
1
1
"
2
2
I represent an exercise performed by a user.
3
Removed:
4
Removed:
I can be either:
5
Removed:
1. instantiated as a pre-existing exercise,
6
Removed:
2. used to create a new custom exercise,
7
Removed:
3. used to track an amount of sets performed by the user.
8
Removed:
I know about primary and secondary muscle groups I target...
9
3
"
10
4
Class {
11
5
#name : 'MFTExercise',
@@ -239,9 +233,9 @@
239
233
]
240
234
241
235
{ #category : 'accessing' }
242
Removed:
MFTExercise >> activates: aMFTMuscleGroup percent: aPercent [
236
Added:
MFTExercise >> activates: aMFTMuscleGroup percent: aPercentage [
243
237
244
Removed:
activatedMuscleGroups at: aMFTMuscleGroup put: aPercent
238
Added:
activatedMuscleGroups at: aMFTMuscleGroup put: aPercentage
245
239
]
246
240
247
241
{ #category : 'accessing' }
src/MyFitnessTracker-Core/MFTMuscle.class.st
@@ -7,7 +7,6 @@
7
7
#instVars : [
8
8
'latinName',
9
9
'englishName',
10
Removed:
'muscleGroup',
11
10
'description'
12
11
],
13
12
#category : 'MyFitnessTracker-Core-Anatomy',
@@ -272,7 +271,7 @@
272
271
{ #category : 'as yet unclassified' }
273
272
MFTMuscle class >> transversusAbdominis [
274
273
275
Removed:
^ self new
274
Added:
^ self newWithLatinName
276
275
englishName: 'abs';
277
276
description:
278
277
'Deepest abdominal muscle. Wraps around the spine for protection and stability.';
@@ -297,6 +296,16 @@
297
296
yourself
298
297
]
299
298
299
Added:
{ #category : 'comparing' }
300
Added:
MFTMuscle >> = anObject [
301
Added:
"Answer whether the receiver and anObject represent the same object."
302
Added:
303
Added:
self == anObject ifTrue: [ ^ true ].
304
Added:
self class = anObject class ifFalse: [ ^ false ].
305
Added:
^ englishName = anObject englishName and: [
306
Added:
latinName = anObject latinName ]
307
Added:
]
308
Added:
300
309
{ #category : 'accessing' }
301
310
MFTMuscle >> canonicalName [
302
311
@@ -327,6 +336,13 @@
327
336
englishName := aString
328
337
]
329
338
339
Added:
{ #category : 'comparing' }
340
Added:
MFTMuscle >> hash [
341
Added:
"Answer an integer value that is related to the identity of the receiver."
342
Added:
343
Added:
^ englishName hash bitXor: latinName hash
344
Added:
]
345
Added:
330
346
{ #category : 'initialization' }
331
347
MFTMuscle >> initialize [
332
348
@@ -353,16 +369,4 @@
353
369
354
370
^ 'http://terminologia-anatomica.org/en/Search?query=musculus {1}'
355
371
format: { latinName }
356
Removed:
]
357
Removed:
358
Removed:
{ #category : 'accessing' }
359
Removed:
MFTMuscle >> muscleGroup [
360
Removed:
361
Removed:
^ muscleGroup
362
Removed:
]
363
Removed:
364
Removed:
{ #category : 'accessing' }
365
Removed:
MFTMuscle >> muscleGroup: aMFTMuscleGroup [
366
Removed:
367
Removed:
muscleGroup := aMFTMuscleGroup
368
372
]
src/MyFitnessTracker-Core/MFTMuscleGroup.class.st
@@ -71,7 +71,6 @@
71
71
MFTMuscleGroup class >> forearm [
72
72
73
73
^ self newWithEnglishName
74
Removed:
latinName: 'antebrachium';
75
74
muscles: {
76
75
MFTMuscle brachioRadialis.
77
76
MFTMuscle flexorCarpiRadialis.
@@ -124,6 +123,15 @@
124
123
yourself
125
124
]
126
125
126
Added:
{ #category : 'comparing' }
127
Added:
MFTMuscleGroup >> = anObject [
128
Added:
"Answer whether the receiver and anObject represent the same object."
129
Added:
130
Added:
self == anObject ifTrue: [ ^ true ].
131
Added:
self class = anObject class ifFalse: [ ^ false ].
132
Added:
^ muscles asBag = anObject muscles asBag
133
Added:
]
134
Added:
127
135
{ #category : 'accessing' }
128
136
MFTMuscleGroup >> canonicalName [
129
137
@@ -152,6 +160,13 @@
152
160
MFTMuscleGroup >> frenchName: anObject [
153
161
154
162
frenchName := anObject
163
Added:
]
164
Added:
165
Added:
{ #category : 'comparing' }
166
Added:
MFTMuscleGroup >> hash [
167
Added:
"Answer an integer value that is related to the identity of the receiver."
168
Added:
169
Added:
^ muscles asBag hash
155
170
]
156
171
157
172
{ #category : 'testing' }
src/MyFitnessTracker-Core/MFTPreExhaustSupersetGroupPrescription.class.st
@@ -1,3 +1,6 @@
1
Added:
"
2
Added:
I represent exactly 2 working sets to be performed with as little rest as possible between them, to pre-exhaust a muscle group.
3
Added:
"
1
4
Class {
2
5
#name : 'MFTPreExhaustSupersetGroupPrescription',
3
6
#superclass : 'MFTSetGroupPrescription',
src/MyFitnessTracker-Core/MFTSetGroupLog.class.st
@@ -0,0 +1,100 @@
1
Added:
"
2
Added:
I represent a logged set group attached to a prescribed set group.
3
Added:
4
Added:
I own the logged sets and any execution-specific group data such as notes.
5
Added:
"
6
Added:
Class {
7
Added:
#name : 'MFTSetGroupLog',
8
Added:
#superclass : 'MFTObject',
9
Added:
#instVars : [
10
Added:
'prescription',
11
Added:
'sets',
12
Added:
'notes'
13
Added:
],
14
Added:
#category : 'MyFitnessTracker-Core-Logging',
15
Added:
#package : 'MyFitnessTracker-Core',
16
Added:
#tag : 'Logging'
17
Added:
}
18
Added:
19
Added:
{ #category : 'accessing' }
20
Added:
MFTSetGroupLog class >> forPrescription: aMFTSetGroupPrescription [
21
Added:
22
Added:
| groupLog |
23
Added:
groupLog := self new.
24
Added:
groupLog prescription: aMFTSetGroupPrescription.
25
Added:
groupLog sets: (aMFTSetGroupPrescription sets collect: [ :each |
26
Added:
MFTSetLog forPrescription: each ]).
27
Added:
^ groupLog
28
Added:
]
29
Added:
30
Added:
{ #category : 'initialization' }
31
Added:
MFTSetGroupLog >> addSet: aMFTSetLog [
32
Added:
33
Added:
sets addLast: aMFTSetLog
34
Added:
]
35
Added:
36
Added:
{ #category : 'initialization' }
37
Added:
MFTSetGroupLog >> canonicalName [
38
Added:
39
Added:
^ prescription
40
Added:
ifNil: [ 'prescriptionless set group' ]
41
Added:
ifNotNil: [ prescription canonicalName ]
42
Added:
]
43
Added:
44
Added:
{ #category : 'initialization' }
45
Added:
MFTSetGroupLog >> initialize [
46
Added:
47
Added:
super initialize.
48
Added:
sets := OrderedCollection new.
49
Added:
notes := String new
50
Added:
]
51
Added:
52
Added:
{ #category : 'initialization' }
53
Added:
MFTSetGroupLog >> isCompletelyLogged [
54
Added:
55
Added:
^ sets allSatisfy: #isLogged
56
Added:
]
57
Added:
58
Added:
{ #category : 'initialization' }
59
Added:
MFTSetGroupLog >> notes [
60
Added:
61
Added:
^ notes
62
Added:
]
63
Added:
64
Added:
{ #category : 'initialization' }
65
Added:
MFTSetGroupLog >> notes: aString [
66
Added:
67
Added:
notes := aString
68
Added:
]
69
Added:
70
Added:
{ #category : 'initialization' }
71
Added:
MFTSetGroupLog >> prescription [
72
Added:
73
Added:
^ prescription
74
Added:
]
75
Added:
76
Added:
{ #category : 'initialization' }
77
Added:
MFTSetGroupLog >> prescription: aMFTSetGroupPrescription [
78
Added:
79
Added:
prescription := aMFTSetGroupPrescription
80
Added:
]
81
Added:
82
Added:
{ #category : 'initialization' }
83
Added:
MFTSetGroupLog >> setLogForPrescription: aMFTSetPrescription [
84
Added:
85
Added:
^ sets
86
Added:
detect: [ :each | each prescription == aMFTSetPrescription ]
87
Added:
ifNone: [ self error: 'Unknown set prescription for this group.' ]
88
Added:
]
89
Added:
90
Added:
{ #category : 'initialization' }
91
Added:
MFTSetGroupLog >> sets [
92
Added:
93
Added:
^ sets
94
Added:
]
95
Added:
96
Added:
{ #category : 'initialization' }
97
Added:
MFTSetGroupLog >> sets: aMFTSetLogCollection [
98
Added:
99
Added:
sets := aMFTSetLogCollection asOrderedCollection
100
Added:
]
src/MyFitnessTracker-Core/MFTWorkoutLog.class.st
@@ -8,7 +8,7 @@
8
8
'prescription',
9
9
'start',
10
10
'finish',
11
Removed:
'sets'
11
Added:
'setGroups'
12
12
],
13
13
#category : 'MyFitnessTracker-Core-Logging',
14
14
#package : 'MyFitnessTracker-Core',
@@ -18,15 +18,19 @@
18
18
{ #category : 'accessing' }
19
19
MFTWorkoutLog class >> forPrescription: aMFTWorkoutPrescription [
20
20
21
Removed:
^ self new
22
Removed:
prescription: aMFTWorkoutPrescription;
23
Removed:
yourself
21
Added:
| workoutLog |
22
Added:
workoutLog := self new.
23
Added:
workoutLog prescription: aMFTWorkoutPrescription.
24
Added:
workoutLog setGroups:
25
Added:
(aMFTWorkoutPrescription setGroups collect: [ :each |
26
Added:
MFTSetGroupLog forPrescription: each ]).
27
Added:
^ workoutLog
24
28
]
25
29
26
30
{ #category : 'accessing' }
27
Removed:
MFTWorkoutLog >> addSet: aMFTSetLog [
31
Added:
MFTWorkoutLog >> addSetGroup: aMFTSetGroupLog [
28
32
29
Removed:
sets addLast: aMFTSetLog
33
Added:
setGroups addLast: aMFTSetGroupLog
30
34
]
31
35
32
36
{ #category : 'initialization' }
@@ -47,7 +51,7 @@
47
51
{ #category : 'as yet unclassified' }
48
52
MFTWorkoutLog >> exercises [
49
53
50
Removed:
^ sets collect: #exercise
54
Added:
^ self sets collect: #exercise
51
55
]
52
56
53
57
{ #category : 'accessing' }
@@ -72,13 +76,13 @@
72
76
MFTWorkoutLog >> initialize [
73
77
74
78
super initialize.
75
Removed:
sets := OrderedCollection new
79
Added:
setGroups := OrderedCollection new
76
80
]
77
81
78
82
{ #category : 'testing' }
79
Removed:
MFTWorkoutLog >> isLogged [
83
Added:
MFTWorkoutLog >> isCompletelyLogged [
80
84
81
Removed:
^ sets allSatisfy: #isLogged
85
Added:
^ setGroups allSatisfy: #isCompletelyLogged
82
86
]
83
87
84
88
{ #category : 'accessing' }
@@ -96,21 +100,38 @@
96
100
{ #category : 'accessing' }
97
101
MFTWorkoutLog >> setForPrescription: aMFTSetPrescription [
98
102
99
Removed:
^ sets
103
Added:
^ self sets
100
104
detect: [ :set | set prescription = aMFTSetPrescription ]
101
Removed:
ifNone: [ MFTSetLog forPrescription: aMFTSetPrescription ]
105
Added:
ifNone: [
106
Added:
self error: 'Unknown set prescription for this workout log.' ]
102
107
]
103
108
104
Removed:
{ #category : 'accessing' }
105
Removed:
MFTWorkoutLog >> sets [
109
Added:
{ #category : 'initialization' }
110
Added:
MFTWorkoutLog >> setGroups [
106
111
107
Removed:
^ sets
112
Added:
^ setGroups
108
113
]
109
114
115
Added:
{ #category : 'as yet unclassified' }
116
Added:
MFTWorkoutLog >> setGroups: aMFTSetGroupLogCollection [
117
Added:
118
Added:
setGroups := aMFTSetGroupLogCollection asOrderedCollection
119
Added:
]
120
Added:
110
121
{ #category : 'accessing' }
111
Removed:
MFTWorkoutLog >> sets: aMFTSetLogCollection [
122
Added:
MFTWorkoutLog >> setLogForPrescription: aMFTSetPrescription [
112
123
113
Removed:
sets := aMFTSetLogCollection
124
Added:
| groupLog |
125
Added:
groupLog := self setGroupLogForPrescription:
126
Added:
(self prescription setGroups detect: [ :eachGroup |
127
Added:
eachGroup sets includes: aMFTSetPrescription ]).
128
Added:
^ groupLog setLogForPrescription: aMFTSetPrescription
129
Added:
]
130
Added:
131
Added:
{ #category : 'as yet unclassified' }
132
Added:
MFTWorkoutLog >> sets [
133
Added:
134
Added:
^ setGroups flatCollect: #sets
114
135
]
115
136
116
137
{ #category : 'accessing' }
src/MyFitnessTracker-Core/MFTWorkoutPrescription.class.st
@@ -71,12 +71,6 @@
71
71
^ title
72
72
]
73
73
74
Removed:
{ #category : 'accessing' }
75
Removed:
MFTWorkoutPrescription >> duration [
76
Removed:
77
Removed:
^ Duration zero
78
Removed:
]
79
Removed:
80
74
{ #category : 'initialization' }
81
75
MFTWorkoutPrescription >> initialize [
82
76
@@ -106,7 +100,7 @@
106
100
aMFTSetPrescriptionCollection)
107
101
]
108
102
109
Removed:
{ #category : 'as yet unclassified' }
103
Added:
{ #category : 'initialization' }
110
104
MFTWorkoutPrescription >> setGroups [
111
105
112
106
^ setGroups