140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski/* 240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Copyright (C) 2014 The Android Open Source Project 340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * you may not use this file except in compliance with the License. 640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * You may obtain a copy of the License at 740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 1040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * See the License for the specific language governing permissions and 1440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * limitations under the License. 1540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski */ 1640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 1740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include "Grouper.h" 1840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 1940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include "SplitDescription.h" 2040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <gtest/gtest.h> 2240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <utils/String8.h> 2340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <utils/Vector.h> 2440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2540e8eefbedcafc51948945647d746daaee092f16Adam Lesinskiusing namespace android; 2640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2740e8eefbedcafc51948945647d746daaee092f16Adam Lesinskinamespace split { 2840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2940e8eefbedcafc51948945647d746daaee092f16Adam Lesinskiclass GrouperTest : public ::testing::Test { 3040e8eefbedcafc51948945647d746daaee092f16Adam Lesinskiprotected: 3140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski virtual void SetUp() { 3240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski Vector<SplitDescription> splits; 3340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "en-rUS-sw600dp-hdpi"); 3440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "fr-rFR-sw600dp-hdpi"); 3540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "fr-rFR-sw600dp-xhdpi"); 3640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, ":armeabi"); 3740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "en-rUS-sw300dp-xhdpi"); 3840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "large"); 3940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "pl-rPL"); 401c2dadddf78c3aa49129425d5f6ee480cfb54444Adam Lesinski addSplit(splits, "fr-rCA"); 411c2dadddf78c3aa49129425d5f6ee480cfb54444Adam Lesinski addSplit(splits, "fr"); 4240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "xlarge"); 4340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "en-rUS-sw600dp-xhdpi"); 4440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "en-rUS-sw300dp-hdpi"); 4540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "xxhdpi"); 4640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "hdpi"); 4740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "de-rDE"); 4840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "xhdpi"); 4940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, ":x86"); 5040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "anydpi"); 5140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "v7"); 5240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "v8"); 5340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "sw600dp"); 5440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "sw300dp"); 5540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski mGroups = groupByMutualExclusivity(splits); 5640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 5740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 5840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski void addSplit(Vector<SplitDescription>& splits, const char* str); 59c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const char* a); 60c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const char* a, const char* b); 61c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const char* a, const char* b, const char* c); 62c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const char* a, const char* b, const char* c, const char* d); 63c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const Vector<const char*>& expectedStrs); 6440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 6540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski Vector<SortedVector<SplitDescription> > mGroups; 6640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski}; 6740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 6840e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldHaveCorrectNumberOfGroups) { 691c2dadddf78c3aa49129425d5f6ee480cfb54444Adam Lesinski EXPECT_EQ(15u, mGroups.size()); 7040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 7140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 7240e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldGroupDensities) { 73c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("en-rUS-sw300dp-hdpi", "en-rUS-sw300dp-xhdpi"); 74c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("en-rUS-sw600dp-hdpi", "en-rUS-sw600dp-xhdpi"); 75c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("fr-rFR-sw600dp-hdpi", "fr-rFR-sw600dp-xhdpi"); 76c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("hdpi", "xhdpi", "xxhdpi", "anydpi"); 7740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 7840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 7940e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldGroupAbi) { 80c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(":armeabi", ":x86"); 8140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 8240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 8340e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldGroupLocale) { 841c2dadddf78c3aa49129425d5f6ee480cfb54444Adam Lesinski expectHasGroupWithSplits("pl-rPL"); 851c2dadddf78c3aa49129425d5f6ee480cfb54444Adam Lesinski expectHasGroupWithSplits("de-rDE"); 861c2dadddf78c3aa49129425d5f6ee480cfb54444Adam Lesinski expectHasGroupWithSplits("fr"); 871c2dadddf78c3aa49129425d5f6ee480cfb54444Adam Lesinski expectHasGroupWithSplits("fr-rCA"); 8840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 8940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 9040e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldGroupEachSplitIntoItsOwnGroup) { 91c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("large"); 92c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("xlarge"); 93c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("v7"); 94c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("v8"); 95c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("sw600dp"); 96c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("sw300dp"); 9740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 9840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 9940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski// 10040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski// Helper methods 10140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski// 10240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 103c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const char* a) { 104c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski Vector<const char*> expected; 105c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(a); 106c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(expected); 107c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski} 108c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski 109c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const char* a, const char* b) { 110c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski Vector<const char*> expected; 111c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(a); 112c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(b); 113c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(expected); 114c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski} 115c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski 116c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const char* a, const char* b, const char* c) { 117c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski Vector<const char*> expected; 118c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(a); 119c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(b); 120c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(c); 121c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(expected); 122c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski} 123c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski 124c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const char* a, const char* b, const char* c, const char* d) { 125c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski Vector<const char*> expected; 126c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(a); 127c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(b); 128c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(c); 129c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(d); 130c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(expected); 131c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski} 132c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski 133c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const Vector<const char*>& expectedStrs) { 13440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski Vector<SplitDescription> splits; 135c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski const size_t expectedStrCount = expectedStrs.size(); 136c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski for (size_t i = 0; i < expectedStrCount; i++) { 13740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski splits.add(); 138c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski if (!SplitDescription::parse(String8(expectedStrs[i]), &splits.editTop())) { 139c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski ADD_FAILURE() << "Failed to parse SplitDescription " << expectedStrs[i]; 14040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski return; 14140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 14240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 14340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t splitCount = splits.size(); 14440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 14540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t groupCount = mGroups.size(); 14640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < groupCount; i++) { 14740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const SortedVector<SplitDescription>& group = mGroups[i]; 14840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (group.size() != splitCount) { 14940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski continue; 15040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 15140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 15240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski size_t found = 0; 15340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t j = 0; j < splitCount; j++) { 15440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (group.indexOf(splits[j]) >= 0) { 15540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski found++; 15640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 15740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 15840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 15940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (found == splitCount) { 16040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski return; 16140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 16240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 16340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 16440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski String8 errorMessage("Failed to find expected group ["); 16540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < splitCount; i++) { 16640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (i != 0) { 16740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append(", "); 16840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 16940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append(splits[i].toString()); 17040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 17140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append("].\nActual:\n"); 17240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 17340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < groupCount; i++) { 17440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.appendFormat("Group %d:\n", int(i + 1)); 17540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const SortedVector<SplitDescription>& group = mGroups[i]; 17640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t j = 0; j < group.size(); j++) { 17740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append(" "); 17840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append(group[j].toString()); 17940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append("\n"); 18040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 18140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 18240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski ADD_FAILURE() << errorMessage.string(); 18340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 18440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 18540e8eefbedcafc51948945647d746daaee092f16Adam Lesinskivoid GrouperTest::addSplit(Vector<SplitDescription>& splits, const char* str) { 18640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski splits.add(); 18740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski EXPECT_TRUE(SplitDescription::parse(String8(str), &splits.editTop())); 18840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 18940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 19040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} // namespace split 191