This source file includes following definitions.
- type
- parameter_
- Equals
- parameter
- CreateFoo
- CreateDictWithParameter
- TEST
- TEST
- TEST
- TEST
#include "chrome/browser/extensions/api/declarative/deduping_factory.h"
#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
const char kTypeName[] = "Foo";
const char kTypeName2[] = "Foo2";
class BaseClass : public base::RefCounted<BaseClass> {
public:
enum Type { FOO };
explicit BaseClass(Type type) : type_(type) {}
Type type() const { return type_; }
virtual bool Equals(const BaseClass* other) const = 0;
protected:
friend class base::RefCounted<BaseClass>;
virtual ~BaseClass() {}
private:
const Type type_;
};
class Foo : public BaseClass {
public:
explicit Foo(int parameter) : BaseClass(FOO), parameter_(parameter) {}
virtual bool Equals(const BaseClass* other) const OVERRIDE {
return other->type() == type() &&
static_cast<const Foo*>(other)->parameter_ == parameter_;
}
int parameter() const {
return parameter_;
}
private:
friend class base::RefCounted<BaseClass>;
virtual ~Foo() {}
const int parameter_;
DISALLOW_COPY_AND_ASSIGN(Foo);
};
scoped_refptr<const BaseClass> CreateFoo(const std::string& ,
const base::Value* value,
std::string* error,
bool* bad_message) {
const base::DictionaryValue* dict = NULL;
CHECK(value->GetAsDictionary(&dict));
int parameter = 0;
if (!dict->GetInteger("parameter", ¶meter)) {
*error = "No parameter";
*bad_message = true;
return scoped_refptr<const BaseClass>(NULL);
}
return scoped_refptr<const BaseClass>(new Foo(parameter));
}
scoped_ptr<base::DictionaryValue> CreateDictWithParameter(int parameter) {
scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
dict->SetInteger("parameter", parameter);
return dict.Pass();
}
}
namespace extensions {
TEST(DedupingFactoryTest, InstantiationParameterized) {
DedupingFactory<BaseClass> factory(2);
factory.RegisterFactoryMethod(
kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo);
scoped_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1));
scoped_ptr<base::DictionaryValue> d2(CreateDictWithParameter(2));
scoped_ptr<base::DictionaryValue> d3(CreateDictWithParameter(3));
scoped_ptr<base::DictionaryValue> d4(CreateDictWithParameter(4));
std::string error;
bool bad_message = false;
scoped_refptr<const BaseClass> c1(
factory.Instantiate(kTypeName, d1.get(), &error, &bad_message));
scoped_refptr<const BaseClass> c2(
factory.Instantiate(kTypeName, d2.get(), &error, &bad_message));
ASSERT_TRUE(c1.get());
ASSERT_TRUE(c2.get());
EXPECT_EQ(1, static_cast<const Foo*>(c1.get())->parameter());
EXPECT_EQ(2, static_cast<const Foo*>(c2.get())->parameter());
scoped_refptr<const BaseClass> c3(
factory.Instantiate(kTypeName, d3.get(), &error, &bad_message));
ASSERT_TRUE(c3.get());
EXPECT_EQ(3, static_cast<const Foo*>(c3.get())->parameter());
scoped_refptr<const BaseClass> c2_b(
factory.Instantiate(kTypeName, d2.get(), &error, &bad_message));
EXPECT_EQ(2, static_cast<const Foo*>(c2_b.get())->parameter());
EXPECT_EQ(c2, c2_b);
scoped_refptr<const BaseClass> c1_b(
factory.Instantiate(kTypeName, d1.get(), &error, &bad_message));
scoped_refptr<const BaseClass> c2_c(
factory.Instantiate(kTypeName, d2.get(), &error, &bad_message));
EXPECT_EQ(2, static_cast<const Foo*>(c2_c.get())->parameter());
EXPECT_EQ(c2, c2_c);
}
TEST(DedupingFactoryTest, InstantiationNonParameterized) {
DedupingFactory<BaseClass> factory(2);
factory.RegisterFactoryMethod(
kTypeName, DedupingFactory<BaseClass>::IS_NOT_PARAMETERIZED, &CreateFoo);
scoped_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1));
scoped_ptr<base::DictionaryValue> d2(CreateDictWithParameter(2));
std::string error;
bool bad_message = false;
scoped_refptr<const BaseClass> c1(
factory.Instantiate(kTypeName, d1.get(), &error, &bad_message));
scoped_refptr<const BaseClass> c2(
factory.Instantiate(kTypeName, d2.get(), &error, &bad_message));
ASSERT_TRUE(c1.get());
ASSERT_TRUE(c2.get());
EXPECT_EQ(1, static_cast<const Foo*>(c1.get())->parameter());
EXPECT_EQ(1, static_cast<const Foo*>(c2.get())->parameter());
EXPECT_EQ(c1, c2);
}
TEST(DedupingFactoryTest, TypeNames) {
DedupingFactory<BaseClass> factory(2);
factory.RegisterFactoryMethod(
kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo);
factory.RegisterFactoryMethod(
kTypeName2, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo);
scoped_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1));
std::string error;
bool bad_message = false;
scoped_refptr<const BaseClass> c1_a(
factory.Instantiate(kTypeName, d1.get(), &error, &bad_message));
scoped_refptr<const BaseClass> c1_b(
factory.Instantiate(kTypeName2, d1.get(), &error, &bad_message));
ASSERT_TRUE(c1_a.get());
ASSERT_TRUE(c1_b.get());
EXPECT_NE(c1_a, c1_b);
}
TEST(DedupingFactoryTest, Clear) {
DedupingFactory<BaseClass> factory(2);
factory.RegisterFactoryMethod(
kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo);
scoped_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1));
std::string error;
bool bad_message = false;
scoped_refptr<const BaseClass> c1_a(
factory.Instantiate(kTypeName, d1.get(), &error, &bad_message));
factory.ClearPrototypes();
scoped_refptr<const BaseClass> c1_b(
factory.Instantiate(kTypeName, d1.get(), &error, &bad_message));
ASSERT_TRUE(c1_a.get());
ASSERT_TRUE(c1_b.get());
EXPECT_NE(c1_a, c1_b);
}
}