SwiftSoup/Tests/SwiftSoupTests/CssTest.swift

234 lines
8.2 KiB
Swift

//
// CssTest.swift
// SwiftSoup
//
// Created by Nabil Chatbi on 11/11/16.
// Copyright © 2016 Nabil Chatbi. All rights reserved.
//
import XCTest
import SwiftSoup
class CssTest: XCTestCase {
var html: Document!
private var htmlString: String!
override func setUp() {
super.setUp()
let sb: StringBuilder = StringBuilder(string: "<html><head></head><body>")
sb.append("<div id='pseudo'>")
for i in 1...10 {
sb.append("<p>\(i)</p>")
}
sb.append("</div>")
sb.append("<div id='type'>")
for i in 1...10 {
sb.append("<p>\(i)</p>")
sb.append("<span>\(i)</span>")
sb.append("<em>\(i)</em>")
sb.append("<svg>\(i)</svg>")
}
sb.append("</div>")
sb.append("<span id='onlySpan'><br /></span>")
sb.append("<p class='empty'><!-- Comment only is still empty! --></p>")
sb.append("<div id='only'>")
sb.append("Some text before the <em>only</em> child in this div")
sb.append("</div>")
sb.append("</body></html>")
htmlString = sb.toString()
html = try! SwiftSoup.parse(htmlString)
}
func testLinuxTestSuiteIncludesAllTests() {
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
let thisClass = type(of: self)
let linuxCount = thisClass.allTests.count
let darwinCount = Int(thisClass.defaultTestSuite.testCaseCount)
XCTAssertEqual(linuxCount, darwinCount, "\(darwinCount - linuxCount) tests are missing from allTests")
#endif
}
func testFirstChild()throws {
try check(html.select("#pseudo :first-child"), "1")
try check(html.select("html:first-child"))
}
func testLastChild()throws {
try check(html.select("#pseudo :last-child"), "10")
try check(html.select("html:last-child"))
}
func testNthChild_simple()throws {
for i in 1...10 {
try check(html.select("#pseudo :nth-child(\(i))"), "\(i)")
}
}
func testNthOfType_unknownTag()throws {
for i in 1...10 {
try check(html.select("#type svg:nth-of-type(\(i))"), "\(i)")
}
}
func testNthLastChild_simple()throws {
for i in 1...10 {
try check(html.select("#pseudo :nth-last-child(\(i))"), "\(11-i)")
}
}
func testNthOfType_simple()throws {
for i in 1...10 {
try check(html.select("#type p:nth-of-type(\(i))"), "\(i)")
}
}
func testNthLastOfType_simple()throws {
for i in 1...10 {
try check(html.select("#type :nth-last-of-type(\(i))"), "\(11-i)", "\(11-i)", "\(11-i)", "\(11-i)")
}
}
func testNthChild_advanced()throws {
try check(html.select("#pseudo :nth-child(-5)"))
try check(html.select("#pseudo :nth-child(odd)"), "1", "3", "5", "7", "9")
try check(html.select("#pseudo :nth-child(2n-1)"), "1", "3", "5", "7", "9")
try check(html.select("#pseudo :nth-child(2n+1)"), "1", "3", "5", "7", "9")
try check(html.select("#pseudo :nth-child(2n+3)"), "3", "5", "7", "9")
try check(html.select("#pseudo :nth-child(even)"), "2", "4", "6", "8", "10")
try check(html.select("#pseudo :nth-child(2n)"), "2", "4", "6", "8", "10")
try check(html.select("#pseudo :nth-child(3n-1)"), "2", "5", "8")
try check(html.select("#pseudo :nth-child(-2n+5)"), "1", "3", "5")
try check(html.select("#pseudo :nth-child(+5)"), "5")
}
func testNthOfType_advanced()throws {
try check(html.select("#type :nth-of-type(-5)"))
try check(html.select("#type p:nth-of-type(odd)"), "1", "3", "5", "7", "9")
try check(html.select("#type em:nth-of-type(2n-1)"), "1", "3", "5", "7", "9")
try check(html.select("#type p:nth-of-type(2n+1)"), "1", "3", "5", "7", "9")
try check(html.select("#type span:nth-of-type(2n+3)"), "3", "5", "7", "9")
try check(html.select("#type p:nth-of-type(even)"), "2", "4", "6", "8", "10")
try check(html.select("#type p:nth-of-type(2n)"), "2", "4", "6", "8", "10")
try check(html.select("#type p:nth-of-type(3n-1)"), "2", "5", "8")
try check(html.select("#type p:nth-of-type(-2n+5)"), "1", "3", "5")
try check(html.select("#type :nth-of-type(+5)"), "5", "5", "5", "5")
}
func testNthLastChild_advanced()throws {
try check(html.select("#pseudo :nth-last-child(-5)"))
try check(html.select("#pseudo :nth-last-child(odd)"), "2", "4", "6", "8", "10")
try check(html.select("#pseudo :nth-last-child(2n-1)"), "2", "4", "6", "8", "10")
try check(html.select("#pseudo :nth-last-child(2n+1)"), "2", "4", "6", "8", "10")
try check(html.select("#pseudo :nth-last-child(2n+3)"), "2", "4", "6", "8")
try check(html.select("#pseudo :nth-last-child(even)"), "1", "3", "5", "7", "9")
try check(html.select("#pseudo :nth-last-child(2n)"), "1", "3", "5", "7", "9")
try check(html.select("#pseudo :nth-last-child(3n-1)"), "3", "6", "9")
try check(html.select("#pseudo :nth-last-child(-2n+5)"), "6", "8", "10")
try check(html.select("#pseudo :nth-last-child(+5)"), "6")
}
func testNthLastOfType_advanced()throws {
try check(html.select("#type :nth-last-of-type(-5)"))
try check(html.select("#type p:nth-last-of-type(odd)"), "2", "4", "6", "8", "10")
try check(html.select("#type em:nth-last-of-type(2n-1)"), "2", "4", "6", "8", "10")
try check(html.select("#type p:nth-last-of-type(2n+1)"), "2", "4", "6", "8", "10")
try check(html.select("#type span:nth-last-of-type(2n+3)"), "2", "4", "6", "8")
try check(html.select("#type p:nth-last-of-type(even)"), "1", "3", "5", "7", "9")
try check(html.select("#type p:nth-last-of-type(2n)"), "1", "3", "5", "7", "9")
try check(html.select("#type p:nth-last-of-type(3n-1)"), "3", "6", "9")
try check(html.select("#type span:nth-last-of-type(-2n+5)"), "6", "8", "10")
try check(html.select("#type :nth-last-of-type(+5)"), "6", "6", "6", "6")
}
func testFirstOfType()throws {
try check(html.select("div:not(#only) :first-of-type"), "1", "1", "1", "1", "1")
}
func testLastOfType()throws {
try check(html.select("div:not(#only) :last-of-type"), "10", "10", "10", "10", "10")
}
func testEmpty()throws {
let sel: Elements = try html.select(":empty")
XCTAssertEqual(3, sel.size())
XCTAssertEqual("head", sel.get(0).tagName())
XCTAssertEqual("br", sel.get(1).tagName())
XCTAssertEqual("p", sel.get(2).tagName())
}
func testOnlyChild()throws {
let sel: Elements = try html.select("span :only-child")
XCTAssertEqual(1, sel.size())
XCTAssertEqual("br", sel.get(0).tagName())
try check(html.select("#only :only-child"), "only")
}
func testOnlyOfType()throws {
let sel: Elements = try html.select(":only-of-type")
XCTAssertEqual(6, sel.size())
XCTAssertEqual("head", sel.get(0).tagName())
XCTAssertEqual("body", sel.get(1).tagName())
XCTAssertEqual("span", sel.get(2).tagName())
XCTAssertEqual("br", sel.get(3).tagName())
XCTAssertEqual("p", sel.get(4).tagName())
XCTAssertTrue(sel.get(4).hasClass("empty"))
XCTAssertEqual("em", sel.get(5).tagName())
}
func check(_ resut: Elements, _ expectedContent: String... ) {
check(resut, expectedContent)
}
func check(_ result: Elements, _ expectedContent: [String] ) {
XCTAssertEqual(expectedContent.count, result.size())
for i in 0..<expectedContent.count {
XCTAssertNotNil(result.get(i))
XCTAssertEqual(expectedContent[i], result.get(i).ownText())
}
}
func testRoot()throws {
let sel: Elements = try html.select(":root")
XCTAssertEqual(1, sel.size())
XCTAssertNotNil(sel.get(0))
try XCTAssertEqual(Tag.valueOf("html"), sel.get(0).tag())
let sel2: Elements = try html.select("body").select(":root")
XCTAssertEqual(1, sel2.size())
XCTAssertNotNil(sel2.get(0))
try XCTAssertEqual(Tag.valueOf("body"), sel2.get(0).tag())
}
static var allTests = {
return [
("testLinuxTestSuiteIncludesAllTests", testLinuxTestSuiteIncludesAllTests),
("testFirstChild", testFirstChild),
("testLastChild", testLastChild),
("testNthChild_simple", testNthChild_simple),
("testNthOfType_unknownTag", testNthOfType_unknownTag),
("testNthLastChild_simple", testNthLastChild_simple),
("testNthOfType_simple", testNthOfType_simple),
("testNthLastOfType_simple", testNthLastOfType_simple),
("testNthChild_advanced", testNthChild_advanced),
("testNthOfType_advanced", testNthOfType_advanced),
("testNthLastChild_advanced", testNthLastChild_advanced),
("testNthLastOfType_advanced", testNthLastOfType_advanced),
("testFirstOfType", testFirstOfType),
("testLastOfType", testLastOfType),
("testEmpty", testEmpty),
("testOnlyChild", testOnlyChild),
("testOnlyOfType", testOnlyOfType),
("testRoot", testRoot)
]
}()
}