Skip to content

Commit be64eff

Browse files
committed
Merge b1e0d7f
2 parents 99bee8e + b1e0d7f commit be64eff

11 files changed

+319
-131
lines changed

src/ExecutableRequirements-Tests/ExReqMockRequirements.class.st

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@ Class {
66
#tag : 'Meta-Requirements-Tests'
77
}
88

9+
{ #category : 'initialization' }
10+
ExReqMockRequirements >> resetMethod [
11+
12+
<script: 'ExReqMockRequirements new resetMethod'>
13+
| class methods |
14+
ExReqTracingPoint all do: #remove.
15+
class := ExReqMockRequirements.
16+
methods := class methods collect: [ :each | each sourceCode ].
17+
class methods do: [ :each | class removeSelector: each ].
18+
methods do: [ :each | class compile: each ]
19+
]
20+
921
{ #category : 'tests' }
1022
ExReqMockRequirements >> testReq1 [
1123

@@ -113,26 +125,26 @@ ExReqMockRequirements >> testReq7 [
113125
description: 'The description';
114126
addVerification: [ :verify |
115127
verify addStepOnAST:
116-
((ExReqMockRequirements methodNamed: #testReq7) ast allChildren
117-
select: [ :each | each isSequence ]) second ];
128+
((ExReqMockRequirements methodNamed: #testReq1) ast allChildren
129+
select: [ :each | each isSequence ]) first ];
118130
addVerification: [ :verify |
119131
verify
120132
addStepOnAST:
121-
((ExReqMockRequirements methodNamed: #testReq7) ast allChildren
122-
select: [ :each | each isSequence ]) second
133+
((ExReqMockRequirements methodNamed: #testReq1) ast allChildren
134+
select: [ :each | each isSequence ]) first
123135
withPrecondition: [ :obj :arguments :requirement | true ] ];
124136
addVerification: [ :verify |
125137
verify
126138
addStepOnAST:
127-
((ExReqMockRequirements methodNamed: #testReq7) ast allChildren
128-
select: [ :each | each isSequence ]) second
139+
((ExReqMockRequirements methodNamed: #testReq1) ast allChildren
140+
select: [ :each | each isSequence ]) first
129141
withPrecondition: [ :obj :arguments :requirement | true ]
130142
withPostcondition: [ :obj :arguments :requirement | true ] ];
131143
addVerification: [ :verify |
132144
verify
133145
addStepOnAST:
134-
((ExReqMockRequirements methodNamed: #testReq7) ast allChildren
135-
select: [ :each | each isSequence ]) second
146+
((ExReqMockRequirements methodNamed: #testReq1) ast allChildren
147+
select: [ :each | each isSequence ]) first
136148
withPostcondition: [ :obj :arguments :requirement | true ] ];
137149
yourself
138150
]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
Class {
2+
#name : 'ExReqMockTestObject',
3+
#superclass : 'Object',
4+
#instVars : [
5+
'x'
6+
],
7+
#category : 'ExecutableRequirements-Tests-Safe-Passing-Control',
8+
#package : 'ExecutableRequirements-Tests',
9+
#tag : 'Safe-Passing-Control'
10+
}
11+
12+
{ #category : 'as yet unclassified' }
13+
ExReqMockTestObject >> methodToTestMetaSafeRecursion [
14+
15+
^ true
16+
]
17+
18+
{ #category : 'as yet unclassified' }
19+
ExReqMockTestObject >> methodToTestTheNonLocalReturn [
20+
21+
x := [ true ifTrue: [ ^ Color red ] ] value.
22+
^ Color blue
23+
]
24+
25+
{ #category : 'as yet unclassified' }
26+
ExReqMockTestObject >> methodToTestThread [
27+
]

src/ExecutableRequirements-Tests/ExReqRepositoryReportTest.class.st

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ ExReqRepositoryReportTest >> testExecuteTracingPoints [
5757

5858
| requirement requirementReport |
5959
self report installTracingPoints.
60+
ExReqMockRequirements new testReq1.
6061
requirement := ExReqMockRequirements new testReq7.
6162
requirementReport := self report findRequirementReport: requirement.
6263
self assert: requirementReport isValid.
@@ -100,3 +101,44 @@ ExReqRepositoryReportTest >> testRepositoryEquivalentReport [
100101
repSte := repVer stepReports at: indexSte.
101102
self assert: ste equals: repSte step ] ] ]
102103
]
104+
105+
{ #category : 'tests' }
106+
ExReqRepositoryReportTest >> testStepReportIsValidEvent [
107+
108+
| success |
109+
success := false.
110+
self report announcer
111+
when: ExReqStepReportIsValidEvent
112+
do: [ :evt | success := true ]
113+
for: self.
114+
self report installTracingPoints.
115+
ExReqMockRequirements new testReq1.
116+
self assert: success
117+
]
118+
119+
{ #category : 'tests' }
120+
ExReqRepositoryReportTest >> testTracingPointInstalledEvent [
121+
122+
| success |
123+
success := false.
124+
self report announcer
125+
when: ExReqTracingPointInstalledEvent
126+
do: [ :evt | success := true ]
127+
for: self.
128+
self report installTracingPoints.
129+
self assert: success
130+
]
131+
132+
{ #category : 'tests' }
133+
ExReqRepositoryReportTest >> testTracingPointRemovedEvent [
134+
135+
| success |
136+
success := false.
137+
self report announcer
138+
when: ExReqTracingPointRemovedEvent
139+
do: [ :evt | success := true ]
140+
for: self.
141+
self report installTracingPoints.
142+
self report removeTracingPoints.
143+
self assert: success
144+
]

src/ExecutableRequirements-Tests/ExReqRepositoryTest.class.st

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ ExReqRepositoryTest >> testRequirementsAreTraceable [
3131
each isPharoImageDocument ].
3232
mockDocuments := documents select: [ :each | each isMockDocument ].
3333

34-
self assert: pharoImageDocument size equals: ExReqMockRequirements methods size - 1.
34+
self assert: pharoImageDocument size equals: ExReqMockRequirements methods size - 2.
3535
self
3636
assertCollection: (pharoImageDocument collect: #method)
3737
includesAll: (ExReqMockRequirements methods reject: [ :each |
38-
each selector = #testReq3 ]).
38+
each selector = #testReq3 or: [ each selector = #resetMethod ] ]).
3939

4040
self assert: mockDocuments size equals: 1.
4141
self assert: mockDocuments first requirementId equals: #testReq3
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
Class {
2+
#name : 'ExReqSafePassingControlTest',
3+
#superclass : 'TestCase',
4+
#instVars : [
5+
'repository',
6+
'report'
7+
],
8+
#category : 'ExecutableRequirements-Tests-Safe-Passing-Control',
9+
#package : 'ExecutableRequirements-Tests',
10+
#tag : 'Safe-Passing-Control'
11+
}
12+
13+
{ #category : 'accessing' }
14+
ExReqSafePassingControlTest >> report [
15+
16+
^ report
17+
]
18+
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+
51+
{ #category : 'as yet unclassified' }
52+
ExReqSafePassingControlTest >> req3 [
53+
54+
<ExReqSafePassingControl>
55+
^ ExReqRequirement new
56+
title: 'A requirement verifications shall handle non local return';
57+
addVerification: [ :verify |
58+
verify
59+
addStepOnAST:
60+
((ExReqMockTestObject methodNamed:
61+
#methodToTestTheNonLocalReturn) ast allChildren select: [
62+
:each | each isMessage ]) first
63+
withPrecondition: [ true ]
64+
withPostcondition: [ true ] ];
65+
yourself
66+
]
67+
68+
{ #category : 'running' }
69+
ExReqSafePassingControlTest >> setUp [
70+
71+
super setUp.
72+
73+
repository := ExReqRepository new
74+
pragmaSelector: #ExReqSafePassingControl;
75+
yourself.
76+
report := repository asReport
77+
]
78+
79+
{ #category : 'running' }
80+
ExReqSafePassingControlTest >> tearDown [
81+
82+
super tearDown.
83+
self report removeTracingPoints.
84+
self report closeReport.
85+
repository := nil
86+
]
87+
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+
100+
{ #category : 'tests' }
101+
ExReqSafePassingControlTest >> testNonLocalReturn [
102+
103+
| requirement requirementReport |
104+
self report installTracingPoints.
105+
ExReqMockTestObject new methodToTestTheNonLocalReturn.
106+
requirement := self req3.
107+
requirementReport := self report findRequirementReport: requirement.
108+
self assert: requirementReport isValid.
109+
self report removeTracingPoints
110+
]
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-Toplo-Example/ExReqToploLoginRequirements.class.st

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Class {
66
#tag : 'Requirements'
77
}
88

9-
{ #category : 'as yet unclassified' }
9+
{ #category : 'capella file' }
1010
ExReqToploLoginRequirements >> capellaFile [
1111

1212
^ '<?xml version="1.0" encoding="UTF-8"?>
@@ -1002,7 +1002,7 @@ ExReqToploLoginRequirements >> capella_requirement_3 [
10021002
yourself
10031003
]
10041004

1005-
{ #category : 'as yet unclassified' }
1005+
{ #category : 'step 4' }
10061006
ExReqToploLoginRequirements >> compiledSourceCodeIntoRequirementMethods [
10071007

10081008
| pragma methodPrefix sourceCodes index methodString |
@@ -1024,7 +1024,7 @@ ExReqToploLoginRequirements >> compiledSourceCodeIntoRequirementMethods [
10241024
self class compile: fullMethod classified: 'requirement - generated' ]
10251025
]
10261026

1027-
{ #category : 'as yet unclassified' }
1027+
{ #category : 'script' }
10281028
ExReqToploLoginRequirements >> openOnExample [
10291029

10301030
<script: 'ExReqToploLoginRequirements new openOnExample'>
@@ -1037,7 +1037,7 @@ ExReqToploLoginRequirements >> openOnExample [
10371037
open.
10381038
]
10391039

1040-
{ #category : 'as yet unclassified' }
1040+
{ #category : 'step 1' }
10411041
ExReqToploLoginRequirements >> transformCapellaFileIntoSimpleModel [
10421042

10431043
| project simple |
@@ -1054,13 +1054,13 @@ ExReqToploLoginRequirements >> transformCapellaFileIntoSimpleModel [
10541054
^ simple
10551055
]
10561056

1057-
{ #category : 'as yet unclassified' }
1057+
{ #category : 'step 3' }
10581058
ExReqToploLoginRequirements >> transformRequirementsIntoSourceCode [
10591059

10601060
^ self transformSimpleModelIntoRequirements collect: [ :each | Stash new serialize: each ]
10611061
]
10621062

1063-
{ #category : 'as yet unclassified' }
1063+
{ #category : 'step 2' }
10641064
ExReqToploLoginRequirements >> transformSimpleModelIntoRequirements [
10651065

10661066
^ self transformCapellaFileIntoSimpleModel asExReqRequirements

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

0 commit comments

Comments
 (0)