-
-
Notifications
You must be signed in to change notification settings - Fork 353
/
ClassTest.class.st
477 lines (377 loc) · 15.6 KB
/
ClassTest.class.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
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
"
SUnit tests for classes
"
Class {
#name : #ClassTest,
#superclass : #ClassTestCase,
#instVars : [
'className',
'testEnvironment'
],
#category : #'Kernel-Tests-Extended-Classes'
}
{ #category : #setup }
ClassTest >> categoryNameForTemporaryClasses [
"Answer the category where to classify temporarily created classes"
^'Dummy-Tests-Class'
]
{ #category : #setup }
ClassTest >> deleteClass [
| cl |
cl := testEnvironment at: className ifAbsent: [ ^ self ].
testingEnvironment at: #ChangeSet ifPresent: [
cl removeFromChanges ].
cl removeFromSystemUnlogged
]
{ #category : #'referencing methods' }
ClassTest >> referencingMethod1 [
^ ExampleForTest1
]
{ #category : #'referencing methods' }
ClassTest >> referencingMethod2 [
^ {ExampleForTest12. ExampleForTest1}
]
{ #category : #'referencing methods' }
ClassTest >> referencingMethod3 [
"no reference"
^ self
]
{ #category : #running }
ClassTest >> setUp [
super setUp.
className := #TUTU.
testEnvironment:= Smalltalk globals.
self deleteClass.
Object subclass: className
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: self categoryNameForTemporaryClasses
]
{ #category : #running }
ClassTest >> tearDown [
self deleteClass.
{self unclassifiedCategory. self categoryNameForTemporaryClasses} do: [:category|
RPackage organizer unregisterPackageNamed: category].
super tearDown
]
{ #category : #tests }
ClassTest >> testAddClassSlot [
| tutu slot1 slot2 |
tutu := testEnvironment at: #TUTU.
slot1 := #X => InstanceVariableSlot.
slot2 := #Y => InstanceVariableSlot.
tutu addClassSlot: slot1.
self assert: tutu class instVarNames equals: #(#X).
tutu addClassSlot: slot2.
self assert: tutu class instVarNames equals: #(#X #Y)
]
{ #category : #tests }
ClassTest >> testAddInstVarName [
| tutu |
tutu := testEnvironment at: #TUTU.
tutu addInstVarNamed: 'x'.
self assert: tutu instVarNames equals: #('x').
tutu addInstVarNamed: 'y'.
self assert: tutu instVarNames equals: #('x' 'y')
]
{ #category : #tests }
ClassTest >> testAddSlot [
| tutu |
tutu := testEnvironment at: #TUTU.
tutu addSlot: #x => InstanceVariableSlot.
self assert: tutu instVarNames equals: #('x').
self assert: tutu name equals: #TUTU.
tutu addSlot: #y => InstanceVariableSlot.
self assert: tutu instVarNames equals: #('x' 'y')
]
{ #category : #tests }
ClassTest >> testAddSlotAnonymous [
| tutu |
tutu := Object newAnonymousSubclass.
self assert: tutu getName isNil.
tutu := tutu addSlot: #x => InstanceVariableSlot.
self assert: tutu instVarNames equals: #('x').
self assert: tutu getName isNil.
tutu := tutu addSlot: #y => InstanceVariableSlot.
self assert: tutu getName isNil.
self assert: tutu instVarNames equals: #('x' 'y')
]
{ #category : #'tests - access' }
ClassTest >> testAllSharedPools [
self assert: Point allSharedPools equals: OrderedCollection new.
self assert: Date sharedPools first equals: ChronologyConstants.
self assert: Date sharedPools size equals: 1. "a metaclass does not have shared pools since only classes have shared pools"
self assert: RootClassPoolUser sharedPools size equals: 1.
self assert: ClassMultiplePoolUser sharedPools size equals: 2. "has shared pools does not take into account the fact that a superclass may use some shared pools"
self assertEmpty: SubclassPoolUser sharedPools
]
{ #category : #tests }
ClassTest >> testChangingShapeDoesNotPutNilInMethodsLastLiteralKey [
"Test that when the shape of a class changes, the key of the last literal of the methods is not nil"
| tutu |
tutu := testEnvironment at: #TUTU.
tutu compile: 'foo'.
self deny: (tutu >> #foo) allLiterals last key isNil.
tutu addInstVarNamed: 'x'.
self deny: (tutu >> #foo) allLiterals last key isNil.
]
{ #category : #'test - accessing parallel hierarchy' }
ClassTest >> testClassSide [
self assert: Point classSide equals: Point class.
self assert: Point class classSide equals: Point class.
]
{ #category : #tests }
ClassTest >> testCommonSuperclass [
self assert: (OrderedCollection commonSuperclass: Array) equals: SequenceableCollection.
self assert: (OrderedCollection commonSuperclass: OrderedCollection) equals: SequenceableCollection.
self assert: (ProtoObject commonSuperclass: Object) equals: nil
]
{ #category : #tests }
ClassTest >> testCompileAll [
ClassTest compileAll
]
{ #category : #'tests - dependencies' }
ClassTest >> testDependencies [
self assert: (ClassTest dependentClasses includes: ClassTest superclass).
self assert: (ClassTest dependentClasses includes: Date)
]
{ #category : #accessing }
ClassTest >> testEnvironment [
^ testEnvironment
]
{ #category : #accessing }
ClassTest >> testEnvironment: anObject [
testEnvironment := anObject
]
{ #category : #'tests - access' }
ClassTest >> testHasPoolVarNamed [
self assert: (Date usesLocalPoolVarNamed: 'DayNames').
"a metaclass does not have shared pools since only classes have shared pools"
self deny: (Date class usesLocalPoolVarNamed: 'DayNames').
self assert: (RootClassPoolUser usesLocalPoolVarNamed: 'Author').
"a subclass does not have the one of its superclass - but it would be good to change that"
self deny: (SubclassPoolUser usesLocalPoolVarNamed: 'Author').
]
{ #category : #'tests - access' }
ClassTest >> testHasSharedPools [
self deny: Point hasSharedPools.
self assert: Date hasSharedPools.
"a metaclass does not have shared pools since only classes have shared pools"
self deny: Date class hasSharedPools.
self assert: RootClassPoolUser hasSharedPools.
"has shared pools does not take into account the fact that a superclass may use some shared pools"
self deny: SubclassPoolUser hasSharedPools.
]
{ #category : #'test - accessing parallel hierarchy' }
ClassTest >> testInstanceSide [
self assert: Point instanceSide equals: Point.
self assert: Point class instanceSide equals: Point.
]
{ #category : #'test - accessing parallel hierarchy' }
ClassTest >> testIsClassSide [
self deny: Point isClassSide.
self assert: Point class isClassSide
]
{ #category : #'test - accessing parallel hierarchy' }
ClassTest >> testIsInstanceSide [
self assert: Point isInstanceSide.
self deny: Point class isInstanceSide
]
{ #category : #'tests - navigation' }
ClassTest >> testMethodsReferencingClass [
self assert: (ClassTest methodsReferencingClass: (Smalltalk classNamed: #ExampleForTest111)) equals: {(ClassTest >> #testOrdersACollectionOfClassesBySuperclass)}.
self
assert: ((ClassTest methodsReferencingClass: (Smalltalk classNamed: #ExampleForTest1)) sort: [ :a :b | a name <= b name ]) asArray
equals: {(ClassTest >> #referencingMethod1) . (ClassTest >> #referencingMethod2) . (ClassTest >> #testOrdersACollectionOfClassesBySuperclass)}.
self assertEmpty: (ClassTest methodsReferencingClass: (Smalltalk classNamed: #BehaviorTest))
]
{ #category : #'tests - navigation' }
ClassTest >> testMethodsReferencingClasses [
| collectionOfMethods collectionOfMethodsShouldBe |
collectionOfMethods := ((ClassTest methodsReferencingClasses: {Smalltalk classNamed: #ExampleForTest12. Smalltalk classNamed: #ExampleForTest1}) sort: [ :a :b | a name <= b name]) asArray.
collectionOfMethodsShouldBe := {
ClassTest>>#referencingMethod1.
ClassTest>>#referencingMethod2.
ClassTest>>#testOrdersACollectionOfClassesBySuperclass}.
self assert: collectionOfMethods asSet equals: collectionOfMethodsShouldBe asSet
]
{ #category : #'tests - class creation' }
ClassTest >> testNewSubclass [
| cls |
cls := Point newSubclass.
self assert: (cls isBehavior).
self assert: (cls superclass == Point).
self assert: (Point allSubclasses includes: cls).
self assert: (cls instVarNames = #()).
self assert: (cls category = self unclassifiedCategory).
self assert: (cls classVarNames = #()).
cls removeFromSystem.
]
{ #category : #'tests - file in/out' }
ClassTest >> testOrdersACollectionOfClassesBySuperclass [
| ordered |
ordered := (Class superclassOrder:
(OrderedCollection
with: ExampleForTest11 class
with: ExampleForTest111 class
with: ExampleForTest12 class
with: ExampleForTest1 class
with: ExampleForTest12 class
with: ExampleForTest112 class)).
self assert: (ordered indexOf: ExampleForTest1 class) < (ordered indexOf: ExampleForTest11 class).
self assert: (ordered indexOf: ExampleForTest11 class) < (ordered indexOf: ExampleForTest111 class).
self assert: (ordered indexOf: ExampleForTest11 class) < (ordered indexOf: ExampleForTest112 class).
self assert: (ordered indexOf: ExampleForTest1 class) < (ordered indexOf: ExampleForTest12 class).
]
{ #category : #'tests - file in/out' }
ClassTest >> testOrdersMetaClassAfterItsClassInstance [
| ordered |
ordered := (Class superclassOrder:
(OrderedCollection
with: Boolean class
with: True
with: Boolean
with: True class)).
self assert: (ordered indexOf: Boolean) < (ordered indexOf: Boolean class).
self assert: (ordered indexOf: True) < (ordered indexOf: True class).
self assert: (ordered indexOf: Boolean class) < (ordered indexOf: True class).
self assert: (ordered indexOf: Boolean) < (ordered indexOf: True).
]
{ #category : #'tests - pools' }
ClassTest >> testPoolVariableAccessibleInClassUser [
"This test shows that a Pool Variable is accessible from the class that declare the Pool usage: here the superclass"
PoolDefiner initialize.
RootClassPoolUser compileAll.
self assert: RootClassPoolUser gloups = 42.
self assert: RootClassPoolUser author = 'Ducasse'
]
{ #category : #'tests - pools' }
ClassTest >> testPoolVariableAccessibleInSubclassOfClassUser [
"This test shows that a Pool Variable is not accessible from a subclass that declare the Pool usage: here SubFlop subclass of Flop and this is a bug. "
PoolDefiner initialize.
SubclassPoolUser compileAll.
self assert: SubclassPoolUser gloups = 42.
self assert: SubclassPoolUser author = 'Ducasse'
]
{ #category : #'tests - navigation' }
ClassTest >> testReferencedClasses [
{(ExceptionTester -> { MyTestNotification. Warning. String. MyResumableTestError. OrderedCollection. MyTestError}).
(CollectionCombinator -> {Array}).
(ExecutionEnvironmentStub -> {OrderedCollection})
}
do: [ :assoc |
self assert: assoc key referencedClasses notEmpty.
self assert: (assoc key referencedClasses asSet includesAll: assoc value asSet)]
]
{ #category : #tests }
ClassTest >> testRemoveClassSlot [
| tutu slot1 slot2 |
tutu := testEnvironment at: #TUTU.
slot1 := #X => InstanceVariableSlot.
slot2 := #Y => InstanceVariableSlot.
tutu addClassSlot: slot1.
self assert: tutu class instVarNames equals: #(#X).
tutu addClassSlot: slot2.
self assert: tutu class instVarNames equals: #(#X #Y).
tutu removeClassSlot: slot2.
self assert: tutu class instVarNames equals: #(#X).
tutu removeClassSlot: slot1.
self assert: tutu class instVarNames equals: #().
]
{ #category : #'tests - access' }
ClassTest >> testSharedPoolOfVarNamed [
self assert: (Date sharedPoolOfVarNamed: 'DayNames') equals: ChronologyConstants.
"a metaclass does not have shared pools since only classes have shared pools"
self assert: (Date class sharedPoolOfVarNamed: 'DayNames') isNil.
self assert: (RootClassPoolUser sharedPoolOfVarNamed: 'Author') equals: PoolDefiner.
self assert: (RootClassPoolUser sharedPoolOfVarNamed: 'Gloups') equals: PoolDefiner.
self assert: (SubclassPoolUser sharedPoolOfVarNamed: 'Author') equals: PoolDefiner.
self assert: (ClassMultiplePoolUser sharedPoolOfVarNamed: 'Author') equals: PoolDefiner.
self assert: (ClassMultiplePoolUser sharedPoolOfVarNamed: 'VariableInPoolDefiner2') equals: PoolDefiner2.
self assert: (ClassMultiplePoolUser sharedPoolOfVarNamed: 'Gloups') equals: PoolDefiner
]
{ #category : #'tests - access' }
ClassTest >> testSharedPools [
self assert: Point sharedPools equals: OrderedCollection new.
self assert: Date sharedPools first equals: ChronologyConstants.
self assert: Date sharedPools size equals: 1. "a metaclass does not have shared pools since only classes have shared pools"
Date class sharedPools.
self assert: RootClassPoolUser sharedPools size equals: 1.
self assert: ClassMultiplePoolUser sharedPools size equals: 2. "has shared pools does not take into account the fact that a superclass may use some shared pools"
self assertEmpty: SubclassPoolUser sharedPools
]
{ #category : #'tests - class creation' }
ClassTest >> testSubclass [
| cls |
(testEnvironment includesKey: #SubclassExample)
ifTrue: [ (testEnvironment at: #SubclassExample) removeFromSystem ].
self deny: (testEnvironment includesKey: #SubclassExample).
cls := Object subclass: #SubclassExample.
self assert: (testEnvironment includesKey: #SubclassExample).
self assert: (testEnvironment at: #SubclassExample) == cls.
self assert: cls category equals: self unclassifiedCategory.
self assert: cls instVarNames equals: #().
cls removeFromSystem
]
{ #category : #'tests - class creation' }
ClassTest >> testSubclassInstanceVariableNames [
| cls |
(testEnvironment includesKey: #SubclassExample)
ifTrue: [ (testEnvironment at: #SubclassExample) removeFromSystem ].
self deny: (testEnvironment includesKey: #SubclassExample).
cls := Object subclass: #SubclassExample instanceVariableNames: 'x y'.
self assert: (testEnvironment includesKey: #SubclassExample).
self assert: (testEnvironment at: #SubclassExample) == cls.
self assert: cls category equals: self unclassifiedCategory.
self assert: cls instVarNames equals: #('x' 'y').
cls removeFromSystem
]
{ #category : #'tests - file in/out' }
ClassTest >> testSuperclassOrder [
| ordered orderedSuperclasses shuffledSuperclasses |
orderedSuperclasses := {ProtoObject. Object. Collection. SequenceableCollection}.
"a shuffled collection of superclasses of OrderedCollection"
shuffledSuperclasses := {Collection. SequenceableCollection. ProtoObject. Object}.
ordered := Class superclassOrder: shuffledSuperclasses.
"should not affect the order as there is no dependencies"
self assert: ordered equals: orderedSuperclasses asOrderedCollection
]
{ #category : #'tests - file in/out' }
ClassTest >> testSuperclassOrderPreservingOrder [
| noHierarchicalRelationship ordered |
"a shuffled collection of direct subclasses of Collection"
noHierarchicalRelationship := {CharacterSet. WideCharacterSet. OrderedDictionary. DependentsArray. Bag. SmallDictionary. SequenceableCollection. HashedCollection. WeakRegistry. Heap}.
ordered := Class superclassOrder: noHierarchicalRelationship.
"should not affect the order as there is no dependencies"
self assert: ordered equals: noHierarchicalRelationship asOrderedCollection
]
{ #category : #'tests - access' }
ClassTest >> testUsesPoolVarNamed [
self assert: (Date usesPoolVarNamed: 'DayNames').
"a metaclass does not have shared pools since only classes have shared pools"
self deny: (Date class usesPoolVarNamed: 'DayNames').
self assert: (RootClassPoolUser usesPoolVarNamed: 'Author').
"a subclass has the one of its superclass"
self assert: (SubclassPoolUser usesPoolVarNamed: 'Author')
]
{ #category : #'tests - class variables' }
ClassTest >> testallClassVariables [
self assert: SmalltalkImage allClassVariables last name equals: #DependentsFields
]
{ #category : #'tests - class variables' }
ClassTest >> testclassVarNames [
self assert: (Object classVarNames includes: #DependentsFields).
"A class and it's meta-class share the class variables"
self assert: Object classVarNames equals: Object class classVarNames
]
{ #category : #'tests - class variables' }
ClassTest >> testclassVariables [
self assert: Object classVariables first name equals: #DependentsFields.
"A class and it's meta-class share the class variables"
self assert: Object classVariables equals: Object class classVariables
]
{ #category : #'tests - class creation' }
ClassTest >> unclassifiedCategory [
^#Unclassified
]