/*******************************************************************************
* Copyright (c) 2008, 2017 Red Hat Inc.
* 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:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.rpm.ui.editor.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.linuxtools.internal.rpm.ui.editor.Activator;
import org.eclipse.linuxtools.internal.rpm.ui.editor.SpecfileCompletionProcessor;
import org.eclipse.linuxtools.internal.rpm.ui.editor.SpecfileEditor;
import org.eclipse.linuxtools.internal.rpm.ui.editor.preferences.PreferenceConstants;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.junit.Test;
public class SpecfileCompletionProcessorTest extends FileTestCase {
public static final String ONE_SOURCE = "Source0: text.zip\n";
public static final String NO_SOURCE = "Patch3: somefilesomewhere.patch" + "\n" + "Patch2: someotherfile.patch\n";
public static final String THREE_SOURCE_SEPARATED = "Source0: text.zip" + "\n" + "Patch0: first.patch" + "\n"
+ "Source2: ant.jar" + "\n" + "Source3: main.tar.gz";
private static final String BUILD_REQUIRES = "BuildRequires: p";
private static final String NON_ALPHA_DOT = "Requires: java-1.";
private static final String NON_ALPHA_PLUS = "Requires: libstdc+";
private SpecfileEditor initEditor(String contents) throws Exception {
newFile(contents);
IEditorPart openEditor = IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(),
testFile);
return (SpecfileEditor) openEditor;
}
private synchronized void computeCompletionProposals(String specContent, int occurances) throws Exception {
SpecfileEditor editor = initEditor(specContent);
testProject.refresh();
// This is needed so the changes in the testFile are loaded in the
// editor
editor.doRevertToSaved();
SpecfileCompletionProcessor complProcessor = new SpecfileCompletionProcessor();
assertNotNull(complProcessor);
editor.getSpecfileSourceViewer().setSelectedRange(0, 0);
ICompletionProposal[] proposals = complProcessor.computeCompletionProposals(editor.getSpecfileSourceViewer(),
0);
int sourceComplCount = 0;
for (ICompletionProposal proposal : proposals) {
if (proposal.getDisplayString().startsWith("%{SOURCE")) {
++sourceComplCount;
}
}
assertEquals(occurances, sourceComplCount);
}
@Test
public void testComputeComplProposalsOneSource() throws Exception {
computeCompletionProposals(ONE_SOURCE, 1);
}
@Test
public void testComputeComplProposalsNoSource() throws Exception {
computeCompletionProposals(NO_SOURCE, 0);
}
@Test
public void testComputeComplProposalsThreeSourceSeparated() throws Exception {
computeCompletionProposals(THREE_SOURCE_SEPARATED, 3);
}
@Test
public void testBRCompletionOrder() throws Exception {
setPackageList(new String[] { "package3", "package2", "package4", "package1" });
SpecfileEditor editor = initEditor(BUILD_REQUIRES);
testProject.refresh();
editor.doRevertToSaved();
editor.getSpecfileSourceViewer().setSelectedRange(BUILD_REQUIRES.length(), 0);
SpecfileCompletionProcessor processor = new SpecfileCompletionProcessor();
ICompletionProposal[] proposals = processor.computeCompletionProposals(editor.getSpecfileSourceViewer(),
BUILD_REQUIRES.length());
assertTrue("Cannot perform test; not enough proposals", proposals.length > 1);
ICompletionProposal previous = proposals[0];
for (int i = 1; i < proposals.length; i++) {
ICompletionProposal current = proposals[i];
assertTrue("Proposals are not in alphabetical order",
previous.getDisplayString().compareToIgnoreCase(current.getDisplayString()) < 0);
previous = current;
}
}
@Test
public void testBRCompletionNonAlphaDot() throws Exception {
setPackageList(new String[] { "java-1.5.0-gcj", "java-1.7.0-openjdk", "java-1.7.0-openjdk-devel",
"java-1.7.0-openjdk-javadoc" });
SpecfileEditor editor = initEditor(NON_ALPHA_DOT);
testProject.refresh();
// This is needed so the changes in the testFile are loaded in the
// editor
editor.doRevertToSaved();
SpecfileCompletionProcessor complProcessor = new SpecfileCompletionProcessor();
assertNotNull(complProcessor);
editor.getSpecfileSourceViewer().setSelectedRange(NON_ALPHA_DOT.length(), 0);
ICompletionProposal[] proposals = complProcessor.computeCompletionProposals(editor.getSpecfileSourceViewer(),
NON_ALPHA_DOT.length());
int sourceComplCount = 0;
for (ICompletionProposal proposal : proposals) {
if (proposal.getDisplayString().startsWith("java-1.")) {
++sourceComplCount;
}
}
assertEquals(4, sourceComplCount);
}
@Test
public void testBRCompletionNonAlphaPlus() throws Exception {
setPackageList(new String[] { "libstdc++", "libstdc++-devel" });
SpecfileEditor editor = initEditor(NON_ALPHA_PLUS);
testProject.refresh();
// This is needed so the changes in the testFile are loaded in the
// editor
editor.doRevertToSaved();
SpecfileCompletionProcessor complProcessor = new SpecfileCompletionProcessor();
assertNotNull(complProcessor);
editor.getSpecfileSourceViewer().setSelectedRange(NON_ALPHA_PLUS.length(), 0);
ICompletionProposal[] proposals = complProcessor.computeCompletionProposals(editor.getSpecfileSourceViewer(),
NON_ALPHA_PLUS.length());
int sourceComplCount = 0;
for (ICompletionProposal proposal : proposals) {
if (proposal.getDisplayString().startsWith("libstdc+")) {
++sourceComplCount;
}
}
assertEquals(2, sourceComplCount);
}
/**
* Set the potential rpm package list to the given list. Useful for testing
* package proposals.
*
* @param packages
*/
private void setPackageList(String[] packages) {
ScopedPreferenceStore prefStore = new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID);
prefStore.setValue(PreferenceConstants.P_RPM_LIST_FILEPATH, "/tmp/pkglist1");
prefStore.setValue(PreferenceConstants.P_RPM_LIST_BACKGROUND_BUILD, false);
try (BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/pkglist1"))) {
for (String packageName : packages) {
out.write(packageName + "\n");
}
} catch (IOException e) {
fail(e.getMessage());
}
Activator.packagesList = null;
}
}