//===--- Join.swift.gyb ---------------------------------------*- swift -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // RUN: %target-run-simple-swiftgyb // REQUIRES: executable_test import StdlibUnittest import StdlibCollectionUnittest public struct JoinWithSeparatorTest { public let elements: [[Int]] public let separator: [Int] public let expected: [Int] public let loc: SourceLoc init( elements: [[Int]], separator: [Int], expected: [Int], file: String = #file, line: UInt = #line ) { self.elements = elements self.separator = separator self.expected = expected self.loc = SourceLoc(file, line, comment: "prefix() test data") } } public let joinWithSeparatorTests = [ // Empty separator. JoinWithSeparatorTest( elements: [], separator: [], expected: []), JoinWithSeparatorTest( elements: [[]], separator: [], expected: []), JoinWithSeparatorTest( elements: [[], []], separator: [], expected: []), JoinWithSeparatorTest( elements: [[], [], []], separator: [], expected: []), JoinWithSeparatorTest( elements: [[ 1010 ]], separator: [], expected: [ 1010 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ]], separator: [], expected: [ 1010, 2020 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ], [ 3030 ]], separator: [], expected: [ 1010, 2020, 3030 ]), JoinWithSeparatorTest( elements: [[], [ 2020 ], [ 3030 ]], separator: [], expected: [ 2020, 3030 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [], [ 3030 ]], separator: [], expected: [ 1010, 3030 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ], []], separator: [], expected: [ 1010, 2020 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [ 2020, 2021 ], [ 3030, 3031 ]], separator: [], expected: [ 1010, 1011, 2020, 2021, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[], [ 2020, 2021 ], [ 3030, 3031 ]], separator: [], expected: [ 2020, 2021, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [], [ 3030, 3031 ]], separator: [], expected: [ 1010, 1011, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [ 2020, 2021 ], []], separator: [], expected: [ 1010, 1011, 2020, 2021 ]), // 1-element separator. JoinWithSeparatorTest( elements: [], separator: [ 99 ], expected: []), JoinWithSeparatorTest( elements: [[]], separator: [ 99 ], expected: []), JoinWithSeparatorTest( elements: [[], []], separator: [ 99 ], expected: [ 99 ]), JoinWithSeparatorTest( elements: [[], [], []], separator: [ 99 ], expected: [ 99, 99 ]), JoinWithSeparatorTest( elements: [[ 1010 ]], separator: [ 99 ], expected: [ 1010 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ]], separator: [ 99 ], expected: [ 1010, 99, 2020 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ], [ 3030 ]], separator: [ 99 ], expected: [ 1010, 99, 2020, 99, 3030 ]), JoinWithSeparatorTest( elements: [[], [ 2020 ], [ 3030 ]], separator: [ 99 ], expected: [ 99, 2020, 99, 3030 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [], [ 3030 ]], separator: [ 99 ], expected: [ 1010, 99, 99, 3030 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ], []], separator: [ 99 ], expected: [ 1010, 99, 2020, 99 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [ 2020, 2021 ], [ 3030, 3031 ]], separator: [ 99 ], expected: [ 1010, 1011, 99, 2020, 2021, 99, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[], [ 2020, 2021 ], [ 3030, 3031 ]], separator: [ 99 ], expected: [ 99, 2020, 2021, 99, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [], [ 3030, 3031 ]], separator: [ 99 ], expected: [ 1010, 1011, 99, 99, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [ 2020, 2021 ], []], separator: [ 99 ], expected: [ 1010, 1011, 99, 2020, 2021, 99 ]), // 2-element separator. JoinWithSeparatorTest( elements: [], separator: [ 98, 99 ], expected: []), JoinWithSeparatorTest( elements: [[]], separator: [ 98, 99 ], expected: []), JoinWithSeparatorTest( elements: [[], []], separator: [ 98, 99 ], expected: [ 98, 99 ]), JoinWithSeparatorTest( elements: [[], [], []], separator: [ 98, 99 ], expected: [ 98, 99, 98, 99 ]), JoinWithSeparatorTest( elements: [[ 1010 ]], separator: [ 98, 99 ], expected: [ 1010 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ]], separator: [ 98, 99 ], expected: [ 1010, 98, 99, 2020 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ], [ 3030 ]], separator: [ 98, 99 ], expected: [ 1010, 98, 99, 2020, 98, 99, 3030 ]), JoinWithSeparatorTest( elements: [[], [ 2020 ], [ 3030 ]], separator: [ 98, 99 ], expected: [ 98, 99, 2020, 98, 99, 3030 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [], [ 3030 ]], separator: [ 98, 99 ], expected: [ 1010, 98, 99, 98, 99, 3030 ]), JoinWithSeparatorTest( elements: [[ 1010 ], [ 2020 ], []], separator: [ 98, 99 ], expected: [ 1010, 98, 99, 2020, 98, 99 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [ 2020, 2021 ], [ 3030, 3031 ]], separator: [ 98, 99 ], expected: [ 1010, 1011, 98, 99, 2020, 2021, 98, 99, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[], [ 2020, 2021 ], [ 3030, 3031 ]], separator: [ 98, 99 ], expected: [ 98, 99, 2020, 2021, 98, 99, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [], [ 3030, 3031 ]], separator: [ 98, 99 ], expected: [ 1010, 1011, 98, 99, 98, 99, 3030, 3031 ]), JoinWithSeparatorTest( elements: [[ 1010, 1011 ], [ 2020, 2021 ], []], separator: [ 98, 99 ], expected: [ 1010, 1011, 98, 99, 2020, 2021, 98, 99 ]), ] var JoinTestSuite = TestSuite("Join") %{ from gyb_stdlib_support import ( TRAVERSALS, collectionTypeName ) from itertools import product base_kinds = [ 'Defaulted', 'Minimal' ] collections = [ (base_kind + collectionTypeName(traversal=traversal, mutable=False, rangeReplaceable=True), traversal) for base_kind, traversal in product(base_kinds, TRAVERSALS) ] other_array_types = [ 'Array', 'ArraySlice', 'ContiguousArray' ] collections += [(array, 'RandomAccess') for array in other_array_types] }% % for Base, TRAVERSALS in collections: % if Base not in other_array_types: % label = 'elements:' % else: % label = '' % end JoinTestSuite.test("${Base}.joined(separator:)") { for test in joinWithSeparatorTests { let elements = ${Base}(${label} test.elements.map { ${Base}(${label} $0) }) let separator = ${Base}(${label} test.separator) let r = Array(elements.joined(separator: separator)) checkSequence(test.expected, r) } } JoinTestSuite.test("${Base}.joined(separator:)/_copyToContiguousArray()") { for test in joinWithSeparatorTests { let elements = ${Base}(${label} test.elements.map { ${Base}(${label} $0) }) let separator = ${Base}(${label} test.separator) let r = Array(elements.joined(separator: separator)) checkSequence(test.expected, r) } } % end JoinTestSuite.test("Sequence.joined(separator:)") { // Default separator (empty). expectEqual("", [].joined()) expectEqual("", [""].joined()) expectEqual("", ["", ""].joined()) expectEqual("", ["", "", ""].joined()) expectEqual("a", ["a"].joined()) expectEqual("ab", ["a", "b"].joined()) expectEqual("abc", ["a", "b", "c"].joined()) expectEqual("abcdef", ["ab", "cd", "ef"].joined()) // Empty separator. expectEqual("", [].joined(separator: "")) expectEqual("", [""].joined(separator: "")) expectEqual("", ["", ""].joined(separator: "")) expectEqual("", ["", "", ""].joined(separator: "")) expectEqual("a", ["a"].joined(separator: "")) expectEqual("ab", ["a", "b"].joined(separator: "")) expectEqual("abc", ["a", "b", "c"].joined(separator: "")) expectEqual("abcdef", ["ab", "cd", "ef"].joined(separator: "")) // 1-element separator. expectEqual("", [""].joined(separator: "x")) expectEqual("x", ["", ""].joined(separator: "x")) expectEqual("xx", ["", "", ""].joined(separator: "x")) expectEqual("a", ["a"].joined(separator: "x")) expectEqual("axb", ["a", "b"].joined(separator: "x")) expectEqual("axbxc", ["a", "b", "c"].joined(separator: "x")) expectEqual("abxcdxef", ["ab", "cd", "ef"].joined(separator: "x")) // 2-element separator. expectEqual("", [""].joined(separator: "xy")) expectEqual("xy", ["", ""].joined(separator: "xy")) expectEqual("xyxy", ["", "", ""].joined(separator: "xy")) expectEqual("a", ["a"].joined(separator: "xy")) expectEqual("axyb", ["a", "b"].joined(separator: "xy")) expectEqual("axybxyc", ["a", "b", "c"].joined(separator: "xy")) expectEqual("abxycdxyef", ["ab", "cd", "ef"].joined(separator: "xy")) } runAllTests()