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"); 4040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "xlarge"); 4140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "en-rUS-sw600dp-xhdpi"); 4240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "en-rUS-sw300dp-hdpi"); 4340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "xxhdpi"); 4440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "hdpi"); 4540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "de-rDE"); 4640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "xhdpi"); 4740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, ":x86"); 4840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "anydpi"); 4940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "v7"); 5040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "v8"); 5140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "sw600dp"); 5240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addSplit(splits, "sw300dp"); 5340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski mGroups = groupByMutualExclusivity(splits); 5440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 5540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 5640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski void addSplit(Vector<SplitDescription>& splits, const char* str); 57c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const char* a); 58c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const char* a, const char* b); 59c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const char* a, const char* b, const char* c); 60c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const char* a, const char* b, const char* c, const char* d); 61c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski void expectHasGroupWithSplits(const Vector<const char*>& expectedStrs); 6240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 6340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski Vector<SortedVector<SplitDescription> > mGroups; 6440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski}; 6540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 6640e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldHaveCorrectNumberOfGroups) { 6740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski EXPECT_EQ(12u, mGroups.size()); 6840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 6940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 7040e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldGroupDensities) { 71c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("en-rUS-sw300dp-hdpi", "en-rUS-sw300dp-xhdpi"); 72c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("en-rUS-sw600dp-hdpi", "en-rUS-sw600dp-xhdpi"); 73c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("fr-rFR-sw600dp-hdpi", "fr-rFR-sw600dp-xhdpi"); 74c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("hdpi", "xhdpi", "xxhdpi", "anydpi"); 7540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 7640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 7740e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldGroupAbi) { 78c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(":armeabi", ":x86"); 7940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 8040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 8140e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldGroupLocale) { 82c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("pl-rPL", "de-rDE"); 8340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 8440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 8540e8eefbedcafc51948945647d746daaee092f16Adam LesinskiTEST_F(GrouperTest, shouldGroupEachSplitIntoItsOwnGroup) { 86c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("large"); 87c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("xlarge"); 88c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("v7"); 89c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("v8"); 90c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("sw600dp"); 91c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits("sw300dp"); 9240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 9340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 9440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski// 9540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski// Helper methods 9640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski// 9740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 98c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const char* a) { 99c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski Vector<const char*> expected; 100c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(a); 101c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(expected); 102c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski} 103c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski 104c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const char* a, const char* b) { 105c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski Vector<const char*> expected; 106c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(a); 107c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(b); 108c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(expected); 109c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski} 110c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski 111c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const char* a, const char* b, const char* c) { 112c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski Vector<const char*> expected; 113c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(a); 114c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(b); 115c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(c); 116c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(expected); 117c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski} 118c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski 119c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const char* a, const char* b, const char* c, const char* d) { 120c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski Vector<const char*> expected; 121c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(a); 122c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(b); 123c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(c); 124c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expected.add(d); 125c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski expectHasGroupWithSplits(expected); 126c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski} 127c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski 128c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskivoid GrouperTest::expectHasGroupWithSplits(const Vector<const char*>& expectedStrs) { 12940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski Vector<SplitDescription> splits; 130c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski const size_t expectedStrCount = expectedStrs.size(); 131c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski for (size_t i = 0; i < expectedStrCount; i++) { 13240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski splits.add(); 133c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski if (!SplitDescription::parse(String8(expectedStrs[i]), &splits.editTop())) { 134c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski ADD_FAILURE() << "Failed to parse SplitDescription " << expectedStrs[i]; 13540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski return; 13640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 13740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 13840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t splitCount = splits.size(); 13940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 14040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t groupCount = mGroups.size(); 14140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < groupCount; i++) { 14240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const SortedVector<SplitDescription>& group = mGroups[i]; 14340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (group.size() != splitCount) { 14440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski continue; 14540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 14640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 14740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski size_t found = 0; 14840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t j = 0; j < splitCount; j++) { 14940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (group.indexOf(splits[j]) >= 0) { 15040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski found++; 15140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 15240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 15340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 15440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (found == splitCount) { 15540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski return; 15640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 15740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 15840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 15940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski String8 errorMessage("Failed to find expected group ["); 16040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < splitCount; i++) { 16140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (i != 0) { 16240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append(", "); 16340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 16440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append(splits[i].toString()); 16540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 16640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append("].\nActual:\n"); 16740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 16840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < groupCount; i++) { 16940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.appendFormat("Group %d:\n", int(i + 1)); 17040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const SortedVector<SplitDescription>& group = mGroups[i]; 17140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t j = 0; j < group.size(); j++) { 17240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append(" "); 17340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append(group[j].toString()); 17440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski errorMessage.append("\n"); 17540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 17640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 17740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski ADD_FAILURE() << errorMessage.string(); 17840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 17940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 18040e8eefbedcafc51948945647d746daaee092f16Adam Lesinskivoid GrouperTest::addSplit(Vector<SplitDescription>& splits, const char* str) { 18140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski splits.add(); 18240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski EXPECT_TRUE(SplitDescription::parse(String8(str), &splits.editTop())); 18340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 18440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 18540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} // namespace split 186