blob: 15c76495cf29e3140d8908d7cca88d50e87ee190 [file] [log] [blame]
// Copyright 2016 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/fxcrt/cfx_observable.h"
#include <utility>
#include "testing/fx_string_testhelpers.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class PseudoObservable : public CFX_Observable<PseudoObservable> {
public:
PseudoObservable() {}
int SomeMethod() { return 42; }
size_t ActiveObservedPtrs() const { return ActiveObservedPtrsForTesting(); }
};
} // namespace
TEST(fxcrt, ObservePtrNull) {
PseudoObservable::ObservedPtr ptr;
EXPECT_EQ(nullptr, ptr.Get());
}
TEST(fxcrt, ObservePtrLivesLonger) {
PseudoObservable* pObs = new PseudoObservable;
PseudoObservable::ObservedPtr ptr(pObs);
EXPECT_NE(nullptr, ptr.Get());
EXPECT_EQ(1u, pObs->ActiveObservedPtrs());
delete pObs;
EXPECT_EQ(nullptr, ptr.Get());
}
TEST(fxcrt, ObservePtrLivesShorter) {
PseudoObservable obs;
{
PseudoObservable::ObservedPtr ptr(&obs);
EXPECT_NE(nullptr, ptr.Get());
EXPECT_EQ(1u, obs.ActiveObservedPtrs());
}
EXPECT_EQ(0u, obs.ActiveObservedPtrs());
}
TEST(fxcrt, ObservePtrResetNull) {
PseudoObservable obs;
PseudoObservable::ObservedPtr ptr(&obs);
EXPECT_EQ(1u, obs.ActiveObservedPtrs());
ptr.Reset();
EXPECT_EQ(0u, obs.ActiveObservedPtrs());
}
TEST(fxcrt, ObservePtrReset) {
PseudoObservable obs1;
PseudoObservable obs2;
PseudoObservable::ObservedPtr ptr(&obs1);
EXPECT_EQ(1u, obs1.ActiveObservedPtrs());
EXPECT_EQ(0u, obs2.ActiveObservedPtrs());
ptr.Reset(&obs2);
EXPECT_EQ(0u, obs1.ActiveObservedPtrs());
EXPECT_EQ(1u, obs2.ActiveObservedPtrs());
}
TEST(fxcrt, ObservePtrEquals) {
PseudoObservable obj1;
PseudoObservable obj2;
PseudoObservable::ObservedPtr null_ptr1;
PseudoObservable::ObservedPtr obj1_ptr1(&obj1);
PseudoObservable::ObservedPtr obj2_ptr1(&obj2);
{
PseudoObservable::ObservedPtr null_ptr2;
EXPECT_TRUE(null_ptr1 == null_ptr2);
PseudoObservable::ObservedPtr obj1_ptr2(&obj1);
EXPECT_TRUE(obj1_ptr1 == obj1_ptr2);
PseudoObservable::ObservedPtr obj2_ptr2(&obj2);
EXPECT_TRUE(obj2_ptr1 == obj2_ptr2);
}
EXPECT_FALSE(null_ptr1 == obj1_ptr1);
EXPECT_FALSE(null_ptr1 == obj2_ptr1);
EXPECT_FALSE(obj1_ptr1 == obj2_ptr1);
}
TEST(fxcrt, ObservePtrNotEquals) {
PseudoObservable obj1;
PseudoObservable obj2;
PseudoObservable::ObservedPtr null_ptr1;
PseudoObservable::ObservedPtr obj1_ptr1(&obj1);
PseudoObservable::ObservedPtr obj2_ptr1(&obj2);
{
PseudoObservable::ObservedPtr null_ptr2;
PseudoObservable::ObservedPtr obj1_ptr2(&obj1);
PseudoObservable::ObservedPtr obj2_ptr2(&obj2);
EXPECT_FALSE(null_ptr1 != null_ptr2);
EXPECT_FALSE(obj1_ptr1 != obj1_ptr2);
EXPECT_FALSE(obj2_ptr1 != obj2_ptr2);
}
EXPECT_TRUE(null_ptr1 != obj1_ptr1);
EXPECT_TRUE(null_ptr1 != obj2_ptr1);
EXPECT_TRUE(obj1_ptr1 != obj2_ptr1);
}
TEST(fxcrt, ObservePtrBool) {
PseudoObservable obj1;
PseudoObservable::ObservedPtr null_ptr;
PseudoObservable::ObservedPtr obj1_ptr(&obj1);
bool null_bool = !!null_ptr;
bool obj1_bool = !!obj1_ptr;
EXPECT_FALSE(null_bool);
EXPECT_TRUE(obj1_bool);
}