1Import-Module Pester
2
3BeforeAll {
4 . $PSScriptRoot/../job-matrix-functions.ps1
5
6 $matrixConfig = @"
7{
8 "displayNames": {
9 "--enableFoo": "withfoo"
10 },
11 "matrix": {
12 "operatingSystem": [
13 "windows-2019",
14 "ubuntu-18.04",
15 "macOS-10.15"
16 ],
17 "framework": [
18 "net461",
19 "netcoreapp2.1"
20 ],
21 "additionalArguments": [
22 "",
23 "--enableFoo"
24 ]
25 },
26 "include": [
27 {
28 "operatingSystem": "windows-2019",
29 "framework": ["net461", "netcoreapp2.1", "net50"],
30 "additionalArguments": "--enableWindowsFoo"
31 }
32 ],
33 "exclude": [
34 {
35 "operatingSystem": "windows-2019",
36 "framework": "net461"
37 },
38 {
39 "operatingSystem": "macOS-10.15",
40 "framework": "netcoreapp2.1"
41 },
42 {
43 "operatingSystem": ["macOS-10.15", "ubuntu-18.04"],
44 "additionalArguments": "--enableFoo"
45 }
46 ]
47}
48"@
49}
50
51Describe "Matrix-Lookup" -Tag "lookup" {
52 It "Should navigate a 2d matrix: <row> <col>" -TestCases @(
53 @{ row = 0; col = 0; expected = 1 },
54 @{ row = 0; col = 1; expected = 2 },
55 @{ row = 1; col = 0; expected = 3 },
56 @{ row = 1; col = 1; expected = 4 }
57 ) {
58 $dimensions = @(2, 2)
59 $matrix = @(
60 1, 2, 3, 4
61 )
62 GetNdMatrixElement @($row, $col) $matrix $dimensions | Should -Be $expected
63 }
64
65 It "Should navigate a 3d matrix: <z> <row> <col>" -TestCases @(
66 @{ z = 0; row = 0; col = 0; expected = 1 }
67 @{ z = 0; row = 0; col = 1; expected = 2 }
68 @{ z = 0; row = 1; col = 0; expected = 3 }
69 @{ z = 0; row = 1; col = 1; expected = 4 }
70 @{ z = 1; row = 0; col = 0; expected = 5 }
71 @{ z = 1; row = 0; col = 1; expected = 6 }
72 @{ z = 1; row = 1; col = 0; expected = 7 }
73 @{ z = 1; row = 1; col = 1; expected = 8 }
74 ) {
75 $dimensions = @(2, 2, 2)
76 $matrix = @(
77 1, 2, 3, 4, 5, 6, 7, 8
78 )
79 GetNdMatrixElement @($z, $row, $col) $matrix $dimensions | Should -Be $expected
80 }
81
82 It "Should navigate a 4d matrix: <t> <z> <row> <col>" -TestCases @(
83 @{ t = 0; z = 0; row = 0; col = 0; expected = 1 }
84 @{ t = 0; z = 0; row = 0; col = 1; expected = 2 }
85 @{ t = 0; z = 0; row = 1; col = 0; expected = 3 }
86 @{ t = 0; z = 0; row = 1; col = 1; expected = 4 }
87 @{ t = 0; z = 1; row = 0; col = 0; expected = 5 }
88 @{ t = 0; z = 1; row = 0; col = 1; expected = 6 }
89 @{ t = 0; z = 1; row = 1; col = 0; expected = 7 }
90 @{ t = 0; z = 1; row = 1; col = 1; expected = 8 }
91 @{ t = 1; z = 0; row = 0; col = 0; expected = 9 }
92 @{ t = 1; z = 0; row = 0; col = 1; expected = 10 }
93 @{ t = 1; z = 0; row = 1; col = 0; expected = 11 }
94 @{ t = 1; z = 0; row = 1; col = 1; expected = 12 }
95 @{ t = 1; z = 1; row = 0; col = 0; expected = 13 }
96 @{ t = 1; z = 1; row = 0; col = 1; expected = 14 }
97 @{ t = 1; z = 1; row = 1; col = 0; expected = 15 }
98 @{ t = 1; z = 1; row = 1; col = 1; expected = 16 }
99 ) {
100 $dimensions = @(2, 2, 2, 2)
101 $matrix = @(
102 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
103 )
104 GetNdMatrixElement @($t, $z, $row, $col) $matrix $dimensions | Should -Be $expected
105 }
106
107 It "Should navigate a 4d matrix: <t> <z> <row> <col>" -TestCases @(
108 @{ t = 0; z = 0; row = 0; col = 0; expected = 1 }
109 @{ t = 0; z = 0; row = 0; col = 1; expected = 2 }
110 @{ t = 0; z = 0; row = 0; col = 2; expected = 3 }
111 @{ t = 0; z = 0; row = 0; col = 3; expected = 4 }
112
113 @{ t = 0; z = 0; row = 1; col = 0; expected = 5 }
114 @{ t = 0; z = 0; row = 1; col = 1; expected = 6 }
115 @{ t = 0; z = 0; row = 1; col = 2; expected = 7 }
116 @{ t = 0; z = 0; row = 1; col = 3; expected = 8 }
117
118 @{ t = 0; z = 1; row = 0; col = 0; expected = 9 }
119 @{ t = 0; z = 1; row = 0; col = 1; expected = 10 }
120 @{ t = 0; z = 1; row = 0; col = 2; expected = 11 }
121 @{ t = 0; z = 1; row = 0; col = 3; expected = 12 }
122
123 @{ t = 0; z = 1; row = 1; col = 0; expected = 13 }
124 @{ t = 0; z = 1; row = 1; col = 1; expected = 14 }
125 @{ t = 0; z = 1; row = 1; col = 2; expected = 15 }
126 @{ t = 0; z = 1; row = 1; col = 3; expected = 16 }
127 ) {
128 $dimensions = @(1, 2, 2, 4)
129 $matrix = @(
130 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
131 )
132 GetNdMatrixElement @($t, $z, $row, $col) $matrix $dimensions | Should -Be $expected
133 }
134
135 # Skipping since by default wrapping behavior on indexing is disabled.
136 # Keeping here in case we want to enable it.
137 It -Skip "Should handle index wrapping: <row> <col>" -TestCases @(
138 @{ row = 2; col = 2; expected = 1 }
139 @{ row = 2; col = 3; expected = 2 }
140 @{ row = 4; col = 4; expected = 1 }
141 @{ row = 4; col = 5; expected = 2 }
142 ) {
143 $dimensions = @(2, 2)
144 $matrix = @(
145 1, 2, 3, 4
146 )
147 GetNdMatrixElement @($row, $col) $matrix $dimensions | Should -Be $expected
148 }
149}
150
151Describe "Matrix-Reverse-Lookup" -Tag "lookup" {
152 It "Should lookup a 2d matrix index: <index>" -TestCases @(
153 @{ index = 0; expected = @(0,0) }
154 @{ index = 1; expected = @(0,1) }
155 @{ index = 2; expected = @(1,0) }
156 @{ index = 3; expected = @(1,1) }
157 ) {
158 $dimensions = @(2, 2)
159 $matrix = @(1, 2, 3, 4)
160 GetNdMatrixElement $expected $matrix $dimensions | Should -Be $matrix[$index]
161 GetNdMatrixIndex $index $dimensions | Should -Be $expected
162 }
163
164 It "Should lookup a 3d matrix index: <index>" -TestCases @(
165 @{ index = 0; expected = @(0,0,0) }
166 @{ index = 1; expected = @(0,0,1) }
167 @{ index = 2; expected = @(0,1,0) }
168 @{ index = 3; expected = @(0,1,1) }
169
170 @{ index = 4; expected = @(1,0,0) }
171 @{ index = 5; expected = @(1,0,1) }
172 @{ index = 6; expected = @(1,1,0) }
173 @{ index = 7; expected = @(1,1,1) }
174 ) {
175 $dimensions = @(2, 2, 2)
176 $matrix = @(0, 1, 2, 3, 4, 5, 6, 7)
177 GetNdMatrixElement $expected $matrix $dimensions | Should -Be $matrix[$index]
178 GetNdMatrixIndex $index $dimensions | Should -Be $expected
179 }
180
181 It "Should lookup a 3d matrix index: <index>" -TestCases @(
182 @{ index = 0; expected = @(0,0,0) }
183 @{ index = 1; expected = @(0,0,1) }
184 @{ index = 2; expected = @(0,0,2) }
185
186 @{ index = 3; expected = @(0,1,0) }
187 @{ index = 4; expected = @(0,1,1) }
188 @{ index = 5; expected = @(0,1,2) }
189
190 @{ index = 6; expected = @(1,0,0) }
191 @{ index = 7; expected = @(1,0,1) }
192 @{ index = 8; expected = @(1,0,2) }
193
194 @{ index = 9; expected = @(1,1,0) }
195 @{ index = 10; expected = @(1,1,1) }
196 @{ index = 11; expected = @(1,1,2) }
197 ) {
198 $dimensions = @(2, 2, 3)
199 $matrix = @(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
200 GetNdMatrixElement $expected $matrix $dimensions | Should -Be $matrix[$index]
201 GetNdMatrixIndex $index $dimensions | Should -Be $expected
202 }
203
204 It "Should lookup a 3d matrix index: <index>" -TestCases @(
205 @{ index = 0; expected = @(0,0,0) }
206 @{ index = 1; expected = @(0,0,1) }
207 @{ index = 2; expected = @(0,1,0) }
208 @{ index = 3; expected = @(0,1,1) }
209
210 @{ index = 4; expected = @(1,0,0) }
211 @{ index = 5; expected = @(1,0,1) }
212 @{ index = 6; expected = @(1,1,0) }
213 @{ index = 7; expected = @(1,1,1) }
214
215 @{ index = 8; expected = @(2,0,0) }
216 @{ index = 9; expected = @(2,0,1) }
217 @{ index = 10; expected = @(2,1,0) }
218 @{ index = 11; expected = @(2,1,1) }
219 ) {
220 $dimensions = @(3, 2, 2)
221 $matrix = @(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
222 GetNdMatrixElement $expected $matrix $dimensions | Should -Be $matrix[$index]
223 GetNdMatrixIndex $index $dimensions | Should -Be $expected
224 }
225
226 It "Should lookup a 4d matrix index: <index>" -TestCases @(
227 @{ index = 0; expected = @(0,0,0,0) }
228 @{ index = 1; expected = @(0,0,0,1) }
229 @{ index = 2; expected = @(0,0,0,2) }
230 @{ index = 3; expected = @(0,0,0,3) }
231
232 @{ index = 4; expected = @(0,0,1,0) }
233 @{ index = 5; expected = @(0,0,1,1) }
234 @{ index = 6; expected = @(0,0,1,2) }
235 @{ index = 7; expected = @(0,0,1,3) }
236
237 @{ index = 8; expected = @(0,1,0,0) }
238 @{ index = 9; expected = @(0,1,0,1) }
239 @{ index = 10; expected = @(0,1,0,2) }
240 @{ index = 11; expected = @(0,1,0,3) }
241
242 @{ index = 12; expected = @(0,1,1,0) }
243 @{ index = 13; expected = @(0,1,1,1) }
244 @{ index = 14; expected = @(0,1,1,2) }
245 @{ index = 15; expected = @(0,1,1,3) }
246 ) {
247 $dimensions = @(1, 2, 2, 4)
248 $matrix = @(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
249 GetNdMatrixElement $expected $matrix $dimensions | Should -Be $matrix[$index]
250 GetNdMatrixIndex $index $dimensions | Should -Be $expected
251 }
252}
253
254Describe 'Matrix-Set' -Tag "set" {
255 It "Should set a matrix element" -TestCases @(
256 @{ value = "set"; index = @(0,0,0,0); arrayIndex = 0 }
257 @{ value = "ones"; index = @(0,1,1,1); arrayIndex = 13 }
258 ) {
259 $dimensions = @(1, 2, 2, 4)
260 $matrix = @(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
261
262 SetNdMatrixElement $value $index $matrix $dimensions
263 $matrix[$arrayIndex] | Should -Be $value
264 }
265}
266
267Describe "Platform Matrix Generation" -Tag "generate" {
268 BeforeEach {
269 $matrixConfigForGenerate = @"
270{
271 "displayNames": {
272 "--enableFoo": "withfoo"
273 },
274 "matrix": {
275 "operatingSystem": [
276 "windows-2019",
277 "ubuntu-18.04",
278 "macOS-10.15"
279 ],
280 "framework": [
281 "net461",
282 "netcoreapp2.1"
283 ],
284 "additionalArguments": [
285 "",
286 "--enableFoo"
287 ]
288 },
289 "include": [
290 {
291 "operatingSystem": "windows-2019",
292 "framework": "net461",
293 "additionalTestArguments": "/p:UseProjectReferenceToAzureClients=true"
294 }
295 ],
296 "exclude": [
297 {
298 "foo": "bar"
299 },
300 {
301 "foo2": "bar2"
302 }
303 ]
304}
305"@
306 $generateConfig = GetMatrixConfigFromJson $matrixConfigForGenerate
307 }
308
309 It "Should get matrix dimensions from Nd parameters" {
310 GetMatrixDimensions $generateConfig.matrixParameters | Should -Be 3, 2, 2
311 }
312
313 It "Should use name overrides from displayNames" {
314 $dimensions = GetMatrixDimensions $generateConfig.matrixParameters
315 $matrix = GenerateFullMatrix $generateConfig.matrixParameters $generateconfig.displayNamesLookup
316
317 $element = GetNdMatrixElement @(0, 0, 0) $matrix $dimensions
318 $element.name | Should -Be "windows2019_net461"
319
320 $element = GetNdMatrixElement @(1, 1, 1) $matrix $dimensions
321 $element.name | Should -Be "ubuntu1804_netcoreapp21_withFoo"
322
323 $element = GetNdMatrixElement @(2, 1, 1) $matrix $dimensions
324 $element.name | Should -Be "macOS1015_netcoreapp21_withFoo"
325 }
326
327 It "Should initialize an N-dimensional matrix from all parameter permutations" {
328 $dimensions = GetMatrixDimensions $generateConfig.matrixParameters
329 $matrix = GenerateFullMatrix $generateConfig.matrixParameters $generateConfig.displayNamesLookup
330 $matrix.Count | Should -Be 12
331
332 $element = $matrix[0].parameters
333 $element.operatingSystem | Should -Be "windows-2019"
334 $element.framework | Should -Be "net461"
335 $element.additionalArguments | Should -Be ""
336
337 $element = GetNdMatrixElement @(1, 1, 1) $matrix $dimensions
338 $element.parameters.operatingSystem | Should -Be "ubuntu-18.04"
339 $element.parameters.framework | Should -Be "netcoreapp2.1"
340 $element.parameters.additionalArguments | Should -Be "--enableFoo"
341
342 $element = GetNdMatrixElement @(2, 1, 1) $matrix $dimensions
343 $element.parameters.operatingSystem | Should -Be "macOS-10.15"
344 $element.parameters.framework | Should -Be "netcoreapp2.1"
345 $element.parameters.additionalArguments | Should -Be "--enableFoo"
346 }
347
348 It "Should initialize a sparse matrix from an N-dimensional matrix" -TestCases @(
349 @{ i = 0; name = "windows2019_net461"; operatingSystem = "windows-2019"; framework = "net461"; additionalArguments = ""; }
350 @{ i = 1; name = "ubuntu1804_netcoreapp21_withfoo"; operatingSystem = "ubuntu-18.04"; framework = "netcoreapp2.1"; additionalArguments = "--enableFoo"; }
351 @{ i = 2; name = "macOS1015_net461"; operatingSystem = "macOS-10.15"; framework = "net461"; additionalArguments = ""; }
352 ) {
353 $sparseMatrix = GenerateSparseMatrix $generateConfig.matrixParameters $generateConfig.displayNamesLookup
354 $dimensions = GetMatrixDimensions $generateConfig.matrixParameters
355 $size = ($dimensions | Measure-Object -Maximum).Maximum
356 $sparseMatrix.Count | Should -Be $size
357
358 $sparseMatrix[$i].name | Should -Be $name
359 $element = $sparseMatrix[$i].parameters
360 $element.operatingSystem | Should -Be $operatingSystem
361 $element.framework | Should -Be $framework
362 $element.additionalArguments | Should -Be $additionalArguments
363 }
364
365 It "Should generate a sparse matrix from an N-dimensional matrix config" {
366 $sparseMatrix = GenerateMatrix $generateConfig "sparse"
367 $sparseMatrix.Length | Should -Be 4
368 }
369
370 It "Should initialize a full matrix from an N-dimensional matrix config" {
371 $matrix = GenerateMatrix $generateConfig "all"
372 $matrix.Length | Should -Be 13
373 }
374}
375
376Describe "Config File Object Conversion" -Tag "convert" {
377 BeforeEach {
378 $config = GetMatrixConfigFromJson $matrixConfig
379 }
380
381 It "Should convert a matrix config" {
382 $config.matrixParameters[0].Name | Should -Be "operatingSystem"
383 $config.matrixParameters[0].Flatten()[0].Value | Should -Be "windows-2019"
384
385 $config.displayNamesLookup | Should -BeOfType [Hashtable]
386 $config.displayNamesLookup["--enableFoo"] | Should -Be "withFoo"
387
388 $config.include.Length | Should -Be 1
389 $config.exclude.Length | Should -Be 3
390 }
391}
392
393Describe "Platform Matrix Post Transformation" -Tag "transform" {
394 BeforeEach {
395 $config = GetMatrixConfigFromJson $matrixConfig
396 }
397
398 It "Should match partial matrix elements" -TestCases @(
399 @{ source = [Ordered]@{ a = 1; b = 2; }; target = [Ordered]@{ a = 1 }; expected = $true }
400 @{ source = [Ordered]@{ a = 1; b = 2; }; target = [Ordered]@{ a = 1; b = 2 }; expected = $true }
401 @{ source = [Ordered]@{ a = 1; b = 2; }; target = [Ordered]@{ a = 1; b = 2; c = 3 }; expected = $false }
402 @{ source = [Ordered]@{ a = 1; b = 2; }; target = [Ordered]@{ }; expected = $false }
403 @{ source = [Ordered]@{ }; target = [Ordered]@{ a = 1; b = 2; }; expected = $false }
404 ) {
405 MatrixElementMatch $source $target | Should -Be $expected
406 }
407
408 It "Should remove matrix elements based on exclude filters" {
409 $matrix = GenerateFullMatrix $config.matrixParameters $config.displayNamesLookup
410 $withExclusion = ProcessExcludes $matrix $config.exclude
411 $withExclusion.Length | Should -Be 5
412
413 $matrix = GenerateSparseMatrix $config.matrixParameters $config.displayNamesLookup
414 [array]$withExclusion = ProcessExcludes $matrix $config.exclude
415 $withExclusion.Length | Should -Be 1
416 }
417
418 It "Should add matrix elements based on include elements" {
419 $matrix = GenerateFullMatrix $config.matrixParameters $config.displayNamesLookup
420 $withInclusion = ProcessIncludes $config $matrix "all"
421 $withInclusion.Length | Should -Be 15
422 }
423
424 It "Should include and exclude values with a matrix" {
425 [Array]$matrix = GenerateMatrix $config "all"
426 $matrix.Length | Should -Be 8
427
428 $matrix[0].name | Should -Be "windows2019_netcoreapp21"
429 $matrix[0].parameters.operatingSystem | Should -Be "windows-2019"
430 $matrix[0].parameters.framework | Should -Be "netcoreapp2.1"
431 $matrix[0].parameters.additionalArguments | Should -Be ""
432
433 $matrix[1].name | Should -Be "windows2019_netcoreapp21_withfoo"
434 $matrix[1].parameters.operatingSystem | Should -Be "windows-2019"
435 $matrix[1].parameters.framework | Should -Be "netcoreapp2.1"
436 $matrix[1].parameters.additionalArguments | Should -Be "--enableFoo"
437
438 $matrix[2].name | Should -Be "ubuntu1804_net461"
439 $matrix[2].parameters.framework | Should -Be "net461"
440 $matrix[2].parameters.operatingSystem | Should -Be "ubuntu-18.04"
441 $matrix[2].parameters.additionalArguments | Should -Be ""
442
443 $matrix[4].name | Should -Be "macOS1015_net461"
444 $matrix[4].parameters.framework | Should -Be "net461"
445 $matrix[4].parameters.operatingSystem | Should -Be "macOS-10.15"
446 $matrix[4].parameters.additionalArguments | Should -Be ""
447
448 $matrix[7].name | Should -Be "windows2019_net50_enableWindowsFoo"
449 $matrix[7].parameters.framework | Should -Be "net50"
450 $matrix[7].parameters.operatingSystem | Should -Be "windows-2019"
451 $matrix[7].parameters.additionalArguments | Should -Be "--enableWindowsFoo"
452 }
453
454 It "Should parse a config with an empty base matrix" {
455 $matrixConfigForIncludeOnly = @"
456{
457 "include": [
458 {
459 "operatingSystem": "windows-2019",
460 "framework": "net461"
461 }
462 ]
463}
464"@
465
466 $config = GetMatrixConfigFromJson $matrixConfigForIncludeOnly
467 [Array]$matrix = GenerateMatrix $config "all"
468 $matrix.Length | Should -Be 1
469 $matrix[0].name | Should -Be "windows2019_net461"
470 }
471
472 It "Should parse a config with an empty include" {
473 $matrixConfigForIncludeOnly = @"
474{
475 "matrix": {
476 "operatingSystem": "windows-2019",
477 "framework": "net461"
478 }
479}
480"@
481
482 $config = GetMatrixConfigFromJson $matrixConfigForIncludeOnly
483 [Array]$matrix = GenerateMatrix $config "all"
484 $matrix.Length | Should -Be 1
485 $matrix[0].name | Should -Be "windows2019_net461"
486 }
487}
488
489Describe "Platform Matrix Generation With Object Fields" -Tag "objectfields" {
490 BeforeEach {
491 $matrixConfigForObject = @"
492{
493 "matrix": {
494 "testObject": {
495 "testObjectName1": { "testObject1Value1": "1", "testObject1Value2": "2" },
496 "testObjectName2": { "testObject2Value1": "1", "testObject2Value2": "2" }
497 },
498 "secondTestObject": {
499 "secondTestObjectName1": { "secondTestObject1Value1": "1", "secondTestObject1Value2": "2" }
500 },
501 "testField": [ "footest", "bartest" ]
502 },
503 "include": [
504 {
505 "testObjectInclude": {
506 "testObjectIncludeName": { "testObjectValue1": "1", "testObjectValue2": "2" }
507 },
508 "testField": "footest"
509 }
510 ]
511}
512"@
513 $objectFieldConfig = GetMatrixConfigFromJson $matrixConfigForObject
514 }
515
516 It "Should parse dimensions properly" {
517 [Array]$dimensions = GetMatrixDimensions $objectFieldConfig.matrixParameters
518 $dimensions.Length | Should -Be 3
519 $dimensions[0] | Should -Be 2
520 $dimensions[1] | Should -Be 1
521 $dimensions[2] | Should -Be 2
522 }
523
524 It "Should populate a sparse matrix dimensions properly" {
525 [Array]$matrix = GenerateMatrix $objectFieldConfig "sparse"
526 $matrix.Length | Should -Be 3
527
528 $matrix[0].name | Should -Be "testObjectName1_secondTestObjectName1_footest"
529 $matrix[0].parameters.testField | Should -Be "footest"
530 $matrix[0].parameters.testObject1Value1 | Should -Be "1"
531 $matrix[0].parameters.testObject1Value2 | Should -Be "2"
532 $matrix[0].parameters.secondTestObject1Value1 | Should -Be "1"
533 $matrix[0].parameters.Count | Should -Be 5
534
535 $matrix[1].name | Should -Be "testObjectName2_secondTestObjectName1_bartest"
536 $matrix[1].parameters.testField | Should -Be "bartest"
537 $matrix[1].parameters.testObject2Value1 | Should -Be "1"
538 $matrix[1].parameters.testObject2Value2 | Should -Be "2"
539 $matrix[1].parameters.secondTestObject1Value1 | Should -Be "1"
540 $matrix[1].parameters.Count | Should -Be 5
541
542 $matrix[2].name | Should -Be "testObjectIncludeName_footest"
543 $matrix[2].parameters.testField | Should -Be "footest"
544 $matrix[2].parameters.testObjectValue1 | Should -Be "1"
545 $matrix[2].parameters.testObjectValue2 | Should -Be "2"
546 $matrix[2].parameters.Count | Should -Be 3
547 }
548
549 It "Should splat matrix entries that are objects into key/values" {
550 [Array]$matrix = GenerateMatrix $objectFieldConfig "all"
551 $matrix.Length | Should -Be 5
552
553 $matrix[0].name | Should -Be "testObjectName1_secondTestObjectName1_footest"
554 $matrix[0].parameters.testField | Should -Be "footest"
555 $matrix[0].parameters.testObject1Value1 | Should -Be "1"
556 $matrix[0].parameters.testObject1Value2 | Should -Be "2"
557 $matrix[0].parameters.secondTestObject1Value1 | Should -Be "1"
558 $matrix[0].parameters.Count | Should -Be 5
559
560 $matrix[3].name | Should -Be "testObjectName2_secondTestObjectName1_bartest"
561 $matrix[3].parameters.testField | Should -Be "bartest"
562 $matrix[3].parameters.testObject2Value1 | Should -Be "1"
563 $matrix[3].parameters.testObject2Value2 | Should -Be "2"
564 $matrix[3].parameters.secondTestObject1Value1 | Should -Be "1"
565 $matrix[3].parameters.Count | Should -Be 5
566
567 $matrix[4].name | Should -Be "testObjectIncludeName_footest"
568 $matrix[4].parameters.testField | Should -Be "footest"
569 $matrix[4].parameters.testObjectValue1 | Should -Be "1"
570 $matrix[4].parameters.testObjectValue2 | Should -Be "2"
571 $matrix[4].parameters.Count | Should -Be 3
572 }
573}
574
575Describe "Platform Matrix Job and Display Names" -Tag "displaynames" {
576 BeforeEach {
577 $matrixConfigForGenerate = @"
578{
579 "displayNames": {
580 "--enableFoo": "withfoo"
581 },
582 "matrix": {
583 "operatingSystem": "ubuntu-18.04",
584 "framework": [
585 "net461",
586 "netcoreapp2.1"
587 ],
588 "TestNullField": null,
589 "TestObjectField": {
590 "TestObjectValueName": {
591 "foo": "bar",
592 "baz": "qux"
593 }
594 }
595 }
596}
597"@
598 $generateConfig = GetMatrixConfigFromJson $matrixConfigForGenerate
599 }
600
601 It "Should enforce valid display name format" {
602 $generateconfig.displayNamesLookup["net461"] = '123.Some.456.Invalid_format-name$(foo)'
603 $generateconfig.displayNamesLookup["netcoreapp2.1"] = (New-Object string[] 150) -join "a"
604 $matrix = GenerateFullMatrix $generateconfig.matrixParameters $generateconfig.displayNamesLookup
605
606 $matrix[0].name | Should -Be "ubuntu1804_123some456invalid_formatnamefoo_TestObjectValueName"
607
608 $matrix[1].name.Length | Should -Be 100
609 # The withfoo part of the argument gets cut off at the character limit
610 $matrix[1].name | Should -BeLike "ubuntu1804_aaaaaaaaaaaaaaaaa*"
611 }
612
613 It "Should create a valid display name when there are leading numbers" {
614 $generateconfig.displayNamesLookup["ubuntu-18.04"] = '123_ubuntu1804'
615 $matrix = GenerateFullMatrix $generateconfig.matrixParameters $generateconfig.displayNamesLookup
616
617 $matrix[0].name | Should -Be "job_123_ubuntu1804_net461_TestObjectValueName"
618 }
619
620 It "Should create a valid job name when there are leading numbers" {
621 $matrixConfigForGenerate = @"
622{
623 "matrix": {
624 "numField1": [1, 2, 3],
625 "letterField": ["a", "b", "c"]
626 }
627}
628"@
629 $generateConfig = GetMatrixConfigFromJson $matrixConfigForGenerate
630 $matrix = GenerateFullMatrix $generateconfig.matrixParameters $generateconfig.displayNamesLookup
631 $matrix[0].name | Should -Be "job_1_a"
632 }
633
634 It "Should create a valid job name when parameter values are all numbers" {
635 $matrixConfigForGenerate = @"
636{
637 "matrix": {
638 "numField1": ["1", "2", "3"],
639 "numField2": [4, 5, 6]
640 }
641}
642"@
643 $generateConfig = GetMatrixConfigFromJson $matrixConfigForGenerate
644 $matrix = GenerateSparseMatrix $generateconfig.matrixParameters $generateconfig.displayNamesLookup
645 $matrix[0].name | Should -Be "job_1_4"
646 $matrix[1].name | Should -Be "job_2_5"
647 $matrix[2].name | Should -Be "job_3_6"
648 }
649
650 It "Should generate a display name with null and object values" {
651 $matrix = GenerateMatrix $generateConfig "sparse"
652 $matrix[0].name | Should -Be "ubuntu1804_net461_TestObjectValueName"
653 }
654}
View as plain text