// 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()
