/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.ide.common.resources; import static com.android.SdkConstants.FD_RES; import static com.android.SdkConstants.FD_RES_DRAWABLE; import static com.android.SdkConstants.FD_RES_LAYOUT; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.resources.configuration.FolderConfiguration; import com.android.ide.common.resources.configuration.LocaleQualifier; import com.android.ide.common.resources.configuration.ScreenOrientationQualifier; import com.android.io.FileWrapper; import com.android.io.IAbstractFile; import com.android.io.IAbstractFolder; import com.android.resources.ResourceFolderType; import com.android.resources.ResourceType; import com.android.resources.ScreenOrientation; import com.google.common.base.Charsets; import com.google.common.io.Files; import junit.framework.TestCase; import java.io.File; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.SortedSet; @SuppressWarnings("javadoc") public class ResourceRepositoryTest extends TestCase { private TestResourceRepository mRepository; @Override protected void setUp() throws Exception { super.setUp(); mRepository = TestResourceRepository.create(false, new Object[]{ "layout/layout1.xml", "<!--contents doesn't matter-->", "layout/layout2.xml", "<!--contents doesn't matter-->", "layout-land/layout1.xml", "<!--contents doesn't matter-->", "layout-land/onlyLand.xml", "<!--contents doesn't matter-->", "drawable/graphic.9.png", new byte[0], "values/strings.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<resources>\n" + " <item type=\"id\" name=\"action_bar_refresh\" />\n" + " <item type=\"dimen\" name=\"dialog_min_width_major\">45%</item>\n" + " <string name=\"home_title\">Home Sample</string>\n" + " <string name=\"show_all_apps\">All</string>\n" + " <string name=\"menu_wallpaper\">Wallpaper</string>\n" + " <string name=\"menu_search\">Search</string>\n" + " <string name=\"menu_settings\">Settings</string>\n" + " <string name=\"dummy\" translatable=\"false\">Ignore Me</string>\n" + " <string name=\"wallpaper_instructions\">Tap picture to set portrait wallpaper</string>\n" + "</resources>\n", "values-es/strings.xml", "" + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<resources>\n" + " <string name=\"show_all_apps\">Todo</string>\n" + "</resources>\n", }); assertFalse(mRepository.isFrameworkRepository()); } @Override protected void tearDown() throws Exception { super.tearDown(); mRepository.dispose(); } public void testBasic() throws Exception { assertFalse(mRepository.hasResourceItem("@layout/layout0")); assertTrue(mRepository.hasResourceItem("@layout/layout1")); assertFalse(mRepository.hasResourceItem(ResourceType.LAYOUT, "layout0")); assertTrue(mRepository.hasResourceItem(ResourceType.LAYOUT, "layout1")); assertFalse(mRepository.hasResourceItem(ResourceType.STRING, "layout1")); assertTrue(mRepository.hasResourceItem(ResourceType.STRING, "home_title")); assertFalse(mRepository.hasResourceItem(ResourceType.STRING, "home_title2")); assertFalse(mRepository.hasResourceItem(ResourceType.DRAWABLE, "graph")); assertTrue(mRepository.hasResourceItem(ResourceType.DRAWABLE, "graphic")); assertTrue(mRepository.hasResourceItem("@id/action_bar_refresh")); assertTrue(mRepository.hasResourceItem("@drawable/graphic")); assertTrue(mRepository.hasResourcesOfType(ResourceType.DRAWABLE)); assertFalse(mRepository.hasResourcesOfType(ResourceType.ANIM)); List<ResourceType> availableResourceTypes = mRepository.getAvailableResourceTypes(); assertEquals(5, availableResourceTypes.size()); // layout, string, drawable, id, dimen Collection<ResourceItem> allStrings = mRepository.getResourceItemsOfType(ResourceType.STRING); assertEquals(7, allStrings.size()); ResourceItem item = mRepository.getResourceItem(ResourceType.STRING, "menu_settings"); assertNotNull(item); assertEquals("menu_settings", item.getName()); assertEquals("@string/menu_settings", item.getXmlString(ResourceType.STRING, false)); assertTrue(item.hasDefault()); assertFalse(item.hasAlternates()); item = mRepository.getResourceItem(ResourceType.STRING, "show_all_apps"); assertNotNull(item); assertEquals("show_all_apps", item.getName()); assertEquals("@string/show_all_apps", item.getXmlString(ResourceType.STRING, false)); assertTrue(item.hasDefault()); assertTrue(item.hasAlternates()); FolderConfiguration folderConfig = new FolderConfiguration(); folderConfig.setLocaleQualifier(LocaleQualifier.getQualifier("en")); ResourceValue value = item.getResourceValue(ResourceType.STRING, folderConfig, false); assertNotNull(value); assertEquals("All", value.getValue()); assertSame(ResourceType.STRING, value.getResourceType()); folderConfig = new FolderConfiguration(); folderConfig.setLocaleQualifier(LocaleQualifier.getQualifier("es")); value = item.getResourceValue(ResourceType.STRING, folderConfig, false); assertNotNull(value); assertEquals("Todo", value.getValue()); assertSame(ResourceType.STRING, value.getResourceType()); item = mRepository.getResourceItem(ResourceType.LAYOUT, "onlyLand"); assertNotNull(item); assertFalse(item.hasDefault()); assertEquals(1, item.getSourceFileList().size()); ResourceFile resourceFile = item.getSourceFileList().get(0); assertEquals("onlyLand.xml", resourceFile.getFile().getName()); assertEquals(ScreenOrientation.LANDSCAPE, resourceFile.getConfiguration().getScreenOrientationQualifier().getValue()); item = mRepository.getResourceItem(ResourceType.LAYOUT, "layout1"); assertNotNull(item); assertTrue(item.hasDefault()); assertTrue(item.hasAlternates()); assertFalse(item.hasNoSourceFile()); assertEquals(2, item.getSourceFileList().size()); assertEquals(1, item.getAlternateCount()); assertFalse(item.isDeclaredInline()); SortedSet<String> languages = mRepository.getLanguages(); assertEquals(1, languages.size()); assertTrue(languages.contains("es")); assertTrue(mRepository.getRegions("es").isEmpty()); List<ResourceFile> layouts = mRepository.getSourceFiles(ResourceType.LAYOUT, "layout1", folderConfig); assertNotNull(layouts); assertEquals(1, layouts.size()); ResourceFile file1 = layouts.get(0); assertEquals("layout1.xml", file1.getFile().getName()); assertSame(mRepository, file1.getRepository()); } public void testGetConfiguredResources() throws Exception { FolderConfiguration folderConfig = new FolderConfiguration(); folderConfig.setLocaleQualifier(LocaleQualifier.getQualifier("es")); folderConfig.setScreenOrientationQualifier( new ScreenOrientationQualifier(ScreenOrientation.LANDSCAPE)); Map<ResourceType, Map<String, ResourceValue>> configuredResources = mRepository.getConfiguredResources(folderConfig); Map<String, ResourceValue> strings = configuredResources .get(ResourceType.STRING); Map<String, ResourceValue> layouts = configuredResources .get(ResourceType.LAYOUT); Map<String, ResourceValue> ids = configuredResources .get(ResourceType.ID); Map<String, ResourceValue> dimens = configuredResources .get(ResourceType.DIMEN); assertEquals(1, ids.size()); assertEquals(1, dimens.size()); assertEquals("dialog_min_width_major", dimens.get("dialog_min_width_major").getName()); assertEquals("45%", dimens.get("dialog_min_width_major").getValue()); assertEquals("Todo", strings.get("show_all_apps").getValue()); assertEquals(3, layouts.size()); assertNotNull(layouts.get("layout1")); ResourceFile file = mRepository.getMatchingFile("dialog_min_width_major", ResourceType.DIMEN, folderConfig); assertNotNull(file); file = mRepository.getMatchingFile("dialog_min_width_major", ResourceFolderType.VALUES, folderConfig); assertNotNull(file); file = mRepository.getMatchingFile("layout1", ResourceFolderType.LAYOUT, folderConfig); assertNotNull(file); file = mRepository.getMatchingFile("layout1", ResourceType.LAYOUT, folderConfig); assertNotNull(file); } public void testUpdates() throws Exception { assertFalse(mRepository.hasResourcesOfType(ResourceType.ANIM)); assertFalse(mRepository.hasResourcesOfType(ResourceType.MENU)); assertFalse(mRepository.hasResourcesOfType(ResourceType.BOOL)); assertTrue(mRepository.hasResourcesOfType(ResourceType.DRAWABLE)); assertTrue(mRepository.hasResourceItem("@drawable/graphic")); // Delete the drawable graphic IAbstractFolder drawableFolder = mRepository.getResFolder() .getFolder(FD_RES_DRAWABLE); assertNotNull(drawableFolder); IAbstractFile graphicFile = drawableFolder.getFile("graphic.9.png"); assertNotNull(graphicFile); assertTrue(graphicFile instanceof FileWrapper); FileWrapper fileWrapper = (FileWrapper) graphicFile; if (fileWrapper.exists()) { boolean deleted = fileWrapper.delete(); assertTrue(deleted); } ResourceFile resourceFile = mRepository.findResourceFile(fileWrapper); assertNotNull(resourceFile); mRepository.removeFile(ResourceType.DRAWABLE, resourceFile); assertFalse(mRepository.hasResourceItem("@drawable/graphic")); assertFalse(mRepository.hasResourcesOfType(ResourceType.DRAWABLE)); // Delete one of the overridden layouts ResourceItem item = mRepository.getResourceItem(ResourceType.LAYOUT, "layout1"); assertTrue(item.hasAlternates()); assertTrue(mRepository.hasResourcesOfType(ResourceType.LAYOUT)); assertTrue(mRepository.hasResourceItem("@layout/layout1")); IAbstractFolder layoutFolder = mRepository.getResFolder() .getFolder(FD_RES_LAYOUT + "-land"); assertNotNull(layoutFolder); IAbstractFile layoutFile = layoutFolder.getFile("layout1.xml"); assertNotNull(layoutFile); assertTrue(layoutFile instanceof FileWrapper); fileWrapper = (FileWrapper) layoutFile; if (fileWrapper.exists()) { boolean deleted = fileWrapper.delete(); assertTrue(deleted); } resourceFile = mRepository.findResourceFile(fileWrapper); assertNotNull(resourceFile); ResourceFolder layoutResFolder = mRepository.getResourceFolder(layoutFolder); assertNotNull(layoutResFolder); layoutResFolder.processFile(layoutFile, ResourceDeltaKind.REMOVED, new ScanningContext(mRepository)); mRepository.removeFile(ResourceType.LAYOUT, resourceFile); // We still have a layout1: only default now assertTrue(mRepository.hasResourceItem("@layout/layout1")); item = mRepository.getResourceItem(ResourceType.LAYOUT, "layout1"); assertFalse(item.hasAlternates()); // change strings assertTrue(mRepository.hasResourceItem("@string/dummy")); assertFalse(mRepository.hasResourceItem("@string/myDummy")); ResourceFile stringResFile = mRepository.getResourceItem(ResourceType.STRING, "dummy") .getSourceFileList().get(0); File stringFile = (File) stringResFile.getFile(); ResourceFolder folder = stringResFile.getFolder(); assertTrue(stringFile.exists()); String strings = Files.toString(stringFile, Charsets.UTF_8); assertNotNull(strings); strings = strings.replace("name=\"dummy\"", "name=\"myDummy\""); Files.write(strings, stringFile, Charsets.UTF_8); folder.processFile(stringResFile.getFile(), ResourceDeltaKind.CHANGED, new ScanningContext(mRepository)); assertTrue(mRepository.hasResourceItem("@string/myDummy")); assertFalse(mRepository.hasResourceItem("@string/dummy")); // add files assertFalse(mRepository.hasResourceItem("@layout/layout5")); File res = new File(mRepository.getDir(), FD_RES); File layout = new File(res, FD_RES_LAYOUT); File newFile = new File(layout, "layout5.xml"); boolean created = newFile.createNewFile(); assertTrue(created); mRepository.findResourceFile(newFile); assertTrue(mRepository.hasResourceItem("@layout/layout5")); // add files 2 assertFalse(mRepository.hasResourceItem("@layout/layout6")); File newFile2 = new File(layout, "layout6.xml"); created = newFile2.createNewFile(); assertTrue(created); IAbstractFile new2 = layoutResFolder.getFolder().getFile("layout6.xml"); assertNotNull(new2); layoutResFolder.processFile(new2, ResourceDeltaKind.ADDED, new ScanningContext(mRepository)); assertTrue(mRepository.hasResourceItem("@layout/layout6")); } public void testFindResourceFile() throws Exception { assertTrue(mRepository.hasResourceItem("@layout/layout1")); ResourceItem item = mRepository.getResourceItem(ResourceType.LAYOUT, "layout1"); assertNotNull(item); List<ResourceFile> sourceFileList = item.getSourceFileList(); assertNotNull(sourceFileList); assertTrue(!sourceFileList.isEmpty()); ResourceFile first = sourceFileList.get(0); IAbstractFile abstractFile = first.getFile(); assertNotNull(abstractFile); assertTrue(abstractFile instanceof File); File f = (File) abstractFile; assertSame(first, mRepository.findResourceFile(f)); assertSame(first, mRepository.findResourceFile(new File(f.getPath()))); File file = new File(f.getParentFile().getParentFile(), "layout" + File.separator + "layout2.xml"); ResourceFile resourceFile = mRepository.findResourceFile(file); assertNotNull(resourceFile); // Invalid paths assertNull(mRepository.findResourceFile(file.getParentFile())); assertNull(mRepository.findResourceFile(file.getParentFile().getParentFile())); assertNull(mRepository.findResourceFile(file.getParentFile().getParentFile(). getParentFile())); assertNull(mRepository.findResourceFile(new File("/tmp"))); } }