11ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/*
21ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
31ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
41ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
51ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * you may not use this file except in compliance with the License.
61ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * You may obtain a copy of the License at
71ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
81ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
91ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Unless required by applicable law or agreed to in writing, software
111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * See the License for the specific language governing permissions and
141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * limitations under the License.
151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski */
161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#ifndef AAPT_TEST_BUILDERS_H
181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#define AAPT_TEST_BUILDERS_H
191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "ResourceTable.h"
211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "ResourceValues.h"
221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "test/Common.h"
23467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "util/Util.h"
24467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "xml/XmlDom.h"
251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include <memory>
271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace aapt {
291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace test {
301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass ResourceTableBuilder {
321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate:
331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    DummyDiagnosticsImpl mDiagnostics;
341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();
351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic:
371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ResourceTableBuilder() = default;
381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
39a587065721053ad54e34f484868142407d59512dAdam Lesinski    StringPool* getStringPool() {
40a587065721053ad54e34f484868142407d59512dAdam Lesinski        return &mTable->stringPool;
41a587065721053ad54e34f484868142407d59512dAdam Lesinski    }
42a587065721053ad54e34f484868142407d59512dAdam Lesinski
431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ResourceTableBuilder& setPackageId(const StringPiece16& packageName, uint8_t id) {
441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        ResourceTablePackage* package = mTable->createPackage(packageName, id);
451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        assert(package);
461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return *this;
471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
49e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ResourceTableBuilder& addSimple(const StringPiece16& name, const ResourceId id = {}) {
501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addValue(name, id, util::make_unique<Id>());
511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ResourceTableBuilder& addReference(const StringPiece16& name, const StringPiece16& ref) {
541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addReference(name, {}, ref);
551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
57e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ResourceTableBuilder& addReference(const StringPiece16& name, const ResourceId id,
581ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                       const StringPiece16& ref) {
591ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addValue(name, id, util::make_unique<Reference>(parseNameOrDie(ref)));
601ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ResourceTableBuilder& addString(const StringPiece16& name, const StringPiece16& str) {
631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addString(name, {}, str);
641ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
651ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
66e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ResourceTableBuilder& addString(const StringPiece16& name, const ResourceId id,
671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                    const StringPiece16& str) {
681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addValue(name, id, util::make_unique<String>(mTable->stringPool.makeRef(str)));
691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
71393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    ResourceTableBuilder& addString(const StringPiece16& name, const ResourceId id,
72393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                    const ConfigDescription& config, const StringPiece16& str) {
73393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski        return addValue(name, id, config,
74393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                        util::make_unique<String>(mTable->stringPool.makeRef(str)));
75393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    }
76393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ResourceTableBuilder& addFileReference(const StringPiece16& name, const StringPiece16& path) {
781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addFileReference(name, {}, path);
791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
81e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ResourceTableBuilder& addFileReference(const StringPiece16& name, const ResourceId id,
821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                           const StringPiece16& path) {
831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addValue(name, id,
841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                        util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
876a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    ResourceTableBuilder& addFileReference(const StringPiece16& name, const StringPiece16& path,
886a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski                                           const ConfigDescription& config) {
896a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski        return addValue(name, {}, config,
906a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski                        util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
916a008170cb18666e04c42856f992fc7a0afa1e1fAdam Lesinski    }
921ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
93e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ResourceTableBuilder& addValue(const StringPiece16& name,
94e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski                                   std::unique_ptr<Value> value) {
951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addValue(name, {}, std::move(value));
961ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
971ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
98e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ResourceTableBuilder& addValue(const StringPiece16& name, const ResourceId id,
991ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                       std::unique_ptr<Value> value) {
1001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return addValue(name, id, {}, std::move(value));
1011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
1021ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
103e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ResourceTableBuilder& addValue(const StringPiece16& name, const ResourceId id,
104e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski                                   const ConfigDescription& config,
105e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski                                   std::unique_ptr<Value> value) {
1069e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski        ResourceName resName = parseNameOrDie(name);
107e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski        bool result = mTable->addResourceAllowMangled(resName, id, config, std::string(),
108e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski                                                      std::move(value), &mDiagnostics);
1091ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        assert(result);
1101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return *this;
1111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
1121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
113e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ResourceTableBuilder& setSymbolState(const StringPiece16& name, ResourceId id,
114e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski                                         SymbolState state) {
115e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        ResourceName resName = parseNameOrDie(name);
116e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        Symbol symbol;
117e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        symbol.state = state;
118e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        bool result = mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
119e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        assert(result);
120e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        return *this;
121e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    }
122e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski
1231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> build() {
1241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return std::move(mTable);
1251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
1261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski};
1271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiinline std::unique_ptr<Reference> buildReference(const StringPiece16& ref,
1291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                                 Maybe<ResourceId> id = {}) {
1301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<Reference> reference = util::make_unique<Reference>(parseNameOrDie(ref));
1311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    reference->id = id;
1321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    return reference;
1331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
1341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
135e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinskiinline std::unique_ptr<BinaryPrimitive> buildPrimitive(uint8_t type, uint32_t data) {
136e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski    android::Res_value value = {};
137e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski    value.size = sizeof(value);
138e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski    value.dataType = type;
139e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski    value.data = data;
140e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski    return util::make_unique<BinaryPrimitive>(value);
141e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski}
142e4bb9eb5af5b0899dc0921d5580220b20e15bd5aAdam Lesinski
143e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinskitemplate <typename T>
144e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinskiclass ValueBuilder {
145e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinskiprivate:
146e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    std::unique_ptr<Value> mValue;
147e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski
148e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinskipublic:
149e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    template <typename... Args>
150e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ValueBuilder(Args&&... args) : mValue(new T{ std::forward<Args>(args)... }) {
151e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    }
152e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski
153e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    template <typename... Args>
154e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ValueBuilder& setSource(Args&&... args) {
155e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        mValue->setSource(Source{ std::forward<Args>(args)... });
156e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        return *this;
157e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    }
158e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski
159e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    ValueBuilder& setComment(const StringPiece16& str) {
160e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        mValue->setComment(str);
161e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        return *this;
162e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    }
163e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski
164e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    std::unique_ptr<Value> build() {
165e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski        return std::move(mValue);
166e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski    }
167e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski};
168e78fd617ec60139a973a01925fa7adad31febb39Adam Lesinski
1691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass AttributeBuilder {
1701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate:
1711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<Attribute> mAttr;
1721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic:
1741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AttributeBuilder(bool weak = false) : mAttr(util::make_unique<Attribute>(weak)) {
1751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        mAttr->typeMask = android::ResTable_map::TYPE_ANY;
1761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
1771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AttributeBuilder& setTypeMask(uint32_t typeMask) {
1791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        mAttr->typeMask = typeMask;
1801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return *this;
1811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
1821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AttributeBuilder& addItem(const StringPiece16& name, uint32_t value) {
1841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        mAttr->symbols.push_back(Attribute::Symbol{
1851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                Reference(ResourceName{ {}, ResourceType::kId, name.toString()}),
1861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                value});
1871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return *this;
1881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
1891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<Attribute> build() {
1911ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return std::move(mAttr);
1921ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
1931ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski};
1941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass StyleBuilder {
1961ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate:
1971ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<Style> mStyle = util::make_unique<Style>();
1981ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1991ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic:
2001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    StyleBuilder& setParent(const StringPiece16& str) {
2011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        mStyle->parent = Reference(parseNameOrDie(str));
2021ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return *this;
2031ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
2041ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2051ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    StyleBuilder& addItem(const StringPiece16& str, std::unique_ptr<Item> value) {
2061ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        mStyle->entries.push_back(Style::Entry{ Reference(parseNameOrDie(str)), std::move(value) });
2071ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return *this;
2081ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
2091ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    StyleBuilder& addItem(const StringPiece16& str, ResourceId id, std::unique_ptr<Item> value) {
2111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        addItem(str, std::move(value));
2121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        mStyle->entries.back().key.id = id;
2131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return *this;
2141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
2151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<Style> build() {
2171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return std::move(mStyle);
2181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
2191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski};
2201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass StyleableBuilder {
2221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate:
2231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();
2241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic:
2261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    StyleableBuilder& addItem(const StringPiece16& str, Maybe<ResourceId> id = {}) {
2271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
2281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        mStyleable->entries.back().id = id;
2291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return *this;
2301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
2311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<Styleable> build() {
2331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        return std::move(mStyleable);
2341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
2351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski};
2361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
237467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskiinline std::unique_ptr<xml::XmlResource> buildXmlDom(const StringPiece& str) {
2381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::stringstream in;
2391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
2401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    StdErrDiagnostics diag;
241cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    std::unique_ptr<xml::XmlResource> doc = xml::inflate(&in, &diag, Source("test.xml"));
2421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    assert(doc);
2431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    return doc;
2441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
2451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
246467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinskiinline std::unique_ptr<xml::XmlResource> buildXmlDomForPackageName(IAaptContext* context,
247467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski                                                                   const StringPiece& str) {
248467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<xml::XmlResource> doc = buildXmlDom(str);
24964587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski    doc->file.name.package = context->getCompilationPackage();
250467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    return doc;
251467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski}
252467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
2531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} // namespace test
2541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} // namespace aapt
2551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#endif /* AAPT_TEST_BUILDERS_H */
257