-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCodigoRepetido-Ejercicio.st
283 lines (189 loc) · 8.79 KB
/
CodigoRepetido-Ejercicio.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
!classDefinition: #CantSuspend category: #'CodigoRepetido-Ejercicio'!
Error subclass: #CantSuspend
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'CodigoRepetido-Ejercicio'!
!classDefinition: #NotFound category: #'CodigoRepetido-Ejercicio'!
Error subclass: #NotFound
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'CodigoRepetido-Ejercicio'!
!classDefinition: #CustomerBookTest category: #'CodigoRepetido-Ejercicio'!
TestCase subclass: #CustomerBookTest
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'CodigoRepetido-Ejercicio'!
!CustomerBookTest methodsFor: 'testing' stamp: 'VPM 9/2/2019 19:30:06'!
test01AddingCustomerShouldNotTakeMoreThan50Milliseconds
| customerBook |
customerBook := CustomerBook new.
self check: [customerBook addCustomerNamed: 'John Lennon'] fasterThan: (50 * millisecond)
! !
!CustomerBookTest methodsFor: 'testing' stamp: 'VPM 9/2/2019 21:11:57'!
test02RemovingCustomerShouldNotTakeMoreThan100Milliseconds
| customerBook paulMcCartney |
paulMcCartney := 'Paul McCartney'.
customerBook := CustomerBook newWithActiveCustomerNamed: paulMcCartney.
self check: [customerBook removeCustomerNamed: paulMcCartney.] fasterThan: (100 * millisecond)
! !
!CustomerBookTest methodsFor: 'testing' stamp: 'VPM 9/2/2019 20:47:21'!
test03CanNotAddACustomerWithEmptyName
| customerBook |
customerBook := CustomerBook new.
[ customerBook addCustomerNamed: ''.
self fail ]
on: Error
do: [ :anError |
self assert: anError messageText = CustomerBook customerCanNotBeEmptyErrorMessage.
self assert: customerBook isEmpty ]! !
!CustomerBookTest methodsFor: 'testing' stamp: 'VPM 9/7/2019 11:57:26'!
test04CanNotRemoveAnInvalidCustomer
| customerBook johnLennon |
johnLennon := 'John Lennon'.
customerBook := CustomerBook newWithActiveCustomerNamed: johnLennon.
self check: customerBook cannotDo: [ customerBook removeCustomerNamed: 'Paul McCartney' ] withoutError: NotFound.! !
!CustomerBookTest methodsFor: 'testing' stamp: 'VPM 9/7/2019 11:25:20'!
test05SuspendingACustomerShouldNotRemoveItFromCustomerBook
| customerBook paulMcCartney|
paulMcCartney := 'Paul McCartney'.
customerBook := CustomerBook newWithSuspendedCustomerNamed: paulMcCartney.
self checkCustomerBook: customerBook hasNumberOfActiveCustomers: 0 numberOfInactive: 1.
self assert: (customerBook includesCustomerNamed: paulMcCartney).
! !
!CustomerBookTest methodsFor: 'testing' stamp: 'VPM 9/7/2019 11:25:51'!
test06RemovingASuspendedCustomerShouldRemoveItFromCustomerBook
| customerBook paulMcCartney|
paulMcCartney := 'Paul McCartney'.
customerBook := CustomerBook newWithActiveCustomerNamed: paulMcCartney.
customerBook suspendCustomerNamed: paulMcCartney.
customerBook removeCustomerNamed: paulMcCartney.
self checkCustomerBook: customerBook hasNumberOfActiveCustomers: 0 numberOfInactive: 0.
self deny: (customerBook includesCustomerNamed: paulMcCartney).
! !
!CustomerBookTest methodsFor: 'testing' stamp: 'VPM 9/7/2019 11:50:19'!
test07CanNotSuspendAnInvalidCustomer
| customerBook johnLennon |
johnLennon := 'John Lennon'.
customerBook := CustomerBook newWithActiveCustomerNamed: johnLennon.
self check: customerBook cannotSuspend: 'Paul McCartney'.
! !
!CustomerBookTest methodsFor: 'testing' stamp: 'VPM 9/7/2019 11:51:04'!
test08CanNotSuspendAnAlreadySuspendedCustomer
| customerBook johnLennon |
johnLennon := 'John Lennon'.
customerBook := CustomerBook newWithSuspendedCustomerNamed: johnLennon.
self check: customerBook cannotSuspend: johnLennon.
! !
!CustomerBookTest methodsFor: 'helpers' stamp: 'VPM 9/7/2019 12:00:53'!
check: aCustomerBook cannotDo: aBlock withoutError: aTypeOfError
| previousActiveCustomers previousSuspendedCustomers|
previousActiveCustomers := aCustomerBook activeCustomers.
previousSuspendedCustomers := aCustomerBook suspendedCustomers.
[ aBlock value.
self fail ]
on: aTypeOfError
do: [ :anError |
self assert: aCustomerBook numberOfCustomers = (previousActiveCustomers size + previousSuspendedCustomers size).
previousActiveCustomers do: [:name | self assert: (aCustomerBook includesCustomerNamed: name)].
previousSuspendedCustomers do: [:name | self assert: (aCustomerBook includesCustomerNamed: name)].
^self. ].
self fail.! !
!CustomerBookTest methodsFor: 'helpers' stamp: 'VPM 9/7/2019 11:55:44'!
check: aCustomerBook cannotSuspend: aCustomer
self check: aCustomerBook cannotDo: [aCustomerBook suspendCustomerNamed: aCustomer] withoutError: CantSuspend.! !
!CustomerBookTest methodsFor: 'helpers' stamp: 'VPM 9/2/2019 19:35:22'!
check: aClosure fasterThan: aTimeInSomeUnit
| timeBeforeRunning timeAfterRunning |
timeBeforeRunning := Time millisecondClockValue * millisecond.
aClosure value.
timeAfterRunning := Time millisecondClockValue * millisecond.
self assert: (timeAfterRunning-timeBeforeRunning) < aTimeInSomeUnit! !
!CustomerBookTest methodsFor: 'helpers' stamp: 'VPM 9/7/2019 11:24:49'!
checkCustomerBook: aCustomerBook hasNumberOfActiveCustomers: numberOfActive numberOfInactive: numberOfInactive
self assert: numberOfActive equals: aCustomerBook numberOfActiveCustomers.
self assert: numberOfInactive equals: aCustomerBook numberOfSuspendedCustomers.
self assert: (numberOfActive + numberOfInactive) equals: aCustomerBook numberOfCustomers.
! !
!classDefinition: #CustomerBook category: #'CodigoRepetido-Ejercicio'!
Object subclass: #CustomerBook
instanceVariableNames: 'suspended active'
classVariableNames: ''
poolDictionaries: ''
category: 'CodigoRepetido-Ejercicio'!
!CustomerBook methodsFor: 'testing' stamp: 'VPM 9/7/2019 11:41:32'!
activeCustomers
^active! !
!CustomerBook methodsFor: 'testing' stamp: 'NR 4/3/2019 10:14:26'!
includesCustomerNamed: aName
^(active includes: aName) or: [ suspended includes: aName ]! !
!CustomerBook methodsFor: 'testing' stamp: 'NR 4/3/2019 10:14:26'!
isEmpty
^active isEmpty and: [ suspended isEmpty ]! !
!CustomerBook methodsFor: 'testing' stamp: 'VPM 9/7/2019 11:41:46'!
suspendedCustomers
^suspended! !
!CustomerBook methodsFor: 'initialization' stamp: 'NR 4/3/2019 10:14:26'!
initialize
super initialize.
active := OrderedCollection new.
suspended:= OrderedCollection new.! !
!CustomerBook methodsFor: 'initialization' stamp: 'VPM 9/2/2019 21:11:33'!
initializeWithActiveCustomerNamed: aName
self addCustomerNamed: aName! !
!CustomerBook methodsFor: 'initialization' stamp: 'VPM 9/2/2019 21:11:44'!
initializeWithSuspendedCustomerNamed: aName
suspended add: aName! !
!CustomerBook methodsFor: 'customer management' stamp: 'VPM 9/2/2019 20:32:23'!
addCustomerNamed: aName
aName isEmpty ifTrue: [ self signalCustomerNameCannotBeEmpty ].
(self includesCustomerNamed: aName) ifTrue: [ self signalCustomerAlreadyExists ].
active add: aName ! !
!CustomerBook methodsFor: 'customer management' stamp: 'NR 4/3/2019 10:14:26'!
numberOfActiveCustomers
^active size! !
!CustomerBook methodsFor: 'customer management' stamp: 'VPM 9/2/2019 20:29:47'!
numberOfCustomers
^self numberOfActiveCustomers + self numberOfSuspendedCustomers! !
!CustomerBook methodsFor: 'customer management' stamp: 'NR 9/19/2018 17:36:09'!
numberOfSuspendedCustomers
^suspended size! !
!CustomerBook methodsFor: 'customer management' stamp: 'VPM 9/2/2019 20:08:27'!
removeCustomerNamed: aName
active remove: aName ifAbsent: [
suspended remove: aName ifAbsent: [
^ NotFound signal
]
].
^aName
! !
!CustomerBook methodsFor: 'customer management' stamp: 'HernanWilkinson 7/6/2011 17:52'!
signalCustomerAlreadyExists
self error: self class customerAlreadyExistsErrorMessage! !
!CustomerBook methodsFor: 'customer management' stamp: 'HernanWilkinson 7/6/2011 17:51'!
signalCustomerNameCannotBeEmpty
self error: self class customerCanNotBeEmptyErrorMessage ! !
!CustomerBook methodsFor: 'customer management' stamp: 'VPM 9/7/2019 12:01:34'!
suspendCustomerNamed: aName
(active includes: aName) ifFalse: [^CantSuspend signal].
active remove: aName.
suspended add: aName
! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
!classDefinition: 'CustomerBook class' category: #'CodigoRepetido-Ejercicio'!
CustomerBook class
instanceVariableNames: ''!
!CustomerBook class methodsFor: 'error messages' stamp: 'NR 9/2/2019 14:41:10'!
customerAlreadyExistsErrorMessage
^'Customer Already Exists.'! !
!CustomerBook class methodsFor: 'error messages' stamp: 'NR 9/2/2019 14:41:16'!
customerCanNotBeEmptyErrorMessage
^'Customer Name Cannot Be Empty.'! !
!CustomerBook class methodsFor: 'creators' stamp: 'VPM 9/2/2019 21:10:01'!
newWithActiveCustomerNamed: aName
^self new initializeWithActiveCustomerNamed: aName! !
!CustomerBook class methodsFor: 'creators' stamp: 'VPM 9/2/2019 21:10:43'!
newWithSuspendedCustomerNamed: aName
^self new initializeWithSuspendedCustomerNamed: aName! !