CommandLineToolkit
315 строк · 12.3 Кб
1import Foundation
2import JSONStream
3import TestHelpers
4import XCTest
5
6class JSONReaderTests: XCTestCase {
7let eventStream = FakeEventStream()
8
9func testEmptyObject() throws {
10let jsonStream = FakeJSONStream(string: "{}")
11let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
12try reader.start()
13
14// swiftlint:disable:next empty_count
15XCTAssertTrue(eventStream.allObjects[0].count == 0)
16}
17
18func testEmptyArray() throws {
19let jsonStream = FakeJSONStream(string: "[]")
20let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
21try reader.start()
22
23// swiftlint:disable:next empty_count
24XCTAssertTrue(eventStream.allArrays[0].count == 0)
25}
26
27func testSimpleObject() throws {
28let jsonStream = FakeJSONStream(string: "{\"the key\": \"the value\"}")
29let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
30try reader.start()
31
32XCTAssertEqual(eventStream.allObjects[0], ["the key": "the value"])
33}
34
35func testSimpleArrayWithString() throws {
36let jsonStream = FakeJSONStream(string: "[\"value\"]")
37let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
38try reader.start()
39
40XCTAssertEqual(eventStream.allArrays[0], ["value"])
41}
42
43func testBrokenArrayWithSingleComma() throws {
44let jsonStream = FakeJSONStream(string: "[\"value\",]")
45let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
46assertThrows { try reader.start() }
47}
48
49func testBrokenArrayWithDoubleComma() throws {
50let jsonStream = FakeJSONStream(string: "[\"value\",,]")
51let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
52assertThrows { try reader.start() }
53}
54
55func testBrokenArrayWithOnlyComma() throws {
56let jsonStream = FakeJSONStream(string: "[,]")
57let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
58assertThrows { try reader.start() }
59}
60
61func testSimpleArrayWithMultipleStrings() throws {
62let jsonStream = FakeJSONStream(string: "[\"obj1\",\"obj2\",\"obj3\"]")
63let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
64try reader.start()
65
66XCTAssertEqual(eventStream.allArrays[0], ["obj1", "obj2", "obj3"])
67}
68
69func testKeyToObject() throws {
70let jsonStream = FakeJSONStream(string: "{\"the key\": {\"subobject\": \"subvalue\"}}")
71let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
72try reader.start()
73
74XCTAssertEqual(eventStream.allObjects[0], ["the key": ["subobject": "subvalue"]])
75}
76
77func testMultipleKeys() throws {
78let jsonStream = FakeJSONStream(string: "{\"one\": \"1\", \"two\": \"2\"}")
79let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
80try reader.start()
81
82XCTAssertEqual(eventStream.allObjects[0], ["one": "1", "two": "2"])
83}
84
85func testMultipleCommasInObject() throws {
86let jsonStream = FakeJSONStream(string: "{\"one\": \"1\",, \"two\": \"2\"}")
87let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
88assertThrows { try reader.start() }
89}
90
91func testObjectWithTailingComma() throws {
92let jsonStream = FakeJSONStream(string: "{\"one\": \"1\",}")
93let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
94assertThrows { try reader.start() }
95}
96
97func testEmptyValue() throws {
98let jsonStream = FakeJSONStream(string: "{\"key\": \"\"}")
99let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
100try reader.start()
101
102XCTAssertEqual(eventStream.allObjects[0], ["key": ""])
103}
104
105func testTwoObjectsInStream() throws {
106let jsonStream = FakeJSONStream(string: "{\"key1\": \"value1\"}{\"key2\": \"value2\"}")
107let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
108try reader.start()
109XCTAssertEqual(eventStream.all.count, 2)
110XCTAssertEqual(eventStream.allObjects[0], ["key1": "value1"])
111XCTAssertEqual(eventStream.allObjects[1], ["key2": "value2"])
112}
113
114func testArrayWithNull() throws {
115let jsonStream = FakeJSONStream(string: "[null]")
116let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
117try reader.start()
118
119XCTAssertEqual(eventStream.allArrays[0], [NSNull()])
120}
121
122func testObjectWithNullValue() throws {
123let jsonStream = FakeJSONStream(string: "{\"key\": null}")
124let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
125try reader.start()
126
127XCTAssertEqual(eventStream.allObjects[0], ["key": NSNull()])
128}
129
130func testObjectWithNullKeyFails() throws {
131let jsonStream = FakeJSONStream(string: "{null: \"value\"}")
132let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
133assertThrows { try reader.start() }
134}
135
136func testArrayWithTrue() throws {
137let jsonStream = FakeJSONStream(string: "[true]")
138let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
139try reader.start()
140
141XCTAssertEqual(eventStream.allArrays[0], [true])
142}
143
144func testObjectWithTrueValue() throws {
145let jsonStream = FakeJSONStream(string: "{\"key\": true}")
146let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
147try reader.start()
148
149XCTAssertEqual(eventStream.allObjects[0], ["key": true])
150}
151
152func testObjectWithTrueKeyFails() throws {
153let jsonStream = FakeJSONStream(string: "{true: \"value\"}")
154let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
155assertThrows { try reader.start() }
156}
157
158func testArrayWithFalse() throws {
159let jsonStream = FakeJSONStream(string: "[false]")
160let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
161try reader.start()
162
163XCTAssertEqual(eventStream.allArrays[0], [false])
164}
165
166func testArrayWithUnparsableFalse() throws {
167let jsonStream = FakeJSONStream(string: "[fulse]")
168let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
169
170assertThrows {
171try reader.start()
172}
173}
174
175func testObjectWithFalseValue() throws {
176let jsonStream = FakeJSONStream(string: "{\"key\": false}")
177let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
178try reader.start()
179
180XCTAssertEqual(eventStream.allObjects[0], ["key": false])
181}
182
183func testObjectWithFalseKeyFails() throws {
184let jsonStream = FakeJSONStream(string: "{false: \"value\"}")
185let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
186assertThrows { try reader.start() }
187}
188
189func testArrayWithNullTrueFalseObjectAndString() throws {
190let jsonStream = FakeJSONStream(string: "[null, true, false, {\"key\": \"value\"}, \"string\"]")
191let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
192try reader.start()
193
194XCTAssertEqual(eventStream.allArrays[0], [NSNull(), true, false, ["key": "value"], "string"])
195}
196
197func testArraySingleNumber() throws {
198let jsonStream = FakeJSONStream(string: "[42]")
199let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
200try reader.start()
201
202XCTAssertEqual(eventStream.allArrays[0], [42])
203}
204
205func testArraySingleNegativeNumber() throws {
206let jsonStream = FakeJSONStream(string: "[-42]")
207let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
208try reader.start()
209
210XCTAssertEqual(eventStream.allArrays[0], [-42])
211}
212
213func testArrayTwoNumbers() throws {
214let jsonStream = FakeJSONStream(string: "[-42, 42]")
215let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
216try reader.start()
217
218XCTAssertEqual(eventStream.allArrays[0], [-42, 42])
219}
220
221func testArrayWithExponentialNumbers() throws {
222let jsonStream = FakeJSONStream(string: "[-42e-3, 42e+3]")
223let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
224try reader.start()
225
226XCTAssertEqual(eventStream.allArrays[0], [-0.042, 42000])
227}
228
229func testArrayWithNegativeDoubleExponentialNumber() throws {
230let jsonStream = FakeJSONStream(string: "[-14318475.1248132e7]")
231let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
232try reader.start()
233
234XCTAssertEqual(eventStream.allArrays[0], [-143184751248132])
235}
236
237func testObjectWithSingleNumberValue() throws {
238let jsonStream = FakeJSONStream(string: "{\"key\": 42}")
239let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
240try reader.start()
241
242XCTAssertEqual(eventStream.allObjects[0], ["key": 42])
243}
244
245func testArrayWithIncorrectNumber() throws {
246let jsonStream = FakeJSONStream(string: "[-12ABA]")
247let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
248assertThrows { try reader.start() }
249}
250
251func testObjectWithIncorrectNumberValue() throws {
252let jsonStream = FakeJSONStream(string: "{\"key\": -12.bad-number}")
253let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
254assertThrows { try reader.start() }
255}
256
257func testObjectWithArrayValue() throws {
258let jsonStream = FakeJSONStream(string: "{\"key\":[\"obj\"]}")
259let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
260try reader.start()
261
262XCTAssertEqual(eventStream.all.count, 1)
263XCTAssertEqual(eventStream.allObjects[0], ["key": ["obj"]])
264}
265
266func testArrayWithArray() throws {
267let jsonStream = FakeJSONStream(string: "[[\"obj\"]]")
268let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
269try reader.start()
270
271XCTAssertEqual(eventStream.all.count, 1)
272XCTAssertEqual(eventStream.allArrays[0], [["obj"]])
273}
274
275func testArrayWithObject() throws {
276let jsonStream = FakeJSONStream(string: "[{\"key\":\"value\"}]")
277let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
278try reader.start()
279
280XCTAssertEqual(eventStream.all.count, 1)
281XCTAssertEqual(eventStream.allArrays[0], [["key": "value"]])
282}
283
284func testComplexStream() throws {
285let dict: [String: Any] = [
286"key": [true, false, NSNull()] as [Any],
287"second_key": [
288"subobject_key1": 12,
289"subobject_key2": "string with spaces"
290] as [String: Any]
291]
292let array: [Any] = ["string!", dict, false, 12e2]
293
294let firstObjectString = try assertNotNil { String(data: try JSONSerialization.data(withJSONObject: dict, options: [.prettyPrinted]), encoding: .utf8) }
295let secondObjectString = try assertNotNil { String(data: try JSONSerialization.data(withJSONObject: array, options: [.prettyPrinted]), encoding: .utf8) }
296
297let jsonStream = FakeJSONStream(string: firstObjectString + "\n" + secondObjectString)
298let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
299try reader.start()
300
301XCTAssertEqual(eventStream.all.count, 2)
302XCTAssertEqual(eventStream.allObjects[0], dict as NSDictionary)
303XCTAssertEqual(eventStream.allArrays[0], array as NSArray)
304}
305
306func testEventStreamGetsScalars() throws {
307let jsonStream = FakeJSONStream(string: "[[\"obj\"]]")
308let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
309try reader.start()
310
311XCTAssertEqual(eventStream.allData.count, 1)
312let string = String(data: Data(eventStream.allData[0]), encoding: .utf8)
313XCTAssertEqual(string, "[[\"obj\"]]")
314}
315}
316