CommandLineToolkit
112 строк · 4.4 Кб
1import Foundation
2import JSONStream
3import XCTest
4
5class JSONReaderNumberEdgeCaseTests: XCTestCase {
6let eventStream = FakeEventStream()
7
8func testNumberJustMinusShouldFail() throws {
9let jsonStream = FakeJSONStream(string: "[-]")
10let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
11XCTAssertThrowsError(try reader.start())
12}
13
14func testNegativeNumberWithoutIntPartShouldFail() throws {
15let jsonStream = FakeJSONStream(string: "[-.123]")
16let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
17XCTAssertThrowsError(try reader.start())
18}
19
20func testNegativeNumberWithoutFractionalPartShouldFail() throws {
21let jsonStream = FakeJSONStream(string: "[-2.]")
22let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
23XCTAssertThrowsError(try reader.start())
24}
25
26func testNumberWithLeadingZeroFails() throws {
27let jsonStream = FakeJSONStream(string: "[01]")
28let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
29XCTAssertThrowsError(try reader.start())
30}
31
32func testNegativeNumberWithLeadingZeroFails() throws {
33let jsonStream = FakeJSONStream(string: "[-01]")
34let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
35XCTAssertThrowsError(try reader.start())
36}
37
38func testNumberWithoutFractionalPartWithExponentialPartFails() throws {
39let jsonStream = FakeJSONStream(string: "[0.e1]")
40let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
41XCTAssertThrowsError(try reader.start())
42}
43
44func testNumberWithIntFractionalPositiveExponentialPartsSucceedes() throws {
45let jsonStream = FakeJSONStream(string: "[0.1e+1]")
46let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
47try reader.start()
48XCTAssertEqual(eventStream.allArrays[0], [1])
49}
50
51func testNegativeNumberWithIntFractionalNegativeExponentialPartsSucceedes() throws {
52let jsonStream = FakeJSONStream(string: "[-0.1e-1]")
53let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
54try reader.start()
55XCTAssertEqual(eventStream.allArrays[0], [-0.01])
56}
57
58func testNegativeNumberWithWrongMinusMinusxponentialPartFails() throws {
59try XCTSkipIf(shouldSkipDueToNumberFormatDifferences())
60
61let jsonStream = FakeJSONStream(string: "[-0.1e--1]")
62let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
63XCTAssertThrowsError(try reader.start())
64}
65
66func testNegativeNumberWithWrongPlusPlusExponentialPartFails() throws {
67try XCTSkipIf(shouldSkipDueToNumberFormatDifferences())
68
69let jsonStream = FakeJSONStream(string: "[-0.1e++1]")
70let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
71XCTAssertThrowsError(try reader.start())
72}
73
74func testNegativeNumberWithWrongPlusMinusExponentialPartFails() throws {
75try XCTSkipIf(shouldSkipDueToNumberFormatDifferences())
76
77let jsonStream = FakeJSONStream(string: "[0.1e+-1]")
78let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
79XCTAssertThrowsError(try reader.start())
80}
81
82func testNumberWithEmptyExponentialPartFails() throws {
83let jsonStream = FakeJSONStream(string: "[0.3e]")
84let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
85XCTAssertThrowsError(try reader.start())
86}
87
88func testNumberWithEmptyExponentialPlusPartFails() throws {
89try XCTSkipIf(shouldSkipDueToNumberFormatDifferences())
90
91let jsonStream = FakeJSONStream(string: "[0.3e+]")
92let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
93XCTAssertThrowsError(try reader.start())
94}
95
96func testPlusNumberFails() throws {
97let jsonStream = FakeJSONStream(string: "[+1]")
98let reader = JSONReader(inputStream: jsonStream, eventStream: eventStream)
99XCTAssertThrowsError(try reader.start())
100}
101
102private func shouldSkipDueToNumberFormatDifferences() -> Bool {
103// https://github.com/apple/swift-corelibs-foundation/issues/4680
104#if os(macOS)
105return false
106#elseif os(Linux)
107return true
108#else
109#error("Unsupported OS")
110#endif
111}
112}
113