1+ using Intervals . NET . Data . Tests . Helpers ;
12using Intervals . NET . Domain . Default . Numeric ;
23using 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