blob: 6a04f30343ebaaa61a0aaddac37871ca63b0b46f [file] [log] [blame]
// RUN: %target-run-stdlib-swift
// REQUIRES: executable_test
import StdlibUnittest
var BitsetTests = TestSuite("Bitset")
BitsetTests.test("_UnsafeBitset.wordCount(forCapacity:)") {
expectEqual(0, _UnsafeBitset.wordCount(forCapacity: 0))
#if arch(i386) || arch(arm)
for i in 1...32 {
expectEqual(1, _UnsafeBitset.wordCount(forCapacity: i), "i=\(i)")
}
for i in 33...64 {
expectEqual(2, _UnsafeBitset.wordCount(forCapacity: i), "i=\(i)")
}
for i in 65...96 {
expectEqual(3, _UnsafeBitset.wordCount(forCapacity: i), "i=\(i)")
}
for i in 97...128 {
expectEqual(4, _UnsafeBitset.wordCount(forCapacity: i), "i=\(i)")
}
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
for i in 1...64 {
expectEqual(1, _UnsafeBitset.wordCount(forCapacity: i), "i=\(i)")
}
for i in 65...128 {
expectEqual(2, _UnsafeBitset.wordCount(forCapacity: i), "i=\(i)")
}
for i in 193...256 {
expectEqual(4, _UnsafeBitset.wordCount(forCapacity: i), "i=\(i)")
}
#else
_UnimplementedError()
#endif
}
BitsetTests.test("_UnsafeBitset.split(_:)") {
#if arch(i386) || arch(arm)
for i in 0...31 {
let comps = _UnsafeBitset.split(i)
expectEqual(0, comps.word, "i=\(i)")
expectEqual(i, comps.bit, "i=\(i)")
}
for i in 32...63 {
let comps = _UnsafeBitset.split(i)
expectEqual(1, comps.word, "i=\(i)")
expectEqual(i - 32, comps.bit, "i=\(i)")
}
for i in 64...95 {
let comps = _UnsafeBitset.split(i)
expectEqual(2, comps.word, "i=\(i)")
expectEqual(i - 64, comps.bit, "i=\(i)")
}
for i in 96...127 {
let comps = _UnsafeBitset.split(i)
expectEqual(3, comps.word, "i=\(i)")
expectEqual(i - 96, comps.bit, "i=\(i)")
}
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
for i in 0...63 {
let comps = _UnsafeBitset.split(i)
expectEqual(0, comps.word, "i=\(i)")
expectEqual(i, comps.bit, "i=\(i)")
}
for i in 64...127 {
let comps = _UnsafeBitset.split(i)
expectEqual(1, comps.word, "i=\(i)")
expectEqual(i - 64, comps.bit, "i=\(i)")
}
for i in 128...191 {
let comps = _UnsafeBitset.split(i)
expectEqual(2, comps.word, "i=\(i)")
expectEqual(i - 128, comps.bit, "i=\(i)")
}
for i in 192...255 {
let comps = _UnsafeBitset.split(i)
expectEqual(3, comps.word, "i=\(i)")
expectEqual(i - 192, comps.bit, "i=\(i)")
}
#else
_UnimplementedError()
#endif
}
BitsetTests.test("Word.capacity") {
expectEqual(_UnsafeBitset.Word.capacity, UInt.bitWidth)
}
BitsetTests.test("Word.uncheckedContains(_:)") {
typealias Word = _UnsafeBitset.Word
for i in 0 ..< Word.capacity {
expectEqual(Word(0).uncheckedContains(i), false, "i=\(i)")
expectEqual(Word(1).uncheckedContains(i), i == 0, "i=\(i)")
expectEqual(Word(2).uncheckedContains(i), i == 1, "i=\(i)")
expectEqual(Word(4).uncheckedContains(i), i == 2, "i=\(i)")
expectEqual(Word(8).uncheckedContains(i), i == 3, "i=\(i)")
expectEqual(Word(15).uncheckedContains(i), i <= 3, "i=\(i)")
expectEqual(Word(~1).uncheckedContains(i), i != 0, "i=\(i)")
expectEqual(Word(~2).uncheckedContains(i), i != 1, "i=\(i)")
expectEqual(Word(~4).uncheckedContains(i), i != 2, "i=\(i)")
expectEqual(Word(~8).uncheckedContains(i), i != 3, "i=\(i)")
expectEqual(Word(~15).uncheckedContains(i), i > 3, "i=\(i)")
expectEqual(Word(UInt.max).uncheckedContains(i), true, "i=\(i)")
}
}
BitsetTests.test("Word.uncheckedInsert(_:)") {
typealias Word = _UnsafeBitset.Word
var word = Word(0)
for i in 0 ..< Word.capacity {
expectFalse(word.uncheckedContains(i))
expectTrue(word.uncheckedInsert(i))
expectTrue(word.uncheckedContains(i))
expectFalse(word.uncheckedInsert(i))
}
expectEqual(word.value, UInt.max)
}
BitsetTests.test("Word.uncheckedRemove(_:)") {
typealias Word = _UnsafeBitset.Word
var word = Word(UInt.max)
for i in 0 ..< Word.capacity {
expectTrue(word.uncheckedContains(i))
expectTrue(word.uncheckedRemove(i))
expectFalse(word.uncheckedContains(i))
expectFalse(word.uncheckedRemove(i))
}
expectEqual(word.value, 0)
}
BitsetTests.test("Word.count") {
typealias Word = _UnsafeBitset.Word
var word = Word(0)
for i in 0 ..< Word.capacity {
expectEqual(word.count, i)
_ = word.uncheckedInsert(i)
expectEqual(word.count, i + 1)
}
for i in 0 ..< Word.capacity {
expectEqual(word.count, Word.capacity - i)
_ = word.uncheckedRemove(i)
expectEqual(word.count, Word.capacity - i - 1)
}
}
BitsetTests.test("Word.makeIterator()") {
typealias Word = _UnsafeBitset.Word
expectEqual(Array(Word(0)), [])
expectEqual(Array(Word(1)), [0])
expectEqual(Array(Word(2)), [1])
expectEqual(Array(Word(3)), [0, 1])
expectEqual(Array(Word(42)), [1, 3, 5])
expectEqual(Array(Word(UInt.max)), Array(0..<UInt.bitWidth))
}
runAllTests()