@@ -1902,6 +1902,95 @@ extension DataTests {
1902
1902
)
1903
1903
}
1904
1904
1905
+ func test_base64Decode_emptyString( ) {
1906
+ XCTAssertEqual ( Data ( ) , Data ( base64Encoded: " " ) )
1907
+ }
1908
+
1909
+ func test_base64Decode_emptyData( ) {
1910
+ XCTAssertEqual ( Data ( ) , Data ( base64Encoded: Data ( ) ) )
1911
+ }
1912
+
1913
+ func test_base64Decode_arrayOfNulls( ) {
1914
+ XCTAssertEqual ( Data ( repeating: 0 , count: 10 ) , Data ( base64Encoded: " AAAAAAAAAAAAAA== " ) )
1915
+ }
1916
+
1917
+ func test_base64Decode_AllTheBytesSequentially( ) {
1918
+ let base64 = " AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w== "
1919
+
1920
+ XCTAssertEqual ( Data ( UInt8 ( 0 ) ... UInt8 ( 255 ) ) , Data ( base64Encoded: base64) )
1921
+ }
1922
+
1923
+ func test_base64Decode_ignoringLineBreaks( ) {
1924
+ let base64 = """
1925
+ TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Np \r \n \
1926
+ bmcgZWxpdC4gVXQgYXQgdGluY2lkdW50IGFyY3UuIFN1c3BlbmRpc3NlIG5lYyBz \r \n \
1927
+ b2RhbGVzIGVyYXQsIHNpdCBhbWV0IGltcGVyZGlldCBpcHN1bS4gRXRpYW0gc2Vk \r \n \
1928
+ IG9ybmFyZSBmZWxpcy4=
1929
+ """
1930
+ let expected = """
1931
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut at tincidunt arcu. Suspendisse nec sodales erat, sit amet imperdiet ipsum. Etiam sed ornare felis.
1932
+ """
1933
+
1934
+ XCTAssertEqual ( Data ( expected. utf8) , Data ( base64Encoded: base64, options: . ignoreUnknownCharacters) )
1935
+ }
1936
+
1937
+ func test_base64Decode_invalidLength( ) {
1938
+ XCTAssertNil ( Data ( base64Encoded: " AAAAA " ) )
1939
+ XCTAssertNil ( Data ( base64Encoded: " AAAAA " , options: . ignoreUnknownCharacters) )
1940
+ }
1941
+
1942
+ func test_base64Decode_variousPaddingNeeds( ) {
1943
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQIDBA== " ) )
1944
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQIDBAU= " ) )
1945
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQIDBAUG " ) )
1946
+ }
1947
+
1948
+ func test_base64Decode_ignoreWhitespaceAtVariousPlaces( ) {
1949
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQIDBA== " , options: . ignoreUnknownCharacters) )
1950
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " A QIDBA== " , options: . ignoreUnknownCharacters) )
1951
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQ IDBA== " , options: . ignoreUnknownCharacters) )
1952
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQI DBA== " , options: . ignoreUnknownCharacters) )
1953
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQID BA== " , options: . ignoreUnknownCharacters) )
1954
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQIDB A== " , options: . ignoreUnknownCharacters) )
1955
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQIDBA == " , options: . ignoreUnknownCharacters) )
1956
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQIDBA= = " , options: . ignoreUnknownCharacters) )
1957
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 ] ) , Data ( base64Encoded: " AQIDBA== " , options: . ignoreUnknownCharacters) )
1958
+
1959
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQIDBAU= " , options: . ignoreUnknownCharacters) )
1960
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " A QIDBAU= " , options: . ignoreUnknownCharacters) )
1961
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQ IDBAU= " , options: . ignoreUnknownCharacters) )
1962
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQI DBAU= " , options: . ignoreUnknownCharacters) )
1963
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQID BAU= " , options: . ignoreUnknownCharacters) )
1964
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQIDB AU= " , options: . ignoreUnknownCharacters) )
1965
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQIDBA U= " , options: . ignoreUnknownCharacters) )
1966
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQIDBAU = " , options: . ignoreUnknownCharacters) )
1967
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 ] ) , Data ( base64Encoded: " AQIDBAU= " , options: . ignoreUnknownCharacters) )
1968
+
1969
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQIDBAUG " , options: . ignoreUnknownCharacters) )
1970
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " A QIDBAUG " , options: . ignoreUnknownCharacters) )
1971
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQ IDBAUG " , options: . ignoreUnknownCharacters) )
1972
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQI DBAUG " , options: . ignoreUnknownCharacters) )
1973
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQID BAUG " , options: . ignoreUnknownCharacters) )
1974
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQIDB AUG " , options: . ignoreUnknownCharacters) )
1975
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQIDBA UG " , options: . ignoreUnknownCharacters) )
1976
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQIDBAU G " , options: . ignoreUnknownCharacters) )
1977
+ XCTAssertEqual ( Data ( [ 1 , 2 , 3 , 4 , 5 , 6 ] ) , Data ( base64Encoded: " AQIDBAUG " , options: . ignoreUnknownCharacters) )
1978
+ }
1979
+
1980
+ func test_base64Decode_test1MBDataGoing0to255OverAndOver( ) {
1981
+ let oneMBTestData = createTestData ( count: 1000 * 1024 )
1982
+ func createTestData( count: Int ) -> Data {
1983
+ var data = Data ( count: count)
1984
+ for index in data. indices {
1985
+ data [ index] = UInt8 ( index % Int( UInt8 . max) )
1986
+ }
1987
+ return data
1988
+ }
1989
+
1990
+ let base64DataString = oneMBTestData. base64EncodedString ( options: . lineLength64Characters)
1991
+ XCTAssertEqual ( oneMBTestData, Data ( base64Encoded: base64DataString, options: . ignoreUnknownCharacters) )
1992
+ }
1993
+
1905
1994
func test_base64Data_small( ) {
1906
1995
let data = Data ( " Hello World " . utf8)
1907
1996
let base64 = data. base64EncodedString ( )
0 commit comments