@@ -588,6 +588,129 @@ public static void TestCompositeRangeWithValues()
588588 AreEqual ( compositeRange4 , compositeRange . WithoutKeys ( ) ) ;
589589 }
590590
591+ [ Test ]
592+ public static void TestCompositeRangeExclusiveWithOrWithoutKeys ( )
593+ {
594+ var compositeRange = Enumerable
595+ . Range ( 1 , 2 )
596+ . ToCompositeRangeExclusive ( i => i - 1 , i => i + 1 ) ;
597+ AreEqual ( compositeRange . ToString ( ) , "(0..3): { '1':(0..2); '2':(1..3) }" ) ;
598+
599+ var compositeRange2 = compositeRange . WithKeys ( i => "A" + i ) ;
600+ AreEqual ( compositeRange2 . ToString ( ) , "(0..3): { 'A1':(0..2); 'A2':(1..3) }" ) ;
601+
602+ var compositeRange3 = compositeRange2 . WithoutKeys ( ) ;
603+ AreEqual ( compositeRange3 . ToString ( ) , "(0..3): { (0..2); (1..3) }" ) ;
604+
605+ var compositeRange4 = compositeRange3 . WithKeys ( "A" ) ;
606+ AreEqual ( compositeRange4 . ToString ( ) , "(0..3): { 'A':(0..2); 'A':(1..3) }" ) ;
607+
608+ var compositeRange5 = compositeRange4 . WithKeys ( "B" ) ;
609+ AreEqual ( compositeRange5 . ToString ( ) , "(0..3): { 'B':(0..2); 'B':(1..3) }" ) ;
610+ }
611+
612+ [ Test ]
613+ public static void TestCompositeRangeExclusiveWithValues ( )
614+ {
615+ var compositeRange = Enumerable
616+ . Range ( 1 , 2 )
617+ . ToCompositeRangeExclusive ( i => i - 1 , i => i + 1 ) ;
618+ AreEqual ( compositeRange . ToString ( ) , "(0..3): { '1':(0..2); '2':(1..3) }" ) ;
619+
620+ var compositeRange2 = compositeRange . WithValues ( i => "A" + i ) ;
621+ AreEqual ( compositeRange2 . ToString ( ) , "(A0..A3): { '1':(A0..A2); '2':(A1..A3) }" ) ;
622+
623+ var compositeRange3 = compositeRange2 . WithValues ( i => i , i => "B" + i . Substring ( 1 ) ) ;
624+ AreEqual ( compositeRange3 . ToString ( ) , "(A0..B3): { '1':(A0..B2); '2':(A1..B3) }" ) ;
625+
626+ var compositeRange4 = compositeRange3 . WithoutKeys ( ) . WithValues ( i => int . Parse ( i . Substring ( 1 ) ) ) ;
627+ AreEqual ( compositeRange4 . ToString ( ) , "(0..3): { (0..2); (1..3) }" ) ;
628+
629+ AreEqual ( compositeRange4 , compositeRange . WithoutKeys ( ) ) ;
630+ }
631+
632+ [ Test ]
633+ public static void TestCompositeRangeExclusiveFromWithOrWithoutKeys ( )
634+ {
635+ var compositeRange = Enumerable
636+ . Range ( 1 , 2 )
637+ . ToCompositeRangeExclusiveFrom ( i => i - 1 , i => i + 1 ) ;
638+ AreEqual ( compositeRange . ToString ( ) , "(0..3]: { '1':(0..2]; '2':(1..3] }" ) ;
639+
640+ var compositeRange2 = compositeRange . WithKeys ( i => "A" + i ) ;
641+ AreEqual ( compositeRange2 . ToString ( ) , "(0..3]: { 'A1':(0..2]; 'A2':(1..3] }" ) ;
642+
643+ var compositeRange3 = compositeRange2 . WithoutKeys ( ) ;
644+ AreEqual ( compositeRange3 . ToString ( ) , "(0..3]: { (0..2]; (1..3] }" ) ;
645+
646+ var compositeRange4 = compositeRange3 . WithKeys ( "A" ) ;
647+ AreEqual ( compositeRange4 . ToString ( ) , "(0..3]: { 'A':(0..2]; 'A':(1..3] }" ) ;
648+
649+ var compositeRange5 = compositeRange4 . WithKeys ( "B" ) ;
650+ AreEqual ( compositeRange5 . ToString ( ) , "(0..3]: { 'B':(0..2]; 'B':(1..3] }" ) ;
651+ }
652+
653+ [ Test ]
654+ public static void TestCompositeRangeExclusiveFromWithValues ( )
655+ {
656+ var compositeRange = Enumerable
657+ . Range ( 1 , 2 )
658+ . ToCompositeRangeExclusiveFrom ( i => i - 1 , i => i + 1 ) ;
659+ AreEqual ( compositeRange . ToString ( ) , "(0..3]: { '1':(0..2]; '2':(1..3] }" ) ;
660+
661+ var compositeRange2 = compositeRange . WithValues ( i => "A" + i ) ;
662+ AreEqual ( compositeRange2 . ToString ( ) , "(A0..A3]: { '1':(A0..A2]; '2':(A1..A3] }" ) ;
663+
664+ var compositeRange3 = compositeRange2 . WithValues ( i => i , i => "B" + i . Substring ( 1 ) ) ;
665+ AreEqual ( compositeRange3 . ToString ( ) , "(A0..B3]: { '1':(A0..B2]; '2':(A1..B3] }" ) ;
666+
667+ var compositeRange4 = compositeRange3 . WithoutKeys ( ) . WithValues ( i => int . Parse ( i . Substring ( 1 ) ) ) ;
668+ AreEqual ( compositeRange4 . ToString ( ) , "(0..3]: { (0..2]; (1..3] }" ) ;
669+
670+ AreEqual ( compositeRange4 , compositeRange . WithoutKeys ( ) ) ;
671+ }
672+
673+ [ Test ]
674+ public static void TestCompositeRangeExclusiveToWithOrWithoutKeys ( )
675+ {
676+ var compositeRange = Enumerable
677+ . Range ( 1 , 2 )
678+ . ToCompositeRangeExclusiveTo ( i => i - 1 , i => i + 1 ) ;
679+ AreEqual ( compositeRange . ToString ( ) , "[0..3): { '1':[0..2); '2':[1..3) }" ) ;
680+
681+ var compositeRange2 = compositeRange . WithKeys ( i => "A" + i ) ;
682+ AreEqual ( compositeRange2 . ToString ( ) , "[0..3): { 'A1':[0..2); 'A2':[1..3) }" ) ;
683+
684+ var compositeRange3 = compositeRange2 . WithoutKeys ( ) ;
685+ AreEqual ( compositeRange3 . ToString ( ) , "[0..3): { [0..2); [1..3) }" ) ;
686+
687+ var compositeRange4 = compositeRange3 . WithKeys ( "A" ) ;
688+ AreEqual ( compositeRange4 . ToString ( ) , "[0..3): { 'A':[0..2); 'A':[1..3) }" ) ;
689+
690+ var compositeRange5 = compositeRange4 . WithKeys ( "B" ) ;
691+ AreEqual ( compositeRange5 . ToString ( ) , "[0..3): { 'B':[0..2); 'B':[1..3) }" ) ;
692+ }
693+
694+ [ Test ]
695+ public static void TestCompositeRangeExclusiveToWithValues ( )
696+ {
697+ var compositeRange = Enumerable
698+ . Range ( 1 , 2 )
699+ . ToCompositeRangeExclusiveTo ( i => i - 1 , i => i + 1 ) ;
700+ AreEqual ( compositeRange . ToString ( ) , "[0..3): { '1':[0..2); '2':[1..3) }" ) ;
701+
702+ var compositeRange2 = compositeRange . WithValues ( i => "A" + i ) ;
703+ AreEqual ( compositeRange2 . ToString ( ) , "[A0..A3): { '1':[A0..A2); '2':[A1..A3) }" ) ;
704+
705+ var compositeRange3 = compositeRange2 . WithValues ( i => i , i => "B" + i . Substring ( 1 ) ) ;
706+ AreEqual ( compositeRange3 . ToString ( ) , "[A0..B3): { '1':[A0..B2); '2':[A1..B3) }" ) ;
707+
708+ var compositeRange4 = compositeRange3 . WithoutKeys ( ) . WithValues ( i => int . Parse ( i . Substring ( 1 ) ) ) ;
709+ AreEqual ( compositeRange4 . ToString ( ) , "[0..3): { [0..2); [1..3) }" ) ;
710+
711+ AreEqual ( compositeRange4 , compositeRange . WithoutKeys ( ) ) ;
712+ }
713+
591714 [ Test ]
592715 [ TestCase (
593716 "∅" ,
0 commit comments