Merge pull request #928 from mohitathwani/String_used_encoding

diff --git a/Foundation/NSString.swift b/Foundation/NSString.swift
index 5b43cf5..351187d 100644
--- a/Foundation/NSString.swift
+++ b/Foundation/NSString.swift
@@ -1261,12 +1261,18 @@
         let readResult = try NSData(contentsOf: url, options:[])
 
         let bytePtr = readResult.bytes.bindMemory(to: UInt8.self, capacity:readResult.length)
-        if readResult.length >= 2 && bytePtr[0] == 254 && bytePtr[1] == 255 {
+        if readResult.length >= 4 && bytePtr[0] == 0xFF && bytePtr[1] == 0xFE && bytePtr[2] == 0x00 && bytePtr[3] == 0x00 {
+          enc?.pointee = String.Encoding.utf32LittleEndian.rawValue
+        }
+        else if readResult.length >= 2 && bytePtr[0] == 0xFE && bytePtr[1] == 0xFF {
           enc?.pointee = String.Encoding.utf16BigEndian.rawValue
         }
-        else if readResult.length >= 2 && bytePtr[0] == 255 && bytePtr[1] == 254 {
+        else if readResult.length >= 2 && bytePtr[0] == 0xFF && bytePtr[1] == 0xFE {
           enc?.pointee = String.Encoding.utf16LittleEndian.rawValue
         }
+        else if readResult.length >= 4 && bytePtr[0] == 0x00 && bytePtr[1] == 0x00 && bytePtr[2] == 0xFE && bytePtr[3] == 0xFF {
+          enc?.pointee = String.Encoding.utf32BigEndian.rawValue
+        }
         else {
           //Need to work on more conditions. This should be the default
           enc?.pointee = String.Encoding.utf8.rawValue
diff --git a/TestFoundation/Resources/NSString-UTF32-BE-data.txt b/TestFoundation/Resources/NSString-UTF32-BE-data.txt
new file mode 100644
index 0000000..cbfab45
--- /dev/null
+++ b/TestFoundation/Resources/NSString-UTF32-BE-data.txt
Binary files differ
diff --git a/TestFoundation/Resources/NSString-UTF32-LE-data.txt b/TestFoundation/Resources/NSString-UTF32-LE-data.txt
new file mode 100644
index 0000000..d658a1f
--- /dev/null
+++ b/TestFoundation/Resources/NSString-UTF32-LE-data.txt
Binary files differ
diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift
index 85dac2a..56e34fe 100644
--- a/TestFoundation/TestNSString.swift
+++ b/TestFoundation/TestNSString.swift
@@ -68,6 +68,8 @@
             ("test_FromContentsOfURL",test_FromContentsOfURL),
             ("test_FromContentsOfURLUsedEncodingUTF16BE", test_FromContentsOfURLUsedEncodingUTF16BE),
             ("test_FromContentsOfURLUsedEncodingUTF16LE", test_FromContentsOfURLUsedEncodingUTF16LE),
+            ("test_FromContentsOfURLUsedEncodingUTF32BE", test_FromContentsOfURLUsedEncodingUTF32BE),
+            ("test_FromContentsOfURLUsedEncodingUTF32LE", test_FromContentsOfURLUsedEncodingUTF32LE),
             ("test_FromContentOfFile",test_FromContentOfFile),
             ("test_swiftStringUTF16", test_swiftStringUTF16),
             // This test takes forever on build servers; it has been seen up to 1852.084 seconds
@@ -334,6 +336,38 @@
       }
     }
 
+    func test_FromContentsOfURLUsedEncodingUTF32BE() {
+      guard let testFileURL = testBundle().url(forResource: "NSString-UTF32-BE-data", withExtension: "txt") else {
+        XCTFail("URL for NSString-UTF32-BE-data.txt is nil")
+        return
+      }
+
+      do {
+         var encoding: UInt = 0
+         let string = try NSString(contentsOf: testFileURL, usedEncoding: &encoding)
+         XCTAssertEqual(string, "NSString fromURL usedEncoding test with UTF32 BE file", "Wrong result when reading UTF32BE file")
+         XCTAssertEqual(encoding, String.Encoding.utf32BigEndian.rawValue, "Wrong encoding detected from UTF32BE file")
+      } catch {
+          XCTFail("Unable to init NSString from contentOf:usedEncoding:")
+      }
+    }
+
+    func test_FromContentsOfURLUsedEncodingUTF32LE() {
+      guard let testFileURL = testBundle().url(forResource: "NSString-UTF32-LE-data", withExtension: "txt") else {
+        XCTFail("URL for NSString-UTF32-LE-data.txt is nil")
+        return
+      }
+
+      do {
+         var encoding: UInt = 0
+         let string = try NSString(contentsOf: testFileURL, usedEncoding: &encoding)
+         XCTAssertEqual(string, "NSString fromURL usedEncoding test with UTF32 LE file", "Wrong result when reading UTF32LE file")
+         XCTAssertEqual(encoding, String.Encoding.utf32LittleEndian.rawValue, "Wrong encoding detected from UTF32LE file")
+      } catch {
+          XCTFail("Unable to init NSString from contentOf:usedEncoding:")
+      }
+    }
+
     func test_FromContentOfFile() {
         let testFilePath = testBundle().path(forResource: "NSStringTestData", ofType: "txt")
         XCTAssertNotNil(testFilePath)
diff --git a/build.py b/build.py
index 1c0c080..4e34e37 100644
--- a/build.py
+++ b/build.py
@@ -469,6 +469,8 @@
     'TestFoundation/Resources/NSStringTestData.txt',
     'TestFoundation/Resources/NSString-UTF16-BE-data.txt',
     'TestFoundation/Resources/NSString-UTF16-LE-data.txt',
+    'TestFoundation/Resources/NSString-UTF32-BE-data.txt',
+    'TestFoundation/Resources/NSString-UTF32-LE-data.txt',
     'TestFoundation/Resources/NSXMLDocumentTestData.xml',
     'TestFoundation/Resources/PropertyList-1.0.dtd',
     'TestFoundation/Resources/NSXMLDTDTestData.xml',