// Copyright (c) 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 <Foundation/Foundation.h>
#include <vector>

#include "base/memory/ref_counted.h"
#include "testing/platform_test.h"

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

// This test verifies assumptions about the murky world of interaction between
// C++ objects and blocks. Just to make sure.

namespace {

using BlockTest = PlatformTest;

class RefCountedObject : public base::RefCounted<RefCountedObject> {
 public:
  RefCountedObject() {}

  // Refcount is private in the superclass, fake it by counting how many times
  // release can be called until there is one count left, then retain the count
  // back.
  int refcount() {
    int count = 1;
    while (!HasOneRef()) {
      bool check = base::subtle::RefCountedBase::Release();
      EXPECT_FALSE(check);
      ++count;
    }
    for (int ii = 1; ii < count; ii++)
      base::subtle::RefCountedBase::AddRef();
    return count;
  }

 protected:
  friend base::RefCounted<RefCountedObject>;
  virtual ~RefCountedObject() {}
};

TEST_F(BlockTest, BlockAndCPlusPlus) {
  RefCountedObject* object = new RefCountedObject();
  object->AddRef();
  EXPECT_TRUE(object->HasOneRef());
  EXPECT_EQ(1, object->refcount());

  {
    scoped_refptr<RefCountedObject> object_test_ptr(object);
    EXPECT_EQ(2, object->refcount());
  }
  EXPECT_TRUE(object->HasOneRef());

  @autoreleasepool {
    void (^heap_block)(int) = nil;
    {
      scoped_refptr<RefCountedObject> object_ptr(object);
      EXPECT_EQ(2, object->refcount());
      void* object_void_ptr = (void*)object;

      void (^stack_block)(int) = ^(int expected) {
        EXPECT_EQ(object_void_ptr, object_ptr.get());
        EXPECT_EQ(expected, object_ptr.get()->refcount());
      };
#ifdef XCODE_CLANG
      // TODO(crbug.com/939749): With newer Clang versions, the expected value
      // is 3. Remove this ifdef when moving to a newer xcode. Note:
      // XCODE_CLANG is a Chromium-specific define local to this build target.
      stack_block(4);
#else
      stack_block(3);
#endif
      heap_block = [stack_block copy];
      stack_block(4);
    }
    heap_block(2);
  }
  EXPECT_TRUE(object->HasOneRef());
  {
    scoped_refptr<RefCountedObject> object_test2_ptr(object);
    EXPECT_EQ(2, object->refcount());
  }
  EXPECT_TRUE(object->HasOneRef());
  object->Release();
}

TEST_F(BlockTest, BlockAndVectors) {
  void (^heap_block)(void) = nil;
  {
    std::vector<int> vector;
    vector.push_back(0);
    vector.push_back(1);
    vector.push_back(2);

    void (^stack_block)(void) = ^{
      EXPECT_EQ(3ul, vector.size());
      EXPECT_EQ(2, vector[2]);
    };
    stack_block();
    vector[2] = 42;
    vector.push_back(22);
    stack_block();
    heap_block = [stack_block copy];
    stack_block();
  }
  heap_block();
}

}  // namespace
