CyborgTests/ParserTests.swift (106 lines of code) (raw):

// // Copyright (c) 2018. Uber Technologies // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // @testable import Cyborg import XCTest class ParserTests: XCTestCase { func test_consume_all_invalid() { "l 1 2 P".withXMLString { (str) in switch consumeAll(using: allDrawingCommands)(str, 0) { case .ok(let wrapped, _): XCTFail("Expected failure, but succeeded with \(wrapped)") case .error(let error): XCTAssertEqual(error, .noParsersMatchedFirstCharacter(80, .init(index: 6, stream: str))) } } } func test_consume_all_error_messages_with_numbers() { "l 1 2 m 3 ".withXMLString { (str) in switch consumeAll(using: allDrawingCommands)(str, 0) { case .ok(let wrapped, _): XCTFail("Expected failure, but succeeded with \(wrapped)") case .error(let error): XCTAssertEqual(error, .tooFewNumbers(expected: 2, found: 1, .init(index: 9, stream: str))) } } } func test_oneorMoreOf() { "a".withXMLString { str in "aaa".withXMLString { contents in XCTAssertEqual(oneOrMore(of: literal(str))(contents, 0).asOptional?.0, Array(repeating: str, count: 3)) " a a a".withXMLString { contents2 in XCTAssertEqual(oneOrMore(of: consumeTrivia(before: literal(str)))(contents2, 0).asOptional?.0, Array(repeating: str, count: 3)) } } } } func test_complex_number() { let (text, buffer) = XMLString.create(from: "-2.38419e-08") defer { buffer.deallocate() } let expected: CGFloat = -2.38419e-08 switch number(from: text, at: 0) { case .ok(let result, let index): XCTAssert(result == expected) XCTAssertEqual(index, text.count) case .error(let error): XCTFail(error.message) } } func test_number_parser() { "-432".withXMLString { str in switch Cyborg.number(from: str, at: 0) { case .ok(let result, let index): XCTAssertEqual(result, -432) XCTAssertEqual(index, str.count) case .error(let error): XCTFail(error.message) } } "40".withXMLString { str2 in switch Cyborg.number(from: str2, at: 0) { case .ok(let result, let index): XCTAssertEqual(result, 40) XCTAssertEqual(index, str2.count) case .error(let error): XCTFail(error.message) } } "4".withXMLString { str3 in switch Cyborg.number(from: str3, at: 0) { case .ok(let result, let index): XCTAssertEqual(result, 4) XCTAssertEqual(index, str3.count) case .error(let error): XCTFail(error.message) } } "4.4 ".withXMLString { str4 in switch Cyborg.number(from: str4, at: 0) { case .ok(let result, let index): XCTAssertEqual(result, 4.4) XCTAssertEqual(index, str4.count - 1) case .error(let error): XCTFail(error.message) } } ".9 ".withXMLString { str5 in switch Cyborg.number(from: str5, at: 0) { case .ok(let result, let index): XCTAssertEqual(result, 0.9) XCTAssertEqual(index, str5.count - 1) case .error(let error): XCTFail(error.message) } } "-.9 ".withXMLString { str6 in switch Cyborg.number(from: str6, at: 0) { case .ok(let result, let index): XCTAssertEqual(result, -0.9) XCTAssertEqual(index, str6.count - 1) case .error(let error): XCTFail(error.message) } } } }