Skip to content

Commit 4523460

Browse files
Test using solution and in-place
1 parent b72cc10 commit 4523460

File tree

2 files changed

+100
-61
lines changed

2 files changed

+100
-61
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,6 @@ build/
2424

2525
# Other files
2626
.DS_Store
27+
28+
# Temporary files
29+
exercises/**/*.tmp

bin/test.ps1

Lines changed: 97 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -26,95 +26,131 @@ param (
2626
$ErrorActionPreference = "Stop"
2727
$PSNativeCommandUseErrorActionPreference = $true
2828

29-
function Invoke-Build-Generators {
30-
Write-Output "Building generators"
31-
& dotnet build ./generators
29+
function Invoke-Tests($Path) {
30+
& dotnet test $Path
3231
}
3332

34-
function Clean($BuildDir) {
35-
Write-Output "Cleaning previous build"
36-
Remove-Item -Recurse -Force $BuildDir -ErrorAction Ignore
37-
}
33+
function Prepare-Exercise($Path) {
34+
$files = Get-Content (Join-Path $Path ".meta" "config.json") -Raw | ConvertFrom-Json | Select-Object -ExpandProperty files
3835

39-
function Copy-Exercise($SourceDir, $BuildDir) {
40-
Write-Output "Copying exercises"
41-
Copy-Item $SourceDir -Destination $BuildDir -Recurse
42-
}
36+
foreach ($fileType in @("example", "exemplar")) {
37+
for (($i = 0); $i -lt $files.$fileType.length; $i++) {
38+
$exampleFile = Join-Path $Path $files.$fileType[$i]
39+
$solutionFile = Join-Path $Path $files.solution[$i]
4340

44-
function Enable-All-UnitTests($BuildDir) {
45-
Write-Output "Enabling all tests"
46-
Get-ChildItem -Path $BuildDir -Include "*Tests.cs" -Recurse | ForEach-Object {
47-
(Get-Content $_.FullName) -replace "Skip = ""Remove this Skip property to run this test""", "" | Set-Content $_.FullName
41+
Copy-Item -Path $solutionFile -Destination "${solutionFile}.tmp"
42+
Copy-Item -Path $exampleFile -Destination $solutionFile
43+
}
4844
}
49-
}
5045

51-
function Test-Refactoring-Projects($PracticeExercisesDir) {
52-
Write-Output "Testing refactoring projects"
53-
& dotnet test "${PracticeExercisesDir}/Refactoring.sln"
46+
foreach ($testFile in $files.test) {
47+
$testFile = Join-Path $Path $testFile
48+
Copy-Item -Path $testFile -Destination "${testFile}.tmp"
49+
(Get-Content $testFile) -replace "Skip = ""Remove this Skip property to run this test""", "" | Set-Content $testFile
50+
}
5451
}
5552

56-
function Set-ExampleImplementation {
57-
[CmdletBinding(SupportsShouldProcess)]
58-
param($ExercisesDir, $ReplaceFileName)
59-
60-
if ($PSCmdlet.ShouldProcess("Exercise ${ReplaceFileName}", "replace solution with example")) {
61-
Get-ChildItem -Path $ExercisesDir -Include "*.csproj" -Recurse | ForEach-Object {
62-
$stub = Join-Path -Path $_.Directory ($_.BaseName + ".cs")
63-
$example = Join-Path -Path $_.Directory ".meta" $ReplaceFileName
53+
function Restore-Exercise($Path) {
54+
Get-ChildItem -Path $Path -Include "*.tmp" -Recurse | ForEach-Object {
55+
$tmpFile = $_.FullName
56+
$originalFile = ($tmpFile -replace "\.tmp$", "")
57+
Move-Item -Path $tmpFile -Destination $originalFile -Force
58+
}
59+
}
6460

65-
Move-Item -Path $example -Destination $stub -Force
61+
function Process-Exercises($Exercises, [ScriptBlock]$Action) {
62+
foreach ($ExerciseType in @("practice", "concept")) {
63+
$Exercises.$ExerciseType | ForEach-Object {
64+
&$Action (Join-Path "exercises" $ExerciseType $_)
6665
}
6766
}
6867
}
6968

70-
function Use-ExampleImplementation {
71-
[CmdletBinding(SupportsShouldProcess)]
72-
param($ConceptExercisesDir, $PracticeExercisesDir)
73-
74-
if ($PSCmdlet.ShouldProcess("Exercises directory", "replace all solutions with corresponding examples")) {
75-
Write-Output "Replacing concept exercise stubs with exemplar"
76-
Set-ExampleImplementation $ConceptExercisesDir "Exemplar.cs"
69+
function Prepare-Exercises($Exercises) {
70+
Process-Exercises $Exercises {
71+
param($Path)
72+
Prepare-Exercise $Path
73+
}
74+
}
7775

78-
Write-Output "Replacing practice exercise stubs with example"
79-
Set-ExampleImplementation $PracticeExercisesDir "Example.cs"
76+
function Restore-Exercises($Exercises) {
77+
Process-Exercises $Exercises {
78+
param($Path)
79+
Restore-Exercise $Path
8080
}
8181
}
8282

83-
function Test-ExerciseImplementation($Exercise, $BuildDir, $ConceptExercisesDir, $PracticeExercisesDir) {
84-
Write-Output "Running tests"
83+
function Run-Tests($Path) {
84+
& dotnet test $Path
85+
}
8586

86-
if (-Not $Exercise) {
87-
Invoke-Tests -Path $BuildDir
87+
function Find-Exercise-Path($Exercise, $Exercises) {
88+
if ($Exercises.practice.Contains($Exercise)) {
89+
Join-Path "exercises" "practice" $Exercise
8890
}
89-
elseif (Test-Path "${ConceptExercisesDir}/${Exercise}") {
90-
Invoke-Tests -Path "${ConceptExercisesDir}/${Exercise}"
91+
elseif ($Exercises.concept.Contains($Exercise)) {
92+
Join-Path "exercises" "concept" $Exercise
93+
} else {
94+
throw "Could not find exercise '${Exercise}'"
9195
}
92-
elseif (Test-Path "${PracticeExercisesDir}/${Exercise}") {
93-
Invoke-Tests -Path "${PracticeExercisesDir}/${Exercise}"
96+
}
97+
98+
function Test-Single-Exercise($Exercise, $Exercises) {
99+
$path = Find-Exercise-Path $Exercise $Exercises
100+
101+
try {
102+
Prepare-Exercise $path
103+
Run-Tests $path
104+
} finally {
105+
Restore-Exercise $path
94106
}
95-
else {
96-
throw "Could not find exercise '${Exercise}'"
107+
}
108+
109+
function Test-All-Exercises($Exercises) {
110+
try {
111+
Prepare-Exercises $Exercises
112+
Run-Tests "exercises/Exercises.sln"
113+
} finally {
114+
Restore-Exercises $Exercises
97115
}
98116
}
99117

100-
function Invoke-Tests($Path) {
101-
& dotnet test $Path
118+
function Parse-Exercises {
119+
Get-Content .\config.json -Raw |
120+
ConvertFrom-Json |
121+
Select-Object -ExpandProperty exercises |
122+
ForEach-Object {
123+
@{
124+
concept = $_.concept | Select-Object -ExpandProperty slug | Sort-Object
125+
practice = $_.practice | Select-Object -ExpandProperty slug | Sort-Object
126+
}
127+
}
102128
}
103129

130+
function Build-Generators {
131+
Write-Output "Build generators"
132+
& dotnet build generators
133+
}
104134

105-
$buildDir = "${PSScriptRoot}/build"
106-
$practiceExercisesDir = "${buildDir}/practice"
107-
$conceptExercisesDir = "${buildDir}/concept"
108-
$sourceDir = Resolve-Path "exercises"
135+
function Test-Refactoring-Exercise-Default-Implementations {
136+
Write-Output "Testing refactoring exercises"
137+
& dotnet test (Join-Path "exercises" "Refactoring.sln")
138+
}
109139

110-
Clean $buildDir
111-
Copy-Exercise $sourceDir $buildDir
112-
Enable-All-UnitTests $buildDir
140+
function Test-Exercise-Example-Implementations($Exercise) {
141+
Write-Output "Testing example implementations"
142+
$exercises = Parse-Exercises
113143

114-
if (!$Exercise) {
115-
Invoke-Build-Generators
116-
Test-Refactoring-Projects $practiceExercisesDir
144+
if ($Exercise) {
145+
Test-Single-Exercise $Exercise $Exercises
146+
} else {
147+
Test-All-Exercises $Exercises
148+
}
117149
}
118150

119-
Use-ExampleImplementation $conceptExercisesDir $practiceExercisesDir
120-
Test-ExerciseImplementation -Exercise $Exercise -BuildDir $buildDir -ConceptExercisesDir $conceptExercisesDir -PracticeExercisesDir $practiceExercisesDir
151+
Test-Exercise-Example-Implementations $Exercise
152+
153+
if (!$Exercise) {
154+
Build-Generators
155+
Test-Refactoring-Exercise-Default-Implementations
156+
}

0 commit comments

Comments
 (0)