Skip to content

Commit 5067da8

Browse files
author
Mykyta Zotov
committed
Feature: Enhance test coverage for RangeData and DateTime domains with edge case scenarios
1 parent 880f1d0 commit 5067da8

4 files changed

Lines changed: 557 additions & 6 deletions

File tree

TEST_COVERAGE_IMPROVEMENTS.md

Whitespace-only changes.

tests/Intervals.NET.Data.Tests/RangeDataTests.cs

Lines changed: 198 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Intervals.NET.Data.Tests.Helpers;
12
using Intervals.NET.Domain.Default.Numeric;
23
using Range = Intervals.NET.Factories.Range;
34

@@ -485,4 +486,200 @@ public void SubRangeIndexer_WithNegativeRange_ReturnsCorrectData()
485486
}
486487

487488
#endregion
488-
}
489+
490+
#region Overflow and Edge Case Tests
491+
492+
[Fact]
493+
public void PointIndexer_WithInsufficientData_ThrowsIndexOutOfRangeException()
494+
{
495+
// Arrange - Range expects 11 elements but only provide 5
496+
var range = Range.Closed<int>(0, 10);
497+
var data = new[] { 0, 1, 2, 3, 4 };
498+
var rangeData = new RangeData<int, int, IntegerFixedStepDomain>(range, data, _domain);
499+
500+
// Act & Assert - Accessing beyond available data
501+
Assert.Throws<IndexOutOfRangeException>(() => rangeData[7]);
502+
}
503+
504+
[Fact]
505+
public void TryGet_Point_WithInsufficientData_ReturnsFalse()
506+
{
507+
// Arrange - Range expects 11 elements but only provide 5
508+
var range = Range.Closed<int>(0, 10);
509+
var data = new[] { 0, 1, 2, 3, 4 };
510+
var rangeData = new RangeData<int, int, IntegerFixedStepDomain>(range, data, _domain);
511+
512+
// Act
513+
var result = rangeData.TryGet(7, out var value);
514+
515+
// Assert
516+
Assert.False(result);
517+
Assert.Equal(default, value);
518+
}
519+
520+
[Fact]
521+
public void SubRangeIndexer_WithSubRangeOutsideParentRange_ThrowsArgumentOutOfRangeException()
522+
{
523+
// Arrange
524+
var range = Range.Closed<int>(0, 10);
525+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
526+
var rangeData = new RangeData<int, int, IntegerFixedStepDomain>(range, data, _domain);
527+
528+
// Act & Assert - Sub-range extends beyond parent range
529+
var subRange = Range.Closed<int>(5, 15);
530+
Assert.Throws<ArgumentOutOfRangeException>(() => rangeData[subRange]);
531+
}
532+
533+
[Fact]
534+
public void TryGet_SubRange_WithSubRangeOutsideParentRange_ReturnsFalse()
535+
{
536+
// Arrange
537+
var range = Range.Closed<int>(0, 10);
538+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
539+
var rangeData = new RangeData<int, int, IntegerFixedStepDomain>(range, data, _domain);
540+
541+
// Act
542+
var subRange = Range.Closed<int>(5, 15);
543+
var result = rangeData.TryGet(subRange, out var resultData);
544+
545+
// Assert
546+
Assert.False(result);
547+
Assert.Null(resultData);
548+
}
549+
550+
[Fact]
551+
public void SubRangeIndexer_WithInfiniteSubRange_ThrowsArgumentException()
552+
{
553+
// Arrange
554+
var range = Range.Closed<int>(0, 10);
555+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
556+
var rangeData = new RangeData<int, int, IntegerFixedStepDomain>(range, data, _domain);
557+
558+
// Act & Assert - Sub-range with infinite end
559+
var subRange = Range.Create(new RangeValue<int>(5), RangeValue<int>.PositiveInfinity, true, false);
560+
Assert.Throws<ArgumentException>(() => rangeData[subRange]);
561+
}
562+
563+
[Fact]
564+
public void TryGet_SubRange_WithInfiniteSubRange_ReturnsFalse()
565+
{
566+
// Arrange
567+
var range = Range.Closed<int>(0, 10);
568+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
569+
var rangeData = new RangeData<int, int, IntegerFixedStepDomain>(range, data, _domain);
570+
571+
// Act
572+
var subRange = Range.Create(new RangeValue<int>(5), RangeValue<int>.PositiveInfinity, true, false);
573+
var result = rangeData.TryGet(subRange, out var resultData);
574+
575+
// Assert
576+
Assert.False(result);
577+
Assert.Null(resultData);
578+
}
579+
580+
[Fact]
581+
public void SubRangeIndexer_WithOverflowInTryGet_ThrowsInvalidOperationException()
582+
{
583+
// Arrange - Use domain that causes overflow in TryGet but not in Contains check
584+
var hugeDomain = new HugeDistanceDomainStub(((long)int.MaxValue) + 100);
585+
var range = Range.Closed<int>(0, 10);
586+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
587+
var rangeData = new RangeData<int, int, HugeDistanceDomainStub>(range, data, hugeDomain);
588+
589+
// Act & Assert - The subrange is contained, but TryGet will fail due to overflow
590+
// This triggers the InvalidOperationException fallback
591+
var subRange = Range.Closed<int>(2, 5);
592+
var exception = Assert.Throws<InvalidOperationException>(() => rangeData[subRange]);
593+
Assert.Contains("Unable to retrieve sub-range", exception.Message);
594+
}
595+
596+
[Fact]
597+
public void TryGet_Point_WithNegativeIndexFromDomain_ReturnsFalse()
598+
{
599+
// Arrange - Use domain that returns negative distance
600+
var hugeDomain = new HugeDistanceDomainStub(-100);
601+
var range = Range.Closed<int>(0, 10);
602+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
603+
var rangeData = new RangeData<int, int, HugeDistanceDomainStub>(range, data, hugeDomain);
604+
605+
// Act
606+
var result = rangeData.TryGet(5, out var value);
607+
608+
// Assert
609+
Assert.False(result);
610+
Assert.Equal(default, value);
611+
}
612+
613+
[Fact]
614+
public void TryGet_Point_WithIndexExceedingIntMax_ReturnsFalse()
615+
{
616+
// Arrange - Use domain that returns distance > int.MaxValue
617+
var hugeDomain = new HugeDistanceDomainStub(long.MaxValue);
618+
var range = Range.Closed<int>(0, 10);
619+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
620+
var rangeData = new RangeData<int, int, HugeDistanceDomainStub>(range, data, hugeDomain);
621+
622+
// Act
623+
var result = rangeData.TryGet(5, out var value);
624+
625+
// Assert
626+
Assert.False(result);
627+
Assert.Equal(default, value);
628+
}
629+
630+
[Fact]
631+
public void TryGet_SubRange_WithStartIndexExceedingIntMax_ReturnsFalse()
632+
{
633+
// Arrange - Use domain that returns huge distances
634+
var hugeDomain = new HugeDistanceDomainStub(((long)int.MaxValue) + 100);
635+
var range = Range.Closed<int>(0, 10);
636+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
637+
var rangeData = new RangeData<int, int, HugeDistanceDomainStub>(range, data, hugeDomain);
638+
639+
// Act
640+
var subRange = Range.Closed<int>(2, 5);
641+
var result = rangeData.TryGet(subRange, out var resultData);
642+
643+
// Assert
644+
Assert.False(result);
645+
Assert.Null(resultData);
646+
}
647+
648+
[Fact]
649+
public void TryGet_SubRange_WithNegativeStartIndex_ReturnsFalse()
650+
{
651+
// Arrange - Use domain that returns negative distance
652+
var hugeDomain = new HugeDistanceDomainStub(-50);
653+
var range = Range.Closed<int>(0, 10);
654+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
655+
var rangeData = new RangeData<int, int, HugeDistanceDomainStub>(range, data, hugeDomain);
656+
657+
// Act
658+
var subRange = Range.Closed<int>(2, 5);
659+
var result = rangeData.TryGet(subRange, out var resultData);
660+
661+
// Assert
662+
Assert.False(result);
663+
Assert.Null(resultData);
664+
}
665+
666+
[Fact]
667+
public void TryGet_SubRange_WithEndIndexExceedingIntMax_ReturnsFalse()
668+
{
669+
// Arrange - Use domain that returns huge distance for endIndex
670+
var hugeDomain = new HugeDistanceDomainStub(((long)int.MaxValue) + 100);
671+
var range = Range.Closed<int>(0, 10);
672+
var data = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
673+
var rangeData = new RangeData<int, int, HugeDistanceDomainStub>(range, data, hugeDomain);
674+
675+
// Act - Both start and end indices will exceed int.MaxValue
676+
var subRange = Range.Closed<int>(2, 5);
677+
var result = rangeData.TryGet(subRange, out var resultData);
678+
679+
// Assert
680+
Assert.False(result);
681+
Assert.Null(resultData);
682+
}
683+
684+
#endregion
685+
}

0 commit comments

Comments
 (0)