Skip to content

Commit

Permalink
Fixed removal of exercise sources befor running test runner. (#631)
Browse files Browse the repository at this point in the history
- fixes #630
  • Loading branch information
Bajger committed May 23, 2024
1 parent e57a79c commit 73f0019
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 14 deletions.
4 changes: 2 additions & 2 deletions dev/src/ExercismTestRunner/ExercismTestRunner.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ ExercismTestRunner >> runTestsOnExercise: slugName importSourceFrom: inputDirect
[
exercise := self findExercise: slugName.

"remove all example solutions - solution classes prior student solution import"
exercise removeSolutionClasses.
"remove all example solutions - solution classes, ext. methods prior student solution import"
exercise removeDefinedSolutionClassesAndExtensionMethods.

self importSourceFilesfrom: inputDirectory.
testResult := self runTestsFor: exercise testCase.
Expand Down
39 changes: 32 additions & 7 deletions dev/src/ExercismTestRunnerTests/ExercismTestRunnerTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,21 @@ ExercismTestRunnerTest >> mockRunnerTestCaseSnapshot [
^ STON fromString: self class mockSnapshotRunnerTestCaseSTON
]

{ #category : #private }
ExercismTestRunnerTest >> prepareMockExtensionMethods [

| package |
Array compile: 'mockMethodArray
^ true'.
Integer compile: 'mockMethodInteger
^ false'.

package := RPackageOrganizer default packageNamed: 'Exercise@MockRunner'
ifAbsent: [RPackageOrganizer default createPackageNamed: 'Exercise@MockRunner'].
package addMethod: Array>>#mockMethodArray.
package addMethod: Integer>>#mockMethodInteger.
]

{ #category : #private }
ExercismTestRunnerTest >> prepareMockSolution [

Expand Down Expand Up @@ -196,7 +211,15 @@ ExercismTestRunnerTest >> prepareMockTestCase [
ExercismTestRunnerTest >> tearDown [
|aPackage|
aPackage := RPackageOrganizer default packageNamed: 'Exercise@MockRunner' ifAbsent: [nil].
aPackage ifNotNil: [ aPackage removeFromSystem].
aPackage ifNotNil: [
aPackage removeFromSystem.

"remove ext. methods as well"
Array compiledMethodAt: #mockMethodArray
ifPresent: [ :method | method removeFromSystem].
Integer compiledMethodAt: #mockMethodInteger
ifPresent: [ :method | method removeFromSystem].
].
super tearDown
]

Expand Down Expand Up @@ -256,17 +279,19 @@ ExercismTestRunnerTest >> testPrepareMockSolution [
]

{ #category : #running }
ExercismTestRunnerTest >> testRemoveSolutionClasses [

|exercise|
ExercismTestRunnerTest >> testRemoveDefinedSolutionClassesAndExtensionMethods [

| exercise |
"preparing mock test case"
self prepareMockTestCase.
self prepareMockSolution.
exercise := ExercismTestRunner default findExercise: 'mock-runner'.
self assert: exercise solutionClasses size equals: 1.
exercise removeSolutionClasses.
self prepareMockExtensionMethods.
exercise := ExercismTestRunner default findExercise: 'mock-runner'.
self assertCollection: exercise solutionClasses equals: {(self class environment at: #MockRunner). Integer. Array.} asSet.
self assert: exercise definedSolutionClasses equals: {self class environment at: #MockRunner} asSet.
exercise removeDefinedSolutionClassesAndExtensionMethods.
self assert: exercise solutionClasses isEmpty.
self assert: exercise definedSolutionClasses isEmpty.
]

{ #category : #tests }
Expand Down
9 changes: 9 additions & 0 deletions dev/src/ExercismTests/ExercismExerciseTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ ExercismExerciseTest >> testCoreExercises [

]

{ #category : #tests }
ExercismExerciseTest >> testDefinedSolutionClasses [

self assertCollection: TestExerciseTest exercise definedSolutionClasses equals: {TestExercise} asSet.
self assertCollection: TestmanyTest exercise definedSolutionClasses equals: {Testmany. TestOtherClass. TestOtherClassTest} asSet.
self assertCollection: TestEmptyTest exercise definedSolutionClasses equals: {} asSet.
self assertCollection: TestExExtensionTest exercise definedSolutionClasses equals: { TestExtension } asSet.
]

{ #category : #tests }
ExercismExerciseTest >> testDescriptionText [

Expand Down
23 changes: 18 additions & 5 deletions dev/src/ExercismTools/ExercismExercise.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,13 @@ ExercismExercise >> asJsonData [
'topics' -> self topics } asOrderedDictionary
]

{ #category : #accessing }
ExercismExercise >> definedSolutionClasses [
"Answer only the classes that are defined by exercise package itself (no system classes with extension methods)"

^ self exercisePackageContainer definedClasses reject: [ :c | c isKindOf: ExercismTest class ]
]

{ #category : #accessing }
ExercismExercise >> descriptionText [
"Answer the String, that is the hint text for exerciems (this is the text afer the markdown heading ## Hint"
Expand Down Expand Up @@ -304,10 +311,16 @@ ExercismExercise >> printOn: aStream [
]

{ #category : #removing }
ExercismExercise >> removeSolutionClasses [
"Solution classes with implemented solution to be removed - utilized by TestRunner before importing student solution"
ExercismExercise >> removeDefinedSolutionClassesAndExtensionMethods [
"Defined Solution classes with implemented solution to be removed - utilized by TestRunner before importing student solution. DO NOT ERASE SYSTEM CLASSES. Only extension methods of them."

|exercisePackage|
exercisePackage := self exercisePackageContainer.
self definedSolutionClasses do: [:aClass | exercisePackage removeClassNamed: aClass name].

"remove extension methods as well"
exercisePackage removeMethods: exercisePackage extensionMethods.

^self solutionClasses do: [:solutionClass | solutionClass removeFromSystem]
]

{ #category : #accessing }
Expand All @@ -319,9 +332,9 @@ ExercismExercise >> snapshot [

{ #category : #accessing }
ExercismExercise >> solutionClasses [
"Answer the classes that are submitted to Exercism"
"Answer the classes that are submitted to Exercism (defined classes as well system classes with extension methods)"

^self exercisePackageContainer classes reject: [ :c | c isKindOf: ExercismTest class ]
^ self exercisePackageContainer classes reject: [ :c | c isKindOf: ExercismTest class ]
]

{ #category : #accessing }
Expand Down

0 comments on commit 73f0019

Please sign in to comment.