@@ -10,10 +10,8 @@ Class {
10
10
#superclass : #Object ,
11
11
#instVars : [
12
12
' numberGenerated' ,
13
- ' testCounter'
14
- ],
15
- #classVars : [
16
- ' LastPath'
13
+ ' testCounter' ,
14
+ ' problems'
17
15
],
18
16
#category : #' ExercismDev-TestGenerator'
19
17
}
@@ -24,51 +22,21 @@ ExercismExerciseGenerator class >> convertLegacyTagsToPackages [
24
22
do: [ :t | t promoteAsExercismRPackage ]
25
23
]
26
24
27
- { #category : #' as yet unclassified' }
28
- ExercismExerciseGenerator class >> defaultSourcePath [
29
- |builder |
30
- [ builder := IceRepositoryCreator new
31
- url: ' git@github.com:exercism/problem-specifications.git' ;
32
- commitishName: ' master' ;
33
- yourself .
34
- builder createRepository.
35
- ] on: IceDuplicatedRepository
36
- do: [ :error | " don nothing" ].
37
- ^ builder locationToUse exists
38
- ifTrue: [ (builder locationToUse / ' exercises' ) fullName ]
39
- ]
40
-
41
25
{ #category : #examples }
42
26
ExercismExerciseGenerator class >> generate [
43
27
" This is the entry point for generating exercism compatible source files that can be checked into
44
28
the exercism/pharo project. e.g. self generate"
45
29
46
30
< example>
47
- | sourcePath defaultSourcePath |
48
-
49
-
50
- defaultSourcePath := self defaultSourcePath.
51
- sourcePath := defaultSourcePath ifNotNil: [
52
- (self confirm: ' Generate from default source location?' , String cr, defaultSourcePath)
53
- ifTrue: [ defaultSourcePath ]
54
- ].
55
- sourcePath ifNil: [
56
- UIManager default
57
- chooseDirectory: ' Select source "problem-specifications/exercises" folder to read from'
58
- path: self lastPath.
59
- ].
60
31
61
- sourcePath ifNotNil: [ self new generateFrom: ( self lastPath: sourcePath) asFileReference ]
32
+ self new generateFrom: ExercismProblemSpecification all " or allNeedingGeneration ?? ask user ?? "
62
33
]
63
34
64
35
{ #category : #examples }
65
- ExercismExerciseGenerator class >> lastPath [
66
- ^ LastPath ifNil: [ LastPath := FileLocator home pathString]
67
- ]
36
+ ExercismExerciseGenerator class >> problemSpecificationsFrom: filePathReference [
37
+ ^ filePathReference entries
38
+ collect: [ :entry | ExercismProblemSpecification newFromFileRef: entry reference ].
68
39
69
- { #category : #examples }
70
- ExercismExerciseGenerator class >> lastPath: pathString [
71
- ^ LastPath := pathString
72
40
]
73
41
74
42
{ #category : #examples }
@@ -196,10 +164,10 @@ ExercismExerciseGenerator >> generateCodeShouldRaiseOn: output variable: variabl
196
164
]
197
165
198
166
{ #category : #generation }
199
- ExercismExerciseGenerator >> generateExerciseFrom: aFileSystemReference [
200
- | testName testDescription testSpecification testJson testClass testRoot testVariable testMetaData versionString |
167
+ ExercismExerciseGenerator >> generateExerciseFrom: spec [
168
+ | testMetaData testClass |
201
169
202
-
170
+ " ExercismProblemSpecification newFromFileRef: aFileSystemReference.
203
171
testRoot := '' join: ((aFileSystemReference basename splitOn: $-) collect: [ :w | w capitalized ]).
204
172
testName := testRoot, 'Test'.
205
173
testVariable := (testRoot, 'Calculator') asValidSelector asString.
@@ -216,19 +184,23 @@ ExercismExerciseGenerator >> generateExerciseFrom: aFileSystemReference [
216
184
217
185
testJson := STONJSON fromString: testSpecification.
218
186
versionString := testJson at: 'version'.
219
-
220
- testMetaData := (WriteStream on: ' ' ) nextPutAll: testMetaData;
221
- nextPutAll: (' exercise: "{1}"' format: {testRoot}); cr;
222
- nextPutAll: (' version: "{1}"' format: {versionString}); cr; contents.
223
-
224
- testClass := self generateTestClass: testName tag: testRoot variable: testVariable.
187
+ "
188
+ Transcript crShow: ' Generating ' , spec classNameForTest.
189
+ spec hasCanonicalData ifFalse: [ ^ self ].
190
+ testClass := self generateTestClassUsing: spec.
225
191
" self generateTestVariableAccessors: testVariable in: testClass."
226
- self generateSetupOn: testClass using: testVariable assigning: testRoot.
227
- self generateTestMethodsOn: testClass calling: testVariable using: testJson prefix: ' ' .
228
- self generateMetaDataFor: testClass description: testDescription version: versionString metaData: testMetaData.
192
+ self generateSetupOn: testClass using: spec.
193
+ self halt. " Work in progress. Step through next method to validate."
194
+ self generateTestMethodsOn: testClass using: spec.
195
+
196
+ testMetaData := ' ' . " spec metaDataString" .
197
+ testMetaData := (WriteStream on: ' ' ) nextPutAll: testMetaData;
198
+ nextPutAll: (' exercise: "{1}"' format: {spec mixedCaseName}); cr;
199
+ nextPutAll: (' version: "{1}"' format: {spec version}); cr; contents.
200
+ self generateMetaDataFor: testClass description: spec description version: spec version metaData: testMetaData.
229
201
230
202
self numberGenerated: self numberGenerated + 1 .
231
- self log: ' successfully created' for: testName
203
+ self log: ' successfully created' for: spec classNameForTest
232
204
233
205
234
206
@@ -237,16 +209,14 @@ ExercismExerciseGenerator >> generateExerciseFrom: aFileSystemReference [
237
209
]
238
210
239
211
{ #category : #generation }
240
- ExercismExerciseGenerator >> generateFrom: filePathReference [
212
+ ExercismExerciseGenerator >> generateFrom: problemSpecifications [
241
213
(RPackageOrganizer default
242
214
includesPackageNamed: self defaultPackageName)
243
215
ifFalse: [ RPackageOrganizer default createPackageNamed: self defaultPackageName ].
244
216
245
- self crLog: ' Generating new TestCases from specification: ' , filePathReference printString.
246
-
247
217
self numberGenerated: 0 .
248
- filePathReference entries
249
- do: [ :entry | self generateExerciseFrom: entry reference ].
218
+ (problemSpecifications select: #hasCanonicalData )
219
+ do: [ :spec | self generateExerciseFrom: spec ].
250
220
251
221
self
252
222
crLog: (' Generation complete. Created {1} Tests!'
@@ -289,65 +259,70 @@ ExercismExerciseGenerator >> generateMetaDataFor: testClass description: testDes
289
259
]
290
260
291
261
{ #category : #generation }
292
- ExercismExerciseGenerator >> generateSetupOn: testClass using: testVariable assigning: testRoot [
293
- | output src |
262
+ ExercismExerciseGenerator >> generateSetupOn: testClass using: spec [
263
+ | methodSource |
294
264
295
- output := (WriteStream on: ' ' ).
296
- output nextPutAll: ' setUp' ; cr.
297
- output tab; nextPutAll: ' super setUp.' ; cr.
298
- output tab; nextPutAll: testVariable, ' := ' ; nextPutAll: testRoot, ' new' .
265
+ methodSource := (WriteStream on: ' ' ).
266
+ methodSource
267
+ nextPutAll: ' setUp' ; cr;
268
+ tab; nextPutAll: ' super setUp.' ; cr;
269
+ tab; nextPutAll: spec testVariable, ' := ' ; nextPutAll: spec classNameForSolution, ' new' .
299
270
300
- src := output contents.
301
- self compile: src for: testClass selector: #setUp protocol: ' running'
271
+ self
272
+ compile: methodSource contents
273
+ for: testClass
274
+ selector: #setUp
275
+ protocol: ' running'
302
276
303
277
]
304
278
305
279
{ #category : #generation }
306
- ExercismExerciseGenerator >> generateTestClass: testName tag: tagName variable: testVariable [
280
+ ExercismExerciseGenerator >> generateTestClassUsing: spec [
307
281
308
282
self resetTestCounter.
309
283
310
284
^ ExercismTest
311
- subclass: testName asSymbol
312
- instanceVariableNames: testVariable
285
+ subclass: spec classNameForTest asSymbol
286
+ instanceVariableNames: spec testVariable
313
287
classVariableNames: ' '
314
288
poolDictionaries: ' '
315
- package: ' ExercismWIP-' , tagName
289
+ package: ' ExercismWIP-' , spec mixedCaseName
316
290
317
291
]
318
292
319
293
{ #category : #generation }
320
- ExercismExerciseGenerator >> generateTestMethodsOn: testClass calling: testVariable using: testJson prefix: aPrefixString [
321
- | instance methodName parameters testResult testPrefix methodNameSegment |
322
-
323
- (testJson at: ' cases' )
324
- do: [ :case |
325
- methodNameSegment := (((testJson at: ' cases' ) size > 1 ) or : [ aPrefixString notEmpty ])
326
- ifTrue: [ (case at: ' description' ) asCamelCase asValidKeyword capitalized ]
327
- ifFalse: [ ' ' ].
328
- methodName := aPrefixString
329
- ifEmpty: [ methodNameSegment withoutPrefix: ' And' ]
330
- ifNotEmpty: [ aPrefixString, methodNameSegment ].
331
-
332
- (case includesKey: ' cases' )
333
- ifTrue: [ self
334
- generateTestMethodsOn: testClass
335
- calling: testVariable
336
- using: case
337
- prefix: methodName ]
338
- ifFalse: [
339
- instance := case at: ' property' .
340
- parameters := case at: ' input' .
341
- testResult := case at: ' expected' .
342
-
343
- testPrefix := ' test{1}_' format: {self nextTestCounter asTwoCharacterString}.
344
- self
345
- generateTestNamed: (testPrefix, methodName) asSymbol
346
- in: testClass
347
- variable: testVariable
348
- selector: instance
349
- parameters: parameters
350
- expecting: testResult ] ]
294
+ ExercismExerciseGenerator >> generateTestMethodsOn: testClass calling: testVariable using: spec prefix: aPrefixString [
295
+ " Processes... https://github.com/exercism/problem-specifications/blob/master/canonical-schema.json"
296
+ | groups instance methodName parameters testResult testPrefix methodNameSegment |
297
+
298
+ groups := (spec tests collect: [ :test | test groupCount ]) max.
299
+ spec tests
300
+ do: [ :test |
301
+ testPrefix := ' test{1}_' format: {self nextTestCounter asTwoCharacterString}.
302
+ self
303
+ generateTestNamed: (testPrefix, test methodNameSegment) asSymbol
304
+ in: testClass
305
+ variable: spec testVariable
306
+ selector: test property
307
+ parameters: test input
308
+ expecting: test expected ]
309
+ ]
310
+
311
+ { #category : #generation }
312
+ ExercismExerciseGenerator >> generateTestMethodsOn: testClass using: spec [
313
+ " Processes... https://github.com/exercism/problem-specifications/blob/master/canonical-schema.json"
314
+ | testPrefix |
315
+
316
+ spec tests
317
+ do: [ :test |
318
+ testPrefix := ' test{1}_' format: {self nextTestCounter asTwoCharacterString}.
319
+ self
320
+ generateTestNamed: (testPrefix, test methodNameSegment) asSymbol
321
+ in: testClass
322
+ variable: spec testVariable
323
+ selector: test property
324
+ parameters: test input
325
+ expecting: test expected ]
351
326
]
352
327
353
328
{ #category : #generation }
0 commit comments