// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

@import camera.Test;
@import AVFoundation;
@import XCTest;

@interface CameraPropertiesTests : XCTestCase

@end

@implementation CameraPropertiesTests

#pragma mark - flash mode tests

- (void)testFLTGetFLTFlashModeForString {
  XCTAssertEqual(FLTFlashModeOff, FLTGetFLTFlashModeForString(@"off"));
  XCTAssertEqual(FLTFlashModeAuto, FLTGetFLTFlashModeForString(@"auto"));
  XCTAssertEqual(FLTFlashModeAlways, FLTGetFLTFlashModeForString(@"always"));
  XCTAssertEqual(FLTFlashModeTorch, FLTGetFLTFlashModeForString(@"torch"));
  XCTAssertThrows(FLTGetFLTFlashModeForString(@"unkwown"));
}

- (void)testFLTGetAVCaptureFlashModeForFLTFlashMode {
  XCTAssertEqual(AVCaptureFlashModeOff, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeOff));
  XCTAssertEqual(AVCaptureFlashModeAuto, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAuto));
  XCTAssertEqual(AVCaptureFlashModeOn, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAlways));
  XCTAssertEqual(-1, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeTorch));
}

#pragma mark - exposure mode tests

- (void)testFLTGetStringForFLTExposureMode {
  XCTAssertEqualObjects(@"auto", FLTGetStringForFLTExposureMode(FLTExposureModeAuto));
  XCTAssertEqualObjects(@"locked", FLTGetStringForFLTExposureMode(FLTExposureModeLocked));
  XCTAssertThrows(FLTGetStringForFLTExposureMode(-1));
}

- (void)testFLTGetFLTExposureModeForString {
  XCTAssertEqual(FLTExposureModeAuto, FLTGetFLTExposureModeForString(@"auto"));
  XCTAssertEqual(FLTExposureModeLocked, FLTGetFLTExposureModeForString(@"locked"));
  XCTAssertThrows(FLTGetFLTExposureModeForString(@"unknown"));
}

#pragma mark - focus mode tests

- (void)testFLTGetStringForFLTFocusMode {
  XCTAssertEqualObjects(@"auto", FLTGetStringForFLTFocusMode(FLTFocusModeAuto));
  XCTAssertEqualObjects(@"locked", FLTGetStringForFLTFocusMode(FLTFocusModeLocked));
  XCTAssertThrows(FLTGetStringForFLTFocusMode(-1));
}

- (void)testFLTGetFLTFocusModeForString {
  XCTAssertEqual(FLTFocusModeAuto, FLTGetFLTFocusModeForString(@"auto"));
  XCTAssertEqual(FLTFocusModeLocked, FLTGetFLTFocusModeForString(@"locked"));
  XCTAssertThrows(FLTGetFLTFocusModeForString(@"unknown"));
}

#pragma mark - resolution preset tests

- (void)testFLTGetFLTResolutionPresetForString {
  XCTAssertEqual(FLTResolutionPresetVeryLow, FLTGetFLTResolutionPresetForString(@"veryLow"));
  XCTAssertEqual(FLTResolutionPresetLow, FLTGetFLTResolutionPresetForString(@"low"));
  XCTAssertEqual(FLTResolutionPresetMedium, FLTGetFLTResolutionPresetForString(@"medium"));
  XCTAssertEqual(FLTResolutionPresetHigh, FLTGetFLTResolutionPresetForString(@"high"));
  XCTAssertEqual(FLTResolutionPresetVeryHigh, FLTGetFLTResolutionPresetForString(@"veryHigh"));
  XCTAssertEqual(FLTResolutionPresetUltraHigh, FLTGetFLTResolutionPresetForString(@"ultraHigh"));
  XCTAssertEqual(FLTResolutionPresetMax, FLTGetFLTResolutionPresetForString(@"max"));
  XCTAssertThrows(FLTGetFLTFlashModeForString(@"unknown"));
}

#pragma mark - video format tests

- (void)testFLTGetVideoFormatFromString {
  XCTAssertEqual(kCVPixelFormatType_32BGRA, FLTGetVideoFormatFromString(@"bgra8888"));
  XCTAssertEqual(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
                 FLTGetVideoFormatFromString(@"yuv420"));
  XCTAssertEqual(kCVPixelFormatType_32BGRA, FLTGetVideoFormatFromString(@"unknown"));
}

#pragma mark - device orientation tests

- (void)testFLTGetUIDeviceOrientationForString {
  XCTAssertEqual(UIDeviceOrientationPortraitUpsideDown,
                 FLTGetUIDeviceOrientationForString(@"portraitDown"));
  XCTAssertEqual(UIDeviceOrientationLandscapeRight,
                 FLTGetUIDeviceOrientationForString(@"landscapeLeft"));
  XCTAssertEqual(UIDeviceOrientationLandscapeLeft,
                 FLTGetUIDeviceOrientationForString(@"landscapeRight"));
  XCTAssertEqual(UIDeviceOrientationPortrait, FLTGetUIDeviceOrientationForString(@"portraitUp"));
  XCTAssertThrows(FLTGetUIDeviceOrientationForString(@"unknown"));
}

- (void)testFLTGetStringForUIDeviceOrientation {
  XCTAssertEqualObjects(@"portraitDown",
                        FLTGetStringForUIDeviceOrientation(UIDeviceOrientationPortraitUpsideDown));
  XCTAssertEqualObjects(@"landscapeLeft",
                        FLTGetStringForUIDeviceOrientation(UIDeviceOrientationLandscapeRight));
  XCTAssertEqualObjects(@"landscapeRight",
                        FLTGetStringForUIDeviceOrientation(UIDeviceOrientationLandscapeLeft));
  XCTAssertEqualObjects(@"portraitUp",
                        FLTGetStringForUIDeviceOrientation(UIDeviceOrientationPortrait));
  XCTAssertEqualObjects(@"portraitUp", FLTGetStringForUIDeviceOrientation(-1));
}

@end
