271 lines
8.6 KiB
C++
271 lines
8.6 KiB
C++
/*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef AAPT_TEST_BUILDERS_H
|
|
#define AAPT_TEST_BUILDERS_H
|
|
|
|
#include "ResourceTable.h"
|
|
#include "ResourceValues.h"
|
|
#include "test/Common.h"
|
|
#include "util/Util.h"
|
|
#include "xml/XmlDom.h"
|
|
|
|
#include <memory>
|
|
|
|
namespace aapt {
|
|
namespace test {
|
|
|
|
class ResourceTableBuilder {
|
|
private:
|
|
DummyDiagnosticsImpl mDiagnostics;
|
|
std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();
|
|
|
|
public:
|
|
ResourceTableBuilder() = default;
|
|
|
|
StringPool* getStringPool() { return &mTable->stringPool; }
|
|
|
|
ResourceTableBuilder& setPackageId(const StringPiece& packageName,
|
|
uint8_t id) {
|
|
ResourceTablePackage* package = mTable->createPackage(packageName, id);
|
|
assert(package);
|
|
return *this;
|
|
}
|
|
|
|
ResourceTableBuilder& addSimple(const StringPiece& name,
|
|
const ResourceId& id = {}) {
|
|
return addValue(name, id, util::make_unique<Id>());
|
|
}
|
|
|
|
ResourceTableBuilder& addSimple(const StringPiece& name,
|
|
const ConfigDescription& config,
|
|
const ResourceId& id = {}) {
|
|
return addValue(name, config, id, util::make_unique<Id>());
|
|
}
|
|
|
|
ResourceTableBuilder& addReference(const StringPiece& name,
|
|
const StringPiece& ref) {
|
|
return addReference(name, {}, ref);
|
|
}
|
|
|
|
ResourceTableBuilder& addReference(const StringPiece& name,
|
|
const ResourceId& id,
|
|
const StringPiece& ref) {
|
|
return addValue(name, id,
|
|
util::make_unique<Reference>(parseNameOrDie(ref)));
|
|
}
|
|
|
|
ResourceTableBuilder& addString(const StringPiece& name,
|
|
const StringPiece& str) {
|
|
return addString(name, {}, str);
|
|
}
|
|
|
|
ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
|
|
const StringPiece& str) {
|
|
return addValue(name, id,
|
|
util::make_unique<String>(mTable->stringPool.makeRef(str)));
|
|
}
|
|
|
|
ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
|
|
const ConfigDescription& config,
|
|
const StringPiece& str) {
|
|
return addValue(name, config, id,
|
|
util::make_unique<String>(mTable->stringPool.makeRef(str)));
|
|
}
|
|
|
|
ResourceTableBuilder& addFileReference(const StringPiece& name,
|
|
const StringPiece& path) {
|
|
return addFileReference(name, {}, path);
|
|
}
|
|
|
|
ResourceTableBuilder& addFileReference(const StringPiece& name,
|
|
const ResourceId& id,
|
|
const StringPiece& path) {
|
|
return addValue(name, id, util::make_unique<FileReference>(
|
|
mTable->stringPool.makeRef(path)));
|
|
}
|
|
|
|
ResourceTableBuilder& addFileReference(const StringPiece& name,
|
|
const StringPiece& path,
|
|
const ConfigDescription& config) {
|
|
return addValue(name, config, {}, util::make_unique<FileReference>(
|
|
mTable->stringPool.makeRef(path)));
|
|
}
|
|
|
|
ResourceTableBuilder& addValue(const StringPiece& name,
|
|
std::unique_ptr<Value> value) {
|
|
return addValue(name, {}, std::move(value));
|
|
}
|
|
|
|
ResourceTableBuilder& addValue(const StringPiece& name, const ResourceId& id,
|
|
std::unique_ptr<Value> value) {
|
|
return addValue(name, {}, id, std::move(value));
|
|
}
|
|
|
|
ResourceTableBuilder& addValue(const StringPiece& name,
|
|
const ConfigDescription& config,
|
|
const ResourceId& id,
|
|
std::unique_ptr<Value> value) {
|
|
ResourceName resName = parseNameOrDie(name);
|
|
bool result = mTable->addResourceAllowMangled(
|
|
resName, id, config, {}, std::move(value), &mDiagnostics);
|
|
assert(result);
|
|
return *this;
|
|
}
|
|
|
|
ResourceTableBuilder& setSymbolState(const StringPiece& name,
|
|
const ResourceId& id,
|
|
SymbolState state) {
|
|
ResourceName resName = parseNameOrDie(name);
|
|
Symbol symbol;
|
|
symbol.state = state;
|
|
bool result =
|
|
mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
|
|
assert(result);
|
|
return *this;
|
|
}
|
|
|
|
std::unique_ptr<ResourceTable> build() { return std::move(mTable); }
|
|
};
|
|
|
|
inline std::unique_ptr<Reference> buildReference(
|
|
const StringPiece& ref, const Maybe<ResourceId>& id = {}) {
|
|
std::unique_ptr<Reference> reference =
|
|
util::make_unique<Reference>(parseNameOrDie(ref));
|
|
reference->id = id;
|
|
return reference;
|
|
}
|
|
|
|
inline std::unique_ptr<BinaryPrimitive> buildPrimitive(uint8_t type,
|
|
uint32_t data) {
|
|
android::Res_value value = {};
|
|
value.size = sizeof(value);
|
|
value.dataType = type;
|
|
value.data = data;
|
|
return util::make_unique<BinaryPrimitive>(value);
|
|
}
|
|
|
|
template <typename T>
|
|
class ValueBuilder {
|
|
private:
|
|
std::unique_ptr<Value> mValue;
|
|
|
|
public:
|
|
template <typename... Args>
|
|
explicit ValueBuilder(Args&&... args)
|
|
: mValue(new T{std::forward<Args>(args)...}) {}
|
|
|
|
template <typename... Args>
|
|
ValueBuilder& setSource(Args&&... args) {
|
|
mValue->setSource(Source{std::forward<Args>(args)...});
|
|
return *this;
|
|
}
|
|
|
|
ValueBuilder& setComment(const StringPiece& str) {
|
|
mValue->setComment(str);
|
|
return *this;
|
|
}
|
|
|
|
std::unique_ptr<Value> build() { return std::move(mValue); }
|
|
};
|
|
|
|
class AttributeBuilder {
|
|
private:
|
|
std::unique_ptr<Attribute> mAttr;
|
|
|
|
public:
|
|
explicit AttributeBuilder(bool weak = false)
|
|
: mAttr(util::make_unique<Attribute>(weak)) {
|
|
mAttr->typeMask = android::ResTable_map::TYPE_ANY;
|
|
}
|
|
|
|
AttributeBuilder& setTypeMask(uint32_t typeMask) {
|
|
mAttr->typeMask = typeMask;
|
|
return *this;
|
|
}
|
|
|
|
AttributeBuilder& addItem(const StringPiece& name, uint32_t value) {
|
|
mAttr->symbols.push_back(Attribute::Symbol{
|
|
Reference(ResourceName({}, ResourceType::kId, name)), value});
|
|
return *this;
|
|
}
|
|
|
|
std::unique_ptr<Attribute> build() { return std::move(mAttr); }
|
|
};
|
|
|
|
class StyleBuilder {
|
|
private:
|
|
std::unique_ptr<Style> mStyle = util::make_unique<Style>();
|
|
|
|
public:
|
|
StyleBuilder& setParent(const StringPiece& str) {
|
|
mStyle->parent = Reference(parseNameOrDie(str));
|
|
return *this;
|
|
}
|
|
|
|
StyleBuilder& addItem(const StringPiece& str, std::unique_ptr<Item> value) {
|
|
mStyle->entries.push_back(
|
|
Style::Entry{Reference(parseNameOrDie(str)), std::move(value)});
|
|
return *this;
|
|
}
|
|
|
|
StyleBuilder& addItem(const StringPiece& str, const ResourceId& id,
|
|
std::unique_ptr<Item> value) {
|
|
addItem(str, std::move(value));
|
|
mStyle->entries.back().key.id = id;
|
|
return *this;
|
|
}
|
|
|
|
std::unique_ptr<Style> build() { return std::move(mStyle); }
|
|
};
|
|
|
|
class StyleableBuilder {
|
|
private:
|
|
std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();
|
|
|
|
public:
|
|
StyleableBuilder& addItem(const StringPiece& str,
|
|
const Maybe<ResourceId>& id = {}) {
|
|
mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
|
|
mStyleable->entries.back().id = id;
|
|
return *this;
|
|
}
|
|
|
|
std::unique_ptr<Styleable> build() { return std::move(mStyleable); }
|
|
};
|
|
|
|
inline std::unique_ptr<xml::XmlResource> buildXmlDom(const StringPiece& str) {
|
|
std::stringstream in;
|
|
in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
|
|
StdErrDiagnostics diag;
|
|
std::unique_ptr<xml::XmlResource> doc =
|
|
xml::inflate(&in, &diag, Source("test.xml"));
|
|
assert(doc);
|
|
return doc;
|
|
}
|
|
|
|
inline std::unique_ptr<xml::XmlResource> buildXmlDomForPackageName(
|
|
IAaptContext* context, const StringPiece& str) {
|
|
std::unique_ptr<xml::XmlResource> doc = buildXmlDom(str);
|
|
doc->file.name.package = context->getCompilationPackage();
|
|
return doc;
|
|
}
|
|
|
|
} // namespace test
|
|
} // namespace aapt
|
|
|
|
#endif /* AAPT_TEST_BUILDERS_H */
|