. $PSScriptRoot\..\..\Load-PesterModules.ps1 $here = Split-Path -Parent $MyInvocation.MyCommand.Path $sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.tests\.', '.' $functionPath = Join-Path -Path $here -ChildPath $sut Write-Host "Overriding SUT: $functionPath" Import-Module $functionPath -Force $moduleForMock = "" Describe 'Invoke-Parallel' { Context 'Ensure Correctness - Batched Parallelism' { It 'Returns Correct Results' { $numbers = 1..50 $results = Invoke-Parallel -objects $numbers -returnObjects -script { param($number) return $number; }; # Make sure it has the right number of results. $results.Count | Should -Be 50 # Make sure it returned all of the right results. # The sum of 1-50 is 1275 $sum = 0; foreach($result in $results) { $sum += $result; } $sum | Should -Be 1275 } It 'Handles Zero Items' { $numbers = $null; $results = Invoke-Parallel -objects $numbers -returnObjects -script { param($number) return $number; }; $results | Should -Be $null; } It 'Handles One Item' { $numbers = @(1); $results = Invoke-Parallel -objects $numbers -returnObjects -script { param($number) return $number; }; $results | Should -Be 1; } It 'Handles ThreadCount -gt NumObjects' { $numbers = 1..8; $numThreads = 400; $results = Invoke-Parallel -objects $numbers -returnObjects -numThreads $numThreads -script { param($number) return $number; }; $results.Count | Should -Be 8; } It 'Handles Odd Thread Division' { $numbers = 1..8; $numThreads = 3; $results = Invoke-Parallel -objects $numbers -returnObjects -numThreads $numThreads -script { param($number) return $number; }; $results.Count | Should -Be 8; } It 'Handles Jobless Last Thread' { # This is an edge case where Ceil(21 items / 8 threads) is rounded up to 3 items per thread. # 7*3 == 21, which means the last thread at 8 threads doesn't have any work to do. # There isn't a more fair way to divy up the work between the threads. # Arbitrarily giving the 8th thread work from the 7th thread won't help in theory. $numbers = @(1..21) $numThreads = 8; $results = Invoke-Parallel -objects $numbers -returnObjects -numThreads $numThreads -script { param($number) return $number; } $results.Count | Should -Be 21; } } Context 'Ensure Correctness - Thread Per Object Parallelism' { It 'Returns Correct Results' { $numbers = 1..6 $results = Invoke-Parallel -objects $numbers -returnObjects -threadPerObject -script { param($number) return $number; }; # Make sure it has the right number of results. $results.Count | Should -Be 6 # Make sure it returned all of the right results. # The sum of 1-6 is 21 $sum = 0; foreach($result in $results) { $sum += $result; } $sum | Should -Be 21 } It 'Handles Zero Items' { $numbers = $null; $results = Invoke-Parallel -objects $numbers -returnObjects -threadPerObject -script { param($number) return $number; }; $results | Should -Be $null; } It 'Handles One Item' { $numbers = @(1); $results = Invoke-Parallel -objects $numbers -returnObjects -threadPerObject -script { param($number) return $number; }; $results | Should -Be 1; } It 'Handles ThreadCount -gt NumObjects' { $numbers = 1..8; $numThreads = 400; $results = Invoke-Parallel -objects $numbers -returnObjects -numThreads $numThreads -threadPerObject -script { param($number) return $number; }; $results.Count | Should -Be 8; } } }