Skip to content

Commit 61d5c86

Browse files
authored
Merge pull request #82 from fslaborg/daily-test-improver-matrix-range-getslice-20251023-a1a45005-c2b64734f85cd564
Daily Test Coverage Improver - Add comprehensive tests for Matrix Range-based GetSlice
2 parents 4f1b2a6 + 9b5787c commit 61d5c86

File tree

1 file changed

+211
-0
lines changed

1 file changed

+211
-0
lines changed

tests/FsMath.Tests/MatrixCoverageGapsTests.fs

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,3 +363,214 @@ module MatrixVectorAddEdgeCaseTests =
363363
let result = Matrix.addColVector mat v
364364
let expected = [|101.0; 102.0; 103.0; 204.0; 205.0; 206.0|]
365365
Assert.Equal<Vector<float>>(expected, result.Data)
366+
367+
368+
// ----------------------------------------------------------------------
369+
/// Tests for Matrix.GetSlice(Range, Range) - the F# Range-based slice syntax
370+
/// This tests the convenient mat.[r1..r2, c1..c2] syntax
371+
module MatrixRangeGetSliceTests =
372+
373+
[<Fact>]
374+
let ``GetSlice Range - full range with .. operator`` () =
375+
let mat = matrix [|
376+
[|1.0; 2.0; 3.0|]
377+
[|4.0; 5.0; 6.0|]
378+
[|7.0; 8.0; 9.0|]
379+
|]
380+
// Using 0.. to get full matrix
381+
let slice = mat.[0.., 0..]
382+
Assert.Equal(3, slice.NumRows)
383+
Assert.Equal(3, slice.NumCols)
384+
Assert.Equal<Vector<float>>([|1.0; 2.0; 3.0; 4.0; 5.0; 6.0; 7.0; 8.0; 9.0|], slice.Data)
385+
386+
[<Fact>]
387+
let ``GetSlice Range - explicit start and end indices`` () =
388+
let mat = matrix [|
389+
[|1.0; 2.0; 3.0; 4.0|]
390+
[|5.0; 6.0; 7.0; 8.0|]
391+
[|9.0; 10.0; 11.0; 12.0|]
392+
[|13.0; 14.0; 15.0; 16.0|]
393+
|]
394+
// Extract middle 2x2: mat.[1..2, 1..2]
395+
let slice = mat.[1..2, 1..2]
396+
Assert.Equal(2, slice.NumRows)
397+
Assert.Equal(2, slice.NumCols)
398+
Assert.Equal<Vector<float>>([|6.0; 7.0; 10.0; 11.0|], slice.Data)
399+
400+
[<Fact>]
401+
let ``GetSlice Range - from start to specific index`` () =
402+
let mat = matrix [|
403+
[|1.0; 2.0; 3.0; 4.0|]
404+
[|5.0; 6.0; 7.0; 8.0|]
405+
[|9.0; 10.0; 11.0; 12.0|]
406+
|]
407+
// Get first 2 rows, first 3 cols: mat.[..1, ..2]
408+
let slice = mat.[..1, ..2]
409+
Assert.Equal(2, slice.NumRows)
410+
Assert.Equal(3, slice.NumCols)
411+
Assert.Equal<Vector<float>>([|1.0; 2.0; 3.0; 5.0; 6.0; 7.0|], slice.Data)
412+
413+
[<Fact>]
414+
let ``GetSlice Range - from specific index to end`` () =
415+
let mat = matrix [|
416+
[|1.0; 2.0; 3.0|]
417+
[|4.0; 5.0; 6.0|]
418+
[|7.0; 8.0; 9.0|]
419+
|]
420+
// Get last 2 rows, last 2 cols: mat.[1.., 1..]
421+
let slice = mat.[1.., 1..]
422+
Assert.Equal(2, slice.NumRows)
423+
Assert.Equal(2, slice.NumCols)
424+
Assert.Equal<Vector<float>>([|5.0; 6.0; 8.0; 9.0|], slice.Data)
425+
426+
[<Fact>]
427+
let ``GetSlice Range - single row range`` () =
428+
let mat = matrix [|
429+
[|1.0; 2.0; 3.0|]
430+
[|4.0; 5.0; 6.0|]
431+
[|7.0; 8.0; 9.0|]
432+
|]
433+
// Extract middle row: mat.[1..1, 0..]
434+
let slice = mat.[1..1, 0..]
435+
Assert.Equal(1, slice.NumRows)
436+
Assert.Equal(3, slice.NumCols)
437+
Assert.Equal<Vector<float>>([|4.0; 5.0; 6.0|], slice.Data)
438+
439+
[<Fact>]
440+
let ``GetSlice Range - single column range`` () =
441+
let mat = matrix [|
442+
[|1.0; 2.0; 3.0|]
443+
[|4.0; 5.0; 6.0|]
444+
[|7.0; 8.0; 9.0|]
445+
|]
446+
// Extract middle column: mat.[0.., 1..1]
447+
let slice = mat.[0.., 1..1]
448+
Assert.Equal(3, slice.NumRows)
449+
Assert.Equal(1, slice.NumCols)
450+
Assert.Equal<Vector<float>>([|2.0; 5.0; 8.0|], slice.Data)
451+
452+
[<Fact>]
453+
let ``GetSlice Range - mixed start and end operators`` () =
454+
let mat = matrix [|
455+
[|1.0; 2.0; 3.0; 4.0|]
456+
[|5.0; 6.0; 7.0; 8.0|]
457+
[|9.0; 10.0; 11.0; 12.0|]
458+
[|13.0; 14.0; 15.0; 16.0|]
459+
|]
460+
// Rows from start to 2, cols from 1 to end: mat.[..2, 1..]
461+
let slice = mat.[..2, 1..]
462+
Assert.Equal(3, slice.NumRows)
463+
Assert.Equal(3, slice.NumCols)
464+
Assert.Equal<Vector<float>>([|2.0; 3.0; 4.0; 6.0; 7.0; 8.0; 10.0; 11.0; 12.0|], slice.Data)
465+
466+
[<Fact>]
467+
let ``GetSlice Range - first row only`` () =
468+
let mat = matrix [|
469+
[|1.0; 2.0; 3.0|]
470+
[|4.0; 5.0; 6.0|]
471+
[|7.0; 8.0; 9.0|]
472+
|]
473+
// First row: mat.[0..0, 0..]
474+
let slice = mat.[0..0, 0..]
475+
Assert.Equal(1, slice.NumRows)
476+
Assert.Equal(3, slice.NumCols)
477+
Assert.Equal<Vector<float>>([|1.0; 2.0; 3.0|], slice.Data)
478+
479+
[<Fact>]
480+
let ``GetSlice Range - last row only`` () =
481+
let mat = matrix [|
482+
[|1.0; 2.0; 3.0|]
483+
[|4.0; 5.0; 6.0|]
484+
[|7.0; 8.0; 9.0|]
485+
|]
486+
// Last row: mat.[2..2, 0..]
487+
let slice = mat.[2..2, 0..]
488+
Assert.Equal(1, slice.NumRows)
489+
Assert.Equal(3, slice.NumCols)
490+
Assert.Equal<Vector<float>>([|7.0; 8.0; 9.0|], slice.Data)
491+
492+
[<Fact>]
493+
let ``GetSlice Range - first column only`` () =
494+
let mat = matrix [|
495+
[|1.0; 2.0; 3.0|]
496+
[|4.0; 5.0; 6.0|]
497+
[|7.0; 8.0; 9.0|]
498+
|]
499+
// First column: mat.[0.., 0..0]
500+
let slice = mat.[0.., 0..0]
501+
Assert.Equal(3, slice.NumRows)
502+
Assert.Equal(1, slice.NumCols)
503+
Assert.Equal<Vector<float>>([|1.0; 4.0; 7.0|], slice.Data)
504+
505+
[<Fact>]
506+
let ``GetSlice Range - last column only`` () =
507+
let mat = matrix [|
508+
[|1.0; 2.0; 3.0|]
509+
[|4.0; 5.0; 6.0|]
510+
[|7.0; 8.0; 9.0|]
511+
|]
512+
// Last column: mat.[0.., 2..2]
513+
let slice = mat.[0.., 2..2]
514+
Assert.Equal(3, slice.NumRows)
515+
Assert.Equal(1, slice.NumCols)
516+
Assert.Equal<Vector<float>>([|3.0; 6.0; 9.0|], slice.Data)
517+
518+
[<Fact>]
519+
let ``GetSlice Range - tall matrix slice`` () =
520+
let mat = Matrix.init<float> 8 4 (fun i j -> float (i * 4 + j))
521+
// Get rows 2 to 5, cols 1 to 3: mat.[2..5, 1..3]
522+
let slice = mat.[2..5, 1..3]
523+
Assert.Equal(4, slice.NumRows)
524+
Assert.Equal(3, slice.NumCols)
525+
// Verify first row of slice (row 2 of original, cols 1-3)
526+
Assert.Equal(9.0, slice.[0, 0]) // mat.[2, 1]
527+
Assert.Equal(10.0, slice.[0, 1]) // mat.[2, 2]
528+
Assert.Equal(11.0, slice.[0, 2]) // mat.[2, 3]
529+
530+
[<Fact>]
531+
let ``GetSlice Range - wide matrix slice`` () =
532+
let mat = Matrix.init<float> 3 10 (fun i j -> float (i * 10 + j))
533+
// Get all rows, cols 3 to 7: mat.[0.., 3..7]
534+
let slice = mat.[0.., 3..7]
535+
Assert.Equal(3, slice.NumRows)
536+
Assert.Equal(5, slice.NumCols)
537+
// Verify first row
538+
let firstRow = slice.[0..0, 0..]
539+
Assert.Equal<Vector<float>>([|3.0; 4.0; 5.0; 6.0; 7.0|], firstRow.Data)
540+
541+
[<Fact>]
542+
let ``GetSlice Range - single element as 1x1 matrix`` () =
543+
let mat = matrix [|
544+
[|1.0; 2.0; 3.0|]
545+
[|4.0; 5.0; 6.0|]
546+
[|7.0; 8.0; 9.0|]
547+
|]
548+
// Extract center element as 1x1 matrix: mat.[1..1, 1..1]
549+
let slice = mat.[1..1, 1..1]
550+
Assert.Equal(1, slice.NumRows)
551+
Assert.Equal(1, slice.NumCols)
552+
Assert.Equal<Vector<float>>([|5.0|], slice.Data)
553+
554+
[<Fact>]
555+
let ``GetSlice Range - corner submatrices`` () =
556+
let mat = matrix [|
557+
[|1.0; 2.0; 3.0; 4.0|]
558+
[|5.0; 6.0; 7.0; 8.0|]
559+
[|9.0; 10.0; 11.0; 12.0|]
560+
[|13.0; 14.0; 15.0; 16.0|]
561+
|]
562+
// Top-left 2x2: mat.[..1, ..1]
563+
let topLeft = mat.[..1, ..1]
564+
Assert.Equal<Vector<float>>([|1.0; 2.0; 5.0; 6.0|], topLeft.Data)
565+
566+
// Top-right 2x2: mat.[..1, 2..]
567+
let topRight = mat.[..1, 2..]
568+
Assert.Equal<Vector<float>>([|3.0; 4.0; 7.0; 8.0|], topRight.Data)
569+
570+
// Bottom-left 2x2: mat.[2.., ..1]
571+
let bottomLeft = mat.[2.., ..1]
572+
Assert.Equal<Vector<float>>([|9.0; 10.0; 13.0; 14.0|], bottomLeft.Data)
573+
574+
// Bottom-right 2x2: mat.[2.., 2..]
575+
let bottomRight = mat.[2.., 2..]
576+
Assert.Equal<Vector<float>>([|11.0; 12.0; 15.0; 16.0|], bottomRight.Data)

0 commit comments

Comments
 (0)