@@ -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