diff --git a/lib/net/imap/sequence_set.rb b/lib/net/imap/sequence_set.rb index 9bb65f59..dfd82616 100644 --- a/lib/net/imap/sequence_set.rb +++ b/lib/net/imap/sequence_set.rb @@ -788,7 +788,11 @@ def disjoint?(other) # Related: #min, #minmax, #slice def max(count = nil, star: :*) if count - slice(-[count, size].min..) || remain_frozen_empty + if cardinality <= count + frozen? ? self : dup + else + slice(-count..) || remain_frozen_empty + end elsif (val = max_num) val == STAR_INT ? star : val end diff --git a/test/net/imap/test_sequence_set.rb b/test/net/imap/test_sequence_set.rb index e0c6d6dd..db1f4b6c 100644 --- a/test/net/imap/test_sequence_set.rb +++ b/test/net/imap/test_sequence_set.rb @@ -808,6 +808,15 @@ def obj.to_sequence_set; 192_168.001_255 end assert_equal SequenceSet["678"], SequenceSet["345,678"].max(1) assert_equal SequenceSet["345,678"], SequenceSet["345,678"].max(222) assert_equal SequenceSet.empty, SequenceSet.new.max(5) + # with different cardinality (150) vs size (200) + set = SequenceSet["101:200,51:150"] + assert_equal SequenceSet["52:200"], set.max(149) + assert_equal SequenceSet["51:200"], set.max(150) + assert_equal SequenceSet["51:200"], set.max(200) + # with different cardinality (2**32) vs count (2**32 - 1) + set = SequenceSet[1..] + assert_equal SequenceSet["2:*"], set.max(2**32 - 1) + assert_equal SequenceSet["1:*"], set.max(2**32) end test "#minmax" do