Skip to content

Commit 7d0a13c

Browse files
committed
Strating to develop the model
1 parent 36488f2 commit 7d0a13c

13 files changed

Lines changed: 439 additions & 2 deletions
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
Class {
2+
#name : 'ExReqMockRequirements',
3+
#superclass : 'Object',
4+
#category : 'ExecutableRequirements-Tests',
5+
#package : 'ExecutableRequirements-Tests'
6+
}
7+
8+
{ #category : 'tests' }
9+
ExReqMockRequirements >> testReq1 [
10+
11+
<ExReqTest>
12+
^ ExReqRequirement new
13+
title: 'A requirement is unique';
14+
yourself
15+
]
16+
17+
{ #category : 'tests' }
18+
ExReqMockRequirements >> testReq2 [
19+
20+
<ExReqTest>
21+
^ ExReqRequirement new
22+
title: 'A requirement belong to only one repository';
23+
yourself
24+
]
25+
26+
{ #category : 'tests' }
27+
ExReqMockRequirements >> testReq3 [
28+
29+
<ExReqTest>
30+
^ ExReqRequirement new
31+
title:
32+
'A requirement can be traced to a document that contain the specification, by default this Pharo image';
33+
sourceDocument: (ExReqMockDocument new requirementId: #testReq3);
34+
yourself
35+
]
36+
37+
{ #category : 'tests' }
38+
ExReqMockRequirements >> testReq4 [
39+
40+
<ExReqTest>
41+
^ ExReqRequirement new
42+
title: 'A requirement can be verified';
43+
addVerification: [ :verify |
44+
verify addStepOnAST:
45+
((ExReqMockRequirements methodNamed: #testReq4) ast allChildren
46+
select: [ :each | each isBlock ]) first ];
47+
addVerification: [ :verify |
48+
verify
49+
addStepOnAST:
50+
((ExReqMockRequirements methodNamed: #testReq4) ast allChildren
51+
select: [ :each | each isBlock ]) second
52+
withPrecondition: [ :obj :arguments :requirement |
53+
obj = requirement ] ];
54+
addVerification: [ :verify |
55+
verify
56+
addStepOnAST:
57+
((ExReqMockRequirements methodNamed: #testReq4) ast allChildren
58+
select: [ :each | each isBlock ]) third
59+
withPostcondition: [ :obj :arguments :requirement |
60+
obj = requirement ] ];
61+
addVerification: [ :verify |
62+
verify
63+
addStepOnAST:
64+
((ExReqMockRequirements methodNamed: #testReq4) ast allChildren
65+
select: [ :each | each isBlock ]) last
66+
withPrecondition: [ :obj :arguments :requirement |
67+
obj = requirement ]
68+
withPostcondition: [ :obj :arguments :requirement |
69+
obj = requirement ] ];
70+
yourself
71+
]
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
Class {
2+
#name : 'ExReqRepositoryTest',
3+
#superclass : 'TestCase',
4+
#instVars : [
5+
'repository'
6+
],
7+
#category : 'ExecutableRequirements-Tests',
8+
#package : 'ExecutableRequirements-Tests'
9+
}
10+
11+
{ #category : 'running' }
12+
ExReqRepositoryTest >> repository [
13+
14+
^ repository
15+
]
16+
17+
{ #category : 'running' }
18+
ExReqRepositoryTest >> setUp [
19+
super setUp.
20+
21+
repository := ExReqRepository new pragmaSelector: #ExReqTest; yourself
22+
]
23+
24+
{ #category : 'tests' }
25+
ExReqRepositoryTest >> testRequirementsAreTraceable [
26+
27+
| documents mockDocuments pharoImageDocument |
28+
documents := self repository requirements collect: #sourceDocument.
29+
pharoImageDocument := documents select: [ :each |
30+
each isPharoImageDocument ].
31+
mockDocuments := documents select: [ :each | each isMockDocument ].
32+
33+
self assert: pharoImageDocument size equals: ExReqMockRequirements methods size - 1.
34+
self
35+
assertCollection: (pharoImageDocument collect: #method)
36+
includesAll: (ExReqMockRequirements methods reject: [ :each |
37+
each selector = #testReq3 ]).
38+
39+
self assert: mockDocuments size equals: 1.
40+
self assert: mockDocuments first requirementId equals: #testReq3
41+
]
42+
43+
{ #category : 'tests' }
44+
ExReqRepositoryTest >> testRequirementsAreUnique [
45+
46+
|expectedRequirementsNumber |
47+
expectedRequirementsNumber := (Pragma allNamed: #ExReqTest) size.
48+
self deny: expectedRequirementsNumber equals: 0.
49+
self assert: self repository requirements size equals: expectedRequirementsNumber.
50+
self assert: self repository requirements asSet size equals: expectedRequirementsNumber
51+
]
52+
53+
{ #category : 'tests' }
54+
ExReqRepositoryTest >> testRequirementsRepository [
55+
56+
self assert: (self repository requirements allSatisfy: [ :each | each repository = self repository ])
57+
]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Package { #name : 'ExecutableRequirements-Tests' }
1+
Package { #name : 'ExecutableRequirements-Tests' }
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Class {
2+
#name : 'ExReqAbstractSourceDocument',
3+
#superclass : 'Object',
4+
#category : 'ExecutableRequirements-Documents',
5+
#package : 'ExecutableRequirements',
6+
#tag : 'Documents'
7+
}
8+
9+
{ #category : 'testing' }
10+
ExReqAbstractSourceDocument >> isMockDocument [
11+
12+
^ false
13+
]
14+
15+
{ #category : 'testing' }
16+
ExReqAbstractSourceDocument >> isPharoImageDocument [
17+
18+
^ false
19+
]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Class {
2+
#name : 'ExReqCondition',
3+
#superclass : 'Object',
4+
#category : 'ExecutableRequirements-Model',
5+
#package : 'ExecutableRequirements',
6+
#tag : 'Model'
7+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
Class {
2+
#name : 'ExReqMockDocument',
3+
#superclass : 'ExReqAbstractSourceDocument',
4+
#instVars : [
5+
'requirementId'
6+
],
7+
#category : 'ExecutableRequirements-Documents',
8+
#package : 'ExecutableRequirements',
9+
#tag : 'Documents'
10+
}
11+
12+
{ #category : 'testing' }
13+
ExReqMockDocument >> isMockDocument [
14+
15+
^ true
16+
]
17+
18+
{ #category : 'accessing' }
19+
ExReqMockDocument >> requirementId [
20+
21+
^ requirementId
22+
]
23+
24+
{ #category : 'accessing' }
25+
ExReqMockDocument >> requirementId: anObject [
26+
27+
requirementId := anObject
28+
]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
Class {
2+
#name : 'ExReqPharoImageSourceDocument',
3+
#superclass : 'ExReqAbstractSourceDocument',
4+
#instVars : [
5+
'method'
6+
],
7+
#category : 'ExecutableRequirements-Documents',
8+
#package : 'ExecutableRequirements',
9+
#tag : 'Documents'
10+
}
11+
12+
{ #category : 'testing' }
13+
ExReqPharoImageSourceDocument >> isPharoImageDocument [
14+
15+
^ true
16+
]
17+
18+
{ #category : 'accessing' }
19+
ExReqPharoImageSourceDocument >> method [
20+
21+
^ method
22+
]
23+
24+
{ #category : 'accessing' }
25+
ExReqPharoImageSourceDocument >> method: anObject [
26+
27+
method := anObject
28+
]
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Class {
2+
#name : 'ExReqRepository',
3+
#superclass : 'Object',
4+
#instVars : [
5+
'requirements',
6+
'pragmaSelector'
7+
],
8+
#category : 'ExecutableRequirements-Model',
9+
#package : 'ExecutableRequirements',
10+
#tag : 'Model'
11+
}
12+
13+
{ #category : 'accessing' }
14+
ExReqRepository >> pragmaSelector [
15+
16+
^ pragmaSelector
17+
]
18+
19+
{ #category : 'accessing' }
20+
ExReqRepository >> pragmaSelector: anObject [
21+
22+
pragmaSelector := anObject.
23+
self updateRequirements
24+
]
25+
26+
{ #category : 'accessing' }
27+
ExReqRepository >> requirements [
28+
29+
^ requirements
30+
]
31+
32+
{ #category : 'initialization' }
33+
ExReqRepository >> updateRequirements [
34+
35+
| pragmas |
36+
pragmas := Pragma allNamed: self pragmaSelector.
37+
requirements := pragmas collect: [ :p |
38+
| requirement |
39+
requirement := p method valueWithReceiver:
40+
p methodClass instanceSide basicNew.
41+
requirement repository: self.
42+
requirement sourceDocument ifNil: [
43+
requirement sourceDocument:
44+
(ExReqPharoImageSourceDocument new
45+
method: p method;
46+
yourself) ].
47+
requirement ]
48+
]
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
Class {
2+
#name : 'ExReqRequirement',
3+
#superclass : 'Object',
4+
#instVars : [
5+
'sourceDocument',
6+
'repository',
7+
'title',
8+
'verifications'
9+
],
10+
#category : 'ExecutableRequirements-Model',
11+
#package : 'ExecutableRequirements',
12+
#tag : 'Model'
13+
}
14+
15+
{ #category : 'adding' }
16+
ExReqRequirement >> addVerification: aFullBlockClosure [
17+
| verification |
18+
verification := ExReqVerification new.
19+
aFullBlockClosure value: verification.
20+
self verifications add: verification
21+
]
22+
23+
{ #category : 'initialization' }
24+
ExReqRequirement >> initialize [
25+
26+
super initialize.
27+
verifications := OrderedCollection new
28+
]
29+
30+
{ #category : 'accessing' }
31+
ExReqRequirement >> repository [
32+
^ repository
33+
]
34+
35+
{ #category : 'accessing' }
36+
ExReqRequirement >> repository: anExReqRepository [
37+
38+
repository := anExReqRepository
39+
]
40+
41+
{ #category : 'accessing' }
42+
ExReqRequirement >> sourceDocument [
43+
44+
^ sourceDocument
45+
]
46+
47+
{ #category : 'accessing' }
48+
ExReqRequirement >> sourceDocument: anObject [
49+
50+
sourceDocument := anObject
51+
]
52+
53+
{ #category : 'accessing' }
54+
ExReqRequirement >> title: aString [
55+
title := aString
56+
]
57+
58+
{ #category : 'accessing' }
59+
ExReqRequirement >> verifications [
60+
^ verifications
61+
]
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
Class {
2+
#name : 'ExReqStep',
3+
#superclass : 'Object',
4+
#instVars : [
5+
'node',
6+
'precondition',
7+
'postcondition'
8+
],
9+
#category : 'ExecutableRequirements-Model',
10+
#package : 'ExecutableRequirements',
11+
#tag : 'Model'
12+
}
13+
14+
{ #category : 'testing' }
15+
ExReqStep >> hasPostcondition [
16+
17+
^ self postcondition isNotNil
18+
]
19+
20+
{ #category : 'testing' }
21+
ExReqStep >> hasPrecondition [
22+
23+
^ self precondition isNotNil
24+
]
25+
26+
{ #category : 'accessing' }
27+
ExReqStep >> node [
28+
29+
^ node
30+
]
31+
32+
{ #category : 'accessing' }
33+
ExReqStep >> node: aRBBlockNode [
34+
node := aRBBlockNode
35+
]
36+
37+
{ #category : 'accessing' }
38+
ExReqStep >> postcondition [
39+
40+
^ postcondition
41+
]
42+
43+
{ #category : 'accessing' }
44+
ExReqStep >> postcondition: anObject [
45+
46+
postcondition := anObject
47+
]
48+
49+
{ #category : 'accessing' }
50+
ExReqStep >> precondition [
51+
52+
^ precondition
53+
]
54+
55+
{ #category : 'accessing' }
56+
ExReqStep >> precondition: anObject [
57+
58+
precondition := anObject
59+
]

0 commit comments

Comments
 (0)