/* * Copyright 2003-2017 JetBrains s.r.o. * * 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 jetbrains.mps.workbench.goTo.matcher; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.util.CommonProcessors.CollectProcessor; import jetbrains.mps.workbench.choose.ChooseByNameData; import jetbrains.mps.workbench.choose.ElementDescriptor; import jetbrains.mps.workbench.choose.ElementPresentation; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.Assert; import org.junit.Test; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.function.BiConsumer; /** * User: shatalin * Date: 21/01/2017 */ public class MPSPackageItemProviderTests { // Matching by exact string @Test public void matchComplete() { checkOneEntryFound(new String[]{"myentry1", "myentry2"}, "myentry1", "myentry1"); } // Matching by substring @Test public void matchSubstring() { checkOneEntryFound(new String[]{"myentry1", "myemtry2"}, "entry", "myentry1"); } @Test public void sortSubstrings() { checkEntriesFound(new String[]{"myentry2", "myentry1", "myenntry3"}, "entry", new String[]{"myentry1", "myentry2"}); } @Test public void orderCompleteThenSubstrings() { checkEntriesFound(new String[]{"myentry1", "myenntry3", "entry"}, "entry", new String[]{"entry", "myentry1"}); } // Matching with Humps @Test public void notMatchedAbbreviation() { checkEntriesFound(new String[]{"myentry1", "myentry2"}, "me1", new String[0]); } @Test public void matchWithHump() { checkOneEntryFound(new String[]{"myEntry1", "myEntry2"}, "me1", "myEntry1"); } @Test public void sortingHumps() { checkEntriesFound(new String[]{"myEntry2", "myEntry1"}, "me", new String[]{"myEntry1", "myEntry2"}); } @Test public void matchSubstringWithHump() { checkOneEntryFound(new String[]{"justOneMy_Entry1", "justOneMyEmntry2"}, "oMyEn", "justOneMy_Entry1"); } @Test public void sortCompleteHumpThenSubstringHump() { checkEntriesFound(new String[]{"justOneMy_Entry3", "justOneMyEntry2", "justOneMy_Entry1"}, "OnMyEn", new String[]{"justOneMyEntry2", "justOneMy_Entry1", "justOneMy_Entry3"}); } @Test public void sortFullHumpMatchFirst() { checkEntriesFound(new String[]{"justOneMy_Entry3", "justOnMy_Entry2", "justOneMyEntry1"}, "OnMyEn", new String[]{"justOnMy_Entry2", "justOneMyEntry1", "justOneMy_Entry3"}); } @Test public void orderSubstringThenHump() { checkEntriesFound(new String[]{"myEntry1", "_me1_"}, "me1", new String[]{"_me1_", "myEntry1"}); } @Test public void orderCompleteThenHump() { checkEntriesFound(new String[]{"myEntry1", "me1"}, "me1", new String[]{"me1", "myEntry1"}); } // With dots @Test public void matchWithSegmentStarts() { checkOneEntryFound(new String[]{"jetbrains.mps.editor", "jetbrains.mps.node"}, "jetme", "jetbrains.mps.editor"); } @Test public void sortCompleteSegmentThenSubstringThenHump() { checkEntriesFound(new String[]{"org.jetbrains.mps.editor", "org.jetme.mps.node", "org._jetme_.mps.node"}, "jetme", new String[]{"org.jetme.mps.node", "org._jetme_.mps.node", "org.jetbrains.mps.editor"}); } @Test public void matchWithSegmentStartsHump() { checkOneEntryFound(new String[]{"jetbrains.mps.impl.editor.runtime", "jetbrains.mps.node"}, "ME", "jetbrains.mps.impl.editor.runtime"); } @Test public void matchWithSegmentStartsAndDots() { checkOneEntryFound(new String[]{"jetbrains.mps.lang.editor", "jetbrains.mps.lang.editor.tests", "jetbrains.mps.lang.node"}, "mps.la.ed.tests", "jetbrains.mps.lang.editor.tests"); } @Test public void orderLessFragmentsFirst() { checkEntriesFound(new String[]{"jetbrains.mps.impl.lang.internal.editor", "jetbrains.mps.lang.editor", "jetbrains.mps.lang.node"}, "mps.lang.ed", new String[]{"jetbrains.mps.lang.editor", "jetbrains.mps.impl.lang.internal.editor"}); } @Test public void orderNameMixedCaseThenSegments() { checkEntriesFound(new String[]{"jetbrains.mps.lang.editor.impl", "jetbrains.mps.lang.editorImpl", "jetbrains.mps.lang.node"}, "editorImpl", new String[]{"jetbrains.mps.lang.editorImpl", "jetbrains.mps.lang.editor.impl"}); } @Test public void orderNameIncompleteMixedCaseThenSegments() { checkEntriesFound(new String[]{"jetbrains.mps.lang.editor.impl", "jetbrains.mps.lang.myEditorImplementation", "jetbrains.mps.lang.node"}, "editorImpl", new String[]{"jetbrains.mps.lang.myEditorImplementation", "jetbrains.mps.lang.editor.impl"}); } @Test public void orderCloseToStartSegmentFirst() { checkEntriesFound(new String[]{"jetbrains.mps.lang.editor.impl", "jetbrains.lang.editor.impl", "jetbrains.mps.lang.node"}, "lang.editor", new String[]{"jetbrains.lang.editor.impl", "jetbrains.mps.lang.editor.impl"}); } @Test public void orderCompleteSegmentMatchFirst() { checkEntriesFound(new String[]{"jetbrains.mps.mylanguage.node", "jetbrains.mps.lang.editor.impl", "jetbrains.mps.language.editor.impl"}, "lang", new String[]{"jetbrains.mps.lang.editor.impl", "jetbrains.mps.language.editor.impl", "jetbrains.mps.mylanguage.node"}); } @Test public void orderCloseToStartSegmentFirst_() { checkEntriesFound(new String[]{"jetbrains.lang.impl.internal.editor", "jetbrains.mps.lang.impl.editor", "jetbrains.mps.lang.node"}, "lang.editor", new String[]{"jetbrains.mps.lang.impl.editor", "jetbrains.lang.impl.internal.editor"}); } private void checkEntriesFound(String[] entries, String pattern, String[] foundEntries) { List<String> result = filterScope(Arrays.asList(entries), pattern); Assert.assertEquals(foundEntries.length, result.size()); Assert.assertArrayEquals(foundEntries, result.toArray()); } private void checkOneEntryFound(String[] entries, String pattern, String entry) { List<String> result = filterScope(Arrays.asList(entries), pattern); Assert.assertEquals(1, result.size()); Assert.assertEquals(entry, result.get(0)); } private List<String> filterScope(Collection<String> scope, String pattern) { ChooseByNameData<String> model = new ChooseByNameData<>(new TestPresentation()); model.setScope(scope, null); CollectProcessor<String> consumer = new CollectProcessor<>(); boolean everywhere = false; MPSPackageItemProvider provider = new MPSPackageItemProvider(); boolean filterElements = provider.filterElements(model.getNames(everywhere), pattern, everywhere, model, new EmptyProgressIndicator(new ModalityState() { @Override public boolean dominates(@NotNull ModalityState anotherState) { return false; } @Override public String toString() { return "ModalityState.Dummy"; } }), (CollectProcessor) consumer); Assert.assertTrue(filterElements); return (List<String>) consumer.getResults(); } private class TestPresentation implements ElementPresentation<String> { @Override public void names(@NotNull Iterable<String> elements, @NotNull BiConsumer<String, String> nameConsumer) { elements.forEach(name -> nameConsumer.accept(name, name)); } @Override public boolean canRender(@Nullable Object element) { return element instanceof String; } @Override public void render(@NotNull String element, @NotNull ElementDescriptor presentation) { presentation.name = element; } } }