@@ -865,7 +865,7 @@ def test_respects_other_range_boundaries(self, other):
865865
866866 def test_doesnt_extend_union (self ):
867867 """
868- A union of ranges should be longer than the sum of it's parts.
868+ A union of ranges should not be longer than the sum of it's parts.
869869 """
870870 # This is a weird test to include, it is added because this feels like an
871871 # obvious risk with the implementation I have used.
@@ -886,6 +886,92 @@ def test_finite_range(self):
886886
887887 assert 3 in subject
888888
889+ class TestDifference :
890+ def test_range_sets_overlap (self ):
891+ range_set = ranges .RangeSet (
892+ [
893+ ranges .FiniteDateRange (
894+ start = datetime .date (2024 , 10 , 1 ),
895+ end = datetime .date (2024 , 10 , 31 ),
896+ )
897+ ]
898+ )
899+ other = ranges .RangeSet (
900+ [
901+ ranges .FiniteDateRange (
902+ start = datetime .date (2024 , 10 , 1 ),
903+ end = datetime .date (2024 , 10 , 15 ),
904+ )
905+ ]
906+ )
907+ difference = range_set .difference (other )
908+
909+ assert difference == ranges .RangeSet (
910+ [
911+ ranges .FiniteDateRange (
912+ start = datetime .date (2024 , 10 , 15 ),
913+ end = datetime .date (2024 , 10 , 31 ),
914+ )
915+ ]
916+ )
917+
918+ def test_range_sets_overlap_multiple_ranges (self ):
919+ range_set = ranges .RangeSet (
920+ [
921+ ranges .FiniteDateRange (
922+ start = datetime .date (2024 , 10 , 1 ),
923+ end = datetime .date (2024 , 10 , 31 ),
924+ ),
925+ ranges .FiniteDateRange (
926+ start = datetime .date (2024 , 11 , 1 ),
927+ end = datetime .date (2024 , 11 , 30 ),
928+ ),
929+ ]
930+ )
931+ other = ranges .RangeSet (
932+ [
933+ ranges .FiniteDateRange (
934+ start = datetime .date (2024 , 10 , 15 ),
935+ end = datetime .date (2024 , 11 , 15 ),
936+ )
937+ ]
938+ )
939+
940+ difference = range_set .difference (other )
941+
942+ assert difference == ranges .RangeSet (
943+ [
944+ ranges .FiniteDateRange (
945+ start = datetime .date (2024 , 10 , 1 ),
946+ end = datetime .date (2024 , 10 , 15 ),
947+ ),
948+ ranges .FiniteDateRange (
949+ start = datetime .date (2024 , 11 , 15 ),
950+ end = datetime .date (2024 , 11 , 30 ),
951+ ),
952+ ]
953+ )
954+
955+ def test_difference_does_not_overlap (self ):
956+ range_set = ranges .RangeSet (
957+ [
958+ ranges .FiniteDateRange (
959+ start = datetime .date (2024 , 1 , 1 ),
960+ end = datetime .date (2024 , 1 , 31 ),
961+ )
962+ ]
963+ )
964+ other = ranges .RangeSet (
965+ [
966+ ranges .FiniteDateRange (
967+ start = datetime .date (2024 , 3 , 1 ),
968+ end = datetime .date (2024 , 3 , 31 ),
969+ )
970+ ]
971+ )
972+ difference = range_set .difference (other )
973+ assert difference == range_set
974+
889975
890976class TestAsFiniteDatetimePeriods :
891977 def test_converts (self ):
0 commit comments