1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
//===--- OptionSetTest.swift - Test for library-only option sets ----------===//
//
// 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-swift
// REQUIRES: executable_test
import StdlibUnittest
struct PackagingOptions : OptionSet {
let rawValue: Int
init(rawValue: Int) { self.rawValue = rawValue }
static let box = PackagingOptions(rawValue: 1)
static let carton = PackagingOptions(rawValue: 2)
static let bag = PackagingOptions(rawValue: 4)
static let satchel = PackagingOptions(rawValue: 8)
static let boxOrBag: PackagingOptions = [box, bag]
static let boxOrCartonOrBag: PackagingOptions = [box, carton, bag]
static let satchelOrBag = satchel.union(bag)
}
var tests = TestSuite("OptionSet")
defer { runAllTests() }
tests.test("basics") {
typealias P = PackagingOptions
expectNotEqual(P(), .box)
expectEqual(P.box, .box)
expectNotEqual(P.box, .carton)
expectNotEqual(P.box, .boxOrBag)
expectEqual(.box, P.box.intersection(.boxOrBag))
expectEqual(.bag, P.bag.intersection(.boxOrBag))
expectEqual(P(), P.bag.intersection(.box))
expectEqual(P(), P.box.intersection(.satchel))
expectEqual(.boxOrBag, P.bag.union(.box))
expectEqual(.boxOrBag, P.box.union(.bag))
expectEqual(.boxOrCartonOrBag, P.boxOrBag.union(.carton))
expectEqual([.satchel, .box], P.satchelOrBag.symmetricDifference(.boxOrBag))
var p = P.box
p.formIntersection(.boxOrBag)
expectEqual(.box, p)
p = .bag
p.formIntersection(.boxOrBag)
expectEqual(.bag, p)
p = .bag
p.formIntersection(.box)
expectEqual(P(), p)
p = .box
p.formIntersection(.satchel)
expectEqual(P(), p)
p = .bag
p.formUnion(.box)
expectEqual(.boxOrBag, p)
p = .box
p.formUnion(.bag)
expectEqual(.boxOrBag, p)
p = .boxOrBag
p.formUnion(.carton)
expectEqual(.boxOrCartonOrBag, p)
p = .satchelOrBag
p.formSymmetricDifference(.boxOrBag)
expectEqual([.satchel, .box], p)
}
tests.test("set algebra") {
typealias P = PackagingOptions
// remove
var p = P.boxOrBag
expectNil(p.remove(P.carton))
p = P.boxOrBag
p.remove(P.boxOrCartonOrBag)
expectEqual(P(), p)
p = P.boxOrBag
let removed = p.remove(P.satchelOrBag)
if #available(SwiftStdlib 5.3, *) {
// https://github.com/apple/swift/pull/28378
expectEqual(P.bag, removed)
}
expectEqual(P.box, p)
// insert
p = P.box
var insertionResult = p.insert(.bag)
expectTrue(insertionResult.inserted)
expectEqual(P.bag, insertionResult.memberAfterInsert)
expectEqual(P.boxOrBag, p)
insertionResult = p.insert(.bag)
expectFalse(insertionResult.inserted)
expectEqual(P.bag, insertionResult.memberAfterInsert)
// update
p = P.box
expectNil(p.update(with: .bag))
expectEqual(P.boxOrBag, p)
p = P.box
expectEqual(P.box, p.update(with: .boxOrBag))
expectEqual(P.boxOrBag, p)
}
|