Base32Tests.swift 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. //
  2. // Base32Tests.swift
  3. // Base32
  4. //
  5. // Created by 野村 憲男 on 1/24/15.
  6. // Copyright (c) 2015 Norio Nomura. All rights reserved.
  7. //
  8. import Foundation
  9. import XCTest
  10. import Base32
  11. class Base32Tests: XCTestCase {
  12. let vectors: [(String,String,String)] = [
  13. ("", "", ""),
  14. ("f", "MY======", "CO======"),
  15. ("fo", "MZXQ====", "CPNG===="),
  16. ("foo", "MZXW6===", "CPNMU==="),
  17. ("foob", "MZXW6YQ=", "CPNMUOG="),
  18. ("fooba", "MZXW6YTB", "CPNMUOJ1"),
  19. ("foobar", "MZXW6YTBOI======", "CPNMUOJ1E8======"),
  20. ]
  21. override func setUp() {
  22. super.setUp()
  23. // Put setup code here. This method is called before the invocation of each test method in the class.
  24. }
  25. override func tearDown() {
  26. // Put teardown code here. This method is called after the invocation of each test method in the class.
  27. super.tearDown()
  28. }
  29. // MARK: https://tools.ietf.org/html/rfc4648
  30. func test_RFC4648_base32Encode() {
  31. let convertedVectors = self.vectors.map {($0.dataUsingUTF8StringEncoding, $1, $2)}
  32. self.measureBlock{
  33. for _ in 0...100 {
  34. for (test, expect, expectHex) in convertedVectors {
  35. let result = base32Encode(test)
  36. XCTAssertEqual(result, expect, "base32Encode for \(test)")
  37. }
  38. }
  39. }
  40. }
  41. func test_RFC4648_base32Decode() {
  42. let convertedVectors = self.vectors.map {($0.dataUsingUTF8StringEncoding, $1, $2)}
  43. self.measureBlock{
  44. for _ in 0...100 {
  45. for (expect, test, testHex) in convertedVectors {
  46. let result = base32DecodeToData(test)
  47. XCTAssertEqual(result!, expect, "base32Decode for \(test)")
  48. }
  49. }
  50. }
  51. }
  52. func test_RFC4648_base32HexEncode() {
  53. let convertedVectors = self.vectors.map {($0.dataUsingUTF8StringEncoding, $1, $2)}
  54. self.measureBlock{
  55. for _ in 0...100 {
  56. for (test, expect, expectHex) in convertedVectors {
  57. let resultHex = base32HexEncode(test)
  58. XCTAssertEqual(resultHex, expectHex, "base32HexEncode for \(test)")
  59. }
  60. }
  61. }
  62. }
  63. func test_RFC4648_base32HexDecode() {
  64. let convertedVectors = self.vectors.map {($0.dataUsingUTF8StringEncoding, $1, $2)}
  65. self.measureBlock{
  66. for _ in 0...100 {
  67. for (expect, test, testHex) in convertedVectors {
  68. let resultHex = base32HexDecodeToData(testHex)
  69. XCTAssertEqual(resultHex!, expect, "base32HexDecode for \(testHex)")
  70. }
  71. }
  72. }
  73. }
  74. // MARK: -
  75. func test_base32ExtensionString() {
  76. self.measureBlock{
  77. for _ in 0...100 {
  78. for (test, expect, expectHex) in self.vectors {
  79. let result = test.base32EncodedString
  80. let resultHex = test.base32HexEncodedString
  81. XCTAssertEqual(result, expect, "\(test).base32EncodedString")
  82. XCTAssertEqual(resultHex, expectHex, "\(test).base32HexEncodedString")
  83. let decoded = result.base32DecodedString()
  84. let decodedHex = resultHex.base32HexDecodedString()
  85. XCTAssertEqual(decoded!, test, "\(result).base32DecodedString()")
  86. XCTAssertEqual(decodedHex!, test, "\(resultHex).base32HexDecodedString()")
  87. }
  88. }
  89. }
  90. }
  91. func test_base32ExtensionData() {
  92. let dataVectors = vectors.map {
  93. (
  94. $0.dataUsingUTF8StringEncoding,
  95. $1.dataUsingUTF8StringEncoding,
  96. $2.dataUsingUTF8StringEncoding
  97. )
  98. }
  99. self.measureBlock{
  100. for _ in 0...100 {
  101. for (test, expect, expectHex) in dataVectors {
  102. let result = test.base32EncodedData
  103. let resultHex = test.base32HexEncodedData
  104. XCTAssertEqual(result, expect, "\(test).base32EncodedData")
  105. XCTAssertEqual(resultHex, expectHex, "\(test).base32HexEncodedData")
  106. let decoded = result.base32DecodedData
  107. let decodedHex = resultHex.base32HexDecodedData
  108. XCTAssertEqual(decoded!, test, "\(result).base32DecodedData")
  109. XCTAssertEqual(decodedHex!, test, "\(resultHex).base32HexDecodedData")
  110. }
  111. }
  112. }
  113. }
  114. func test_base32ExtensionDataAndString() {
  115. let dataAndStringVectors = vectors.map {($0.dataUsingUTF8StringEncoding, $1, $2)}
  116. self.measureBlock{
  117. for _ in 0...100 {
  118. for (test, expect, expectHex) in dataAndStringVectors {
  119. let result = test.base32EncodedString
  120. let resultHex = test.base32HexEncodedString
  121. XCTAssertEqual(result, expect, "\(test).base32EncodedString")
  122. XCTAssertEqual(resultHex, expectHex, "\(test).base32HexEncodedString")
  123. let decoded = result.base32DecodedData
  124. let decodedHex = resultHex.base32HexDecodedData
  125. XCTAssertEqual(decoded!, test, "\(result).base32DecodedData")
  126. XCTAssertEqual(decodedHex!, test, "\(resultHex).base32HexDecodedData")
  127. }
  128. }
  129. }
  130. }
  131. // MARK:
  132. func test_base32DecodeStringAcceptableLengthPatterns() {
  133. // "=" stripped valid string
  134. let strippedVectors = vectors.map {
  135. (
  136. $0.dataUsingUTF8StringEncoding,
  137. $1.stringByReplacingOccurrencesOfString("=", withString:""),
  138. $2.stringByReplacingOccurrencesOfString("=", withString:"")
  139. )
  140. }
  141. for (expect, test, testHex) in strippedVectors {
  142. let result = base32DecodeToData(test)
  143. let resultHex = base32HexDecodeToData(testHex)
  144. XCTAssertEqual(result!, expect, "base32Decode for \(test)")
  145. XCTAssertEqual(resultHex!, expect, "base32HexDecode for \(testHex)")
  146. }
  147. // invalid length string with padding
  148. let invalidVectorWithPaddings: [(String,String)] = [
  149. ("M=======", "C======="),
  150. ("MYZ=====", "COZ====="),
  151. ("MZXW6Z==", "CPNMUZ=="),
  152. ("MZXW6YTBO=======", "CPNMUOJ1E======="),
  153. ]
  154. for (test, testHex) in invalidVectorWithPaddings {
  155. let result = base32DecodeToData(test)
  156. let resultHex = base32HexDecodeToData(testHex)
  157. XCTAssertNil(result, "base32Decode for \(test)")
  158. XCTAssertNil(resultHex, "base32HexDecode for \(test)")
  159. }
  160. // invalid length string without padding
  161. let invalidVectorWithoutPaddings = invalidVectorWithPaddings.map {
  162. (
  163. $0.stringByReplacingOccurrencesOfString("=", withString:""),
  164. $1.stringByReplacingOccurrencesOfString("=", withString:"")
  165. )
  166. }
  167. for (test, testHex) in invalidVectorWithPaddings {
  168. let result = base32DecodeToData(test)
  169. let resultHex = base32HexDecodeToData(testHex)
  170. XCTAssertNil(result, "base32Decode for \(test)")
  171. XCTAssertNil(resultHex, "base32HexDecode for \(test)")
  172. }
  173. }
  174. }