src/String/Assert-StringEqual.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
function Test-StringEqual 
{
    param (
        [String]$Expected, 
        $Actual, 
        [switch]$CaseSensitive,
        [switch]$IgnoreWhitespace
    )

    if ($IgnoreWhitespace)
    { 
        $Expected = $Expected -replace '\s'
        $Actual = $Actual -replace '\s'
    }

    if (-not $CaseSensitive) 
    {
        $Expected -eq $Actual
    } 
    else 
    {
        $Expected -ceq $Actual
    }
}

function Get-StringEqualDefaultFailureMessage ([String]$Expected, $Actual) 
{
    "Expected the string to be '$Expected' but got '$Actual'."
}

function Assert-StringEqual 
{
    param (
        [Parameter(Position=1, ValueFromPipeline=$true)]
        $Actual, 
        [Parameter(Position=0)]
        [String]$Expected,
        [String]$CustomMessage,
        [switch]$CaseSensitive,
        [switch]$IgnoreWhitespace
    )
    
    $_actual = Collect-Input -ParameterInput $Actual -PipelineInput $local:Input

    if (-not $CustomMessage)
    {
        $formattedMessage = Get-StringEqualDefaultFailureMessage -Expected $Expected -Actual $_actual
    }
    else 
    {
        $formattedMessage = Get-CustomFailureMessage -Expected $Expected -Actual $_actual -CustomMessage $CustomMessage
    }

    $stringsAreEqual = Test-StringEqual -Expected $Expected -Actual $_actual -CaseSensitive:$CaseSensitive -IgnoreWhitespace:$IgnoreWhiteSpace
    if (-not ($stringsAreEqual)) 
    {
        throw [Assertions.AssertionException]$formattedMessage
    }
}