/*
 * Copyright 2011 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "gtest/gtest.h"
#define ENABLE_OBJECT_COUNTER
#include "sfntly/port/refcount.h"
#include "test/smart_pointer_test.h"

using sfntly::RefCounted;
using sfntly::Ptr;

class Foo : public RefCounted<Foo> {
public:  // put in something to make sure it's not empty
  int foo_;
  int foo() { return foo_; }
};

bool testSmartPointer() {
  // scope out allocation
  {
    Ptr<Foo> p1;
    p1 = new Foo();
    EXPECT_EQ(size_t(1), p1->ref_count_);
    EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);

    Ptr<Foo> p2;
    p2 = p1;
    EXPECT_EQ(size_t(2), p1->ref_count_);
    EXPECT_EQ(size_t(2), p2->ref_count_);
    EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);

    Ptr<Foo> p3;
    p3 = p1;
    EXPECT_EQ(size_t(3), p1->ref_count_);
    EXPECT_EQ(size_t(3), p2->ref_count_);
    EXPECT_EQ(size_t(3), p3->ref_count_);
    EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);

    p2 = new Foo();
    EXPECT_EQ(size_t(2), p1->ref_count_);
    EXPECT_EQ(size_t(1), p2->ref_count_);
    EXPECT_EQ(size_t(2), p3->ref_count_);
    EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);

    p3.release();
    EXPECT_EQ(size_t(1), p1->ref_count_);
    EXPECT_EQ(NULL, p3.p_);
    EXPECT_EQ(size_t(2), RefCounted<Foo>::object_counter_);

    p2 = NULL;
    EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);

    p1 = p1;
    EXPECT_EQ(size_t(1), p1->ref_count_);
    EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);

    p1 = &(*p1);
    EXPECT_EQ(size_t(1), p1->ref_count_);
    EXPECT_EQ(size_t(1), RefCounted<Foo>::object_counter_);
  }
  EXPECT_EQ(size_t(0), RefCounted<Foo>::object_counter_);
  return true;
}
