Skip to content

Commit 9cf6cfe

Browse files
committed
🐛 Fix SequenceSet#delete?(num..num) to return set
According to the rdoc, using a range with `#delete?` should return a sequence set (or nil), but the check came after importing the input, and was based on whether the imported run contained multiple values. So deleting a single number range (e.g: `1..1` or `"1:1"`) would return a number not a set.
1 parent 9b3208a commit 9cf6cfe

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

lib/net/imap/sequence_set.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1024,8 +1024,9 @@ def delete(element)
10241024
# Related: #delete, #delete_at, #subtract, #difference, #disjoint?
10251025
def delete?(element)
10261026
modifying! # short-circuit before input_to_tuple
1027+
element = input_try_convert(element)
10271028
tuple = input_to_tuple element
1028-
if tuple.first == tuple.last
1029+
if number_input?(element)
10291030
return unless include_tuple? tuple
10301031
tuple_subtract tuple
10311032
normalize!
@@ -1790,6 +1791,14 @@ def input_try_convert(input)
17901791
input
17911792
end
17921793

1794+
# NOTE: input_try_convert must be called on input first
1795+
def number_input?(input)
1796+
case input
1797+
when *STARS, Integer then true
1798+
when String then !input.include?(/[:,]/)
1799+
end
1800+
end
1801+
17931802
def range_to_tuple(range)
17941803
first = to_tuple_int(range.begin || 1)
17951804
last = to_tuple_int(range.end || :*)

test/net/imap/test_sequence_set.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,13 +813,21 @@ def obj.to_sequence_set; 192_168.001_255 end
813813

814814
test "#delete?" do
815815
set = SequenceSet.new [5..10, 20]
816+
# deleting a number
816817
assert_nil set.delete?(11)
817818
assert_equal SequenceSet[5..10, 20], set
818819
assert_equal 6, set.delete?(6)
819820
assert_equal SequenceSet[5, 7..10, 20], set
821+
# deleting a range
820822
assert_equal SequenceSet[9..10, 20], set.delete?(9..)
821823
assert_equal SequenceSet[5, 7..8], set
822824
assert_nil set.delete?(11..)
825+
set = SequenceSet.new [5..11, 20, 30..40]
826+
assert_equal SequenceSet[9..11, 20, 30..33], set.delete?(9..33)
827+
assert_equal SequenceSet[5..8, 34..40], set
828+
set = SequenceSet.new [5..11, 20, 30..40]
829+
# deleting a single-member range
830+
assert_equal SequenceSet[9], set.delete?(9..9)
823831
end
824832

825833
test "#slice!" do

0 commit comments

Comments
 (0)