forked from pharo-project/pharo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MessageTallyTest.class.st
120 lines (94 loc) · 3.59 KB
/
MessageTallyTest.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
"
SUnit tests for MessageTally
"
Class {
#name : #MessageTallyTest,
#superclass : #TestCase,
#category : #'Tool-Profilers-Tests-Messages'
}
{ #category : #tallying }
MessageTallyTest >> testClosedTally [
| tally |
tally := MessageTally
tallySendsTo: nil
inBlock: [ 3.14159 printString ]
showTree: true
closeAfter: true
openResultWindow: false.
"The tally is closed, therefore nothing may be accessed"
self assert: tally receivers isNil
]
{ #category : #basic }
MessageTallyTest >> testInstantiation [
| messageTally |
messageTally := MessageTally new.
self assert: messageTally time equals: 0.
self assert: messageTally tally equals: 0
]
{ #category : #sampling }
MessageTallyTest >> testSampling1 [
| tally |
tally := MessageTally
spyOn: [ 1000 timesRepeat: [ 3.14159 printString ] ]
reportOtherProcesses: false
cutoff: 1
openResultWindow: false
closeAfter: false.
"No process is accessible from the tally, the reason is that using the sampling method execute the block in the current process"
self assert: tally process isNil
]
{ #category : #tallying }
MessageTallyTest >> testTallySends [
| tally thisMethod allProcesses processUsedByTally tallyForPrintString tallyForPrintStringBase blockToTest |
allProcesses := Process allInstances.
blockToTest := [ 3.14159s printString ].
tally := MessageTally
tallySendsTo: nil
inBlock: blockToTest
showTree: true
closeAfter: false
openResultWindow: false.
"tally is for this test block. In FullBlocks the method is the CompiledBlock and not the CompiledMethod"
thisMethod := blockToTest method.
self assert: tally hash equals: thisMethod hash.
self assert: tally method identicalTo: thisMethod.
self assert: tally theClass identicalTo: self class.
processUsedByTally := tally process.
self deny: (allProcesses includes: processUsedByTally).
"Below is specialized for the execution ' 3.14159 printString '. Any method change in the execution flow of printString will turn this test to yellow"
self assert: tally tally >= 50.
"The tally is not close, therefore the tree may be crawled over"
self assert: tally receivers isArray.
self assert: tally receivers size equals: 2.
"--------"
tallyForPrintString := tally receivers second.
"Since 3.14159s is a ScaledDecimal"
self assert: (tallyForPrintString theClass includesBehavior: ScaledDecimal).
"the executed method is Number>>printString"
self assert: tallyForPrintString method identicalTo: Number >> #printString.
self assert: tallyForPrintString tally >= 50.
"--------"
tallyForPrintStringBase := tallyForPrintString receivers first.
"The receiver is still a ScaledDecimal"
self assert: (tallyForPrintString theClass includesBehavior: ScaledDecimal).
"the executed method is Number>>printStringBase: this time"
self assert: tallyForPrintStringBase method identicalTo: Number >> #printStringBase:.
self assert: tallyForPrintStringBase tally >= 50.
"The method printStringBase: calls two methods:
SequenceableCollection class >> streamContents: and ScaledDecimal >> printOn:base:"
self assert: tallyForPrintStringBase receivers size equals: 1.
self assert: tallyForPrintStringBase receivers first tally >= 50.
"We close to explicitly release reference of the process, the class and methods"
tally close
]
{ #category : #tallying }
MessageTallyTest >> testTallyShouldNotContainsAReturn [
"The block passed to MessageTally should not have a ^ "
self should: [ MessageTally
tallySendsTo: nil
inBlock: [ ^ 3.14159 printString ]
showTree: true
closeAfter: false
openResultWindow: false ]
raise: Error
]