blob: c64715945b7b0b85cc4d27a788a4d16e9a31780c [file] [log] [blame]
Adam Lesinski1ab598f2015-08-14 14:26:04 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef AAPT_TEST_BUILDERS_H
18#define AAPT_TEST_BUILDERS_H
19
20#include "ResourceTable.h"
21#include "ResourceValues.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070022#include "test/Common.h"
Adam Lesinski467f1712015-11-16 17:35:44 -080023#include "util/Util.h"
24#include "xml/XmlDom.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070025
26#include <memory>
27
28namespace aapt {
29namespace test {
30
31class ResourceTableBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070032 private:
33 DummyDiagnosticsImpl mDiagnostics;
34 std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -070035
Adam Lesinskicacb28f2016-10-19 12:18:14 -070036 public:
37 ResourceTableBuilder() = default;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070038
Adam Lesinskicacb28f2016-10-19 12:18:14 -070039 StringPool* getStringPool() { return &mTable->stringPool; }
Adam Lesinskia5870652015-11-20 15:32:30 -080040
Adam Lesinskicacb28f2016-10-19 12:18:14 -070041 ResourceTableBuilder& setPackageId(const StringPiece& packageName,
42 uint8_t id) {
43 ResourceTablePackage* package = mTable->createPackage(packageName, id);
44 assert(package);
45 return *this;
46 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070047
Adam Lesinskicacb28f2016-10-19 12:18:14 -070048 ResourceTableBuilder& addSimple(const StringPiece& name,
49 const ResourceId& id = {}) {
50 return addValue(name, id, util::make_unique<Id>());
51 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070052
Adam Lesinskicacb28f2016-10-19 12:18:14 -070053 ResourceTableBuilder& addSimple(const StringPiece& name,
54 const ConfigDescription& config,
55 const ResourceId& id = {}) {
56 return addValue(name, config, id, util::make_unique<Id>());
57 }
Adam Lesinskifb6312f2016-06-28 14:40:32 -070058
Adam Lesinskicacb28f2016-10-19 12:18:14 -070059 ResourceTableBuilder& addReference(const StringPiece& name,
60 const StringPiece& ref) {
61 return addReference(name, {}, ref);
62 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070063
Adam Lesinskicacb28f2016-10-19 12:18:14 -070064 ResourceTableBuilder& addReference(const StringPiece& name,
65 const ResourceId& id,
66 const StringPiece& ref) {
67 return addValue(name, id,
68 util::make_unique<Reference>(parseNameOrDie(ref)));
69 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070070
Adam Lesinskicacb28f2016-10-19 12:18:14 -070071 ResourceTableBuilder& addString(const StringPiece& name,
72 const StringPiece& str) {
73 return addString(name, {}, str);
74 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070075
Adam Lesinskicacb28f2016-10-19 12:18:14 -070076 ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
77 const StringPiece& str) {
78 return addValue(name, id,
79 util::make_unique<String>(mTable->stringPool.makeRef(str)));
80 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070081
Adam Lesinskicacb28f2016-10-19 12:18:14 -070082 ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
83 const ConfigDescription& config,
84 const StringPiece& str) {
85 return addValue(name, config, id,
86 util::make_unique<String>(mTable->stringPool.makeRef(str)));
87 }
Adam Lesinski393b5f02015-12-17 13:03:11 -080088
Adam Lesinskicacb28f2016-10-19 12:18:14 -070089 ResourceTableBuilder& addFileReference(const StringPiece& name,
90 const StringPiece& path) {
91 return addFileReference(name, {}, path);
92 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070093
Adam Lesinskicacb28f2016-10-19 12:18:14 -070094 ResourceTableBuilder& addFileReference(const StringPiece& name,
95 const ResourceId& id,
96 const StringPiece& path) {
97 return addValue(name, id, util::make_unique<FileReference>(
98 mTable->stringPool.makeRef(path)));
99 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700100
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700101 ResourceTableBuilder& addFileReference(const StringPiece& name,
102 const StringPiece& path,
103 const ConfigDescription& config) {
104 return addValue(name, config, {}, util::make_unique<FileReference>(
105 mTable->stringPool.makeRef(path)));
106 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700107
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700108 ResourceTableBuilder& addValue(const StringPiece& name,
109 std::unique_ptr<Value> value) {
110 return addValue(name, {}, std::move(value));
111 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700112
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700113 ResourceTableBuilder& addValue(const StringPiece& name, const ResourceId& id,
114 std::unique_ptr<Value> value) {
115 return addValue(name, {}, id, std::move(value));
116 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700117
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700118 ResourceTableBuilder& addValue(const StringPiece& name,
119 const ConfigDescription& config,
120 const ResourceId& id,
121 std::unique_ptr<Value> value) {
122 ResourceName resName = parseNameOrDie(name);
123 bool result = mTable->addResourceAllowMangled(
124 resName, id, config, {}, std::move(value), &mDiagnostics);
125 assert(result);
126 return *this;
127 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700128
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700129 ResourceTableBuilder& setSymbolState(const StringPiece& name,
130 const ResourceId& id,
131 SymbolState state) {
132 ResourceName resName = parseNameOrDie(name);
133 Symbol symbol;
134 symbol.state = state;
135 bool result =
136 mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
137 assert(result);
138 return *this;
139 }
Adam Lesinskie78fd612015-10-22 12:48:43 -0700140
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700141 std::unique_ptr<ResourceTable> build() { return std::move(mTable); }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700142};
143
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700144inline std::unique_ptr<Reference> buildReference(
145 const StringPiece& ref, const Maybe<ResourceId>& id = {}) {
146 std::unique_ptr<Reference> reference =
147 util::make_unique<Reference>(parseNameOrDie(ref));
148 reference->id = id;
149 return reference;
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700150}
151
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700152inline std::unique_ptr<BinaryPrimitive> buildPrimitive(uint8_t type,
153 uint32_t data) {
154 android::Res_value value = {};
155 value.size = sizeof(value);
156 value.dataType = type;
157 value.data = data;
158 return util::make_unique<BinaryPrimitive>(value);
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -0800159}
160
Adam Lesinskie78fd612015-10-22 12:48:43 -0700161template <typename T>
162class ValueBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700163 private:
164 std::unique_ptr<Value> mValue;
Adam Lesinskie78fd612015-10-22 12:48:43 -0700165
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700166 public:
167 template <typename... Args>
168 explicit ValueBuilder(Args&&... args)
169 : mValue(new T{std::forward<Args>(args)...}) {}
Adam Lesinskie78fd612015-10-22 12:48:43 -0700170
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700171 template <typename... Args>
172 ValueBuilder& setSource(Args&&... args) {
173 mValue->setSource(Source{std::forward<Args>(args)...});
174 return *this;
175 }
Adam Lesinskie78fd612015-10-22 12:48:43 -0700176
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700177 ValueBuilder& setComment(const StringPiece& str) {
178 mValue->setComment(str);
179 return *this;
180 }
Adam Lesinskie78fd612015-10-22 12:48:43 -0700181
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700182 std::unique_ptr<Value> build() { return std::move(mValue); }
Adam Lesinskie78fd612015-10-22 12:48:43 -0700183};
184
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700185class AttributeBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700186 private:
187 std::unique_ptr<Attribute> mAttr;
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700188
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700189 public:
190 explicit AttributeBuilder(bool weak = false)
191 : mAttr(util::make_unique<Attribute>(weak)) {
192 mAttr->typeMask = android::ResTable_map::TYPE_ANY;
193 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700194
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700195 AttributeBuilder& setTypeMask(uint32_t typeMask) {
196 mAttr->typeMask = typeMask;
197 return *this;
198 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700199
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700200 AttributeBuilder& addItem(const StringPiece& name, uint32_t value) {
201 mAttr->symbols.push_back(Attribute::Symbol{
202 Reference(ResourceName({}, ResourceType::kId, name)), value});
203 return *this;
204 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700205
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700206 std::unique_ptr<Attribute> build() { return std::move(mAttr); }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700207};
208
209class StyleBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700210 private:
211 std::unique_ptr<Style> mStyle = util::make_unique<Style>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700212
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700213 public:
214 StyleBuilder& setParent(const StringPiece& str) {
215 mStyle->parent = Reference(parseNameOrDie(str));
216 return *this;
217 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700218
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700219 StyleBuilder& addItem(const StringPiece& str, std::unique_ptr<Item> value) {
220 mStyle->entries.push_back(
221 Style::Entry{Reference(parseNameOrDie(str)), std::move(value)});
222 return *this;
223 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700224
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700225 StyleBuilder& addItem(const StringPiece& str, const ResourceId& id,
226 std::unique_ptr<Item> value) {
227 addItem(str, std::move(value));
228 mStyle->entries.back().key.id = id;
229 return *this;
230 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700231
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700232 std::unique_ptr<Style> build() { return std::move(mStyle); }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700233};
234
235class StyleableBuilder {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700236 private:
237 std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700238
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700239 public:
240 StyleableBuilder& addItem(const StringPiece& str,
241 const Maybe<ResourceId>& id = {}) {
242 mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
243 mStyleable->entries.back().id = id;
244 return *this;
245 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700246
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700247 std::unique_ptr<Styleable> build() { return std::move(mStyleable); }
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700248};
249
Adam Lesinski467f1712015-11-16 17:35:44 -0800250inline std::unique_ptr<xml::XmlResource> buildXmlDom(const StringPiece& str) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700251 std::stringstream in;
252 in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
253 StdErrDiagnostics diag;
254 std::unique_ptr<xml::XmlResource> doc =
255 xml::inflate(&in, &diag, Source("test.xml"));
256 assert(doc);
257 return doc;
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700258}
259
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700260inline std::unique_ptr<xml::XmlResource> buildXmlDomForPackageName(
261 IAaptContext* context, const StringPiece& str) {
262 std::unique_ptr<xml::XmlResource> doc = buildXmlDom(str);
263 doc->file.name.package = context->getCompilationPackage();
264 return doc;
Adam Lesinski467f1712015-11-16 17:35:44 -0800265}
266
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700267} // namespace test
268} // namespace aapt
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700269
270#endif /* AAPT_TEST_BUILDERS_H */