blob: a6da135b6664185877493dd812cea7b8a41b624b [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* 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.eclipse.adt.internal.editors.resources.manager;
import com.android.SdkConstants;
import com.android.ide.common.resources.ResourceFile;
import com.android.ide.common.resources.ResourceFolder;
import com.android.ide.common.resources.ResourceItem;
import com.android.ide.common.resources.ResourceRepository;
import com.android.ide.common.resources.SingleResourceFile;
import com.android.ide.common.resources.configuration.FolderConfiguration;
import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
import com.android.ide.eclipse.adt.io.IFileWrapper;
import com.android.ide.eclipse.adt.io.IFolderWrapper;
import com.android.ide.eclipse.mock.Mocks;
import com.android.io.IAbstractFolder;
import com.android.io.IAbstractResource;
import com.android.resources.Keyboard;
import com.android.resources.KeyboardState;
import com.android.resources.Navigation;
import com.android.resources.NavigationState;
import com.android.resources.NightMode;
import com.android.resources.ResourceFolderType;
import com.android.resources.ScreenOrientation;
import com.android.resources.TouchScreen;
import com.android.resources.UiMode;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import junit.framework.TestCase;
public class ConfigMatchTest extends TestCase {
private static final String SEARCHED_FILENAME = "main.xml"; //$NON-NLS-1$
private static final String MISC1_FILENAME = "foo.xml"; //$NON-NLS-1$
private static final String MISC2_FILENAME = "bar.xml"; //$NON-NLS-1$
private FolderConfiguration mDefaultConfig;
private ResourceRepository mResources;
private FolderConfiguration config4;
private FolderConfiguration config3;
private FolderConfiguration config2;
private FolderConfiguration config1;
@Override
protected void setUp() throws Exception {
super.setUp();
// create a default config with all qualifiers.
mDefaultConfig = new FolderConfiguration();
mDefaultConfig.createDefault();
IAbstractFolder folder = Mocks.createAbstractFolder(
SdkConstants.FD_RESOURCES, new IAbstractResource[0]);
// create the project resources.
mResources = new ResourceRepository(folder, false) {
@Override
protected ResourceItem createResourceItem(String name) {
return new ResourceItem(name);
}
};
// create 2 arrays of IResource. one with the filename being looked up, and one without.
// Since the required API uses IResource, we can use MockFolder for them.
IFile[] validMemberList = new IFile[] {
Mocks.createFile(MISC1_FILENAME),
Mocks.createFile(SEARCHED_FILENAME),
Mocks.createFile(MISC2_FILENAME),
};
IFile[] invalidMemberList = new IFile[] {
Mocks.createFile(MISC1_FILENAME),
Mocks.createFile(MISC2_FILENAME),
};
// add multiple ResourceFolder to the project resource.
FolderConfiguration defaultConfig = getConfiguration(
null, // country code
null, // network code
null, // language
null, // region
null, // smallest width dp
null, // width dp
null, // height dp
null, // screen size
null, // screen ratio
null, // screen orientation
null, // dock mode
null, // night mode
null, // dpi
null, // touch mode
null, // keyboard state
null, // text input
null, // navigation state
null, // navigation method
null, // screen dimension
null);// version
addFolder(mResources, defaultConfig, validMemberList);
config1 = getConfiguration(
null, // country code
null, // network code
"en", // language
null, // region
null, // smallest width dp
null, // width dp
null, // height dp
null, // screen size
null, // screen ratio
null, // screen orientation
null, // dock mode
null, // night mode
null, // dpi
null, // touch mode
KeyboardState.EXPOSED.getResourceValue(), // keyboard state
null, // text input
null, // navigation state
null, // navigation method
null, // screen dimension
null);// version
addFolder(mResources, config1, validMemberList);
config2 = getConfiguration(
null, // country code
null, // network code
"en", // language
null, // region
null, // smallest width dp
null, // width dp
null, // height dp
null, // screen size
null, // screen ratio
null, // screen orientation
null, // dock mode
null, // night mode
null, // dpi
null, // touch mode
KeyboardState.HIDDEN.getResourceValue(), // keyboard state
null, // text input
null, // navigation state
null, // navigation method
null, // screen dimension
null);// version
addFolder(mResources, config2, validMemberList);
config3 = getConfiguration(
null, // country code
null, // network code
"en", // language
null, // region
null, // smallest width dp
null, // width dp
null, // height dp
null, // screen size
null, // screen ratio
ScreenOrientation.LANDSCAPE.getResourceValue(), // screen orientation
null, // dock mode
null, // night mode
null, // dpi
null, // touch mode
null, // keyboard state
null, // text input
null, // navigation state
null, // navigation method
null, // screen dimension
null);// version
addFolder(mResources, config3, validMemberList);
config4 = getConfiguration(
"mcc310", // country code
"mnc435", // network code
"en", // language
"rUS", // region
null, // smallest width dp
null, // width dp
null, // height dp
"normal", // screen size
"notlong", // screen ratio
ScreenOrientation.LANDSCAPE.getResourceValue(), // screen orientation
UiMode.DESK.getResourceValue(), // dock mode
NightMode.NIGHT.getResourceValue(), // night mode
"mdpi", // dpi
TouchScreen.FINGER.getResourceValue(), // touch mode
KeyboardState.EXPOSED.getResourceValue(), // keyboard state
Keyboard.QWERTY.getResourceValue(), // text input
NavigationState.EXPOSED.getResourceValue(), // navigation state
Navigation.DPAD.getResourceValue(), // navigation method
"480x320", // screen dimension
"v3"); // version
addFolder(mResources, config4, invalidMemberList);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
mResources = null;
}
public void test1() {
FolderConfiguration testConfig = getConfiguration(
"mcc310", // country code
"mnc435", // network code
"en", // language
"rUS", // region
null, // smallest width dp
null, // width dp
null, // height dp
"normal", // screen size
"notlong", // screen ratio
ScreenOrientation.LANDSCAPE.getResourceValue(), // screen orientation
UiMode.DESK.getResourceValue(), // dock mode
NightMode.NIGHT.getResourceValue(), // night mode
"mdpi", // dpi
TouchScreen.FINGER.getResourceValue(), // touch mode
KeyboardState.EXPOSED.getResourceValue(), // keyboard state
Keyboard.QWERTY.getResourceValue(), // text input
NavigationState.EXPOSED.getResourceValue(), // navigation state
Navigation.DPAD.getResourceValue(), // navigation method
"480x320", // screen dimension
"v3"); // version
ResourceFile result = mResources.getMatchingFile(SEARCHED_FILENAME,
ResourceFolderType.LAYOUT, testConfig);
boolean bresult = result.getFolder().getConfiguration().equals(config3);
assertEquals(bresult, true);
}
/**
* Creates a {@link FolderConfiguration}.
* @param qualifierValues The list of qualifier values. The length must equals the total number
* of Qualifiers. <code>null</code> is permitted and will make the FolderConfiguration not use
* this particular qualifier.
*/
private FolderConfiguration getConfiguration(String... qualifierValues) {
// FolderConfiguration.getQualifierCount is always valid and up to date.
final int count = FolderConfiguration.getQualifierCount();
// Check we have the right number of qualifier.
assertEquals(qualifierValues.length, count);
FolderConfiguration config = new FolderConfiguration();
for (int i = 0 ; i < count ; i++) {
String value = qualifierValues[i];
if (value != null) {
assertTrue(mDefaultConfig.getQualifier(i).checkAndSet(value, config));
}
}
return config;
}
/**
* Adds a folder to the given {@link ProjectResources} with the given
* {@link FolderConfiguration}. The folder is filled with files from the provided list.
* @param resources the {@link ResourceRepository} in which to add the folder.
* @param config the {@link FolderConfiguration} for the created folder.
* @param memberList the list of files for the folder.
*/
private void addFolder(ResourceRepository resources, FolderConfiguration config,
IFile[] memberList) throws Exception {
// figure out the folder name based on the configuration
String folderName = config.getFolderName(ResourceFolderType.LAYOUT);
// create the folder mock
IFolder folder = Mocks.createFolder(folderName, memberList);
// add it to the resource, and get back a ResourceFolder object.
ResourceFolder resFolder = resources.processFolder(new IFolderWrapper(folder));
// and fill it with files from the list.
for (IFile file : memberList) {
resFolder.addFile(new SingleResourceFile(new IFileWrapper(file), resFolder));
}
}
}