Add tests for Core package.

82.7% coverage.

Commit
e6374f7ab2efa20b8a882871b30313dd5ab9d0a1
Author
Marius Peter <dev@marius-peter.com>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
src/MyFitnessTracker-Core-Tests/MFTEquipmentTest.class.st
index 00000000..62e8315e 000000..100644
@@ -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
index 00000000..ab2ad4d3 000000..100644
@@ -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
index 00000000..ee1895a1 000000..100644
@@ -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
index 00000000..2a3161c8 000000..100644
@@ -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
index 00000000..abe5d885 000000..100644
@@ -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
index 00000000..29b20956 000000..100644
@@ -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
index 00000000..850e4870 000000..100644
@@ -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
index 00000000..ed8dadbc 000000..100644
@@ -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
index 00000000..e43d18e0 000000..100644
@@ -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
index 00000000..958e7179 000000..100644
@@ -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
index 00000000..fb977fbb 000000..100644
@@ -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
index 00000000..50bc7f26 000000..100644
@@ -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
index 00000000..c9f5da25 000000..100644
@@ -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
index 00000000..e9ec2165 000000..100644
@@ -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
index 00000000..34fcf3f4 000000..100644
@@ -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
index 00000000..fd5525ec 000000..100644
@@ -0,0 +1,1 @@
1 Added: Package { #name : 'MyFitnessTracker-Core-Tests' }
src/MyFitnessTracker-Core/MFTExercise.class.st
index f9cdc980..83083254 100644..100644
@@ -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
index cc93d2d9..4c3e6572 100644..100644
@@ -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
index 6456caea..ffea9615 100644..100644
@@ -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
index a58f3baf..4db584f3 100644..100644
@@ -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
index 00000000..c52be48e 000000..100644
@@ -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
index 73b11d6b..105c7107 100644..100644
@@ -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
index 409aee54..9405518f 100644..100644
@@ -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