SwiftyXMLParser/SwiftyXMLParserTests/AccessorTests.swift

405 lines
13 KiB
Swift
Executable File

/**
* The MIT License (MIT)
*
* Copyright (C) 2016 Yahoo Japan Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
import XCTest
@testable import SwiftyXMLParser
class AccessorTests: XCTestCase {
override func setUp() {
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testIndexerTypeIntToSingleElement() {
let singleElementAccessor = XML.Accessor(singleElement())
let target1 = singleElementAccessor[0]
if let name = target1.name {
XCTAssertEqual(name, "RootElement", "can access element name")
} else {
XCTFail("fail to get name")
}
let target2 = singleElementAccessor[1]
switch target2 {
case .failure(_):
XCTAssert(true, "access to wrong path")
default:
XCTFail("need to fail")
}
}
func testIndexerTypeIntToSequence() {
let accessor = XML.Accessor(sequence())
let target1 = accessor[0]
if let name = target1.name {
XCTAssertEqual(name, "Element", "can access corrent element")
} else {
XCTFail("fail to get name")
}
let target2 = accessor[1]
if let name = target2.name {
XCTAssertEqual(name, "Element", "can access corrent element")
} else {
XCTFail("fail to get name")
}
let target3 = accessor[2]
switch target3 {
case .failure(_):
XCTAssert(true, "Aaccess to wrong path")
default:
XCTFail("need to fail")
}
}
func testIndexerTypeString() {
let accessor = XML.Accessor(singleElement())
let me = accessor["RootElement"]
switch me {
case .failure(_):
XCTAssert(true, "can access corrent element")
default:
XCTFail("fail to get element")
}
}
func testIndexerTypeStringShingleElement() {
let accessor = XML.Accessor(singleElement())
let children = accessor["ChildElement"]
switch children {
case .sequence(_):
XCTAssert(true, "can access corrent element")
default:
XCTFail("fail to get element")
}
}
func testIndexerTypeStringSequence() {
let accessor = XML.Accessor(sequence())
let failureChildren = accessor["ChildElement"]
switch failureChildren {
case .failure(_):
XCTAssert(true, "need to select one element from multiple elements")
default:
XCTFail("need to fail")
}
let successChildren = accessor[0]["ChildElement1"]
switch successChildren {
case .sequence(_):
XCTAssert(true, "can access corrent element")
default:
XCTFail("fail to get element")
}
}
func testIndexerToFailure() {
let accessor = XML.Accessor(failure())
let intIndexer = accessor[0]
switch intIndexer {
case .failure(_):
XCTAssert(true, "need to return failure when access wrong path once")
default:
XCTFail("need to fail")
}
let stringIndexer = accessor["ChildElement"]
switch stringIndexer {
case .failure(_):
XCTAssert(true, "need to return failure when access wrong path once")
default:
XCTFail("need to fail")
}
}
func testIndexTypeArray() {
let accessor = XML.Accessor(sequence())
let indexer = accessor[[0, "ChildElement1", 1]]
switch indexer {
case .singleElement(_):
XCTAssert(true, "access element with Array")
default:
XCTFail("fail to get element")
}
let failureIndexer = accessor[[1, "Hoget", "Foge"]]
switch failureIndexer {
case .failure(_):
XCTAssert(true, "access wrong path with Array")
default:
XCTFail("need to fail")
}
}
func testIndexTypeVariableArguments() {
let accessor = XML.Accessor(sequence())
let indexer = accessor[0, "ChildElement1", 1]
switch indexer {
case .singleElement(_):
XCTAssert(true, "access element with Variadic")
default:
XCTFail("fail to get element")
}
let failureIndexer = accessor[1, "Hoget", "Foge"]
switch failureIndexer {
case .failure(_):
XCTAssert(true, "access wrong path with Variadic")
default:
XCTFail("need to fail")
}
}
func testName() {
let accessor = XML.Accessor(singleElement())
if let name = accessor.name {
XCTAssertEqual(name, "RootElement", "access name with SingleElement Accessor")
} else {
XCTFail("fail")
}
let sequenceAccessor = XML.Accessor(sequence())
if let _ = sequenceAccessor.name {
XCTFail("access name with Failure Sequence")
} else {
XCTAssert(true, "fail")
}
let failureAccessor = XML.Accessor(failure())
if let _ = failureAccessor.name {
XCTFail("fail")
} else {
XCTAssert(true, "fail to access name with Failure Accessor")
}
}
func testText() {
let accessor = XML.Accessor(singleElement())
if let text = accessor.text {
XCTAssertEqual(text, "text", "access text with SingleElement Accessor")
} else {
XCTFail("fail")
}
let sequenceAccessor = XML.Accessor(sequence())
if let _ = sequenceAccessor.text {
XCTFail("fail")
} else {
XCTAssert(true, "fail to access text with Sequence Accessor")
}
let failureAccessor = XML.Accessor(failure())
if let _ = failureAccessor.text {
XCTFail("fail")
} else {
XCTAssert(true, "fail to access name with Failure Accessor")
}
}
func testAttributes() {
let accessor = XML.Accessor(singleElement())
if !accessor.attributes.isEmpty {
XCTAssertEqual(accessor.attributes, ["key": "value"], "access attriubtes with SingleElement Accessor")
} else {
XCTFail("fail")
}
let sequenceAccessor = XML.Accessor(sequence())
if !sequenceAccessor.attributes.isEmpty {
XCTFail("fail")
} else {
XCTAssert(true, "fail to attributes text with Sequence Accessor")
}
let failureAccessor = XML.Accessor(failure())
if !failureAccessor.attributes.isEmpty {
XCTFail("fail")
} else {
XCTAssert(true, "fail to access name with Failure Accessor")
}
}
func testAll() {
let accessor = XML.Accessor(singleElement())
if let all = accessor.all {
XCTAssertEqual(all.count, 1, "access all elements")
} else {
XCTFail("fail")
}
let sequenceAccessor = XML.Accessor(sequence())
if let all = sequenceAccessor.all {
XCTAssertEqual(all.count, 2, "access all elements")
} else {
XCTAssert(true, "fail")
}
let failureAccessor = XML.Accessor(failure())
if let _ = failureAccessor.all {
XCTFail("access all elements")
} else {
XCTAssert(true, "fail")
}
}
func testNames() {
let accessor = XML.Accessor(singleElement())
if let names = accessor.names {
XCTAssertEqual(names[0], "RootElement", "access all names")
} else {
XCTFail("fail")
}
let sequenceAccessor = XML.Accessor(sequence())
if let names = sequenceAccessor.names {
XCTAssertEqual(names, ["Element", "Element"], "access all names")
} else {
XCTFail("fail")
}
let failureAccessor = XML.Accessor(failure())
if let _ = failureAccessor.names {
XCTFail("fail")
} else {
XCTAssert(true, "fail to access all names")
}
}
func testError() {
let accessor = XML.Accessor(singleElement())
if let _ = accessor.error {
XCTFail("fail")
} else {
XCTAssert(true, "return nil from SngleElement")
}
let sequenceAccessor = XML.Accessor(sequence())
if let _ = sequenceAccessor.error {
XCTFail("fail")
} else {
XCTAssert(true, "return nil from SngleElement")
}
let failureAccessor = XML.Accessor(failure())
if let _ = failureAccessor.error {
XCTAssert(true, "return Error from SngleElement")
} else {
XCTFail("fail")
}
}
func testMap() {
let accessor = XML.Accessor(singleElement())
let newAccessor = accessor.map { $0 }
XCTAssertEqual(newAccessor.count, 1, "access single element with map")
let sequenceAccessor = XML.Accessor(sequence())
let newSequenceAccessor = sequenceAccessor.map { $0 }
XCTAssertEqual(newSequenceAccessor.count, 2, "access each element with map")
let failureAccessor = XML.Accessor(failure())
let newFailureAccessor = failureAccessor.map { $0 }
XCTAssertEqual(newFailureAccessor.count, 0, "access failure with map")
}
func testFlatMap() {
let accessor = XML.Accessor(singleElement())
let singleText = accessor.flatMap { $0.text }
XCTAssertEqual(singleText, ["text"], "can access text")
let sequenceAccessor = XML.Accessor(sequence())
let texts = sequenceAccessor.flatMap { $0.text }
XCTAssertEqual(texts, ["text", "text2"], "can access each text")
let failureAccessor = XML.Accessor(failure())
let failureTexts = failureAccessor.flatMap { $0.text }
XCTAssertEqual(failureTexts, [], "has no text")
}
func testIterator() {
let accessor = XML.Accessor(singleElement())
var result: [XML.Accessor] = []
for accessorElem in accessor {
result.append(accessorElem)
}
XCTAssertEqual(result.count, 1, "access single element with for-in")
let sequneceAccessor = XML.Accessor(sequence())
var sequenceResult: [XML.Accessor] = []
for accessorElem in sequneceAccessor {
sequenceResult.append(accessorElem)
}
XCTAssertEqual(sequenceResult.count, 2, "access multiple element with for-in")
let failureAccessor = XML.Accessor(failure())
var failureResult: [XML.Accessor] = []
for accessorElem in failureAccessor {
failureResult.append(accessorElem)
}
XCTAssertEqual(failureResult.count, 0, "access failure element with for-in")
}
fileprivate func singleElement() -> XML.Element {
let element = XML.Element(name: "RootElement")
element.text = "text"
element.attributes = ["key": "value"]
element.childElements = [
XML.Element(name: "ChildElement"),
XML.Element(name: "ChildElement")
]
return element
}
fileprivate func sequence() -> [XML.Element] {
let elem1 = XML.Element(name: "Element")
elem1.text = "text"
elem1.attributes = ["key": "value"]
elem1.childElements = [
XML.Element(name: "ChildElement1"),
XML.Element(name: "ChildElement1")
]
let elem2 = XML.Element(name: "Element")
elem2.text = "text2"
elem2.childElements = [
XML.Element(name: "ChildElement2"),
XML.Element(name: "ChildElement2")
]
let elements = [ elem1, elem2 ]
return elements
}
fileprivate func failure() -> XMLError {
return XMLError.accessError(description: "error")
}
}