// 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;
@import XCTest;
@import AVFoundation;
#import <OCMock/OCMock.h>

@interface FLTCam : NSObject <FlutterTexture,
                              AVCaptureVideoDataOutputSampleBufferDelegate,
                              AVCaptureAudioDataOutputSampleBufferDelegate>

- (void)setExposurePointWithResult:(FlutterResult)result x:(double)x y:(double)y;
@end

@interface CameraExposureTests : XCTestCase
@property(readonly, nonatomic) FLTCam *camera;
@property(readonly, nonatomic) id mockDevice;
@property(readonly, nonatomic) id mockUIDevice;
@end

@implementation CameraExposureTests

- (void)setUp {
  _camera = [[FLTCam alloc] init];
  _mockDevice = OCMClassMock([AVCaptureDevice class]);
  _mockUIDevice = OCMPartialMock([UIDevice currentDevice]);
}

- (void)tearDown {
  [_mockDevice stopMocking];
  [_mockUIDevice stopMocking];
}

- (void)testSetExpsourePointWithResult_SetsExposurePointOfInterest {
  // UI is currently in landscape left orientation
  OCMStub([(UIDevice *)_mockUIDevice orientation]).andReturn(UIDeviceOrientationLandscapeLeft);
  // Exposure point of interest is supported
  OCMStub([_mockDevice isExposurePointOfInterestSupported]).andReturn(true);
  // Set mock device as the current capture device
  [_camera setValue:_mockDevice forKey:@"captureDevice"];

  // Run test
  [_camera
      setExposurePointWithResult:^void(id _Nullable result) {
      }
                               x:1
                               y:1];

  // Verify the focus point of interest has been set
  OCMVerify([_mockDevice setExposurePointOfInterest:CGPointMake(1, 1)]);
}

@end
