| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/browser/api/declarative/deduping_factory.h" | 5 #include "extensions/browser/api/declarative/deduping_factory.h" |
| 6 | 6 |
| 7 #include <memory> |
| 8 |
| 7 #include "base/macros.h" | 9 #include "base/macros.h" |
| 8 #include "base/memory/scoped_ptr.h" | |
| 9 #include "base/values.h" | 10 #include "base/values.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 12 |
| 12 namespace { | 13 namespace { |
| 13 | 14 |
| 14 const char kTypeName[] = "Foo"; | 15 const char kTypeName[] = "Foo"; |
| 15 const char kTypeName2[] = "Foo2"; | 16 const char kTypeName2[] = "Foo2"; |
| 16 | 17 |
| 17 // This serves as an example how to use the DedupingFactory. | 18 // This serves as an example how to use the DedupingFactory. |
| 18 class BaseClass : public base::RefCounted<BaseClass> { | 19 class BaseClass : public base::RefCounted<BaseClass> { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 CHECK(value->GetAsDictionary(&dict)); | 66 CHECK(value->GetAsDictionary(&dict)); |
| 66 int parameter = 0; | 67 int parameter = 0; |
| 67 if (!dict->GetInteger("parameter", ¶meter)) { | 68 if (!dict->GetInteger("parameter", ¶meter)) { |
| 68 *error = "No parameter"; | 69 *error = "No parameter"; |
| 69 *bad_message = true; | 70 *bad_message = true; |
| 70 return scoped_refptr<const BaseClass>(NULL); | 71 return scoped_refptr<const BaseClass>(NULL); |
| 71 } | 72 } |
| 72 return scoped_refptr<const BaseClass>(new Foo(parameter)); | 73 return scoped_refptr<const BaseClass>(new Foo(parameter)); |
| 73 } | 74 } |
| 74 | 75 |
| 75 scoped_ptr<base::DictionaryValue> CreateDictWithParameter(int parameter) { | 76 std::unique_ptr<base::DictionaryValue> CreateDictWithParameter(int parameter) { |
| 76 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue); | 77 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue); |
| 77 dict->SetInteger("parameter", parameter); | 78 dict->SetInteger("parameter", parameter); |
| 78 return dict; | 79 return dict; |
| 79 } | 80 } |
| 80 | 81 |
| 81 } // namespace | 82 } // namespace |
| 82 | 83 |
| 83 namespace extensions { | 84 namespace extensions { |
| 84 | 85 |
| 85 TEST(DedupingFactoryTest, InstantiationParameterized) { | 86 TEST(DedupingFactoryTest, InstantiationParameterized) { |
| 86 DedupingFactory<BaseClass> factory(2); | 87 DedupingFactory<BaseClass> factory(2); |
| 87 factory.RegisterFactoryMethod( | 88 factory.RegisterFactoryMethod( |
| 88 kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo); | 89 kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo); |
| 89 | 90 |
| 90 scoped_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1)); | 91 std::unique_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1)); |
| 91 scoped_ptr<base::DictionaryValue> d2(CreateDictWithParameter(2)); | 92 std::unique_ptr<base::DictionaryValue> d2(CreateDictWithParameter(2)); |
| 92 scoped_ptr<base::DictionaryValue> d3(CreateDictWithParameter(3)); | 93 std::unique_ptr<base::DictionaryValue> d3(CreateDictWithParameter(3)); |
| 93 scoped_ptr<base::DictionaryValue> d4(CreateDictWithParameter(4)); | 94 std::unique_ptr<base::DictionaryValue> d4(CreateDictWithParameter(4)); |
| 94 | 95 |
| 95 std::string error; | 96 std::string error; |
| 96 bool bad_message = false; | 97 bool bad_message = false; |
| 97 | 98 |
| 98 // Fill factory with 2 different types. | 99 // Fill factory with 2 different types. |
| 99 scoped_refptr<const BaseClass> c1( | 100 scoped_refptr<const BaseClass> c1( |
| 100 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); | 101 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); |
| 101 scoped_refptr<const BaseClass> c2( | 102 scoped_refptr<const BaseClass> c2( |
| 102 factory.Instantiate(kTypeName, d2.get(), &error, &bad_message)); | 103 factory.Instantiate(kTypeName, d2.get(), &error, &bad_message)); |
| 103 ASSERT_TRUE(c1.get()); | 104 ASSERT_TRUE(c1.get()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 127 factory.Instantiate(kTypeName, d2.get(), &error, &bad_message)); | 128 factory.Instantiate(kTypeName, d2.get(), &error, &bad_message)); |
| 128 EXPECT_EQ(2, static_cast<const Foo*>(c2_c.get())->parameter()); | 129 EXPECT_EQ(2, static_cast<const Foo*>(c2_c.get())->parameter()); |
| 129 EXPECT_EQ(c2, c2_c); | 130 EXPECT_EQ(c2, c2_c); |
| 130 } | 131 } |
| 131 | 132 |
| 132 TEST(DedupingFactoryTest, InstantiationNonParameterized) { | 133 TEST(DedupingFactoryTest, InstantiationNonParameterized) { |
| 133 DedupingFactory<BaseClass> factory(2); | 134 DedupingFactory<BaseClass> factory(2); |
| 134 factory.RegisterFactoryMethod( | 135 factory.RegisterFactoryMethod( |
| 135 kTypeName, DedupingFactory<BaseClass>::IS_NOT_PARAMETERIZED, &CreateFoo); | 136 kTypeName, DedupingFactory<BaseClass>::IS_NOT_PARAMETERIZED, &CreateFoo); |
| 136 | 137 |
| 137 scoped_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1)); | 138 std::unique_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1)); |
| 138 scoped_ptr<base::DictionaryValue> d2(CreateDictWithParameter(2)); | 139 std::unique_ptr<base::DictionaryValue> d2(CreateDictWithParameter(2)); |
| 139 | 140 |
| 140 std::string error; | 141 std::string error; |
| 141 bool bad_message = false; | 142 bool bad_message = false; |
| 142 | 143 |
| 143 // We create two instances with different dictionaries but because the type is | 144 // We create two instances with different dictionaries but because the type is |
| 144 // declared to be not parameterized, we should get the same instance. | 145 // declared to be not parameterized, we should get the same instance. |
| 145 scoped_refptr<const BaseClass> c1( | 146 scoped_refptr<const BaseClass> c1( |
| 146 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); | 147 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); |
| 147 scoped_refptr<const BaseClass> c2( | 148 scoped_refptr<const BaseClass> c2( |
| 148 factory.Instantiate(kTypeName, d2.get(), &error, &bad_message)); | 149 factory.Instantiate(kTypeName, d2.get(), &error, &bad_message)); |
| 149 ASSERT_TRUE(c1.get()); | 150 ASSERT_TRUE(c1.get()); |
| 150 ASSERT_TRUE(c2.get()); | 151 ASSERT_TRUE(c2.get()); |
| 151 EXPECT_EQ(1, static_cast<const Foo*>(c1.get())->parameter()); | 152 EXPECT_EQ(1, static_cast<const Foo*>(c1.get())->parameter()); |
| 152 EXPECT_EQ(1, static_cast<const Foo*>(c2.get())->parameter()); | 153 EXPECT_EQ(1, static_cast<const Foo*>(c2.get())->parameter()); |
| 153 EXPECT_EQ(c1, c2); | 154 EXPECT_EQ(c1, c2); |
| 154 } | 155 } |
| 155 | 156 |
| 156 TEST(DedupingFactoryTest, TypeNames) { | 157 TEST(DedupingFactoryTest, TypeNames) { |
| 157 DedupingFactory<BaseClass> factory(2); | 158 DedupingFactory<BaseClass> factory(2); |
| 158 factory.RegisterFactoryMethod( | 159 factory.RegisterFactoryMethod( |
| 159 kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo); | 160 kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo); |
| 160 factory.RegisterFactoryMethod( | 161 factory.RegisterFactoryMethod( |
| 161 kTypeName2, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo); | 162 kTypeName2, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo); |
| 162 | 163 |
| 163 scoped_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1)); | 164 std::unique_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1)); |
| 164 | 165 |
| 165 std::string error; | 166 std::string error; |
| 166 bool bad_message = false; | 167 bool bad_message = false; |
| 167 | 168 |
| 168 scoped_refptr<const BaseClass> c1_a( | 169 scoped_refptr<const BaseClass> c1_a( |
| 169 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); | 170 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); |
| 170 scoped_refptr<const BaseClass> c1_b( | 171 scoped_refptr<const BaseClass> c1_b( |
| 171 factory.Instantiate(kTypeName2, d1.get(), &error, &bad_message)); | 172 factory.Instantiate(kTypeName2, d1.get(), &error, &bad_message)); |
| 172 | 173 |
| 173 ASSERT_TRUE(c1_a.get()); | 174 ASSERT_TRUE(c1_a.get()); |
| 174 ASSERT_TRUE(c1_b.get()); | 175 ASSERT_TRUE(c1_b.get()); |
| 175 EXPECT_NE(c1_a, c1_b); | 176 EXPECT_NE(c1_a, c1_b); |
| 176 } | 177 } |
| 177 | 178 |
| 178 TEST(DedupingFactoryTest, Clear) { | 179 TEST(DedupingFactoryTest, Clear) { |
| 179 DedupingFactory<BaseClass> factory(2); | 180 DedupingFactory<BaseClass> factory(2); |
| 180 factory.RegisterFactoryMethod( | 181 factory.RegisterFactoryMethod( |
| 181 kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo); | 182 kTypeName, DedupingFactory<BaseClass>::IS_PARAMETERIZED, &CreateFoo); |
| 182 | 183 |
| 183 scoped_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1)); | 184 std::unique_ptr<base::DictionaryValue> d1(CreateDictWithParameter(1)); |
| 184 | 185 |
| 185 std::string error; | 186 std::string error; |
| 186 bool bad_message = false; | 187 bool bad_message = false; |
| 187 | 188 |
| 188 scoped_refptr<const BaseClass> c1_a( | 189 scoped_refptr<const BaseClass> c1_a( |
| 189 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); | 190 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); |
| 190 | 191 |
| 191 factory.ClearPrototypes(); | 192 factory.ClearPrototypes(); |
| 192 | 193 |
| 193 scoped_refptr<const BaseClass> c1_b( | 194 scoped_refptr<const BaseClass> c1_b( |
| 194 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); | 195 factory.Instantiate(kTypeName, d1.get(), &error, &bad_message)); |
| 195 | 196 |
| 196 ASSERT_TRUE(c1_a.get()); | 197 ASSERT_TRUE(c1_a.get()); |
| 197 ASSERT_TRUE(c1_b.get()); | 198 ASSERT_TRUE(c1_b.get()); |
| 198 EXPECT_NE(c1_a, c1_b); | 199 EXPECT_NE(c1_a, c1_b); |
| 199 } | 200 } |
| 200 | 201 |
| 201 } // namespace extensions | 202 } // namespace extensions |
| OLD | NEW |