PseudolocaleGenerator_test.cpp revision d0f116b619feede0cfdb647157ce5ab4d50a1c46
1393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski/*
2393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * Copyright (C) 2016 The Android Open Source Project
3393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski *
4393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * you may not use this file except in compliance with the License.
6393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * You may obtain a copy of the License at
7393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski *
8393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski *
10393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * See the License for the specific language governing permissions and
14393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski * limitations under the License.
15393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski */
16393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
17393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski#include "compile/PseudolocaleGenerator.h"
18d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski#include "test/Test.h"
19393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski#include "util/Util.h"
20393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
21393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski#include <androidfw/ResourceTypes.h>
22393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
23393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinskinamespace aapt {
24393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
25393b5f0d6130d3848dd82075986a5cf40c09ce44Adam LesinskiTEST(PseudolocaleGeneratorTest, PseudolocalizeStyledString) {
26393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    StringPool pool;
27393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    StyleString originalStyle;
28d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    originalStyle.str = "Hello world!";
29d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    originalStyle.spans = { Span{ "b", 2, 3 }, Span{ "b", 6, 7 }, Span{ "i", 1, 10 } };
30393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
31393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    std::unique_ptr<StyledString> newString = pseudolocalizeStyledString(
32393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski            util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
33393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski            Pseudolocalizer::Method::kNone, &pool);
34393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
35393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    EXPECT_EQ(originalStyle.str, *newString->value->str);
36393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
37393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
38d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("He").size(), newString->value->spans[0].firstChar);
39d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("Hel").size(), newString->value->spans[0].lastChar);
40d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("b"), *newString->value->spans[0].name);
41393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
42d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("Hello ").size(), newString->value->spans[1].firstChar);
43d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("Hello w").size(), newString->value->spans[1].lastChar);
44d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("b"), *newString->value->spans[1].name);
45393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
46d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("H").size(), newString->value->spans[2].firstChar);
47d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("Hello worl").size(), newString->value->spans[2].lastChar);
48d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("i"), *newString->value->spans[2].name);
49393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
50d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    originalStyle.spans.push_back(Span{ "em", 0, 11u });
51393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
52393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    newString = pseudolocalizeStyledString(
53393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski            util::make_unique<StyledString>(pool.makeRef(originalStyle)).get(),
54393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski            Pseudolocalizer::Method::kAccent, &pool);
55393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
56d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð¡ one two]"), *newString->value->str);
57393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    ASSERT_EQ(originalStyle.spans.size(), newString->value->spans.size());
58393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
59d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[Ĥé").size(), newString->value->spans[0].firstChar);
60d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[Ĥéļ").size(), newString->value->spans[0].lastChar);
61393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
62d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[Ĥéļļö ").size(), newString->value->spans[1].firstChar);
63d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[Ĥéļļö ŵ").size(), newString->value->spans[1].lastChar);
64393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
65d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[Ĥ").size(), newString->value->spans[2].firstChar);
66d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļ").size(), newString->value->spans[2].lastChar);
67393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
68d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[").size(), newString->value->spans[3].firstChar);
69d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("[Ĥéļļö ŵöŕļð").size(), newString->value->spans[3].lastChar);
70393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski}
71393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
72393b5f0d6130d3848dd82075986a5cf40c09ce44Adam LesinskiTEST(PseudolocaleGeneratorTest, PseudolocalizeOnlyDefaultConfigs) {
73393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
74d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski            .addString("@android:string/one", "one")
75d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski            .addString("@android:string/two", ResourceId{}, test::parseConfigOrDie("en"), "two")
76d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski            .addString("@android:string/three", "three")
77d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski            .addString("@android:string/three", ResourceId{}, test::parseConfigOrDie("en-rXA"),
78d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski                       "three")
79d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski            .addString("@android:string/four", "four")
80393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski            .build();
81393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
82d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    String* val = test::getValue<String>(table.get(), "@android:string/four");
83393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    val->setTranslateable(false);
84393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
85393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
86393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    PseudolocaleGenerator generator;
87393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    ASSERT_TRUE(generator.consume(context.get(), table.get()));
88393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
89393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    // Normal pseudolocalization should take place.
90d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "@android:string/one",
91393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                                       test::parseConfigOrDie("en-rXA")));
92d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "@android:string/one",
93393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                                       test::parseConfigOrDie("ar-rXB")));
94393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
95393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    // No default config for android:string/two, so no pseudlocales should exist.
96d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "@android:string/two",
97393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                                       test::parseConfigOrDie("en-rXA")));
98d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "@android:string/two",
99393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                                       test::parseConfigOrDie("ar-rXB")));
100393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
101393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
102393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    // Check that we didn't override manual pseudolocalization.
103d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    val = test::getValueForConfig<String>(table.get(), "@android:string/three",
104393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                          test::parseConfigOrDie("en-rXA"));
105393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    ASSERT_NE(nullptr, val);
106d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    EXPECT_EQ(std::string("three"), *val->value);
107393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
108d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    ASSERT_NE(nullptr, test::getValueForConfig<String>(table.get(), "@android:string/three",
109393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                                       test::parseConfigOrDie("ar-rXB")));
110393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
111393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski    // Check that four's translateable marker was honored.
112d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "@android:string/four",
113393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                                       test::parseConfigOrDie("en-rXA")));
114d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski    ASSERT_EQ(nullptr, test::getValueForConfig<String>(table.get(), "@android:string/four",
115393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski                                                       test::parseConfigOrDie("ar-rXB")));
116393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
117393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski}
118393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
119393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski} // namespace aapt
120393b5f0d6130d3848dd82075986a5cf40c09ce44Adam Lesinski
121