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