From 740a9b57dcc5ac388fa61864579eb6c45dfd2bbd Mon Sep 17 00:00:00 2001
From: Dariusz Rybicki <dariusz@elixxir.io>
Date: Tue, 30 Aug 2022 12:09:10 +0100
Subject: [PATCH] Update JSONHelpers

---
 ...NumberToString.swift => JSONHelpers.swift} |  18 ++
 .../ConvertJsonNumberToStringTests.swift      | 127 -----------
 .../Helpers/JSONHelpersTests.swift            | 214 ++++++++++++++++++
 3 files changed, 232 insertions(+), 127 deletions(-)
 rename Sources/XXClient/Helpers/{ConvertJsonNumberToString.swift => JSONHelpers.swift} (67%)
 delete mode 100644 Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift
 create mode 100644 Tests/XXClientTests/Helpers/JSONHelpersTests.swift

diff --git a/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift b/Sources/XXClient/Helpers/JSONHelpers.swift
similarity index 67%
rename from Sources/XXClient/Helpers/ConvertJsonNumberToString.swift
rename to Sources/XXClient/Helpers/JSONHelpers.swift
index 8390ba1c..5653752d 100644
--- a/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift
+++ b/Sources/XXClient/Helpers/JSONHelpers.swift
@@ -35,3 +35,21 @@ func convertJsonNumberToString(
   }
   return output
 }
