Skip to content

Commit 225bc35

Browse files
authored
Merge pull request #2265 from weissi/jw-backport-2219
2 parents 7cffb13 + ba2a720 commit 225bc35

File tree

2 files changed

+63
-8
lines changed

2 files changed

+63
-8
lines changed

Foundation/DateFormatter.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ open class DateFormatter : Formatter {
2121
let dateStyle = CFDateFormatterStyle(self.dateStyle.rawValue)
2222
let timeStyle = CFDateFormatterStyle(self.timeStyle.rawValue)
2323
#endif
24-
24+
2525
let obj = CFDateFormatterCreate(kCFAllocatorSystemDefault, locale._cfObject, dateStyle, timeStyle)!
2626
_setFormatterAttributes(obj)
2727
if let dateFormat = _dateFormat {
@@ -139,7 +139,7 @@ open class DateFormatter : Formatter {
139139
open var dateFormat: String! {
140140
get {
141141
guard let format = _dateFormat else {
142-
return __cfObject.map { CFDateFormatterGetFormat($0)._swiftObject } ?? ""
142+
return CFDateFormatterGetFormat(_cfObject)._swiftObject
143143
}
144144
return format
145145
}
@@ -152,18 +152,12 @@ open class DateFormatter : Formatter {
152152
willSet {
153153
_dateFormat = nil
154154
}
155-
didSet {
156-
_dateFormat = CFDateFormatterGetFormat(_cfObject)._swiftObject
157-
}
158155
}
159156

160157
open var timeStyle: Style = .none {
161158
willSet {
162159
_dateFormat = nil
163160
}
164-
didSet {
165-
_dateFormat = CFDateFormatterGetFormat(_cfObject)._swiftObject
166-
}
167161
}
168162

169163
/*@NSCopying*/ internal var _locale: Locale? { willSet { _reset() } }

TestFoundation/TestDateFormatter.swift

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class TestDateFormatter: XCTestCase {
2828
("test_expectedTimeZone", test_expectedTimeZone),
2929
("test_dateFrom", test_dateFrom),
3030
("test_dateParseAndFormatWithJapaneseCalendar", test_dateParseAndFormatWithJapaneseCalendar),
31+
("test_orderOfPropertySetters", test_orderOfPropertySetters),
3132
]
3233
}
3334

@@ -443,4 +444,64 @@ class TestDateFormatter: XCTestCase {
443444
let dateString = formatter.string(from: Date(timeIntervalSince1970: 1556633400)) // April 30, 2019, 11:10 PM (JST)
444445
XCTAssertEqual(dateString, "平成31年4月30日 23:10")
445446
}
447+
448+
func test_orderOfPropertySetters() throws {
449+
450+
// This produces a .count factorial number of arrays
451+
func combinations<T>(of a: [T]) -> [[T]] {
452+
precondition(!a.isEmpty)
453+
if a.count == 1 { return [a] }
454+
if a.count == 2 { return [ [a[0], a[1]], [ a[1], a[0]] ] }
455+
456+
var result: [[T]] = []
457+
458+
for idx in a.startIndex..<a.endIndex {
459+
let x = a[idx]
460+
var b: [T] = a
461+
b.remove(at: idx)
462+
463+
for var c in combinations(of: b) {
464+
c.append(x)
465+
result.append(c)
466+
}
467+
}
468+
return result
469+
}
470+
471+
let formatter = DateFormatter()
472+
formatter.timeZone = TimeZone(identifier: "CET")
473+
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
474+
let date = try formatter.date(from: "2019-05-05T12:52:10").unwrapped()
475+
476+
let applySettings: [(String, (DateFormatter) -> Void)] =
477+
[(".timeZone", {
478+
$0.timeZone = TimeZone(identifier: "Europe/Oslo")
479+
}),
480+
(".calendar", {
481+
$0.calendar = Calendar(identifier: .gregorian)
482+
}),
483+
(".locale", {
484+
$0.locale = Locale(identifier: "nb")
485+
}),
486+
(".dateStyle", {
487+
$0.dateStyle = .medium
488+
}),
489+
(".timeStyle", {
490+
$0.timeStyle = .medium
491+
})
492+
]
493+
494+
// Test all of the combinations of setting the properties produces the same output
495+
let expected = "5. mai 2019, 12:52:10"
496+
for settings in combinations(of: applySettings) {
497+
let f = DateFormatter()
498+
settings.forEach { $0.1(f) }
499+
XCTAssertEqual(f.dateFormat, "d. MMM y, HH:mm:ss")
500+
let formattedString = f.string(from: date)
501+
if formattedString != expected {
502+
let applied = settings.map { $0.0 }.joined(separator: ",")
503+
XCTFail("\(formattedString) != \(expected) using settings applied in order \(applied)")
504+
}
505+
}
506+
}
446507
}

0 commit comments

Comments
 (0)