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
  • development
  • integration
  • main
  • v1.0.0
  • v1.1.0
  • v1.1.1
  • v1.1.2
  • v1.1.3
  • v1.1.4
  • v1.1.5
10 results

Target

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