diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index b4b112d..1161fe3 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -145,4 +145,20 @@ class SocketBasicPacketTest: XCTestCase { XCTAssertEqual(packet.packetString, expectedSendString) XCTAssertEqual(packet.binary, [data2, data]) } + + func testBinaryStringPlaceholderInMessage() { + let engineString = "52-[\"test\",\"~~0\",{\"num\":0,\"_placeholder\":true},{\"num\":1,\"_placeholder\":true}]" + let socket = SocketIOClient(socketURL: NSURL()) + socket.setTestable() + + if case let .Right(packet) = socket.parseString(engineString) { + var packet = packet + XCTAssertEqual(packet.event, "test") + packet.addData(data) + packet.addData(data2) + XCTAssertEqual(packet.args[0] as? String, "~~0") + } else { + XCTFail() + } + } } diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index b205556..c8bea5c 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -18,9 +18,10 @@ class SocketParserTest: XCTestCase { "25[\"test\"]": ("/", ["test"], [], 5), "2[\"test\",\"~~0\"]": ("/", ["test", "~~0"], [], -1), "2/swift,[\"testArrayEmitReturn\",[\"test3\",\"test4\"]]": ("/swift", ["testArrayEmitReturn", ["test3", "test4"]], [], -1), - "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], -1), + "51-/swift,[\"testMultipleItemsWithBufferEmitReturn\",[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", ["testMultipleItemsWithBufferEmitReturn", [1, 2], ["test": "bob"], 25, "polo", ["_placeholder": true, "num": 0]], [], -1), "3/swift,0[[\"test3\",\"test4\"]]": ("/swift", [["test3", "test4"]], [], 0), - "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", "~~0"], [], 19), + "61-/swift,19[[1,2],{\"test\":\"bob\"},25,\"polo\",{\"_placeholder\":true,\"num\":0}]": + ("/swift", [ [1, 2], ["test": "bob"], 25, "polo", ["_placeholder": true, "num": 0]], [], 19), "4/swift,": ("/swift", [], [], -1), "0/swift": ("/swift", [], [], -1), "1/swift": ("/swift", [], [], -1), @@ -123,8 +124,8 @@ class SocketParserTest: XCTestCase { if case let .Right(packet) = packet { XCTAssertEqual(packet.type, SocketPacket.PacketType(rawValue: Int(type) ?? -1)!) XCTAssertEqual(packet.nsp, validValues.0) - XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1)) - XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2)) + XCTAssertTrue((packet.data as NSArray).isEqualToArray(validValues.1), "\(packet.data)") + XCTAssertTrue((packet.binary as NSArray).isEqualToArray(validValues.2), "\(packet.binary)") XCTAssertEqual(packet.id, validValues.3) } else { XCTFail() diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index 52de38a..0de5485 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -187,19 +187,21 @@ struct SocketPacket { data = data.map(_fillInPlaceholders) } - // Helper method that looks for placeholder strings + // Helper method that looks for placeholders // If object is a collection it will recurse // Returns the object if it is not a placeholder string or the corresponding // binary data private func _fillInPlaceholders(object: AnyObject) -> AnyObject { switch object { - case let string as String where string["~~(\\d)"].groups() != nil: - return binary[Int(string["~~(\\d)"].groups()![1])!] case let dict as NSDictionary: - return dict.reduce(NSMutableDictionary(), combine: {cur, keyValue in - cur[keyValue.0 as! NSCopying] = _fillInPlaceholders(keyValue.1) - return cur - }) + if dict["_placeholder"] as? Bool ?? false { + return binary[dict["num"] as! Int] + } else { + return dict.reduce(NSMutableDictionary(), combine: {cur, keyValue in + cur[keyValue.0 as! NSCopying] = _fillInPlaceholders(keyValue.1) + return cur + }) + } case let arr as [AnyObject]: return arr.map(_fillInPlaceholders) default: diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index c74b160..80b5fa5 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -111,12 +111,11 @@ extension SocketParsable { } let d = message[parser.currentIndex.advancedBy(1)..