blob: 1b510e756855a793a0b3ef7142bfce01ecc106b0 [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"
22#include "util/Util.h"
23#include "XmlDom.h"
24
25#include "test/Common.h"
26
27#include <memory>
28
29namespace aapt {
30namespace test {
31
32class ResourceTableBuilder {
33private:
34 DummyDiagnosticsImpl mDiagnostics;
35 std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();
36
37public:
38 ResourceTableBuilder() = default;
39
40 ResourceTableBuilder& setPackageId(const StringPiece16& packageName, uint8_t id) {
41 ResourceTablePackage* package = mTable->createPackage(packageName, id);
42 assert(package);
43 return *this;
44 }
45
Adam Lesinskie78fd612015-10-22 12:48:43 -070046 ResourceTableBuilder& addSimple(const StringPiece16& name, const ResourceId id = {}) {
Adam Lesinski1ab598f2015-08-14 14:26:04 -070047 return addValue(name, id, util::make_unique<Id>());
48 }
49
50 ResourceTableBuilder& addReference(const StringPiece16& name, const StringPiece16& ref) {
51 return addReference(name, {}, ref);
52 }
53
Adam Lesinskie78fd612015-10-22 12:48:43 -070054 ResourceTableBuilder& addReference(const StringPiece16& name, const ResourceId id,
Adam Lesinski1ab598f2015-08-14 14:26:04 -070055 const StringPiece16& ref) {
56 return addValue(name, id, util::make_unique<Reference>(parseNameOrDie(ref)));
57 }
58
59 ResourceTableBuilder& addString(const StringPiece16& name, const StringPiece16& str) {
60 return addString(name, {}, str);
61 }
62
Adam Lesinskie78fd612015-10-22 12:48:43 -070063 ResourceTableBuilder& addString(const StringPiece16& name, const ResourceId id,
Adam Lesinski1ab598f2015-08-14 14:26:04 -070064 const StringPiece16& str) {
65 return addValue(name, id, util::make_unique<String>(mTable->stringPool.makeRef(str)));
66 }
67
68 ResourceTableBuilder& addFileReference(const StringPiece16& name, const StringPiece16& path) {
69 return addFileReference(name, {}, path);
70 }
71
Adam Lesinskie78fd612015-10-22 12:48:43 -070072 ResourceTableBuilder& addFileReference(const StringPiece16& name, const ResourceId id,
Adam Lesinski1ab598f2015-08-14 14:26:04 -070073 const StringPiece16& path) {
74 return addValue(name, id,
75 util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
76 }
77
78
Adam Lesinskie78fd612015-10-22 12:48:43 -070079 ResourceTableBuilder& addValue(const StringPiece16& name,
80 std::unique_ptr<Value> value) {
Adam Lesinski1ab598f2015-08-14 14:26:04 -070081 return addValue(name, {}, std::move(value));
82 }
83
Adam Lesinskie78fd612015-10-22 12:48:43 -070084 ResourceTableBuilder& addValue(const StringPiece16& name, const ResourceId id,
Adam Lesinski1ab598f2015-08-14 14:26:04 -070085 std::unique_ptr<Value> value) {
86 return addValue(name, id, {}, std::move(value));
87 }
88
Adam Lesinskie78fd612015-10-22 12:48:43 -070089 ResourceTableBuilder& addValue(const StringPiece16& name, const ResourceId id,
90 const ConfigDescription& config,
91 std::unique_ptr<Value> value) {
Adam Lesinski9e10ac72015-10-16 14:37:48 -070092 ResourceName resName = parseNameOrDie(name);
Adam Lesinskie78fd612015-10-22 12:48:43 -070093 bool result = mTable->addResourceAllowMangled(resName, id, config, std::move(value),
Adam Lesinski9e10ac72015-10-16 14:37:48 -070094 &mDiagnostics);
Adam Lesinski1ab598f2015-08-14 14:26:04 -070095 assert(result);
96 return *this;
97 }
98
Adam Lesinskie78fd612015-10-22 12:48:43 -070099 ResourceTableBuilder& setSymbolState(const StringPiece16& name, ResourceId id,
100 SymbolState state) {
101 ResourceName resName = parseNameOrDie(name);
102 Symbol symbol;
103 symbol.state = state;
104 bool result = mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
105 assert(result);
106 return *this;
107 }
108
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700109 std::unique_ptr<ResourceTable> build() {
110 return std::move(mTable);
111 }
112};
113
114inline std::unique_ptr<Reference> buildReference(const StringPiece16& ref,
115 Maybe<ResourceId> id = {}) {
116 std::unique_ptr<Reference> reference = util::make_unique<Reference>(parseNameOrDie(ref));
117 reference->id = id;
118 return reference;
119}
120
Adam Lesinskie78fd612015-10-22 12:48:43 -0700121template <typename T>
122class ValueBuilder {
123private:
124 std::unique_ptr<Value> mValue;
125
126public:
127 template <typename... Args>
128 ValueBuilder(Args&&... args) : mValue(new T{ std::forward<Args>(args)... }) {
129 }
130
131 template <typename... Args>
132 ValueBuilder& setSource(Args&&... args) {
133 mValue->setSource(Source{ std::forward<Args>(args)... });
134 return *this;
135 }
136
137 ValueBuilder& setComment(const StringPiece16& str) {
138 mValue->setComment(str);
139 return *this;
140 }
141
142 std::unique_ptr<Value> build() {
143 return std::move(mValue);
144 }
145};
146
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700147class AttributeBuilder {
148private:
149 std::unique_ptr<Attribute> mAttr;
150
151public:
152 AttributeBuilder(bool weak = false) : mAttr(util::make_unique<Attribute>(weak)) {
153 mAttr->typeMask = android::ResTable_map::TYPE_ANY;
154 }
155
156 AttributeBuilder& setTypeMask(uint32_t typeMask) {
157 mAttr->typeMask = typeMask;
158 return *this;
159 }
160
161 AttributeBuilder& addItem(const StringPiece16& name, uint32_t value) {
162 mAttr->symbols.push_back(Attribute::Symbol{
163 Reference(ResourceName{ {}, ResourceType::kId, name.toString()}),
164 value});
165 return *this;
166 }
167
168 std::unique_ptr<Attribute> build() {
169 return std::move(mAttr);
170 }
171};
172
173class StyleBuilder {
174private:
175 std::unique_ptr<Style> mStyle = util::make_unique<Style>();
176
177public:
178 StyleBuilder& setParent(const StringPiece16& str) {
179 mStyle->parent = Reference(parseNameOrDie(str));
180 return *this;
181 }
182
183 StyleBuilder& addItem(const StringPiece16& str, std::unique_ptr<Item> value) {
184 mStyle->entries.push_back(Style::Entry{ Reference(parseNameOrDie(str)), std::move(value) });
185 return *this;
186 }
187
188 StyleBuilder& addItem(const StringPiece16& str, ResourceId id, std::unique_ptr<Item> value) {
189 addItem(str, std::move(value));
190 mStyle->entries.back().key.id = id;
191 return *this;
192 }
193
194 std::unique_ptr<Style> build() {
195 return std::move(mStyle);
196 }
197};
198
199class StyleableBuilder {
200private:
201 std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();
202
203public:
204 StyleableBuilder& addItem(const StringPiece16& str, Maybe<ResourceId> id = {}) {
205 mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
206 mStyleable->entries.back().id = id;
207 return *this;
208 }
209
210 std::unique_ptr<Styleable> build() {
211 return std::move(mStyleable);
212 }
213};
214
215inline std::unique_ptr<XmlResource> buildXmlDom(const StringPiece& str) {
216 std::stringstream in;
217 in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
218 StdErrDiagnostics diag;
219 std::unique_ptr<XmlResource> doc = xml::inflate(&in, &diag, {});
220 assert(doc);
221 return doc;
222}
223
224} // namespace test
225} // namespace aapt
226
227#endif /* AAPT_TEST_BUILDERS_H */