Skip to content

Commit 65a2a31

Browse files
authored
Add -Count to Should-BeCollection (#2567)
* Add -Count to Should-BeCollection * Message fixes
1 parent e7a5259 commit 65a2a31

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

src/functions/assert/Collection/Should-BeCollection.ps1

+20-7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
.PARAMETER Actual
1010
A collection of items.
1111
12+
.PARAMETER Count
13+
Checks if the collection has the expected number of items.
14+
1215
.PARAMETER Because
1316
The reason why the input should be the expected value.
1417
@@ -41,26 +44,36 @@
4144
param (
4245
[Parameter(Position = 1, ValueFromPipeline = $true)]
4346
$Actual,
44-
[Parameter(Position = 0, Mandatory)]
47+
[Parameter(Position = 0, Mandatory, ParameterSetName = 'Expected')]
4548
$Expected,
46-
[String]$Because
49+
[String]$Because,
50+
[Parameter(ParameterSetName = 'Count')]
51+
[int] $Count
4752
)
4853

4954
$collectedInput = Collect-Input -ParameterInput $Actual -PipelineInput $local:Input -IsPipelineInput $MyInvocation.ExpectingInput
5055
$Actual = $collectedInput.Actual
5156

52-
if (-not (Is-Collection -Value $Expected)) {
53-
$Message = Get-AssertionMessage -Expected $Expected -Actual $Actual -Because $Because -DefaultMessage "Expected <expectedType> <expected> is not a collection."
57+
if (-not (Is-Collection -Value $Actual)) {
58+
$Message = Get-AssertionMessage -Expected $Expected -Actual $Actual -Because $Because -DefaultMessage "Actual <actualType> <actual> is not a collection."
5459
throw [Pester.Factory]::CreateShouldErrorRecord($Message, $MyInvocation.ScriptName, $MyInvocation.ScriptLineNumber, $MyInvocation.Line.TrimEnd([System.Environment]::NewLine), $true)
5560
}
5661

57-
if (-not (Is-Collection -Value $Actual)) {
58-
$Message = Get-AssertionMessage -Expected $Expected -Actual $Actual -Because $Because -DefaultMessage "Actual <actualType> <actual> is not a collection."
62+
if ($PSCmdlet.ParameterSetName -eq 'Count') {
63+
if ($Count -ne $Actual.Count) {
64+
$Message = Get-AssertionMessage -Expected $Count -Actual $Actual -Because $Because -Data @{ actualCount = $Actual.Count } -DefaultMessage "Expected <expected> items in <actualType> <actual>,<because> but it has <actualCount> items."
65+
throw [Pester.Factory]::CreateShouldErrorRecord($Message, $MyInvocation.ScriptName, $MyInvocation.ScriptLineNumber, $MyInvocation.Line.TrimEnd([System.Environment]::NewLine), $true)
66+
}
67+
return
68+
}
69+
70+
if (-not (Is-Collection -Value $Expected)) {
71+
$Message = Get-AssertionMessage -Expected $Expected -Actual $Actual -Because $Because -DefaultMessage "Expected <expectedType> <expected> is not a collection."
5972
throw [Pester.Factory]::CreateShouldErrorRecord($Message, $MyInvocation.ScriptName, $MyInvocation.ScriptLineNumber, $MyInvocation.Line.TrimEnd([System.Environment]::NewLine), $true)
6073
}
6174

6275
if (-not (Is-CollectionSize -Expected $Expected -Actual $Actual)) {
63-
$Message = Get-AssertionMessage -Expected $Expected -Actual $Actual -Because $Because -DefaultMessage "Expected <expectedType> <expected> to be present in <actualType> <actual>, but they don't have the same number of items."
76+
$Message = Get-AssertionMessage -Expected $Expected -Actual $Actual -Because $Because -DefaultMessage "Expected <expectedType> <expected> to be present in <actualType> <actual>,<because> but they don't have the same number of items."
6477
throw [Pester.Factory]::CreateShouldErrorRecord($Message, $MyInvocation.ScriptName, $MyInvocation.ScriptLineNumber, $MyInvocation.Line.TrimEnd([System.Environment]::NewLine), $true)
6578
}
6679

tst/functions/assert/Collection/Should-BeCollection.Tests.ps1

+22
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,26 @@ Describe "Should-BeCollection" {
2424
$err = { $actual | Should-BeCollection $expected } | Verify-AssertionFailed
2525
$err.Exception.Message | Verify-Equal "Expected [Object[]] @(5, 6, 7, 8, 9) to be present in [Object[]] @(1, 2, 3, 4, 5) in any order, but some values were not.`nMissing in actual: '6 (index 1), 7 (index 2), 8 (index 3), 9 (index 4)'`nExtra in actual: '1 (index 0), 2 (index 1), 3 (index 2), 4 (index 3)'"
2626
}
27+
28+
Describe "-Count" {
29+
It "Counts empty collection @() correctly" {
30+
@() | Should-BeCollection -Count 0
31+
}
32+
33+
It "Counts collection with one item correctly" -ForEach @(
34+
@(1),
35+
(, @()), # array in array
36+
@($null),
37+
@(""),
38+
# we also cannot distinguish between a single item and a single item array
39+
1
40+
) {
41+
$_ | Should-BeCollection -Count 1
42+
}
43+
44+
It "Fails when collection does not have the expected number of items" {
45+
$err = { @(1, 2) | Should-BeCollection -Count 3 } | Verify-AssertionFailed
46+
$err.Exception.Message | Verify-Equal "Expected 3 items in [Object[]] @(1, 2), but it has 2 items."
47+
}
48+
}
2749
}

0 commit comments

Comments
 (0)