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