145 lines
4.5 KiB
PowerShell
145 lines
4.5 KiB
PowerShell
|
. $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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|