blob: e540cd7ace90015705856e2fca2ee4d9ca6ceaf9 [file] [log] [blame]
Adam Lesinski1ab598f2015-08-14 14:26:04 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef AAPT_TEST_CONTEXT_H
18#define AAPT_TEST_CONTEXT_H
19
20#include "NameMangler.h"
21#include "util/Util.h"
22
23#include "process/IResourceTableConsumer.h"
24#include "process/SymbolTable.h"
25#include "test/Common.h"
26
27#include <cassert>
28#include <list>
29
30namespace aapt {
31namespace test {
32
33class Context : public IAaptContext {
34private:
35 friend class ContextBuilder;
36
37 Context() = default;
38
39 Maybe<std::u16string> mCompilationPackage;
40 Maybe<uint8_t> mPackageId;
41 std::unique_ptr<IDiagnostics> mDiagnostics = util::make_unique<StdErrDiagnostics>();
42 std::unique_ptr<ISymbolTable> mSymbols;
43 std::unique_ptr<NameMangler> mNameMangler;
44
45public:
46 ISymbolTable* getExternalSymbols() override {
47 assert(mSymbols && "test symbols not set");
48 return mSymbols.get();
49 }
50
51 void setSymbolTable(std::unique_ptr<ISymbolTable> symbols) {
52 mSymbols = std::move(symbols);
53 }
54
55 IDiagnostics* getDiagnostics() override {
56 assert(mDiagnostics && "test diagnostics not set");
57 return mDiagnostics.get();
58 }
59
60 StringPiece16 getCompilationPackage() override {
61 assert(mCompilationPackage && "package name not set");
62 return mCompilationPackage.value();
63 }
64
65 uint8_t getPackageId() override {
66 assert(mPackageId && "package ID not set");
67 return mPackageId.value();
68 }
69
70 NameMangler* getNameMangler() override {
71 assert(mNameMangler && "test name mangler not set");
72 return mNameMangler.get();
73 }
Adam Lesinski355f2852016-02-13 20:26:45 -080074
75 bool verbose() override {
76 return false;
77 }
Adam Lesinski1ab598f2015-08-14 14:26:04 -070078};
79
80class ContextBuilder {
81private:
82 std::unique_ptr<Context> mContext = std::unique_ptr<Context>(new Context());
83
84public:
85 ContextBuilder& setCompilationPackage(const StringPiece16& package) {
86 mContext->mCompilationPackage = package.toString();
87 return *this;
88 }
89
90 ContextBuilder& setPackageId(uint8_t id) {
91 mContext->mPackageId = id;
92 return *this;
93 }
94
95 ContextBuilder& setSymbolTable(std::unique_ptr<ISymbolTable> symbols) {
96 mContext->mSymbols = std::move(symbols);
97 return *this;
98 }
99
100 ContextBuilder& setDiagnostics(std::unique_ptr<IDiagnostics> diag) {
101 mContext->mDiagnostics = std::move(diag);
102 return *this;
103 }
104
105 ContextBuilder& setNameManglerPolicy(NameManglerPolicy policy) {
106 mContext->mNameMangler = util::make_unique<NameMangler>(policy);
107 return *this;
108 }
109
110 std::unique_ptr<Context> build() {
111 return std::move(mContext);
112 }
113};
114
115class StaticSymbolTableBuilder {
116private:
117 struct SymbolTable : public ISymbolTable {
118 std::list<std::unique_ptr<Symbol>> mSymbols;
119 std::map<ResourceName, Symbol*> mNameMap;
120 std::map<ResourceId, Symbol*> mIdMap;
121
122 const Symbol* findByName(const ResourceName& name) override {
123 auto iter = mNameMap.find(name);
124 if (iter != mNameMap.end()) {
125 return iter->second;
126 }
127 return nullptr;
128 }
129
130 const Symbol* findById(ResourceId id) override {
131 auto iter = mIdMap.find(id);
132 if (iter != mIdMap.end()) {
133 return iter->second;
134 }
135 return nullptr;
136 }
137 };
138
139 std::unique_ptr<SymbolTable> mSymbolTable = util::make_unique<SymbolTable>();
140
141public:
Adam Lesinski467f1712015-11-16 17:35:44 -0800142 StaticSymbolTableBuilder& addPublicSymbol(const StringPiece16& name, ResourceId id,
143 std::unique_ptr<Attribute> attr = {}) {
144 std::unique_ptr<ISymbolTable::Symbol> symbol = util::make_unique<ISymbolTable::Symbol>(
145 id, std::move(attr));
146 symbol->isPublic = true;
147 mSymbolTable->mNameMap[parseNameOrDie(name)] = symbol.get();
148 mSymbolTable->mIdMap[id] = symbol.get();
149 mSymbolTable->mSymbols.push_back(std::move(symbol));
150 return *this;
151 }
152
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700153 StaticSymbolTableBuilder& addSymbol(const StringPiece16& name, ResourceId id,
Adam Lesinski467f1712015-11-16 17:35:44 -0800154 std::unique_ptr<Attribute> attr = {}) {
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700155 std::unique_ptr<ISymbolTable::Symbol> symbol = util::make_unique<ISymbolTable::Symbol>(
156 id, std::move(attr));
157 mSymbolTable->mNameMap[parseNameOrDie(name)] = symbol.get();
158 mSymbolTable->mIdMap[id] = symbol.get();
159 mSymbolTable->mSymbols.push_back(std::move(symbol));
160 return *this;
161 }
162
163 std::unique_ptr<ISymbolTable> build() {
164 return std::move(mSymbolTable);
165 }
166};
167
168} // namespace test
169} // namespace aapt
170
171#endif /* AAPT_TEST_CONTEXT_H */