Skip to content

Commit e0f997c

Browse files
authored
🔀 Merge pull request #461 from ruby/backport/v0.4-seqset-bugfixes
🐛 Backport v0.4 SequenceSet bugfixes
2 parents 5b8f9ae + 06fb071 commit e0f997c

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

lib/net/imap/sequence_set.rb

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ def &(other)
676676
#
677677
# <tt>(seqset ^ other)</tt> is equivalent to <tt>((seqset | other) -
678678
# (seqset & other))</tt>.
679-
def ^(other) remain_frozen (self | other).subtract(self & other) end
679+
def ^(other) remain_frozen (dup | other).subtract(self & other) end
680680
alias xor :^
681681

682682
# :call-seq:
@@ -1245,14 +1245,18 @@ def slice_length(start, length)
12451245
def slice_range(range)
12461246
first = range.begin || 0
12471247
last = range.end || -1
1248-
last -= 1 if range.exclude_end? && range.end && last != STAR_INT
1248+
if range.exclude_end?
1249+
return remain_frozen_empty if last.zero?
1250+
last -= 1 if range.end && last != STAR_INT
1251+
end
12491252
if (first * last).positive? && last < first
1250-
SequenceSet.empty
1253+
remain_frozen_empty
12511254
elsif (min = at(first))
12521255
max = at(last)
1256+
max = :* if max.nil?
12531257
if max == :* then self & (min..)
12541258
elsif min <= max then self & (min..max)
1255-
else SequenceSet.empty
1259+
else remain_frozen_empty
12561260
end
12571261
end
12581262
end
@@ -1380,6 +1384,7 @@ def send_data(imap, tag) # :nodoc:
13801384
private
13811385

13821386
def remain_frozen(set) frozen? ? set.freeze : set end
1387+
def remain_frozen_empty; frozen? ? SequenceSet.empty : SequenceSet.new end
13831388

13841389
# frozen clones are shallow copied
13851390
def initialize_clone(other)

test/net/imap/test_sequence_set.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,34 @@ def compare_to_reference_set(nums, set, seqset)
8383
end
8484
end
8585

86+
data "#slice(length)", {transform: ->{ _1.slice(0, 10) }, }
87+
data "#slice(range)", {transform: ->{ _1.slice(0...10) }, }
88+
data "#slice => empty", {transform: ->{ _1.slice(0...0) }, }
89+
data "#slice => empty", {transform: ->{ _1.slice(10..9) }, }
90+
data "#union", {transform: ->{ _1 | (1..100) }, }
91+
data "#intersection", {transform: ->{ _1 & (1..100) }, }
92+
data "#difference", {transform: ->{ _1 - (1..100) }, }
93+
data "#xor", {transform: ->{ _1 ^ (1..100) }, }
94+
data "#complement", {transform: ->{ ~_1 }, }
95+
data "#normalize", {transform: ->{ _1.normalize }, }
96+
data "#limit", {transform: ->{ _1.limit(max: 22) }, freeze: :always }
97+
data "#limit => empty", {transform: ->{ _1.limit(max: 1) }, freeze: :always }
98+
test "transforms keep frozen status" do |data|
99+
transform = data.fetch(:transform)
100+
set = SequenceSet.new("2:4,7:11,99,999")
101+
dup = set.dup
102+
result = transform.to_proc.(set)
103+
assert_equal dup, set, "transform should not modified"
104+
if data[:freeze] == :always
105+
assert result.frozen?, "this transform always returns frozen"
106+
else
107+
refute result.frozen?, "transform of non-frozen returned frozen"
108+
end
109+
set.freeze
110+
result = transform.to_proc.(set)
111+
assert result.frozen?, "transform of frozen returned non-frozen"
112+
end
113+
86114
%i[clone dup].each do |method|
87115
test "##{method}" do
88116
orig = SequenceSet.new "2:4,7:11,99,999"
@@ -265,6 +293,9 @@ def obj.to_sequence_set; 192_168.001_255 end
265293
SequenceSet[((1..10_000) % 10).to_a][-5, 4]
266294
assert_nil SequenceSet[111..222, 888..999][2000, 4]
267295
assert_nil SequenceSet[111..222, 888..999][-2000, 4]
296+
# with length longer than the remaining members
297+
assert_equal SequenceSet[101...200],
298+
SequenceSet[1...200][100, 10000]
268299
end
269300

270301
test "#[range]" do
@@ -286,9 +317,13 @@ def obj.to_sequence_set; 192_168.001_255 end
286317
assert_equal SequenceSet.empty, SequenceSet[1..100][-50..-60]
287318
assert_equal SequenceSet.empty, SequenceSet[1..100][-10..10]
288319
assert_equal SequenceSet.empty, SequenceSet[1..100][60..-60]
320+
assert_equal SequenceSet.empty, SequenceSet[1..100][10...0]
321+
assert_equal SequenceSet.empty, SequenceSet[1..100][0...0]
289322
assert_nil SequenceSet.empty[2..4]
290323
assert_nil SequenceSet[101..200][1000..1060]
291324
assert_nil SequenceSet[101..200][-1000..-60]
325+
# with length longer than the remaining members
326+
assert_equal SequenceSet[101..1111], SequenceSet[1..1111][100..999_999]
292327
end
293328

294329
test "#find_index" do

0 commit comments

Comments
 (0)