// RUN: %target-run-simple-swift
// REQUIRES: executable_test

import StdlibUnittest

var UnsafeBitMapTests = TestSuite("UnsafeBitMap")

UnsafeBitMapTests.test("wordIndex(_:), bitIndex(_:)") {
#if arch(i386) || arch(arm)
  for i in 0...31 {
    expectEqual(0, _UnsafeBitMap.wordIndex(i), "i=\(i)")
    expectEqual(i, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)")
  }
  for i in 32...63 {
    expectEqual(1, _UnsafeBitMap.wordIndex(i), "i=\(i)")
    expectEqual(i - 32, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)")
  }
  for i in 64...95 {
    expectEqual(2, _UnsafeBitMap.wordIndex(i), "i=\(i)")
    expectEqual(i - 64, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)")
  }
  for i in 96...127 {
    expectEqual(3, _UnsafeBitMap.wordIndex(i), "i=\(i)")
    expectEqual(i - 96, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)")
  }
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
  for i in 0...63 {
    expectEqual(0, _UnsafeBitMap.wordIndex(i), "i=\(i)")
    expectEqual(i, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)")
  }
  for i in 64...127 {
    expectEqual(1, _UnsafeBitMap.wordIndex(i), "i=\(i)")
    expectEqual(i - 64, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)")
  }
  for i in 192...255 {
    expectEqual(3, _UnsafeBitMap.wordIndex(i), "i=\(i)")
    expectEqual(i - 192, Int(_UnsafeBitMap.bitIndex(i)), "i=\(i)")
  }
#else
  _UnimplementedError()
#endif
}

UnsafeBitMapTests.test("sizeInWords(forSizeInBits:)") {
  expectEqual(0, _UnsafeBitMap.sizeInWords(forSizeInBits: 0))
#if arch(i386) || arch(arm)
  for i in 1...32 {
    expectEqual(1, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)")
  }
  for i in 33...64 {
    expectEqual(2, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)")
  }
  for i in 65...96 {
    expectEqual(3, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)")
  }
  for i in 97...128 {
    expectEqual(4, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)")
  }
#elseif arch(x86_64) || arch(arm64) || arch(powerpc64) || arch(powerpc64le) || arch(s390x)
  for i in 1...64 {
    expectEqual(1, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)")
  }
  for i in 65...128 {
    expectEqual(2, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)")
  }
  for i in 193...256 {
    expectEqual(4, _UnsafeBitMap.sizeInWords(forSizeInBits: i), "i=\(i)")
  }
#else
  _UnimplementedError()
#endif
}

let sizes = [
  0, 1, 2, 3, 7, 8, 9, 31, 32, 33, 48, 63, 64, 65, 127, 128, 129, 1024, 10000
]

func make(sizeInBits: Int) -> _UnsafeBitMap {
  let sizeInWords = _UnsafeBitMap.sizeInWords(forSizeInBits: sizeInBits)
  let storage = UnsafeMutablePointer<UInt>.allocate(capacity: sizeInWords)
  let bitMap = _UnsafeBitMap(storage: storage, bitCount: sizeInBits)
  expectEqual(sizeInWords, bitMap.numberOfWords)
  return bitMap
}

UnsafeBitMapTests.test("initializeToZero()")
  .forEach(in: sizes) {
  sizeInBits in
  let bitMap = make(sizeInBits: sizeInBits)
  defer { bitMap.values.deallocate() }

  bitMap.initializeToZero()
  for i in 0..<sizeInBits {
    expectEqual(false, bitMap[i])
  }
}

UnsafeBitMapTests.test("subscript")
  .forEach(in: sizes) {
  sizeInBits in
  let bitMap = make(sizeInBits: sizeInBits)
  defer { bitMap.values.deallocate() }

  if sizeInBits != 0 {
    bitMap.initializeToZero()
    let index = 7882627 % sizeInBits
    bitMap[index] = true
    for i in 0..<sizeInBits {
      expectEqual(i == index, bitMap[i])
    }
  }

  if sizeInBits < 500 {
    for i in 0..<sizeInBits {
      bitMap.initializeToZero()
      bitMap[i] = true
      for j in 0..<sizeInBits {
        expectEqual(i == j, bitMap[j])
      }
    }
  }
}

runAllTests()
