ps/Modules/Alkami.PowerShell.Common/Public/Invoke-Parallel.tests.ps1

145 lines
4.5 KiB
PowerShell
Raw Permalink Normal View History

2023-05-30 22:51:22 -07:00
. $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;
}
}
}