| // Copyright 2023 Google LLC |
| // |
| // 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 |
| // |
| // https://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 "mpact/sim/generic/ref_count.h" |
| |
| #include "googlemock/include/gmock/gmock.h" |
| #include "googletest/include/gtest/gtest.h" |
| |
| namespace mpact { |
| namespace sim { |
| namespace generic { |
| namespace { |
| |
| // Test class that counts calls to the destructor and OnRefCountIsZero. |
| class TestRefCount : public ReferenceCount { |
| public: |
| TestRefCount(int *destructor_call_count, int *refcount_zero_call_count) |
| : destructor_call_count_(destructor_call_count), |
| refcount_zero_call_count_(refcount_zero_call_count) {} |
| |
| TestRefCount() = delete; |
| |
| ~TestRefCount() override { |
| if (nullptr != destructor_call_count_) { |
| ++(*destructor_call_count_); |
| } |
| } |
| |
| void OnRefCountIsZero() override { |
| if (nullptr != refcount_zero_call_count_) { |
| ++(*refcount_zero_call_count_); |
| } |
| ReferenceCount::OnRefCountIsZero(); |
| } |
| |
| private: |
| int *destructor_call_count_; |
| int *refcount_zero_call_count_; |
| }; |
| |
| // Call constructor and ensure that the refcount is initialized to 1. |
| TEST(RefCount, Create) { |
| ReferenceCount *ref_count = new ReferenceCount(); |
| EXPECT_EQ(ref_count->ref_count(), 1); |
| ref_count->DecRef(); |
| } |
| |
| // Test that ref count increases when Inc is called. |
| TEST(RefCount, IncRef) { |
| ReferenceCount *ref_count = new ReferenceCount(); |
| EXPECT_EQ(ref_count->ref_count(), 1); |
| ref_count->IncRef(); |
| EXPECT_EQ(ref_count->ref_count(), 2); |
| ref_count->DecRef(); |
| EXPECT_EQ(ref_count->ref_count(), 1); |
| ref_count->DecRef(); |
| } |
| |
| // Test that the override OnRefCountIsZero is called and that the number |
| // of destructor calls matches that count. |
| |
| TEST(RefCount, OnRefCountIsZero) { |
| int destructor_call_count = 0; |
| int refcount_zero_call_count = 0; |
| TestRefCount *test_ref_count = |
| new TestRefCount(&destructor_call_count, &refcount_zero_call_count); |
| |
| EXPECT_EQ(test_ref_count->ref_count(), 1); |
| test_ref_count->DecRef(); |
| EXPECT_EQ(refcount_zero_call_count, 1); |
| EXPECT_EQ(destructor_call_count, 1); |
| } |
| |
| } // namespace |
| } // namespace generic |
| } // namespace sim |
| } // namespace mpact |