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