//===--- 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(macOS 10.16, iOS 14.0, watchOS 7.0, tvOS 14.0, *) { // 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) }