// RUN: %empty-directory(%t)
// RUN: %target-build-swift -swift-version 3 %s -o %t/a.out
// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out
// REQUIRES: objc_interop
// REQUIRES: executable_test
// CoreMedia is not present on watchOS.
// UNSUPPORTED: OS=watchos

import CoreMedia
import AVFoundation
import StdlibUnittest
import StdlibUnittestFoundationExtras

var coreMedia = TestSuite("CoreMedia")

func equalCMTimeMappings(_ x: CMTimeMapping, _ y: CMTimeMapping) -> Bool {
  var xx = x, yy = y
  return memcmp(&xx, &yy, MemoryLayout<CMTimeMapping>.size) == 0
}

coreMedia.test("NSValue bridging") {
  let time1 = CMTimeMake(181, 60)
  expectBridgeToNSValue(time1,
                        nsValueInitializer: { NSValue(time: $0) },
                        nsValueGetter: { $0.timeValue },
                        equal: (==))
  let time2 = CMTimeMake(242, 60)
  let timeRange1 = CMTimeRangeFromTimeToTime(time1, time2)

  expectBridgeToNSValue(timeRange1,
                        nsValueInitializer: { NSValue(timeRange: $0) },
                        nsValueGetter: { $0.timeRangeValue },
                        equal: (==))

  let time3 = CMTimeMake(303, 60)
  let timeRange2 = CMTimeRangeFromTimeToTime(time2, time3)
  let timeMapping = CMTimeMapping(source: timeRange1, target: timeRange2)
  expectBridgeToNSValue(timeMapping,
                        nsValueInitializer: { NSValue(timeMapping: $0) },
                        nsValueGetter: { $0.timeMappingValue },
                        equal: equalCMTimeMappings)
}


var AVFoundationTests = TestSuite("AVFoundation_Swift3")

let boxedPixelFormat = NSNumber(value: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)

#if os(macOS) || os(iOS)

if #available(iOS 5, *) {
  AVFoundationTests.test("AVCaptureVideoDataOutput.availableVideoCVPixelFormatTypes") {
    func f(v: AVCaptureVideoDataOutput) -> Bool {
      return v.availableVideoCVPixelFormatTypes.contains(where: { e in
        if let e = e as? NSNumber, e == boxedPixelFormat {
          return true
        }
        else {
          return false
        }
      })
    }
  }
}

#endif

#if os(iOS)

if #available(iOS 7, *) {
  AVFoundationTests.test("AVMetadataMachineReadableCodeObject.corners") {
    func f(m: AVMetadataMachineReadableCodeObject) -> [Any]! {
      return m.corners
    }
  }
}

if #available(iOS 10, *) {
  AVFoundationTests.test("AVCaptureDeviceFormat.supportedColorSpaces") {
    func f(df: AVCaptureDeviceFormat) -> Bool {
      return df.supportedColorSpaces.contains(NSNumber(value: AVCaptureColorSpace.sRGB.rawValue))
    }
  }

  AVFoundationTests.test("AVCapturePhotoOutput.supportedFlashModes") {
    func f(p: AVCapturePhotoOutput) -> Bool {
      return p.supportedFlashModes.contains(NSNumber(value: AVCaptureFlashMode.off.rawValue))
    }
  }

  AVFoundationTests.test("AVCapturePhotoOutput.availablePhotoPixelFormatTypes") {
    func f(p: AVCapturePhotoOutput) -> Bool {
      return p.availablePhotoPixelFormatTypes.contains(boxedPixelFormat)
    }
  }

  AVFoundationTests.test("AVCapturePhotoOutput.availableRawPhotoPixelFormatTypes") {
    func f(p: AVCapturePhotoOutput) -> Bool {
      return p.availableRawPhotoPixelFormatTypes.contains(boxedPixelFormat)
    }
  }

  AVFoundationTests.test("AVCapturePhotoSettings.availablePreviewPhotoPixelFormatTypes") {
    func f(p: AVCapturePhotoSettings) -> Bool {
      return p.availablePreviewPhotoPixelFormatTypes.contains(boxedPixelFormat)
    }
  }
}

if #available(iOS 11, *) {
  AVFoundationTests.test("AVCaptureSynchronizedDataCollection/iteration") {
    func f(c: AVCaptureSynchronizedDataCollection) {
      for element in c {
        var element = element
        expectType(AVCaptureSynchronizedData.self, &element)
      }
    }
  }
}

#endif

runAllTests()
