Skip to content

Commit 2d65146

Browse files
author
Kevin Lefèvre
authored
Merge pull request #46 from klefevre/fix/mailimap_set_conversion
Fix mailimap_set conversion (+ add tests)
2 parents 6daf8a5 + 61b6618 commit 2d65146

4 files changed

Lines changed: 63 additions & 14 deletions

File tree

Postal/IMAPSession+Fetch.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,10 @@ extension IndexSet {
125125
let result: UnsafeMutablePointer<mailimap_set> = mailimap_set_new_empty()
126126

127127
rangeView.forEach { (range) in
128-
let safeLocation = UInt32(truncatingBitPattern: range.startIndex)
129-
let safeLength = UInt32(truncatingBitPattern: range.upperBound)
128+
let safeFirst = UInt32(truncatingBitPattern: range.startIndex)
129+
let safeLast = UInt32(truncatingBitPattern: range.upperBound - 1)
130130

131-
mailimap_set_add_interval(result, safeLocation, safeLength)
131+
mailimap_set_add_interval(result, safeFirst, safeLast)
132132
}
133133
return result
134134
}

Postal/Libetpan+Util.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,10 @@ extension mailimap_set {
200200
var result: IndexSet = IndexSet()
201201

202202
sequence(set_list, of: mailimap_set_item.self)
203-
.map { (item: mailimap_set_item) -> CountableRange<Int> in
204-
return Int(item.set_first)..<Int(item.set_last)
203+
.map { (item: mailimap_set_item) -> CountableClosedRange<Int> in
204+
return Int(item.set_first)...Int(item.set_last)
205205
}
206-
.forEach { (range: CountableRange<Int>) in
206+
.forEach { (range: CountableClosedRange<Int>) in
207207
result.insert(integersIn: range)
208208
}
209209
return result
@@ -213,10 +213,10 @@ extension mailimap_set {
213213
var result: [Int] = []
214214

215215
sequence(set_list, of: mailimap_set_item.self)
216-
.map { (item: mailimap_set_item) -> CountableRange<Int> in
217-
return Int(item.set_first)..<Int(item.set_last)
216+
.map { (item: mailimap_set_item) -> CountableClosedRange<Int> in
217+
return Int(item.set_first)...Int(item.set_last)
218218
}
219-
.forEach { (range: CountableRange<Int>) in
219+
.forEach { (range: CountableClosedRange<Int>) in
220220
result.append(contentsOf: range)
221221
}
222222
return result

PostalTests/IMAPSessionTests.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,21 @@ extension IMAPSessionTests {
7474
// TODO: We should test retrieved ids as well as the number of messages count
7575

7676
extension IMAPSessionTests {
77+
78+
func test_fetch_one_message_from_uid() throws {
79+
let indexSet = IndexSet(integer: 50)
80+
81+
var results = [FetchResult]()
82+
try imapSession.fetchMessages("INBOX", set: .uid(indexSet), flags: []) { results.append($0) }
83+
84+
print("1 messages:");
85+
results.forEach { print("\t\($0)") }
86+
87+
XCTAssertEqual(results.count, 1, "should have retrieved the 1 first messages")
88+
}
7789

7890
func test_fetch_ten_first_messages() throws {
79-
let indexSet = IndexSet(1..<10)
91+
let indexSet = IndexSet(1...10)
8092

8193
var results = [FetchResult]()
8294
try imapSession.fetchMessages("INBOX", set: .indexes(indexSet), flags: []) { results.append($0) }

PostalTests/LibetpanConversionTests.swift

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,21 @@ import libetpan
1212

1313
class LibetpanConversionTests: XCTestCase {
1414

15-
func test_indexset_to_imapset() {
15+
func test_indexset_to_imapset_with_one_value() {
16+
let givenIndexSet = IndexSet(integer: 50)
17+
18+
let retrievedImapSet = givenIndexSet.unreleasedMailimapSet
19+
defer { mailimap_set_free(retrievedImapSet) }
20+
21+
let retrievedImapSetSequence = sequence(retrievedImapSet.pointee.set_list, of: mailimap_set_item.self)
22+
retrievedImapSetSequence.enumerated().forEach { (offset: Int, element: mailimap_set_item) in
23+
let givenRange = givenIndexSet.rangeView[offset]
24+
XCTAssertEqual(Int(element.set_first), givenRange.lowerBound)
25+
XCTAssertEqual(Int(element.set_last), givenRange.upperBound - 1)
26+
}
27+
}
28+
29+
func test_indexset_to_imapset_with_multiple_values() {
1630
var givenIndexSet = IndexSet(1...5)
1731
givenIndexSet.remove(3)
1832

@@ -23,7 +37,7 @@ class LibetpanConversionTests: XCTestCase {
2337
retrievedImapSetSequence.enumerated().forEach { (offset: Int, element: mailimap_set_item) in
2438
let givenRange = givenIndexSet.rangeView[offset]
2539
XCTAssertEqual(Int(element.set_first), givenRange.lowerBound)
26-
XCTAssertEqual(Int(element.set_last), givenRange.upperBound)
40+
XCTAssertEqual(Int(element.set_last), givenRange.upperBound - 1)
2741
}
2842
}
2943

@@ -44,8 +58,19 @@ class LibetpanConversionTests: XCTestCase {
4458
XCTAssertEqual(element.set_last, expectedUpperBound)
4559
}
4660
}
61+
62+
func test_imapset_to_indexset_with_one_value() {
63+
let expectedIndexSet = IndexSet(integer: 42)
64+
65+
let imapSet = expectedIndexSet.unreleasedMailimapSet
66+
defer { mailimap_set_free(imapSet) }
67+
68+
let retrievedIndexSet = imapSet.pointee.indexSet
69+
70+
XCTAssertEqual(expectedIndexSet, retrievedIndexSet)
71+
}
4772

48-
func test_imapset_to_indexset() {
73+
func test_imapset_to_indexset_with_multiple_values() {
4974
var expectedIndexSet = IndexSet(1...5)
5075
expectedIndexSet.remove(3)
5176

@@ -57,7 +82,19 @@ class LibetpanConversionTests: XCTestCase {
5782
XCTAssertEqual(expectedIndexSet, retrievedIndexSet)
5883
}
5984

60-
func test_imapset_to_array() {
85+
func test_imapset_to_array_with_one_value() {
86+
let expectedIndexSet = IndexSet(integer: 42)
87+
88+
let imapSet = expectedIndexSet.unreleasedMailimapSet
89+
defer { mailimap_set_free(imapSet) }
90+
91+
let expectedArray = [42]
92+
let retrievedArray = imapSet.pointee.array
93+
94+
XCTAssertEqual(expectedArray, retrievedArray)
95+
}
96+
97+
func test_imapset_to_array_with_multiple_values() {
6198
var expectedIndexSet = IndexSet(1...5)
6299
expectedIndexSet.remove(3)
63100

0 commit comments

Comments
 (0)