Files
swift-mirror/test/SwiftSyntax/SyntaxChildren.swift
Tony Allevato 1187890ca4 [SwiftSyntax] Fix SyntaxChildren iteration (#12319)
* [SwiftSyntax] Fix SyntaxChildren iteration

SyntaxChildren.Iterator stops the first time it sees a nil child;
since it traverses all indexes without considering presence, this
causes it to terminate iteration early if there is a missing child
in the list.

* [SwiftSyntax] Add tests for SyntaxChildren
2017-10-15 00:38:35 -04:00

61 lines
1.9 KiB
Swift

// RUN: %target-run-simple-swift
// REQUIRES: executable_test
// REQUIRES: OS=macosx
// REQUIRES: sdk_overlay
import Foundation
import StdlibUnittest
import SwiftSyntax
/// Verifies that there is a next item returned by the iterator and that it
/// satisfies the given predicate.
func expectNext<Iterator: IteratorProtocol>(
_ iterator: inout Iterator,
satisfies predicate: (Iterator.Element) throws -> Bool
) rethrows {
let next = iterator.next()
expectNotNil(next)
expectTrue(try predicate(next!))
}
/// Verifies that the iterator is exhausted.
func expectNextIsNil<Iterator: IteratorProtocol>(_ iterator: inout Iterator) {
expectNil(iterator.next())
}
var SyntaxChildrenAPI = TestSuite("SyntaxChildrenAPI")
SyntaxChildrenAPI.test("IterateWithAllPresent") {
let returnStmt = SyntaxFactory.makeReturnStmt(
returnKeyword: SyntaxFactory.makeReturnKeyword(),
expression: SyntaxFactory.makeBlankExpr(),
semicolon: SyntaxFactory.makeSemicolonToken())
var iterator = returnStmt.children.makeIterator()
expectNext(&iterator) { ($0 as? TokenSyntax)?.tokenKind == .returnKeyword }
expectNext(&iterator) { $0 is ExprSyntax }
expectNext(&iterator) { ($0 as? TokenSyntax)?.tokenKind == .semicolon }
expectNextIsNil(&iterator)
}
SyntaxChildrenAPI.test("IterateWithSomeMissing") {
let returnStmt = SyntaxFactory.makeReturnStmt(
returnKeyword: SyntaxFactory.makeReturnKeyword(),
expression: nil,
semicolon: SyntaxFactory.makeSemicolonToken())
var iterator = returnStmt.children.makeIterator()
expectNext(&iterator) { ($0 as? TokenSyntax)?.tokenKind == .returnKeyword }
expectNext(&iterator) { ($0 as? TokenSyntax)?.tokenKind == .semicolon }
expectNextIsNil(&iterator)
}
SyntaxChildrenAPI.test("IterateWithAllMissing") {
let returnStmt = SyntaxFactory.makeBlankReturnStmt()
var iterator = returnStmt.children.makeIterator()
expectNextIsNil(&iterator)
}
runAllTests()