// 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.

#include "base/macros.h"
#include "components/prefs/default_pref_store.h"
#include "testing/gtest/include/gtest/gtest.h"

using base::Value;

namespace {

class MockPrefStoreObserver : public PrefStore::Observer {
 public:
  explicit MockPrefStoreObserver(DefaultPrefStore* pref_store);
  ~MockPrefStoreObserver() override;

  int change_count() {
    return change_count_;
  }

  // PrefStore::Observer implementation:
  void OnPrefValueChanged(const std::string& key) override;
  void OnInitializationCompleted(bool succeeded) override {}

 private:
  DefaultPrefStore* pref_store_;

  int change_count_;

  DISALLOW_COPY_AND_ASSIGN(MockPrefStoreObserver);
};

MockPrefStoreObserver::MockPrefStoreObserver(DefaultPrefStore* pref_store)
    : pref_store_(pref_store), change_count_(0) {
  pref_store_->AddObserver(this);
}

MockPrefStoreObserver::~MockPrefStoreObserver() {
  pref_store_->RemoveObserver(this);
}

void MockPrefStoreObserver::OnPrefValueChanged(const std::string& key) {
  change_count_++;
}

}  // namespace

TEST(DefaultPrefStoreTest, NotifyPrefValueChanged) {
  scoped_refptr<DefaultPrefStore> pref_store(new DefaultPrefStore);
  MockPrefStoreObserver observer(pref_store.get());
  std::string kPrefKey("pref_key");

  // Setting a default value shouldn't send a change notification.
  pref_store->SetDefaultValue(kPrefKey,
                              std::unique_ptr<Value>(new Value("foo")));
  EXPECT_EQ(0, observer.change_count());

  // Replacing the default value should send a change notification...
  pref_store->ReplaceDefaultValue(kPrefKey,
                                  std::unique_ptr<Value>(new Value("bar")));
  EXPECT_EQ(1, observer.change_count());

  // But only if the value actually changed.
  pref_store->ReplaceDefaultValue(kPrefKey,
                                  std::unique_ptr<Value>(new Value("bar")));
  EXPECT_EQ(1, observer.change_count());
}

