/* * Copyright (C) 2013 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.tools.idea.configurations; import com.android.ide.common.resources.ResourceRepository; import com.android.ide.common.resources.ResourceResolver; import com.android.tools.idea.rendering.LocalResourceRepository; import com.android.tools.idea.rendering.Locale; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTagValue; import org.jetbrains.android.AndroidTestCase; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.sdk.FrameworkResourceLoader; public class ResourceResolverCacheTest extends AndroidTestCase { @Override protected boolean requireRecentSdk() { return true; } public void test() throws Exception { VirtualFile file1 = myFixture.copyFileToProject("render/layout1.xml", "res/layout/layout1.xml"); VirtualFile file2 = myFixture.copyFileToProject("render/layout2.xml", "res/layout/layout2.xml"); VirtualFile file3 = myFixture.copyFileToProject("javadoc/strings/strings.xml", "res/values/strings.xml"); assertNotNull(file1); assertNotNull(file2); assertNotNull(file3); AndroidFacet facet = AndroidFacet.getInstance(myModule); assertNotNull(facet); Project project = getProject(); PsiFile psiFile1 = PsiManager.getInstance(project).findFile(file1); assertNotNull(psiFile1); PsiFile psiFile2 = PsiManager.getInstance(project).findFile(file2); assertNotNull(psiFile2); final PsiFile psiFile3 = PsiManager.getInstance(project).findFile(file3); assertNotNull(psiFile3); ConfigurationManager configurationManager = facet.getConfigurationManager(); assertNotNull(configurationManager); final Configuration configuration1 = configurationManager.getConfiguration(file1); Configuration configuration2 = configurationManager.getConfiguration(file2); assertNotNull(configuration1.getTheme()); assertEquals(configuration2.getTheme(), configuration1.getTheme()); ResourceResolver resolver1 = configuration1.getResourceResolver(); ResourceResolver resolver2 = configuration2.getResourceResolver(); assertSame(resolver1, resolver2); assertSame(resolver1, configuration1.getResourceResolver()); configuration1.setTheme("Theme.Light"); final ResourceResolver resolver1b = configuration1.getResourceResolver(); assertNotSame(resolver1b, resolver1); assertNotSame(resolver1b, resolver2); assertSame(resolver1b, configuration1.getResourceResolver()); configuration2.setTheme("Theme.Light"); assertSame(resolver1b, configuration2.getResourceResolver()); // Test project resource changes, should invalidate final LocalResourceRepository resources = myFacet.getModuleResources(true); assertNotNull(resources); final long generation = resources.getModificationCount(); assertEquals("Cancel", configuration1.getResourceResolver().findResValue("@string/cancel", false).getValue()); WriteCommandAction.runWriteCommandAction(null, new Runnable() { @Override public void run() { //noinspection ConstantConditions XmlTagValue value = ((XmlFile)psiFile3).getRootTag().getSubTags()[1].getValue(); assertEquals("Cancel", value.getTrimmedText()); value.setText("\"FooBar\""); } }); assertTrue(resources.isScanPending(psiFile3)); ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { assertTrue(generation < resources.getModificationCount()); assertNotSame(resolver1b, configuration1.getResourceResolver()); assertEquals("FooBar", configuration1.getResourceResolver().findResValue("@string/cancel", false).getValue()); } }); ResourceResolverCache cache = configuration1.getConfigurationManager().getResolverCache(); assertSame(cache, configuration2.getConfigurationManager().getResolverCache()); ResourceRepository frameworkResources = cache.getFrameworkResources(configuration1.getFullConfig(), configuration1.getTarget()); assertTrue(frameworkResources instanceof FrameworkResourceLoader.IdeFrameworkResources); assertTrue(((FrameworkResourceLoader.IdeFrameworkResources)frameworkResources).getSkippedLocales()); } }