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