| Index: mojo/services/public/cpp/view_manager/tests/view_unittest.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/tests/view_unittest.cc b/mojo/services/public/cpp/view_manager/tests/view_unittest.cc
|
| index eb7276cd781282559478fa078b41ce100cdc1c8b..b0bd08b6b768d30d3789a73500f8528b88474c27 100644
|
| --- a/mojo/services/public/cpp/view_manager/tests/view_unittest.cc
|
| +++ b/mojo/services/public/cpp/view_manager/tests/view_unittest.cc
|
| @@ -9,6 +9,7 @@
|
| #include "mojo/services/public/cpp/view_manager/lib/view_private.h"
|
| #include "mojo/services/public/cpp/view_manager/util.h"
|
| #include "mojo/services/public/cpp/view_manager/view_observer.h"
|
| +#include "mojo/services/public/cpp/view_manager/view_property.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace mojo {
|
| @@ -102,6 +103,88 @@ TEST_F(ViewTest, DrawnAndVisible) {
|
| EXPECT_FALSE(v11.IsDrawn());
|
| }
|
|
|
| +namespace {
|
| +DEFINE_VIEW_PROPERTY_KEY(int, kIntKey, -2);
|
| +DEFINE_VIEW_PROPERTY_KEY(const char*, kStringKey, "squeamish");
|
| +}
|
| +
|
| +TEST_F(ViewTest, Property) {
|
| + TestView v;
|
| +
|
| + // Non-existent properties should return the default values.
|
| + EXPECT_EQ(-2, v.GetLocalProperty(kIntKey));
|
| + EXPECT_EQ(std::string("squeamish"), v.GetLocalProperty(kStringKey));
|
| +
|
| + // A set property value should be returned again (even if it's the default
|
| + // value).
|
| + v.SetLocalProperty(kIntKey, INT_MAX);
|
| + EXPECT_EQ(INT_MAX, v.GetLocalProperty(kIntKey));
|
| + v.SetLocalProperty(kIntKey, -2);
|
| + EXPECT_EQ(-2, v.GetLocalProperty(kIntKey));
|
| + v.SetLocalProperty(kIntKey, INT_MIN);
|
| + EXPECT_EQ(INT_MIN, v.GetLocalProperty(kIntKey));
|
| +
|
| + v.SetLocalProperty(kStringKey, static_cast<const char*>(NULL));
|
| + EXPECT_EQ(NULL, v.GetLocalProperty(kStringKey));
|
| + v.SetLocalProperty(kStringKey, "squeamish");
|
| + EXPECT_EQ(std::string("squeamish"), v.GetLocalProperty(kStringKey));
|
| + v.SetLocalProperty(kStringKey, "ossifrage");
|
| + EXPECT_EQ(std::string("ossifrage"), v.GetLocalProperty(kStringKey));
|
| +
|
| + // ClearProperty should restore the default value.
|
| + v.ClearLocalProperty(kIntKey);
|
| + EXPECT_EQ(-2, v.GetLocalProperty(kIntKey));
|
| + v.ClearLocalProperty(kStringKey);
|
| + EXPECT_EQ(std::string("squeamish"), v.GetLocalProperty(kStringKey));
|
| +}
|
| +
|
| +namespace {
|
| +
|
| +class TestProperty {
|
| + public:
|
| + TestProperty() {}
|
| + virtual ~TestProperty() { last_deleted_ = this; }
|
| + static TestProperty* last_deleted() { return last_deleted_; }
|
| +
|
| + private:
|
| + static TestProperty* last_deleted_;
|
| + DISALLOW_COPY_AND_ASSIGN(TestProperty);
|
| +};
|
| +
|
| +TestProperty* TestProperty::last_deleted_ = NULL;
|
| +
|
| +DEFINE_OWNED_VIEW_PROPERTY_KEY(TestProperty, kOwnedKey, NULL);
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(ViewTest, OwnedProperty) {
|
| + TestProperty* p3 = NULL;
|
| + {
|
| + TestView v;
|
| + EXPECT_EQ(NULL, v.GetLocalProperty(kOwnedKey));
|
| + TestProperty* p1 = new TestProperty();
|
| + v.SetLocalProperty(kOwnedKey, p1);
|
| + EXPECT_EQ(p1, v.GetLocalProperty(kOwnedKey));
|
| + EXPECT_EQ(NULL, TestProperty::last_deleted());
|
| +
|
| + TestProperty* p2 = new TestProperty();
|
| + v.SetLocalProperty(kOwnedKey, p2);
|
| + EXPECT_EQ(p2, v.GetLocalProperty(kOwnedKey));
|
| + EXPECT_EQ(p1, TestProperty::last_deleted());
|
| +
|
| + v.ClearLocalProperty(kOwnedKey);
|
| + EXPECT_EQ(NULL, v.GetLocalProperty(kOwnedKey));
|
| + EXPECT_EQ(p2, TestProperty::last_deleted());
|
| +
|
| + p3 = new TestProperty();
|
| + v.SetLocalProperty(kOwnedKey, p3);
|
| + EXPECT_EQ(p3, v.GetLocalProperty(kOwnedKey));
|
| + EXPECT_EQ(p2, TestProperty::last_deleted());
|
| + }
|
| +
|
| + EXPECT_EQ(p3, TestProperty::last_deleted());
|
| +}
|
| +
|
| // ViewObserver --------------------------------------------------------
|
|
|
| typedef testing::Test ViewObserverTest;
|
| @@ -614,12 +697,12 @@ TEST_F(ViewObserverTest, SetVisible) {
|
|
|
| namespace {
|
|
|
| -class PropertyChangeObserver : public ViewObserver {
|
| +class SharedPropertyChangeObserver : public ViewObserver {
|
| public:
|
| - explicit PropertyChangeObserver(View* view) : view_(view) {
|
| + explicit SharedPropertyChangeObserver(View* view) : view_(view) {
|
| view_->AddObserver(this);
|
| }
|
| - virtual ~PropertyChangeObserver() { view_->RemoveObserver(this); }
|
| + virtual ~SharedPropertyChangeObserver() { view_->RemoveObserver(this); }
|
|
|
| Changes GetAndClearChanges() {
|
| Changes changes;
|
| @@ -629,16 +712,15 @@ class PropertyChangeObserver : public ViewObserver {
|
|
|
| private:
|
| // Overridden from ViewObserver:
|
| - void OnViewPropertyChanged(View* view,
|
| - const std::string& name,
|
| - const std::vector<uint8_t>* old_data,
|
| - const std::vector<uint8_t>* new_data) override {
|
| + void OnViewSharedPropertyChanged(
|
| + View* view,
|
| + const std::string& name,
|
| + const std::vector<uint8_t>* old_data,
|
| + const std::vector<uint8_t>* new_data) override {
|
| changes_.push_back(base::StringPrintf(
|
| - "view=%s property changed key=%s old_value=%s new_value=%s",
|
| - ViewIdToString(view->id()).c_str(),
|
| - name.c_str(),
|
| - VectorToString(old_data).c_str(),
|
| - VectorToString(new_data).c_str()));
|
| + "view=%s shared property changed key=%s old_value=%s new_value=%s",
|
| + ViewIdToString(view->id()).c_str(), name.c_str(),
|
| + VectorToString(old_data).c_str(), VectorToString(new_data).c_str()));
|
| }
|
|
|
| std::string VectorToString(const std::vector<uint8_t>* data) {
|
| @@ -653,50 +735,110 @@ class PropertyChangeObserver : public ViewObserver {
|
| View* view_;
|
| Changes changes_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(PropertyChangeObserver);
|
| + DISALLOW_COPY_AND_ASSIGN(SharedPropertyChangeObserver);
|
| };
|
|
|
| } // namespace
|
|
|
| -TEST_F(ViewObserverTest, SetProperty) {
|
| +TEST_F(ViewObserverTest, SetLocalProperty) {
|
| TestView v1;
|
| std::vector<uint8_t> one(1, '1');
|
|
|
| {
|
| // Change visibility from true to false and make sure we get notifications.
|
| - PropertyChangeObserver observer(&v1);
|
| - v1.SetProperty("one", &one);
|
| + SharedPropertyChangeObserver observer(&v1);
|
| + v1.SetSharedProperty("one", &one);
|
| Changes changes = observer.GetAndClearChanges();
|
| ASSERT_EQ(1U, changes.size());
|
| - EXPECT_EQ("view=0,1 property changed key=one old_value=NULL new_value=1",
|
| - changes[0]);
|
| - EXPECT_EQ(1U, v1.properties().size());
|
| + EXPECT_EQ(
|
| + "view=0,1 shared property changed key=one old_value=NULL new_value=1",
|
| + changes[0]);
|
| + EXPECT_EQ(1U, v1.shared_properties().size());
|
| }
|
| {
|
| // Set visible to existing value and verify no notifications.
|
| - PropertyChangeObserver observer(&v1);
|
| - v1.SetProperty("one", &one);
|
| + SharedPropertyChangeObserver observer(&v1);
|
| + v1.SetSharedProperty("one", &one);
|
| EXPECT_TRUE(observer.GetAndClearChanges().empty());
|
| - EXPECT_EQ(1U, v1.properties().size());
|
| + EXPECT_EQ(1U, v1.shared_properties().size());
|
| }
|
| {
|
| // Set the value to NULL to delete it.
|
| // Change visibility from true to false and make sure we get notifications.
|
| - PropertyChangeObserver observer(&v1);
|
| - v1.SetProperty("one", NULL);
|
| + SharedPropertyChangeObserver observer(&v1);
|
| + v1.SetSharedProperty("one", NULL);
|
| Changes changes = observer.GetAndClearChanges();
|
| ASSERT_EQ(1U, changes.size());
|
| - EXPECT_EQ("view=0,1 property changed key=one old_value=1 new_value=NULL",
|
| - changes[0]);
|
| - EXPECT_EQ(0U, v1.properties().size());
|
| + EXPECT_EQ(
|
| + "view=0,1 shared property changed key=one old_value=1 new_value=NULL",
|
| + changes[0]);
|
| + EXPECT_EQ(0U, v1.shared_properties().size());
|
| }
|
| {
|
| // Setting a null property to null shouldn't update us.
|
| - PropertyChangeObserver observer(&v1);
|
| - v1.SetProperty("one", NULL);
|
| + SharedPropertyChangeObserver observer(&v1);
|
| + v1.SetSharedProperty("one", NULL);
|
| EXPECT_TRUE(observer.GetAndClearChanges().empty());
|
| - EXPECT_EQ(0U, v1.properties().size());
|
| + EXPECT_EQ(0U, v1.shared_properties().size());
|
| + }
|
| +}
|
| +
|
| +namespace {
|
| +
|
| +typedef std::pair<const void*, intptr_t> PropertyChangeInfo;
|
| +
|
| +class LocalPropertyChangeObserver : public ViewObserver {
|
| + public:
|
| + explicit LocalPropertyChangeObserver(View* view)
|
| + : view_(view),
|
| + property_key_(nullptr),
|
| + old_property_value_(-1) {
|
| + view_->AddObserver(this);
|
| + }
|
| + virtual ~LocalPropertyChangeObserver() { view_->RemoveObserver(this); }
|
| +
|
| + PropertyChangeInfo PropertyChangeInfoAndClear() {
|
| + PropertyChangeInfo result(property_key_, old_property_value_);
|
| + property_key_ = NULL;
|
| + old_property_value_ = -3;
|
| + return result;
|
| + }
|
| +
|
| + private:
|
| + void OnViewLocalPropertyChanged(View* window,
|
| + const void* key,
|
| + intptr_t old) override {
|
| + property_key_ = key;
|
| + old_property_value_ = old;
|
| }
|
| +
|
| + View* view_;
|
| + const void* property_key_;
|
| + intptr_t old_property_value_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(LocalPropertyChangeObserver);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(ViewObserverTest, LocalPropertyChanged) {
|
| + TestView v1;
|
| + LocalPropertyChangeObserver o(&v1);
|
| +
|
| + static const ViewProperty<int> prop = {-2};
|
| +
|
| + v1.SetLocalProperty(&prop, 1);
|
| + EXPECT_EQ(PropertyChangeInfo(&prop, -2), o.PropertyChangeInfoAndClear());
|
| + v1.SetLocalProperty(&prop, -2);
|
| + EXPECT_EQ(PropertyChangeInfo(&prop, 1), o.PropertyChangeInfoAndClear());
|
| + v1.SetLocalProperty(&prop, 3);
|
| + EXPECT_EQ(PropertyChangeInfo(&prop, -2), o.PropertyChangeInfoAndClear());
|
| + v1.ClearLocalProperty(&prop);
|
| + EXPECT_EQ(PropertyChangeInfo(&prop, 3), o.PropertyChangeInfoAndClear());
|
| +
|
| + // Sanity check to see if |PropertyChangeInfoAndClear| really clears.
|
| + EXPECT_EQ(PropertyChangeInfo(
|
| + reinterpret_cast<const void*>(NULL), -3), o.PropertyChangeInfoAndClear());
|
| }
|
|
|
| } // namespace mojo
|
|
|