1cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski/*
2cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * Copyright (C) 2016 The Android Open Source Project
3cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski *
4cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * you may not use this file except in compliance with the License.
6cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * You may obtain a copy of the License at
7cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski *
8cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski *
10cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * See the License for the specific language governing permissions and
14cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski * limitations under the License.
15cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski */
16cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
17cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include "test/Test.h"
18cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski#include "xml/XmlActionExecutor.h"
19cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
20cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskinamespace aapt {
21cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinskinamespace xml {
22cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
23cc5609d8e484ec82ef1dced793af7f674f059b1cAdam LesinskiTEST(XmlActionExecutorTest, BuildsAccessibleNestedPattern) {
24cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    XmlActionExecutor executor;
25cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    XmlNodeAction& manifestAction = executor[u"manifest"];
26cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    XmlNodeAction& applicationAction = manifestAction[u"application"];
27cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
28cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    Element* manifestEl = nullptr;
29cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    manifestAction.action([&](Element* manifest) -> bool {
30cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        manifestEl = manifest;
31cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        return true;
32cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    });
33cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
34cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    Element* applicationEl = nullptr;
35cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    applicationAction.action([&](Element* application) -> bool {
36cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        applicationEl = application;
37cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        return true;
38cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    });
39cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
40cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    std::unique_ptr<XmlResource> doc = test::buildXmlDom("<manifest><application /></manifest>");
41cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
42cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    StdErrDiagnostics diag;
43cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    ASSERT_TRUE(executor.execute(XmlActionExecutorPolicy::None, &diag, doc.get()));
44cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    ASSERT_NE(nullptr, manifestEl);
45cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    EXPECT_EQ(std::u16string(u"manifest"), manifestEl->name);
46cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
47cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    ASSERT_NE(nullptr, applicationEl);
48cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    EXPECT_EQ(std::u16string(u"application"), applicationEl->name);
49cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski}
50cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
51cc5609d8e484ec82ef1dced793af7f674f059b1cAdam LesinskiTEST(XmlActionExecutorTest, FailsWhenUndefinedHierarchyExists) {
52cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    XmlActionExecutor executor;
53cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    executor[u"manifest"][u"application"];
54cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
55cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    std::unique_ptr<XmlResource> doc = test::buildXmlDom(
56cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski            "<manifest><application /><activity /></manifest>");
57cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    StdErrDiagnostics diag;
58cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    ASSERT_FALSE(executor.execute(XmlActionExecutorPolicy::Whitelist, &diag, doc.get()));
59cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski}
60cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski
61cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski} // namespace xml
62cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski} // namespace aapt
63