+
+func convertJsonStringToNumber(
+  in input: Data,
+  at key: String
+) -> Data {
+  guard var string = String(data: input, encoding: .utf8) else {
+    return input
+  }
+  string = string.replacingOccurrences(
+    of: #""\#(key)"( *):( *)"([0-9]+)"( *)(,*)"#,
+    with: #""\#(key)"$1:$2$3$4$5"#,
+    options: [.regularExpression]
+  )
+  guard let output = string.data(using: .utf8) else {
+    return input
+  }
+  return output
+}
diff --git a/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift b/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift
deleted file mode 100644
index 4fc1ecd7..00000000
--- a/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift
+++ /dev/null
@@ -1,127 +0,0 @@
-import CustomDump
-import XCTest
-@testable import XXClient
-
-final class ConvertJsonNumberToStringTests: XCTestCase {
-  func testConverting() {
-    assert(
-      input: #"{"number":1234567890,"text":"hello"}"#,
-      key: "number",
-      expected: #"{"number":"1234567890","text":"hello"}"#
-    )
-
-    assert(
-      input: #"{"text":"hello","number":1234567890}"#,
-      key: "number",
-      expected: #"{"text":"hello","number":"1234567890"}"#
-    )
-
-    assert(
-      input: #"{  "number"  :  1234567890  ,  "text"  :  "hello"  }"#,
-      key: "number",
-      expected: #"{  "number"  :  "1234567890"  ,  "text"  :  "hello"  }"#
-    )
-
-    assert(
-      input: #"{  "text"  :  "hello"  ,  "number"  :  1234567890  }"#,
-      key: "number",
-      expected: #"{  "text"  :  "hello"  ,  "number"  :  "1234567890"  }"#
-    )
-
-    assert(
-      input: """
-      {
-        "number": 1234567890,
-        "text": "hello"
-      }
-      """,
-      key: "number",
-      expected: """
-      {
-        "number": "1234567890",
-        "text": "hello"
-      }
-      """
-    )
-
-    assert(
-      input: """
-      {
-        "text": "hello",
-        "number": 1234567890
-      }
-      """,
-      key: "number",
-      expected: """
-      {
-        "text": "hello",
-        "number": "1234567890"
-      }
-      """
-    )
-
-    assert(
-      input: """
-      {
-        "text": "hello",
-        "number1": 123456789,
-        "number2": 1234567890,
-        "number3": 123456789,
-        "number4": 1234567890
-      }
-      """,
-      minNumberLength: 10,
-      expected: """
-      {
-        "text": "hello",
-        "number1": 123456789,
-        "number2": "1234567890",
-        "number3": 123456789,
-        "number4": "1234567890"
-      }
-      """
-    )
-  }
-}
-
-private func assert(
-  input: String,
-  key: String,
-  expected: String,
-  file: StaticString = #file,
-  line: UInt = #line
-) {
-  XCTAssertNoDifference(
-    String(
-      data: convertJsonNumberToString(
-        in: input.data(using: .utf8)!,
-        at: key
-      ),
-      encoding: .utf8
-    )!,
-    expected,
-    file: file,
-    line: line
-  )
-}
-
-private func assert(
-  input: String,
-  minNumberLength: Int,
-  expected: String,
-  file: StaticString = #file,
-  line: UInt = #line
-) {
-  XCTAssertNoDifference(
-    String(
-      data: convertJsonNumberToString(
-        in: input.data(using: .utf8)!,
-        minNumberLength: minNumberLength
-      ),
-      encoding: .utf8
-    )!,
-    expected,
-    file: file,
-    line: line
-  )
-}
diff --git a/Tests/XXClientTests/Helpers/JSONHelpersTests.swift b/Tests/XXClientTests/Helpers/JSONHelpersTests.swift
new file mode 100644
index 00000000..20a90116
--- /dev/null
+++ b/Tests/XXClientTests/Helpers/JSONHelpersTests.swift
@@ -0,0 +1,214 @@
+import CustomDump
+import XCTest
+@testable import XXClient
+
+final class JSONHelpersTests: XCTestCase {
+  func testConvertingNumberToStringByKey() {
+    assertConvertingJsonNumberToString(
+      input: #"{"number":1234567890,"text":"hello"}"#,
+      key: "number",
+      expected: #"{"number":"1234567890","text":"hello"}"#
+    )
+
+    assertConvertingJsonNumberToString(
+      input: #"{"text":"hello","number":1234567890}"#,
+      key: "number",
+      expected: #"{"text":"hello","number":"1234567890"}"#
+    )
+
+    assertConvertingJsonNumberToString(
+      input: #"{  "number"  :  1234567890  ,  "text"  :  "hello"  }"#,
+      key: "number",
+      expected: #"{  "number"  :  "1234567890"  ,  "text"  :  "hello"  }"#
+    )
+
+    assertConvertingJsonNumberToString(
+      input: #"{  "text"  :  "hello"  ,  "number"  :  1234567890  }"#,
+      key: "number",
+      expected: #"{  "text"  :  "hello"  ,  "number"  :  "1234567890"  }"#
+    )
+
+    assertConvertingJsonNumberToString(
+      input: """
+      {
+        "number": 1234567890,
+        "text": "hello"
+      }
+      """,
+      key: "number",
+      expected: """
+      {
+        "number": "1234567890",
+        "text": "hello"
+      }
+      """
+    )
+
+    assertConvertingJsonNumberToString(
+      input: """
+      {
+        "text": "hello",
+        "number": 1234567890
+      }
+      """,
+      key: "number",
+      expected: """
+      {
+        "text": "hello",
+        "number": "1234567890"
+      }
+      """
+    )
+  }
+
+  func testConvertingNumberToStringByLength() {
+    assertConvertingJsonNumberToString(
+      input: """
+      {
+        "text": "hello",
+        "number1": 123456789,
+        "number2": 1234567890,
+        "number3": 123456789,
+        "number4": 1234567890
+      }
+      """,
+      minNumberLength: 10,
+      expected: """
+      {
+        "text": "hello",
+        "number1": 123456789,
+        "number2": "1234567890",
+        "number3": 123456789,
+        "number4": "1234567890"
+      }
+      """
+    )
+
+    assertConvertingJsonNumberToString(
+      input: #"{"text":"hello","number1":123456789,"number2":1234567890,"number3":123456789,"number4":1234567890}"#,
+      minNumberLength: 10,
+      expected: #"{"text":"hello","number1":123456789,"number2":"1234567890","number3":123456789,"number4":"1234567890"}"#
+    )
+  }
+
+  func testConvertingStringToNumber() {
+    assertConvertingJsonStringToNumber(
+      input: #"{"number":"1234567890","text":"hello"}"#,
+      key: "number",
+      expected: #"{"number":1234567890,"text":"hello"}"#
+    )
+
+    assertConvertingJsonStringToNumber(
+      input: #"{"text":"hello","number":"1234567890"}"#,
+      key: "number",
+      expected: #"{"text":"hello","number":1234567890}"#
+    )
+
+    assertConvertingJsonStringToNumber(
+      input: #"{  "number"  :  "1234567890"  ,  "text"  :  "hello"  }"#,
+      key: "number",
+      expected: #"{  "number"  :  1234567890  ,  "text"  :  "hello"  }"#
+    )
+
+    assertConvertingJsonStringToNumber(
+      input: #"{  "text"  :  "hello"  ,  "number"  :  "1234567890"  }"#,
+      key: "number",
+      expected: #"{  "text"  :  "hello"  ,  "number"  :  1234567890  }"#
+    )
+
+    assertConvertingJsonStringToNumber(
+      input: """
+      {
+        "number": "1234567890",
+        "text": "hello"
+      }
+      """,
+      key: "number",
+      expected: """
+      {
+        "number": 1234567890,
+        "text": "hello"
+      }
+      """
+    )
+
+    assertConvertingJsonStringToNumber(
+      input: """
+      {
+        "text": "hello",
+        "number": "1234567890"
+      }
+      """,
+      key: "number",
+      expected: """
+      {
+        "text": "hello",
+        "number": 1234567890
+      }
+      """
+    )
+  }
+}
+
+private func assertConvertingJsonNumberToString(
+  input: String,
+  key: String,
+  expected: String,
+  file: StaticString = #file,
+  line: UInt = #line
+) {
+  XCTAssertNoDifference(
+    String(
+      data: convertJsonNumberToString(
+        in: input.data(using: .utf8)!,
+        at: key
+      ),
+      encoding: .utf8
+    )!,
+    expected,
+    file: file,
+    line: line
+  )
+}
+
+private func assertConvertingJsonNumberToString(
+  input: String,
+  minNumberLength: Int,
+  expected: String,
+  file: StaticString = #file,
+  line: UInt = #line
+) {
+  XCTAssertNoDifference(
+    String(
+      data: convertJsonNumberToString(
+        in: input.data(using: .utf8)!,
+        minNumberLength: minNumberLength
+      ),
+      encoding: .utf8
+    )!,
+    expected,
+    file: file,
+    line: line
+  )
+}
+
+private func assertConvertingJsonStringToNumber(
+  input: String,
+  key: String,
+  expected: String,
+  file: StaticString = #file,
+  line: UInt = #line
+) {
+  XCTAssertNoDifference(
+    String(
+      data: convertJsonStringToNumber(
+        in: input.data(using: .utf8)!,
+        at: key
+      ),
+      encoding: .utf8
+    )!,
+    expected,
+    file: file,
+    line: line
+  )
+}
-- 
GitLab