Builders.h revision 9e10ac70155c993e7053323ad36beaea7bf7d54f
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 "util/Util.h" 231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "XmlDom.h" 241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "test/Common.h" 261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include <memory> 281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace aapt { 301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace test { 311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass ResourceTableBuilder { 331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate: 341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski DummyDiagnosticsImpl mDiagnostics; 351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>(); 361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic: 381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder() = default; 391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& setPackageId(const StringPiece16& packageName, uint8_t id) { 411ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTablePackage* package = mTable->createPackage(packageName, id); 421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski assert(package); 431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return *this; 441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addSimple(const StringPiece16& name, ResourceId id = {}) { 471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addValue(name, id, util::make_unique<Id>()); 481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addReference(const StringPiece16& name, const StringPiece16& ref) { 511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addReference(name, {}, ref); 521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addReference(const StringPiece16& name, ResourceId id, 551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const StringPiece16& ref) { 561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addValue(name, id, util::make_unique<Reference>(parseNameOrDie(ref))); 571ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 581ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 591ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addString(const StringPiece16& name, const StringPiece16& str) { 601ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addString(name, {}, str); 611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addString(const StringPiece16& name, ResourceId id, 641ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const StringPiece16& str) { 651ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addValue(name, id, util::make_unique<String>(mTable->stringPool.makeRef(str))); 661ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addFileReference(const StringPiece16& name, const StringPiece16& path) { 691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addFileReference(name, {}, path); 701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addFileReference(const StringPiece16& name, ResourceId id, 731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const StringPiece16& path) { 741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addValue(name, id, 751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::make_unique<FileReference>(mTable->stringPool.makeRef(path))); 761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addValue(const StringPiece16& name, std::unique_ptr<Value> value) { 801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addValue(name, {}, std::move(value)); 811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addValue(const StringPiece16& name, ResourceId id, 841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<Value> value) { 851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return addValue(name, id, {}, std::move(value)); 861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResourceTableBuilder& addValue(const StringPiece16& name, ResourceId id, 891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const ConfigDescription& config, std::unique_ptr<Value> value) { 909e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski ResourceName resName = parseNameOrDie(name); 919e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski bool result = mTable->addResourceAllowMangled(resName, id, config, {}, std::move(value), 929e10ac70155c993e7053323ad36beaea7bf7d54fAdam Lesinski &mDiagnostics); 931ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski assert(result); 941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return *this; 951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 961ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 971ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<ResourceTable> build() { 981ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return std::move(mTable); 991ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}; 1011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1021ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiinline std::unique_ptr<Reference> buildReference(const StringPiece16& ref, 1031ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Maybe<ResourceId> id = {}) { 1041ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<Reference> reference = util::make_unique<Reference>(parseNameOrDie(ref)); 1051ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski reference->id = id; 1061ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return reference; 1071ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 1081ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1091ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass AttributeBuilder { 1101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate: 1111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<Attribute> mAttr; 1121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic: 1141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AttributeBuilder(bool weak = false) : mAttr(util::make_unique<Attribute>(weak)) { 1151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mAttr->typeMask = android::ResTable_map::TYPE_ANY; 1161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AttributeBuilder& setTypeMask(uint32_t typeMask) { 1191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mAttr->typeMask = typeMask; 1201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return *this; 1211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski AttributeBuilder& addItem(const StringPiece16& name, uint32_t value) { 1241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mAttr->symbols.push_back(Attribute::Symbol{ 1251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Reference(ResourceName{ {}, ResourceType::kId, name.toString()}), 1261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski value}); 1271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return *this; 1281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<Attribute> build() { 1311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return std::move(mAttr); 1321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}; 1341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass StyleBuilder { 1361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate: 1371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<Style> mStyle = util::make_unique<Style>(); 1381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic: 1401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StyleBuilder& setParent(const StringPiece16& str) { 1411ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mStyle->parent = Reference(parseNameOrDie(str)); 1421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return *this; 1431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StyleBuilder& addItem(const StringPiece16& str, std::unique_ptr<Item> value) { 1461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mStyle->entries.push_back(Style::Entry{ Reference(parseNameOrDie(str)), std::move(value) }); 1471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return *this; 1481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StyleBuilder& addItem(const StringPiece16& str, ResourceId id, std::unique_ptr<Item> value) { 1511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski addItem(str, std::move(value)); 1521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mStyle->entries.back().key.id = id; 1531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return *this; 1541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<Style> build() { 1571ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return std::move(mStyle); 1581ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1591ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}; 1601ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass StyleableBuilder { 1621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate: 1631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>(); 1641ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1651ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic: 1661ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StyleableBuilder& addItem(const StringPiece16& str, Maybe<ResourceId> id = {}) { 1671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mStyleable->entries.push_back(Reference(parseNameOrDie(str))); 1681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mStyleable->entries.back().id = id; 1691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return *this; 1701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<Styleable> build() { 1731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return std::move(mStyleable); 1741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}; 1761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiinline std::unique_ptr<XmlResource> buildXmlDom(const StringPiece& str) { 1781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::stringstream in; 1791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str; 1801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StdErrDiagnostics diag; 1811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<XmlResource> doc = xml::inflate(&in, &diag, {}); 1821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski assert(doc); 1831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return doc; 1841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 1851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} // namespace test 1871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} // namespace aapt 1881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#endif /* AAPT_TEST_BUILDERS_H */ 190