Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • mobile/ios/elixxir-dapps-sdk-swift
1 result
Select Git revision
Show changes
Commits on Source (6)
import Foundation
/// Replaces all numbers at provided key with string equivalents
///
/// Example input:
/// {
/// "key": 123,
/// "object": {
/// "hello": "world",
/// "key": 321
/// }
/// }
///
/// Example output:
/// {
/// "key": "123",
/// "object": {
/// "hello": "world",
/// "key": "321"
/// }
/// }
///
/// - Parameters:
/// - input: JSON data
/// - key: the key which values should be converted
/// - Returns: JSON data
func convertJsonNumberToString(
in input: Data,
at key: String
......@@ -18,16 +42,40 @@ func convertJsonNumberToString(
return output
}
func convertJsonNumberToString(
/// Replaces all strings at provided key with number equivalents
///
/// Example input:
/// {
/// "key": "123",
/// "object": {
/// "hello": "world",
/// "key": "321"
/// }
/// }
///
/// Example output:
/// {
/// "key": 123,
/// "object": {
/// "hello": "world",
/// "key": 321
/// }
/// }
///
/// - Parameters:
/// - input: JSON data
/// - key: the key which values should be converted
/// - Returns: JSON data
func convertJsonStringToNumber(
in input: Data,
minNumberLength: Int
at key: String
) -> Data {
guard var string = String(data: input, encoding: .utf8) else {
return input
}
string = string.replacingOccurrences(
of: #":( *)([0-9]{\#(minNumberLength),})( *)(,*)"#,
with: #":$1"$2"$3$4"#,
of: #""\#(key)"( *):( *)"([0-9]+)"( *)(,*)"#,
with: #""\#(key)"$1:$2$3$4$5"#,
options: [.regularExpression]
)
guard let output = string.data(using: .utf8) else {
......
import Foundation
public struct DHKey: Equatable {
public init(value: String, fingerprint: UInt64) {
self.value = value
self.fingerprint = fingerprint
}
public var value: String
public var fingerprint: UInt64
}
extension DHKey: Codable {
enum CodingKeys: String, CodingKey {
case value = "Value"
case fingerprint = "Fingerprint"
}
public static func decode(_ data: Data) throws -> Self {
let data = convertJsonNumberToString(in: data, at: "Value")
return try JSONDecoder().decode(Self.self, from: data)
}
public func encode() throws -> Data {
let data = try JSONEncoder().encode(self)
return convertJsonStringToNumber(in: data, at: "Value")
}
}
import Foundation
public struct GroupMember: Equatable {
public init(id: Data) {
public init(id: Data, dhKey: DHKey) {
self.id = id
self.dhKey = dhKey
}
public var id: Data
public var dhKey: DHKey
}
extension GroupMember: Decodable {
extension GroupMember: Codable {
enum CodingKeys: String, CodingKey {
case id = "ID"
case dhKey = "DhKey"
}
public static func decode(_ data: Data) throws -> Self {
let data = convertJsonNumberToString(in: data, minNumberLength: 19)
let data = convertJsonNumberToString(in: data, at: "Value")
return try JSONDecoder().decode(Self.self, from: data)
}
public func encode() throws -> Data {
let data = try JSONEncoder().encode(self)
return convertJsonStringToNumber(in: data, at: "Value")
}
}
extension Array where Element == GroupMember {
public static func decode(_ data: Data) throws -> Self {
let data = convertJsonNumberToString(in: data, minNumberLength: 19)
let data = convertJsonNumberToString(in: data, at: "Value")
return try JSONDecoder().decode(Self.self, from: data)
}
public func encode() throws -> Data {
let data = try JSONEncoder().encode(self)
return convertJsonStringToNumber(in: data, at: "Value")
}
}
......@@ -2,33 +2,33 @@ import CustomDump
import XCTest
@testable import XXClient
final class ConvertJsonNumberToStringTests: XCTestCase {
func testConverting() {
assert(
final class JSONHelpersTests: XCTestCase {
func testConvertingNumberToStringByKey() {
assertConvertingJsonNumberToString(
input: #"{"number":1234567890,"text":"hello"}"#,
key: "number",
expected: #"{"number":"1234567890","text":"hello"}"#
)
assert(
assertConvertingJsonNumberToString(
input: #"{"text":"hello","number":1234567890}"#,
key: "number",
expected: #"{"text":"hello","number":"1234567890"}"#
)
assert(
assertConvertingJsonNumberToString(
input: #"{ "number" : 1234567890 , "text" : "hello" }"#,
key: "number",
expected: #"{ "number" : "1234567890" , "text" : "hello" }"#
)
assert(
assertConvertingJsonNumberToString(
input: #"{ "text" : "hello" , "number" : 1234567890 }"#,
key: "number",
expected: #"{ "text" : "hello" , "number" : "1234567890" }"#
)
assert(
assertConvertingJsonNumberToString(
input: """
{
"number": 1234567890,
......@@ -44,7 +44,7 @@ final class ConvertJsonNumberToStringTests: XCTestCase {
"""
)
assert(
assertConvertingJsonNumberToString(
input: """
{
"text": "hello",
......@@ -59,32 +59,68 @@ final class ConvertJsonNumberToStringTests: XCTestCase {
}
"""
)
}
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"
}
"""
)
assert(
assertConvertingJsonStringToNumber(
input: """
{
"text": "hello",
"number1": 123456789,
"number2": 1234567890,
"number3": 123456789,
"number4": 1234567890
"number": "1234567890"
}
""",
minNumberLength: 10,
key: "number",
expected: """
{
"text": "hello",
"number1": 123456789,
"number2": "1234567890",
"number3": 123456789,
"number4": "1234567890"
"number": 1234567890
}
"""
)
}
}
private func assert(
private func assertConvertingJsonNumberToString(
input: String,
key: String,
expected: String,
......@@ -105,18 +141,18 @@ private func assert(
)
}
private func assert(
private func assertConvertingJsonStringToNumber(
input: String,
minNumberLength: Int,
key: String,
expected: String,
file: StaticString = #file,
line: UInt = #line
) {
XCTAssertNoDifference(
String(
data: convertJsonNumberToString(
data: convertJsonStringToNumber(
in: input.data(using: .utf8)!,
minNumberLength: minNumberLength
at: key
),
encoding: .utf8
)!,
......
import CustomDump
import XCTest
@testable import XXClient
final class DHKeyTests: XCTestCase {
func testCoding() throws {
let value = "1759426033802606996617132861414734059978289057332806031357800676138355264622676606691435603603751978195460163638145821347601916259127578968570412642641025630452893097179266022832268525346700655861033031712000288680395716922501450233258587788020541937373196899001184700899008948530359980753630443486308876999029238453979779103124291315202352475056237021681172884599194016245219278368648568458514708567045834427853469072638665888791358582182353417065794210125797368093469194927663862565508608719835557592421245749381164023134450699040591219966988201315627676532245052123725278573237006510683695959381015415110970848376498637637944431576313526294020390694483472829278364602405292767170719547347485307956614210210673321959886410245334772057212077704024337636501108566655549055129066343309591274727538343075929837698653965640646190405582788894021694347212874155979958144038307500444865955516612526623220973497735316081265793063949"
let fingerprint: UInt64 = 15989433043166758754
let jsonString = """
{
"Value": \(value),
"Fingerprint": \(fingerprint)
}
"""
let jsonData = jsonString.data(using: .utf8)!
let model = try DHKey.decode(jsonData)
XCTAssertNoDifference(model, DHKey(
value: value,
fingerprint: fingerprint
))
let encodedModel = try model.encode()
let encodedModelString = String(data: encodedModel, encoding: .utf8)
XCTAssertNoDifference(
encodedModelString,
#"{"Value":\#(value),"Fingerprint":\#(fingerprint)}"#
)
}
}
......@@ -4,13 +4,15 @@ import XCTest
final class GroupMemberTests: XCTestCase {
func testCoding() throws {
let idB64 = "U4x/lrFkvxuXu59LtHLon1sUhPJSCcnZND6SugndnVID"
let idB64 = "SGVsbG8sIFdvcmxkISBHcm91cCBNZW1iZXIgVGVzdCBJRA=="
let dhKeyValue = "1759426033802606996617132861414734059978289057332806031357800676138355264622676606691435603603751978195460163638145821347601916259127578968570412642641025630452893097179266022832268525346700655861033031712000288680395716922501450233258587788020541937373196899001184700899008948530359980753630443486308876999029238453979779103124291315202352475056237021681172884599194016245219278368648568458514708567045834427853469072638665888791358582182353417065794210125797368093469194927663862565508608719835557592421245749381164023134450699040591219966988201315627676532245052123725278573237006510683695959381015415110970848376498637637944431576313526294020390694483472829278364602405292767170719547347485307956614210210673321959886410245334772057212077704024337636501108566655549055129066343309591274727538343075929837698653965640646190405582788894021694347212874155979958144038307500444865955516612526623220973497735316081265793063949"
let dhKeyFingerprint: UInt64 = 15989433043166758754
let jsonString = """
{
"ID": "\(idB64)",
"DhKey": {
"Value": 1759426033802606996617132861414734059978289057332806031357800676138355264622676606691435603603751978195460163638145821347601916259127578968570412642641025630452893097179266022832268525346700655861033031712000288680395716922501450233258587788020541937373196899001184700899008948530359980753630443486308876999029238453979779103124291315202352475056237021681172884599194016245219278368648568458514708567045834427853469072638665888791358582182353417065794210125797368093469194927663862565508608719835557592421245749381164023134450699040591219966988201315627676532245052123725278573237006510683695959381015415110970848376498637637944431576313526294020390694483472829278364602405292767170719547347485307956614210210673321959886410245334772057212077704024337636501108566655549055129066343309591274727538343075929837698653965640646190405582788894021694347212874155979958144038307500444865955516612526623220973497735316081265793063949,
"Fingerprint": 15989433043166758754
"Value": \(dhKeyValue),
"Fingerprint": \(dhKeyFingerprint)
}
}
"""
......@@ -18,13 +20,34 @@ final class GroupMemberTests: XCTestCase {
let model = try GroupMember.decode(jsonData)
XCTAssertNoDifference(model, GroupMember(
id: Data(base64Encoded: idB64)!
id: Data(base64Encoded: idB64)!,
dhKey: DHKey(
value: dhKeyValue,
fingerprint: dhKeyFingerprint
)
))
let encodedModel = try model.encode()
let encodedModelString = String(data: encodedModel, encoding: .utf8)!
XCTAssertNoDifference(
encodedModelString,
"""
{"ID":"\(idB64)","DhKey":{"Value":\(dhKeyValue),"Fingerprint":\(dhKeyFingerprint)}}
"""
)
let jsonArrayString = "[\(jsonString)]"
let jsonArrayData = jsonArrayString.data(using: .utf8)!
let decodedModels = try [GroupMember].decode(jsonArrayData)
XCTAssertNoDifference(decodedModels, [model])
let encodedModels = try decodedModels.encode()
let encodedModelsString = String(data: encodedModels, encoding: .utf8)!
XCTAssertNoDifference(
encodedModelsString,
"[\(encodedModelString)]"
)
}
}