1 Import-Module Pester 2 3 BeforeAll { 4 . $PSScriptRoot/../job-matrix-functions.ps1 5 6 $matrixConfig = @" 7 { 8 "matrix": { 9 "operatingSystem": [ "windows-2019", "ubuntu-18.04", "macOS-10.15" ], 10 "framework": [ "net461", "netcoreapp2.1" ], 11 "additionalArguments": [ "", "mode=test" ] 12 } 13 } 14 "@ 15 $config = GetMatrixConfigFromJson $matrixConfig 16 } 17 18 Describe "Matrix Filter" -Tag "filter" { 19 It "Should filter by matrix display name" -TestCases @( 20 @{ regex = "windows.*"; expectedFirst = "windows2019_net461"; length = 4 } 21 @{ regex = "windows2019_netcoreapp21_modetest"; expectedFirst = "windows2019_netcoreapp21_modetest"; length = 1 } 22 @{ regex = ".*ubuntu.*"; expectedFirst = "ubuntu1804_net461"; length = 4 } 23 ) { 24 [array]$matrix = GenerateMatrix $config "all" $regex 25 $matrix.Length | Should -Be $length 26 $matrix[0].Name | Should -Be $expectedFirst 27 } 28 29 It "Should handle no display name filter matches" { 30 $matrix = GenerateMatrix $config "all" 31 [array]$filtered = FilterMatrixDisplayName $matrix "doesnotexist" 32 $filtered | Should -BeNullOrEmpty 33 } 34 35 It "Should filter by matrix key/value" -TestCases @( 36 @{ filterString = "operatingSystem=windows.*"; expectedFirst = "windows2019_net461"; length = 4 } 37 @{ filterString = "operatingSystem=windows-2019"; expectedFirst = "windows2019_net461"; length = 4 } 38 @{ filterString = "framework=.*"; expectedFirst = "windows2019_net461"; length = 12 } 39 @{ filterString = "additionalArguments=mode=test"; expectedFirst = "windows2019_net461_modetest"; length = 6 } 40 @{ filterString = "additionalArguments=^$"; expectedFirst = "windows2019_net461"; length = 6 } 41 ) { 42 [array]$matrix = GenerateMatrix $config "all" -filters @($filterString) 43 $matrix.Length | Should -Be $length 44 $matrix[0].Name | Should -Be $expectedFirst 45 } 46 47 It "Should filter by optional matrix key/value" -TestCases @( 48 @{ filterString = "operatingSystem=^$|windows.*"; expectedFirst = "windows2019_net461"; length = 4 } 49 @{ filterString = "doesnotexist=^$|.*"; expectedFirst = "windows2019_net461"; length = 12 } 50 ) { 51 [array]$matrix = GenerateMatrix $config "all" -filters @($filterString) 52 $matrix.Length | Should -Be $length 53 $matrix[0].Name | Should -Be $expectedFirst 54 } 55 56 It "Should handle multiple matrix key/value filters " { 57 [array]$matrix = GenerateMatrix $config "all" -filters "operatingSystem=windows.*","framework=.*","additionalArguments=mode=test" 58 $matrix.Length | Should -Be 2 59 $matrix[0].Name | Should -Be "windows2019_net461_modetest" 60 } 61 62 It "Should handle no matrix key/value filter matches" { 63 [array]$matrix = GenerateMatrix $config "all" -filters @("doesnot=exist") 64 $matrix | Should -BeNullOrEmpty 65 } 66 67 It "Should handle invalid matrix key/value filter syntax" { 68 { GenerateMatrix $config "all" -filters @("invalid") } | Should -Throw 69 { GenerateMatrix $config "all" -filters @("emptyvalue=") } | Should -Throw 70 { GenerateMatrix $config "all" -filters @("=emptykey") } | Should -Throw 71 { GenerateMatrix $config "all" -filters @("=") } | Should -Throw 72 } 73 74 It "Should filter by key exclude" { 75 [array]$matrix = GenerateMatrix $config "all" -filters @("operatingSystem=^$") 76 $matrix | Should -BeNullOrEmpty 77 78 [array]$matrix = GenerateMatrix $config "all" 79 $matrix.Length | Should -Be 12 80 $matrix += @{ Name = "excludeme"; Parameters = [Ordered]@{ "foo" = 1 } } 81 [array]$matrix = FilterMatrix $matrix @("foo=^$") 82 $matrix.Length | Should -Be 12 83 } 84 } 85