// Copyright 2012 The Chromium 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 "ios/testing/ocmock_complex_type_helper.h"

#include "base/logging.h"
#include "testing/platform_test.h"
#import "third_party/ocmock/OCMock/OCMock.h"
#include "third_party/ocmock/gtest_support.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

// A complex type to test with..
struct SampleComplexType {
  int number;
  float blob;
};

typedef int ScalarType;

@protocol TestedProtocol
- (void)passObject:(id)foo;
- (void)passComplexType:(const SampleComplexType&)foo;
- (void)passScalar:(ScalarType)foo;
@end

@interface MockClass : OCMockComplexTypeHelper
@end

@implementation MockClass

typedef void (^complexTypeBlock)(const SampleComplexType&);

- (void)passComplexType:(const SampleComplexType&)foo {
  return static_cast<complexTypeBlock>([self blockForSelector:_cmd])(foo);
}

typedef void (^ScalarBlock)(const ScalarType&);

- (void)passScalar:(ScalarType)foo {
  return static_cast<ScalarBlock>([self blockForSelector:_cmd])(foo);
}

@end

namespace {

class OCMockComplexTypeHelperTest : public PlatformTest {
 protected:
  void SetUp() override {
    PlatformTest::SetUp();
    OCMockObject* protocol_mock =
        [OCMockObject mockForProtocol:@protocol(TestedProtocol)];
    helped_mock_ = [[MockClass alloc] initWithRepresentedObject:protocol_mock];
  }

  void TearDown() override {
    EXPECT_OCMOCK_VERIFY(helped_mock_);
    PlatformTest::TearDown();
  }

  id helped_mock_;
};

TEST_F(OCMockComplexTypeHelperTest, nilObjectStillWorks) {
  [[helped_mock_ expect] passObject:nil];
  [helped_mock_ passObject:nil];
}

TEST_F(OCMockComplexTypeHelperTest, anyObjectStillWorks) {
  id someObject = [[NSObject alloc] init];
  [[helped_mock_ expect] passObject:OCMOCK_ANY];
  [helped_mock_ passObject:someObject];
}

TEST_F(OCMockComplexTypeHelperTest, complexType) {
  const SampleComplexType expected_value = {1, 1.0};

  complexTypeBlock block = ^(const SampleComplexType& value) {
    EXPECT_EQ(expected_value.number, value.number);
    EXPECT_EQ(expected_value.blob, value.blob);
  };
  [helped_mock_ onSelector:@selector(passComplexType:)
      callBlockExpectation:(id)block];

  [helped_mock_ passComplexType:expected_value];
}

TEST_F(OCMockComplexTypeHelperTest, scalarType) {
  const ScalarType expected_value = 42;

  ScalarBlock block = ^(const ScalarType& value) {
    EXPECT_EQ(expected_value, value);
  };
  [helped_mock_ onSelector:@selector(passScalar:)
      callBlockExpectation:(id)block];

  [helped_mock_ passScalar:expected_value];
}

}  // namespace
