-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEjercicio2-CodigoRepetido-.st
289 lines (198 loc) · 8.71 KB
/
Ejercicio2-CodigoRepetido-.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
284
285
286
287
288
289
!classDefinition: #TestingErrors category: 'CodigoRepetido-Ejercicio'!
Error subclass: #TestingErrors
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'CodigoRepetido-Ejercicio'!
!classDefinition: #CantSuspend category: 'CodigoRepetido-Ejercicio'!
TestingErrors subclass: #CantSuspend
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'CodigoRepetido-Ejercicio'!
!classDefinition: #NotFound category: 'CodigoRepetido-Ejercicio'!
TestingErrors 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 Messages' stamp: 'srs 10/10/2021 00:29:48'!
AssertThatIn: aCustomerBook theNumberOfSuspendedAndTotalCustomersAre: aNumber
self assert: 0 equals: aCustomerBook numberOfActiveCustomers.
self assert: aNumber equals: aCustomerBook numberOfSuspendedCustomers.
self assert: aNumber equals: aCustomerBook numberOfCustomers.
! !
!CustomerBookTest methodsFor: 'Testing Messages' stamp: 'LG 10/13/2021 18:22:26'!
DoThis: firstClosure ThenFailWith: anError AndFinallyDo: secondClosure
[firstClosure value.
self fail]
on: anError
do: secondClosure.! !
!CustomerBookTest methodsFor: 'Testing Messages' stamp: 'LG 10/13/2021 17:39:58'!
TimeOf: anAction for: aCostumerBook named: aPerson
| millisecondsBeforeRunning millisecondsAfterRunning |
millisecondsBeforeRunning := Time millisecondClockValue * millisecond.
anAction sendTo: aCostumerBook with: aPerson.
millisecondsAfterRunning := Time millisecondClockValue * millisecond.
^ millisecondsAfterRunning-millisecondsBeforeRunning.! !
!CustomerBookTest methodsFor: 'Tests' stamp: 'srs 10/9/2021 02:05:10'!
test01AddingCustomerShouldNotTakeMoreThan50Milliseconds
| customerBook millisecondsToAddCustomer|
customerBook := CustomerBook new.
millisecondsToAddCustomer := self TimeOf: #addCustomerNamed: for: customerBook named: 'John Lennon'.
self assert: (millisecondsToAddCustomer) < (50 * millisecond)
! !
!CustomerBookTest methodsFor: 'Tests' stamp: 'srs 10/9/2021 16:15:46'!
test02RemovingCustomerShouldNotTakeMoreThan100Milliseconds
| millisecondsToRemoveCustomer customerBook PaulMcCartney|
customerBook := CustomerBook new.
PaulMcCartney := 'PaulMcCartney'.
customerBook addCustomerNamed: PaulMcCartney.
millisecondsToRemoveCustomer := self TimeOf: #removeCustomerNamed: for: customerBook named: PaulMcCartney.
self assert: (millisecondsToRemoveCustomer) < (100 * millisecond)
! !
!CustomerBookTest methodsFor: 'Tests' stamp: 'LG 10/13/2021 18:21:44'!
test03CanNotAddACustomerWithEmptyName
| customerBook |
customerBook := CustomerBook new.
self DoThis: [ customerBook addCustomerNamed: ''.
] ThenFailWith: Error AndFinallyDo: [ :anError |
self assert: anError messageText = CustomerBook customerCanNotBeEmptyErrorMessage.
self assert: customerBook isEmpty ]! !
!CustomerBookTest methodsFor: 'Tests' stamp: 'LG 10/13/2021 18:21:44'!
test04CanNotRemoveAnInvalidCustomer
| customerBook johnLennon |
customerBook := CustomerBook new.
johnLennon := 'John Lennon'.
customerBook addCustomerNamed: johnLennon.
self DoThis: [ customerBook removeCustomerNamed: 'Paul McCartney'.
] ThenFailWith: NotFound AndFinallyDo: [ :anError |
self assert: customerBook numberOfCustomers = 1.
self assert: (customerBook includesCustomerNamed: johnLennon) ]
! !
!CustomerBookTest methodsFor: 'Tests' stamp: 'srs 10/10/2021 00:29:48'!
test05SuspendingACustomerShouldNotRemoveItFromCustomerBook
| customerBook PaulMcCartney|
customerBook := CustomerBook new.
PaulMcCartney := 'PaulMcCartney'.
customerBook addCustomerNamed: PaulMcCartney.
customerBook suspendCustomerNamed: PaulMcCartney.
self AssertThatIn: customerBook theNumberOfSuspendedAndTotalCustomersAre: 1.
self assert: (customerBook includesCustomerNamed: PaulMcCartney).
! !
!CustomerBookTest methodsFor: 'Tests' stamp: 'srs 10/10/2021 00:29:48'!
test06RemovingASuspendedCustomerShouldRemoveItFromCustomerBook
| customerBook |
customerBook := CustomerBook new.
customerBook addCustomerNamed: 'Paul McCartney'.
customerBook suspendCustomerNamed: 'Paul McCartney'.
customerBook removeCustomerNamed: 'Paul McCartney'.
self AssertThatIn: customerBook theNumberOfSuspendedAndTotalCustomersAre: 0.
self deny: (customerBook includesCustomerNamed: 'Paul McCartney').
! !
!CustomerBookTest methodsFor: 'Tests' stamp: 'LG 10/13/2021 18:21:44'!
test07CanNotSuspendAnInvalidCustomer
| customerBook JohnLennon RingoStarr|
customerBook := CustomerBook new.
JohnLennon := 'John Lennon'.
RingoStarr := 'Ringo Starr'.
customerBook addCustomerNamed: JohnLennon.
self DoThis: [ customerBook suspendCustomerNamed: RingoStarr .
] ThenFailWith: CantSuspend AndFinallyDo: [ :anError |
self assert: customerBook numberOfCustomers = 1.
self assert: (customerBook includesCustomerNamed: JohnLennon) ]
! !
!CustomerBookTest methodsFor: 'Tests' stamp: 'LG 10/13/2021 18:21:44'!
test08CanNotSuspendAnAlreadySuspendedCustomer
| customerBook johnLennon |
customerBook := CustomerBook new.
johnLennon := 'John Lennon'.
customerBook addCustomerNamed: johnLennon.
customerBook suspendCustomerNamed: johnLennon.
self DoThis: [ customerBook suspendCustomerNamed: johnLennon.]
ThenFailWith: CantSuspend AndFinallyDo: [ :anError |
self assert: customerBook numberOfCustomers = 1.
self assert: (customerBook includesCustomerNamed: johnLennon) ]
! !
!classDefinition: #CustomerBook category: 'CodigoRepetido-Ejercicio'!
Object subclass: #CustomerBook
instanceVariableNames: 'suspended active'
classVariableNames: ''
poolDictionaries: ''
category: 'CodigoRepetido-Ejercicio'!
!CustomerBook methodsFor: 'initialization' stamp: 'LL 10/30/2020 12:22:04'!
initialize
active := OrderedCollection new.
suspended:= OrderedCollection new.! !
!CustomerBook methodsFor: 'customer management' stamp: 'srs 10/9/2021 17:36:39'!
LookForAndRemove: aName
| aux contador |
aux := OrderedCollection new.
aux add: active.
aux add: suspended.
contador := 1.
2 timesRepeat: [ |action |
action := (aux at: contador).
1 to: action size do:
[ :index |
aName = (action at: index)
ifTrue: [
action removeAt: index.
^ aName.
]
].
contador := contador + 1.
].
^ NotFound signal.! !
!CustomerBook methodsFor: 'customer management' stamp: 'NR 4/3/2019 10:14:26'!
addCustomerNamed: aName
aName isEmpty ifTrue: [ self signalCustomerNameCannotBeEmpty ].
((active includes: aName) or: [suspended includes: aName]) ifTrue: [ self signalCustomerAlreadyExists ].
active add: aName ! !
!CustomerBook methodsFor: 'customer management' stamp: 'srs 10/9/2021 17:36:39'!
removeCustomerNamed: aName
^self LookForAndRemove: aName.
! !
!CustomerBook methodsFor: 'customer management' stamp: 'NR 4/3/2019 10:14:26'!
suspendCustomerNamed: aName
(active includes: aName) ifFalse: [^CantSuspend signal].
active remove: aName.
suspended add: aName
! !
!CustomerBook methodsFor: 'accessing' stamp: 'NR 4/3/2019 10:14:26'!
numberOfActiveCustomers
^active size! !
!CustomerBook methodsFor: 'accessing' stamp: 'NR 4/3/2019 10:14:26'!
numberOfCustomers
^active size + suspended size! !
!CustomerBook methodsFor: 'accessing' stamp: 'NR 9/19/2018 17:36:09'!
numberOfSuspendedCustomers
^suspended size! !
!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: 'signal errors' stamp: 'HernanWilkinson 7/6/2011 17:52'!
signalCustomerAlreadyExists
self error: self class customerAlreadyExistsErrorMessage! !
!CustomerBook methodsFor: 'signal errors' stamp: 'HernanWilkinson 7/6/2011 17:51'!
signalCustomerNameCannotBeEmpty
self error: self class customerCanNotBeEmptyErrorMessage ! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
!classDefinition: 'CustomerBook class' category: 'CodigoRepetido-Ejercicio'!
CustomerBook class
instanceVariableNames: ''!
!CustomerBook class methodsFor: 'error messages' stamp: 'NR 4/30/2020 09:05:18'!
customerAlreadyExistsErrorMessage
^'Customer Already Exists'! !
!CustomerBook class methodsFor: 'error messages' stamp: 'NR 4/30/2020 09:05:25'!
customerCanNotBeEmptyErrorMessage
^'Customer Name Cannot Be Empty'! !