From 1411ccf0e4166be75878d87aa5952d8832a605a7 Mon Sep 17 00:00:00 2001 From: Bartek Chlebek Date: Thu, 3 Dec 2015 22:27:39 +0100 Subject: [PATCH 1/4] NSString.init?(bytes: length: encoding:) implemented --- Foundation/NSString.swift | 4 +++- TestFoundation/TestNSString.swift | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Foundation/NSString.swift b/Foundation/NSString.swift index 1521ca0f85..f976d19db1 100644 --- a/Foundation/NSString.swift +++ b/Foundation/NSString.swift @@ -698,7 +698,9 @@ extension NSString { } public convenience init?(bytes: UnsafePointer, length len: Int, encoding: UInt) { - let cf = CFStringCreateWithBytes(kCFAllocatorDefault, UnsafePointer(bytes), len, CFStringConvertNSStringEncodingToEncoding(encoding), true) + guard let cf = CFStringCreateWithBytes(kCFAllocatorDefault, UnsafePointer(bytes), len, CFStringConvertNSStringEncodingToEncoding(encoding), true) else { + return nil + } self.init(cf._swiftObject) } diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift index 872ca4060d..42df73dd40 100644 --- a/TestFoundation/TestNSString.swift +++ b/TestFoundation/TestNSString.swift @@ -22,6 +22,10 @@ class TestNSString : XCTestCase { var allTests : [(String, () -> ())] { return [ ("test_BridgeConstruction", test_BridgeConstruction ), + ("test_isEqualToStringWithStringLiteral", test_isEqualToStringWithStringLiteral ), + ("test_FromASCIIData", test_FromASCIIData ), + ("test_FromUTF8Data", test_FromUTF8Data ), + ("test_FromMalformedUTF8Data", test_FromMalformedUTF8Data ), ] } @@ -42,4 +46,29 @@ class TestNSString : XCTestCase { let cluster: NSString = "✌🏾" XCTAssertEqual(cluster.length, 3) } + + func test_isEqualToStringWithStringLiteral() { + let string: NSString = "literal" + XCTAssertTrue(string.isEqualToString("literal")) + } + + func test_FromASCIIData() { + let bytes: [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74, 0x21] // "Hello Swift!" + let string = NSString(bytes: bytes, length: bytes.count, encoding: NSASCIIStringEncoding) + XCTAssertNotNil(string) + XCTAssertTrue(string!.isEqualToString("Hello Swift!")) + } + + func test_FromUTF8Data() { + let bytes: [UInt8] = [0x49, 0x20, 0xE2, 0x9D, 0xA4, 0xEF, 0xB8, 0x8F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74] // "I ❤️ Swift" + let string = NSString(bytes: bytes, length: bytes.count, encoding: NSUTF8StringEncoding) + XCTAssertNotNil(string) + XCTAssertTrue(string?.isEqualToString("I ❤️ Swift") ?? false) + } + + func test_FromMalformedUTF8Data() { + let bytes: [UInt8] = [0xFF] + let string = NSString(bytes: bytes, length: bytes.count, encoding: NSUTF8StringEncoding) + XCTAssertNil(string) + } } \ No newline at end of file From 6e3b4dd7b745a78613862ca35e729a962987929e Mon Sep 17 00:00:00 2001 From: Bartek Chlebek Date: Thu, 3 Dec 2015 22:35:53 +0100 Subject: [PATCH 2/4] NSString.init?(data: encoding:) implemented --- Foundation/NSString.swift | 2 +- TestFoundation/TestNSString.swift | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Foundation/NSString.swift b/Foundation/NSString.swift index f976d19db1..d8fefba072 100644 --- a/Foundation/NSString.swift +++ b/Foundation/NSString.swift @@ -694,7 +694,7 @@ extension NSString { } public convenience init?(data: NSData, encoding: UInt) { - NSUnimplemented() + self.init(bytes: data.bytes, length: data.length, encoding: encoding) } public convenience init?(bytes: UnsafePointer, length len: Int, encoding: UInt) { diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift index 42df73dd40..47b09f033e 100644 --- a/TestFoundation/TestNSString.swift +++ b/TestFoundation/TestNSString.swift @@ -26,6 +26,9 @@ class TestNSString : XCTestCase { ("test_FromASCIIData", test_FromASCIIData ), ("test_FromUTF8Data", test_FromUTF8Data ), ("test_FromMalformedUTF8Data", test_FromMalformedUTF8Data ), + ("test_FromASCIINSData", test_FromASCIINSData ), + ("test_FromUTF8NSData", test_FromUTF8NSData ), + ("test_FromMalformedUTF8NSData", test_FromMalformedUTF8NSData ), ] } @@ -71,4 +74,27 @@ class TestNSString : XCTestCase { let string = NSString(bytes: bytes, length: bytes.count, encoding: NSUTF8StringEncoding) XCTAssertNil(string) } + + func test_FromASCIINSData() { + let bytes: [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74, 0x21] // "Hello Swift!" + let data = NSData(bytes: bytes, length: bytes.count) + let string = NSString(data: data, encoding: NSASCIIStringEncoding) + XCTAssertNotNil(string) + XCTAssertTrue(string!.isEqualToString("Hello Swift!")) + } + + func test_FromUTF8NSData() { + let bytes: [UInt8] = [0x49, 0x20, 0xE2, 0x9D, 0xA4, 0xEF, 0xB8, 0x8F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74] // "I ❤️ Swift" + let data = NSData(bytes: bytes, length: bytes.count) + let string = NSString(data: data, encoding: NSUTF8StringEncoding) + XCTAssertNotNil(string) + XCTAssertTrue(string?.isEqualToString("I ❤️ Swift") ?? false) + } + + func test_FromMalformedUTF8NSData() { + let bytes: [UInt8] = [0xFF] + let data = NSData(bytes: bytes, length: bytes.count) + let string = NSString(data: data, encoding: NSUTF8StringEncoding) + XCTAssertNil(string) + } } \ No newline at end of file From 7199509ba38c9176732be0e047dc322f73cd4938 Mon Sep 17 00:00:00 2001 From: Bartek Chlebek Date: Thu, 3 Dec 2015 22:51:21 +0100 Subject: [PATCH 3/4] NSString.init?(CString: encoding:) implemented --- Foundation/NSString.swift | 5 ++++- TestFoundation/TestNSString.swift | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Foundation/NSString.swift b/Foundation/NSString.swift index d8fefba072..d79bc87440 100644 --- a/Foundation/NSString.swift +++ b/Foundation/NSString.swift @@ -709,7 +709,10 @@ extension NSString { } public convenience init?(CString nullTerminatedCString: UnsafePointer, encoding: UInt) { - NSUnimplemented() + guard let cf = CFStringCreateWithCString(kCFAllocatorDefault, nullTerminatedCString, CFStringConvertNSStringEncodingToEncoding(encoding)) else { + return nil + } + self.init(cf._swiftObject) } public convenience init(contentsOfURL url: NSURL, encoding enc: UInt) throws { diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift index 47b09f033e..98fde48760 100644 --- a/TestFoundation/TestNSString.swift +++ b/TestFoundation/TestNSString.swift @@ -29,6 +29,9 @@ class TestNSString : XCTestCase { ("test_FromASCIINSData", test_FromASCIINSData ), ("test_FromUTF8NSData", test_FromUTF8NSData ), ("test_FromMalformedUTF8NSData", test_FromMalformedUTF8NSData ), + ("test_FromNullTerminatedCStringInASCII", test_FromNullTerminatedCStringInASCII ), + ("test_FromNullTerminatedCStringInUTF8", test_FromNullTerminatedCStringInUTF8 ), + ("test_FromMalformedNullTerminatedCStringInUTF8", test_FromMalformedNullTerminatedCStringInUTF8 ), ] } @@ -97,4 +100,24 @@ class TestNSString : XCTestCase { let string = NSString(data: data, encoding: NSUTF8StringEncoding) XCTAssertNil(string) } + + func test_FromNullTerminatedCStringInASCII() { + let bytes: [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74, 0x21, 0x00] // "Hello Swift!" + let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSASCIIStringEncoding) + XCTAssertNotNil(string) + XCTAssertTrue(string!.isEqualToString("Hello Swift!")) + } + + func test_FromNullTerminatedCStringInUTF8() { + let bytes: [UInt8] = [0x49, 0x20, 0xE2, 0x9D, 0xA4, 0xEF, 0xB8, 0x8F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74] // "I ❤️ Swift" + let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSUTF8StringEncoding) + XCTAssertNotNil(string) + XCTAssertTrue(string?.isEqualToString("I ❤️ Swift") ?? false) + } + + func test_FromMalformedNullTerminatedCStringInUTF8() { + let bytes: [UInt8] = [0xFF, 0x00] + let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSUTF8StringEncoding) + XCTAssertNil(string) + } } \ No newline at end of file From 8d4ddce689557b9a20f35c896131cbb4fd03b419 Mon Sep 17 00:00:00 2001 From: Bartek Chlebek Date: Thu, 3 Dec 2015 23:13:38 +0100 Subject: [PATCH 4/4] Unit Tests cleanup --- TestFoundation/TestNSString.swift | 43 ++++++++++++++++++------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift index 98fde48760..3448f64506 100644 --- a/TestFoundation/TestNSString.swift +++ b/TestFoundation/TestNSString.swift @@ -22,7 +22,7 @@ class TestNSString : XCTestCase { var allTests : [(String, () -> ())] { return [ ("test_BridgeConstruction", test_BridgeConstruction ), - ("test_isEqualToStringWithStringLiteral", test_isEqualToStringWithStringLiteral ), + ("test_isEqualToStringWithSwiftString", test_isEqualToStringWithSwiftString ), ("test_FromASCIIData", test_FromASCIIData ), ("test_FromUTF8Data", test_FromUTF8Data ), ("test_FromMalformedUTF8Data", test_FromMalformedUTF8Data ), @@ -53,70 +53,77 @@ class TestNSString : XCTestCase { XCTAssertEqual(cluster.length, 3) } - func test_isEqualToStringWithStringLiteral() { + func test_isEqualToStringWithSwiftString() { let string: NSString = "literal" - XCTAssertTrue(string.isEqualToString("literal")) + let swiftString = "literal" + XCTAssertTrue(string.isEqualToString(swiftString)) } + internal let mockASCIIStringBytes: [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74, 0x21] + internal let mockASCIIString = "Hello Swift!" + internal let mockUTF8StringBytes: [UInt8] = [0x49, 0x20, 0xE2, 0x9D, 0xA4, 0xEF, 0xB8, 0x8F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74] + internal let mockUTF8String = "I ❤️ Swift" + internal let mockMalformedUTF8StringBytes: [UInt8] = [0xFF] + func test_FromASCIIData() { - let bytes: [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74, 0x21] // "Hello Swift!" + let bytes = mockASCIIStringBytes let string = NSString(bytes: bytes, length: bytes.count, encoding: NSASCIIStringEncoding) XCTAssertNotNil(string) - XCTAssertTrue(string!.isEqualToString("Hello Swift!")) + XCTAssertTrue(string?.isEqualToString(mockASCIIString) ?? false) } func test_FromUTF8Data() { - let bytes: [UInt8] = [0x49, 0x20, 0xE2, 0x9D, 0xA4, 0xEF, 0xB8, 0x8F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74] // "I ❤️ Swift" + let bytes = mockUTF8StringBytes let string = NSString(bytes: bytes, length: bytes.count, encoding: NSUTF8StringEncoding) XCTAssertNotNil(string) - XCTAssertTrue(string?.isEqualToString("I ❤️ Swift") ?? false) + XCTAssertTrue(string?.isEqualToString(mockUTF8String) ?? false) } func test_FromMalformedUTF8Data() { - let bytes: [UInt8] = [0xFF] + let bytes = mockMalformedUTF8StringBytes let string = NSString(bytes: bytes, length: bytes.count, encoding: NSUTF8StringEncoding) XCTAssertNil(string) } func test_FromASCIINSData() { - let bytes: [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74, 0x21] // "Hello Swift!" + let bytes = mockASCIIStringBytes let data = NSData(bytes: bytes, length: bytes.count) let string = NSString(data: data, encoding: NSASCIIStringEncoding) XCTAssertNotNil(string) - XCTAssertTrue(string!.isEqualToString("Hello Swift!")) + XCTAssertTrue(string?.isEqualToString(mockASCIIString) ?? false) } func test_FromUTF8NSData() { - let bytes: [UInt8] = [0x49, 0x20, 0xE2, 0x9D, 0xA4, 0xEF, 0xB8, 0x8F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74] // "I ❤️ Swift" + let bytes = mockUTF8StringBytes let data = NSData(bytes: bytes, length: bytes.count) let string = NSString(data: data, encoding: NSUTF8StringEncoding) XCTAssertNotNil(string) - XCTAssertTrue(string?.isEqualToString("I ❤️ Swift") ?? false) + XCTAssertTrue(string?.isEqualToString(mockUTF8String) ?? false) } func test_FromMalformedUTF8NSData() { - let bytes: [UInt8] = [0xFF] + let bytes = mockMalformedUTF8StringBytes let data = NSData(bytes: bytes, length: bytes.count) let string = NSString(data: data, encoding: NSUTF8StringEncoding) XCTAssertNil(string) } func test_FromNullTerminatedCStringInASCII() { - let bytes: [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74, 0x21, 0x00] // "Hello Swift!" + let bytes = mockASCIIStringBytes + [0x00] let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSASCIIStringEncoding) XCTAssertNotNil(string) - XCTAssertTrue(string!.isEqualToString("Hello Swift!")) + XCTAssertTrue(string?.isEqualToString(mockASCIIString) ?? false) } func test_FromNullTerminatedCStringInUTF8() { - let bytes: [UInt8] = [0x49, 0x20, 0xE2, 0x9D, 0xA4, 0xEF, 0xB8, 0x8F, 0x20, 0x53, 0x77, 0x69, 0x66, 0x74] // "I ❤️ Swift" + let bytes = mockUTF8StringBytes + [0x00] let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSUTF8StringEncoding) XCTAssertNotNil(string) - XCTAssertTrue(string?.isEqualToString("I ❤️ Swift") ?? false) + XCTAssertTrue(string?.isEqualToString(mockUTF8String) ?? false) } func test_FromMalformedNullTerminatedCStringInUTF8() { - let bytes: [UInt8] = [0xFF, 0x00] + let bytes = mockMalformedUTF8StringBytes + [0x00] let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSUTF8StringEncoding) XCTAssertNil(string) }