Skip to content
Snippets Groups Projects
Commit a235f28a authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Merge branch 'development' into dev/macos-support-2

parents 13c11598 f2a547dd
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!50Add macOS support
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)]"
)
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment