Skip to content

Commit f4d806b

Browse files
committed
Meta-Safe requirement
1 parent e596326 commit f4d806b

5 files changed

Lines changed: 93 additions & 14 deletions

File tree

src/ExecutableRequirements-Tests/ExReqMockRequirements.class.st

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ ExReqMockRequirements >> testReq7 [
136136
addVerification: [ :verify |
137137
verify
138138
addStepOnAST:
139-
((ExReqMockRequirements methodNamed: #testReq1) ast allChildren
139+
((ExReqMockRequirements methodNamed: #testReq1) ast allChildren
140140
select: [ :each | each isSequence ]) first
141141
withPrecondition: [ :obj :arguments :requirement | true ]
142142
withPostcondition: [ :obj :arguments :requirement | true ] ];

src/ExecutableRequirements-Tests/ExReqMockTestObject.class.st

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,19 @@ Class {
99
#tag : 'Safe-Passing-Control'
1010
}
1111

12+
{ #category : 'as yet unclassified' }
13+
ExReqMockTestObject >> methodToTestMetaSafeRecursion [
14+
15+
^ true
16+
]
17+
1218
{ #category : 'as yet unclassified' }
1319
ExReqMockTestObject >> methodToTestTheNonLocalReturn [
1420

1521
x := [ true ifTrue: [ ^ Color red ] ] value.
1622
^ Color blue
1723
]
24+
25+
{ #category : 'as yet unclassified' }
26+
ExReqMockTestObject >> methodToTestThread [
27+
]

src/ExecutableRequirements-Tests/ExReqSafePassingControlTest.class.st

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,38 @@ ExReqSafePassingControlTest >> report [
1616
^ report
1717
]
1818

19+
{ #category : 'as yet unclassified' }
20+
ExReqSafePassingControlTest >> req1 [
21+
22+
<ExReqSafePassingControl>
23+
^ ExReqRequirement new
24+
title:
25+
'A requirement verifications shall handle meta-safe recursion';
26+
addVerification: [ :verify |
27+
verify
28+
addStepOnAST:
29+
(ExReqMockTestObject methodNamed:
30+
#methodToTestMetaSafeRecursion) ast
31+
withPrecondition: [
32+
ExReqMockTestObject new methodToTestMetaSafeRecursion ]
33+
withPostcondition: [
34+
ExReqMockTestObject new methodToTestMetaSafeRecursion ] ];
35+
yourself
36+
]
37+
38+
{ #category : 'as yet unclassified' }
39+
ExReqSafePassingControlTest >> req2 [
40+
41+
<ExReqSafePassingControl>
42+
^ ExReqRequirement new
43+
title:
44+
'A requirement verifications shall manage evaluation in a NON thread-specific maner.';
45+
addVerification: [ :verify |
46+
verify addStepOnAST:
47+
(ExReqMockTestObject methodNamed: #methodToTestThread) ast ];
48+
yourself
49+
]
50+
1951
{ #category : 'as yet unclassified' }
2052
ExReqSafePassingControlTest >> req3 [
2153

@@ -53,6 +85,18 @@ ExReqSafePassingControlTest >> tearDown [
5385
repository := nil
5486
]
5587

88+
{ #category : 'tests' }
89+
ExReqSafePassingControlTest >> testMetaSafeRecursion [
90+
91+
| requirement requirementReport |
92+
self report installTracingPoints.
93+
ExReqMockTestObject new methodToTestMetaSafeRecursion.
94+
requirement := self req1.
95+
requirementReport := self report findRequirementReport: requirement.
96+
self assert: requirementReport isValid.
97+
self report removeTracingPoints
98+
]
99+
56100
{ #category : 'tests' }
57101
ExReqSafePassingControlTest >> testNonLocalReturn [
58102

@@ -64,3 +108,27 @@ ExReqSafePassingControlTest >> testNonLocalReturn [
64108
self assert: requirementReport isValid.
65109
self report removeTracingPoints
66110
]
111+
112+
{ #category : 'tests' }
113+
ExReqSafePassingControlTest >> testThread [
114+
115+
| block return checkAssert requirement requirementReport |
116+
checkAssert := Semaphore new.
117+
self report installTracingPoints.
118+
requirement := self req2.
119+
requirementReport := self report findRequirementReport: requirement.
120+
121+
block := [
122+
ExReqMockTestObject new methodToTestThread.
123+
checkAssert signal ].
124+
return := block fork.
125+
126+
"Returns immediately, forked block not yet run"
127+
self deny: requirementReport isValid.
128+
129+
"Forked process has been scheduled"
130+
checkAssert wait.
131+
self assert: requirementReport isValid.
132+
133+
self report removeTracingPoints
134+
]

src/ExecutableRequirements/ExReqAbstractSourceDocument.class.st

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,21 @@ Class {
1111

1212
{ #category : 'as yet unclassified' }
1313
ExReqAbstractSourceDocument >> equalsSource: anExReqSourceDocument [
14-
self method == anExReqSourceDocument method
15-
ifTrue: [ ^ true ].
16-
self method class = anExReqSourceDocument method class
17-
ifFalse: [ ^ false ].
18-
self method size = anExReqSourceDocument method size
19-
ifFalse: [ ^ false ].
20-
self method header = anExReqSourceDocument method header
14+
15+
self method == anExReqSourceDocument method ifTrue: [ ^ true ].
16+
self method ifNil: [ ^ false ].
17+
anExReqSourceDocument method ifNil: [ ^ false ].
18+
self method selector = anExReqSourceDocument method selector
2119
ifFalse: [ ^ false ].
20+
self method class = anExReqSourceDocument method class ifFalse: [
21+
^ false ].
22+
self method size = anExReqSourceDocument method size ifFalse: [
23+
^ false ].
24+
self method header = anExReqSourceDocument method header ifFalse: [
25+
^ false ].
2226
self method initialPC to: self method endPC do: [ :i |
23-
(self method at: i) = (anExReqSourceDocument method at: i)
24-
ifFalse: [ ^ false ] ].
27+
(self method at: i) = (anExReqSourceDocument method at: i) ifFalse: [
28+
^ false ] ].
2529
^ true
2630
]
2731

src/ExecutableRequirements/ExReqStepReport.class.st

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ ExReqStepReport >> announceValidity [
2727
ExReqStepReport >> closeReport [
2828

2929
super closeReport.
30-
step := nil.
31-
requirement := nil.
32-
previousStepReport := nil.
33-
nextStepReport := nil
3430
]
3531

3632
{ #category : 'accessing' }
@@ -190,6 +186,7 @@ ExReqStepReport >> verifyStepPostconditionWithContext: aContext [
190186
3 - Postcondition not nil -> evaluation
191187
"
192188

189+
self step ifNil: [ ^ self ].
193190
postconditionValidity ifTrue: [ ^ self ].
194191
self preconditionIsValid ifFalse: [ ^ self ].
195192
self step postcondition ifNil: [

0 commit comments

Comments
 (0)