/*******************************************************************************
* Copyright (c) 2013 Red Hat Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Neil Guzman - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.createrepo.tree.tests;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoPreferenceConstants;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoProject;
import org.eclipse.linuxtools.internal.rpm.createrepo.ICreaterepoConstants;
import org.eclipse.linuxtools.internal.rpm.createrepo.form.tests.TestCreaterepoProject;
import org.eclipse.linuxtools.internal.rpm.createrepo.tree.CreaterepoCategoryModel;
import org.eclipse.linuxtools.internal.rpm.createrepo.tree.CreaterepoTreeCategory;
import org.eclipse.linuxtools.internal.rpm.createrepo.tree.CreaterepoTreeContentProvider;
import org.eclipse.linuxtools.internal.rpm.createrepo.tree.CreaterepoTreeLabelProvider;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.osgi.service.prefs.BackingStoreException;
/**
* Tests for tag category tree. Make sure that preferences are properly loaded
* into the treeviewer and that the categories are the correct ones.
*/
public class CreaterepoTreeTest {
/*
* Tags being used to test with.
*/
private static final String[] DISTRO_TAGS =
{"tag1","tag2","tag3","tag4","tag5"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
private static final String[] CONTENT_TAGS = {};
private static final String[] REPO_TAGS = {"tag1"}; //$NON-NLS-1$
/*
* Categories and how many tags per categories to test with.
*/
private static final Map<String, Integer> CORRECT_CATEGORIES;
static {
Map<String, Integer> temp = new HashMap<>();
temp.put(CreaterepoPreferenceConstants.PREF_DISTRO_TAG, DISTRO_TAGS.length);
temp.put(CreaterepoPreferenceConstants.PREF_CONTENT_TAG, CONTENT_TAGS.length);
temp.put(CreaterepoPreferenceConstants.PREF_REPO_TAG, REPO_TAGS.length);
CORRECT_CATEGORIES = Collections.unmodifiableMap(temp);
}
private static TestCreaterepoProject testProject;
private CreaterepoProject project;
private TreeViewer viewer;
private Tree tree;
/**
* Initialize the test project.
*
* @throws CoreException
*/
@BeforeClass
public static void setUpBeforeClass() throws CoreException {
testProject = new TestCreaterepoProject();
assertTrue(testProject.getProject().exists());
}
/**
* Delete the project when tests are done.
*
* @throws CoreException
*/
@AfterClass
public static void tearDownAfterClass() throws CoreException {
testProject.dispose();
assertFalse(testProject.getProject().exists());
}
/**
* Get the CreaterepoProject at the beginning of each test.
*
* @throws CoreException
*/
@Before
public void setUp() throws CoreException {
project = testProject.getCreaterepoProject();
assertNotNull(project);
}
/**
* Clear the preferences after each test.
*
* @throws BackingStoreException
*/
@After
public void tearDown() throws BackingStoreException {
IEclipsePreferences pref = project.getEclipsePreferences();
pref.clear();
pref.flush();
assertEquals(0, pref.keys().length);
}
/**
* Test if the treeviewer is initialized properly with the correct labels.
*/
@Test
public void testTreeViewerInitialization() {
Display.getDefault().syncExec(() -> {
initViewer();
// there should only be 3 categories
assertEquals(3, tree.getItemCount());
// and these should be the correct categories
for (TreeItem treeItem : tree.getItems()) {
assertTrue(inCategory(treeItem.getText()));
}
});
}
/**
* Test if the treeviewer properly loads the preferences.
*
* @throws BackingStoreException
*/
@Test
public void testTreeViewerPreferences() throws BackingStoreException {
addTestPreferences();
Display.getDefault().syncExec(() -> {
initViewer();
for (TreeItem treeItem : tree.getItems()) {
if (treeItem.getData() instanceof CreaterepoTreeCategory) {
CreaterepoTreeCategory category = (CreaterepoTreeCategory) treeItem.getData();
// make sure the categories are still correct
assertTrue(CORRECT_CATEGORIES.containsKey(category.getName()));
// assert that the number of tags stored is the correct
// amount
assertEquals(CORRECT_CATEGORIES.get(category.getName()).intValue(), category.getTags().size());
}
}
// do 1 test to make sure the tags were properly stored/loaded
for (TreeItem treeItem : tree.getItems()) {
if (treeItem.getData() instanceof CreaterepoTreeCategory) {
CreaterepoTreeCategory category = (CreaterepoTreeCategory) treeItem.getData();
// only check 1 category's tags, as all are loaded the same
// way
if (category.getName().equals(CreaterepoPreferenceConstants.PREF_DISTRO_TAG)) {
assertArrayEquals(DISTRO_TAGS, category.getTags().toArray());
break;
}
}
}
});
}
/**
* Initialize the treeviewer and tree. Needs access to UI thread when using
* SWTBot tests. Need to wrap tests in Display.getDefault().syncExec().
*/
private void initViewer() {
viewer = new TreeViewer(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
viewer.setContentProvider(new CreaterepoTreeContentProvider());
viewer.setLabelProvider(new CreaterepoTreeLabelProvider());
CreaterepoCategoryModel model = new CreaterepoCategoryModel(project);
viewer.setInput(model);
tree = viewer.getTree();
}
/**
* Add some test tags in the preferences.
*
* @throws BackingStoreException
*/
private void addTestPreferences() throws BackingStoreException {
IEclipsePreferences pref = project.getEclipsePreferences();
pref.put(CreaterepoPreferenceConstants.PREF_DISTRO_TAG, preparePrefValue(DISTRO_TAGS));
pref.put(CreaterepoPreferenceConstants.PREF_CONTENT_TAG, preparePrefValue(CONTENT_TAGS));
pref.put(CreaterepoPreferenceConstants.PREF_REPO_TAG, preparePrefValue(REPO_TAGS));
pref.flush();
}
/**
* Helper method to prepare the tags the way it should be stored in preferences.
*
* @param values The values to store.
* @return The string as it should be stored.
*/
private static String preparePrefValue(String[] values) {
String str = ICreaterepoConstants.EMPTY_STRING;
if (values.length > 0) {
for (String temp : values) {
str = str.concat(temp+ICreaterepoConstants.DELIMITER);
}
str = str.substring(0, str.length()-1);
}
return str;
}
/**
* Helper method to check if the item is one of the correct categories.
*
* @param itemToCheck The item to check.
* @return True if the item should exist, false otherwise.
*/
private static boolean inCategory(String itemToCheck) {
for (String str : CORRECT_CATEGORIES.keySet()) {
if (str.equals(itemToCheck)) {
return true;
}
}
return false;
}
}