diff --git a/.idea/modules.xml b/.idea/modules.xml index 5d7ebb85be2e..8f87f521d954 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -905,8 +905,8 @@ + - diff --git a/plugins/search-everywhere-ml/semantics/tests/intellij.searchEverywhereMl.semantics.tests.iml b/plugins/search-everywhere-ml/semantics/tests/intellij.searchEverywhereMl.semantics.tests.iml index 2c405adfa957..d124a39dfa90 100644 --- a/plugins/search-everywhere-ml/semantics/tests/intellij.searchEverywhereMl.semantics.tests.iml +++ b/plugins/search-everywhere-ml/semantics/tests/intellij.searchEverywhereMl.semantics.tests.iml @@ -4,21 +4,11 @@ - - - - - - - - - - \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/.keep b/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/.keep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticActionSearchTest.kt b/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticActionSearchTest.kt deleted file mode 100644 index 6a6896356f7f..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticActionSearchTest.kt +++ /dev/null @@ -1,134 +0,0 @@ -package com.intellij.searchEverywhereMl.semantics.tests - -import com.intellij.ide.actions.searcheverywhere.ActionSearchEverywhereContributor -import com.intellij.ide.actions.searcheverywhere.SearchEverywhereUI -import com.intellij.ide.actions.searcheverywhere.SearchEverywhereUI.SINGLE_CONTRIBUTOR_ELEMENTS_LIMIT -import com.intellij.ide.util.gotoByName.GotoActionModel -import com.intellij.openapi.application.EDT -import com.intellij.openapi.application.readAction -import com.intellij.openapi.util.Disposer -import com.intellij.ml.llm.embeddings.core.actions.ActionEmbeddingStorageManager -import com.intellij.ml.llm.embeddings.core.indexer.IndexId -import com.intellij.ml.llm.embeddings.core.indexer.configuration.EmbeddingsConfiguration -import com.intellij.ml.llm.embeddings.searchEverywhere.contributors.SemanticActionSearchEverywhereContributor -import com.intellij.ml.llm.embeddings.searchEverywhere.settings.SearchEverywhereSemanticSettings -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.test.runTest -import kotlin.time.Duration.Companion.minutes -import kotlin.time.Duration.Companion.seconds - -class SemanticActionSearchTest : SemanticSearchBaseTestCase() { - private val storageWrapper - get() = EmbeddingsConfiguration.getStorageManagerWrapper(IndexId.ACTIONS) - - fun `test basic semantics`() = runTest { - setupTest("java/IndexProjectAction.java") // open file in the editor to make all actions indexable - - var neighbours = storageWrapper.search(null, "delete all breakpoints", 10, 0.5f).map { it.id }.toSet() - assertContainsElements(neighbours, "Debugger.RemoveAllBreakpoints", "Debugger.RemoveAllBreakpointsInFile") - - neighbours = storageWrapper.search(null, "fix ide", 10, 0.5f).map { it.id }.toSet() - assertContainsElements( - neighbours, - "CallSaul", // 'Repair IDE' action (don't ask why) - "ExportImportGroup" // 'Manage IDE Settings' action - ) - - neighbours = storageWrapper.search(null, "web explorer", 10, 0.5f).map { it.id }.toSet() - assertContainsElements(neighbours, "WebBrowser", "BrowseWeb") - } - - fun `test search everywhere contributor`() = runTest( - timeout = 1.minutes // time to generate action embeddings - ) { - setupTest("java/IndexProjectAction.java") - - val standardActionContributor = ActionSearchEverywhereContributor.Factory() - .createContributor(createEvent()) as ActionSearchEverywhereContributor - val searchEverywhereUI = runBlocking(Dispatchers.EDT) { - SearchEverywhereUI(project, listOf(SemanticActionSearchEverywhereContributor(standardActionContributor)), { _ -> null }, null) - } - Disposer.register(project, searchEverywhereUI) - - val elements = runOnEdt { searchEverywhereUI.findElementsForPattern("delete all breakpoints") }.await() - - val items = elements.filterIsInstance().map { (it.value as GotoActionModel.ActionWrapper).actionText } - - assertContainsElements(items, "Remove All Breakpoints", "Remove All Breakpoints In The Current File") - } - - fun `test empty query`() = runTest(timeout = 10.seconds) { - val semanticActionContributor = readAction { - SemanticActionSearchEverywhereContributor( - ActionSearchEverywhereContributor.Factory().createContributor(createEvent()) as ActionSearchEverywhereContributor) - } - - val semanticSearchEverywhereUI = runBlocking(Dispatchers.EDT) { SearchEverywhereUI(project, listOf(semanticActionContributor)) } - Disposer.register(project, semanticSearchEverywhereUI) - - val results = runOnEdt { semanticSearchEverywhereUI.findElementsForPattern("") }.await() - - assertEquals("expected no results from semantic contributor for empty query", - 0, results.filterIsInstance().mapNotNull { it.value as? GotoActionModel.MatchedValue }.size) - } - - fun `test semantic and standard contributor results match`() = runTest(timeout = 5.minutes) { - setupTest("java/IndexProjectAction.java") - - // Contributors do not share the same GotoActionModel: - val standardActionContributor = readAction { ActionSearchEverywhereContributor.Factory() - .createContributor(createEvent()) as ActionSearchEverywhereContributor } - val semanticActionContributor = readAction { - SemanticActionSearchEverywhereContributor( - ActionSearchEverywhereContributor.Factory().createContributor(createEvent()) as ActionSearchEverywhereContributor) - } - - val standardSearchEverywhereUI = runBlocking(Dispatchers.EDT) { SearchEverywhereUI(project, listOf(standardActionContributor)) } - Disposer.register(project, standardSearchEverywhereUI) - val semanticSearchEverywhereUI = runBlocking(Dispatchers.EDT) { SearchEverywhereUI(project, listOf(semanticActionContributor)) } - Disposer.register(project, semanticSearchEverywhereUI) - - val prefixes = ('a'..'z').map { it.toString() }.toMutableList() - var lastAdded = prefixes.toList() - repeat(2) { - lastAdded = lastAdded.flatMap { prefix -> ('a'..'z').map { prefix + it } } - prefixes.addAll(lastAdded) - } - - suspend fun findResultsFromUI(ui: SearchEverywhereUI, query: String): List { - return runOnEdt { ui.findElementsForPattern(query) }.await() - .filterIsInstance() - .mapNotNull { it.value as? GotoActionModel.ActionWrapper } - // 'Include disabled actions' checkbox is automatically set in standard search when no results found. - // Since there are fewer cases when lookup is empty, disabled actions might not appear in semantic search results, and that's fine: - .filter { it.isAvailable } - .map { it.actionText } - } - - val iterations = 1200 - for (query in prefixes.take(iterations)) { - val semanticResults = findResultsFromUI(semanticSearchEverywhereUI, query) - val standardResults = findResultsFromUI(standardSearchEverywhereUI, query) - - assert(standardResults.toSet().minus(semanticResults.toSet()).isEmpty() || - (standardResults.size == semanticResults.size && semanticResults.size == SINGLE_CONTRIBUTOR_ELEMENTS_LIMIT)) { - """ - Not all elements from standard contributor are present in semantic contributor results - query: $query - standard results (len = ${standardResults.size}): $standardResults - semantic results (len = ${semanticResults.size}): $semanticResults - removed results: ${standardResults.toSet().minus(semanticResults.toSet())} - added results: ${semanticResults.toSet().minus(standardResults.toSet())} - """.trimIndent() - } - } - } - - private suspend fun setupTest(vararg filePaths: String) { - myFixture.configureByFiles(*filePaths) - SearchEverywhereSemanticSettings.getInstance().enabledInActionsTab = true - storageWrapper.clearStorage(null) - ActionEmbeddingStorageManager.getInstance().prepareForSearch().join() - } -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticClassSearchTest.kt b/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticClassSearchTest.kt deleted file mode 100644 index 91e3aa88c23d..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticClassSearchTest.kt +++ /dev/null @@ -1,138 +0,0 @@ -package com.intellij.searchEverywhereMl.semantics.tests - -import com.intellij.ide.actions.searcheverywhere.PsiItemWithSimilarity -import com.intellij.ide.actions.searcheverywhere.SearchEverywhereUI -import com.intellij.ide.util.gotoByName.GotoClassModel2 -import com.intellij.openapi.application.EDT -import com.intellij.openapi.application.readAction -import com.intellij.openapi.application.smartReadAction -import com.intellij.openapi.command.WriteCommandAction -import com.intellij.openapi.util.Disposer -import com.intellij.ml.llm.embeddings.core.indexer.FileBasedEmbeddingIndexer -import com.intellij.ml.llm.embeddings.core.indexer.IndexId -import com.intellij.ml.llm.embeddings.core.indexer.configuration.EmbeddingsConfiguration -import com.intellij.ml.llm.embeddings.core.indexer.entities.IndexableClass -import com.intellij.ml.llm.embeddings.core.jvm.indices.EntityId -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiElement -import com.intellij.ml.llm.embeddings.searchEverywhere.contributors.SemanticClassSearchEverywhereContributor -import com.intellij.ml.llm.embeddings.searchEverywhere.settings.SearchEverywhereSemanticSettings -import com.intellij.testFramework.VfsTestUtil -import com.intellij.testFramework.utils.editor.commitToPsi -import com.intellij.testFramework.utils.editor.saveToDisk -import com.intellij.util.TimeoutUtil -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.test.runTest -import org.jetbrains.kotlin.psi.KtClass -import kotlin.time.Duration.Companion.seconds - -class SemanticClassSearchTest : SemanticSearchBaseTestCase() { - private val storageWrapper - get() = EmbeddingsConfiguration.getStorageManagerWrapper(IndexId.CLASSES) - - private val model - get() = GotoClassModel2(project) - - fun `test basic semantics`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/ProjectIndexingTask.kt", "java/ScoresFileManager.java") - assertEquals(3, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("IndexProjectAction", "ProjectIndexingTask"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("ScoresFileManager"), neighbours) - } - - fun `test index ids are not duplicated`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/IndexProjectAction.kt") - assertEquals(1, storageWrapper.getStorageStats(project).size) - } - - fun `test search everywhere contributor`() = runTest( - timeout = 45.seconds // increased timeout because of a bug in class index - ) { - setupTest("java/IndexProjectAction.java", "kotlin/ProjectIndexingTask.kt", "java/ScoresFileManager.java") - assertEquals(3, storageWrapper.getStorageStats(project).size) - - val contributor = readAction { SemanticClassSearchEverywhereContributor(createEvent()) } - Disposer.register(project, contributor) - val searchEverywhereUI = runBlocking(Dispatchers.EDT) { SearchEverywhereUI(project, listOf(contributor), { _ -> null }, null) } - Disposer.register(project, searchEverywhereUI) - - val elements = runOnEdt { searchEverywhereUI.findElementsForPattern("index project job") }.await() - - val items: List = elements.filterIsInstance>().mapNotNull { extractPsiElement(it) } - assertEquals(2, items.size) - - val classes = items.filterIsInstance().map { readAction { IndexableClass(EntityId(it.name ?: "")) } } + - items.filterIsInstance().map { readAction { IndexableClass(EntityId(it.name ?: "")) } } - assertEquals(2, classes.size) - assertEquals(setOf(EntityId("IndexProjectAction"), EntityId("ProjectIndexingTask")), classes.map { it.id }.toSet()) - } - - fun `test class renaming changes the index`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/ProjectIndexingTask.kt", "java/ScoresFileManager.java") - assertEquals(3, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("IndexProjectAction", "ProjectIndexingTask"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("ScoresFileManager"), neighbours) - - val nameToReplace = "IndexProjectAction" - val startOffset = myFixture.editor.document.text.indexOf(nameToReplace) - WriteCommandAction.runWriteCommandAction(project) { - myFixture.editor.document.replaceString(startOffset, startOffset + nameToReplace.length, "ScoresFileHandler") - myFixture.editor.document.saveToDisk() // This is how we trigger reindexing - myFixture.editor.document.commitToPsi(project) - } - - TimeoutUtil.sleep(2000) // wait for two seconds for index update - - neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.filterByModel() - assertEquals(setOf("ProjectIndexingTask"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.filterByModel() - assertEquals(setOf("ScoresFileManager", "ScoresFileHandler"), neighbours) - } - - fun `test removal of file with class changes the index`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/ProjectIndexingTask.kt", "java/ScoresFileManager.java") - assertEquals(3, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("IndexProjectAction", "ProjectIndexingTask"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("ScoresFileManager"), neighbours) - - VfsTestUtil.deleteFile(myFixture.editor.virtualFile) // deletes the currently open file: java/IndexProjectAction.java - TimeoutUtil.sleep(2000) // wait for two seconds for index update - - neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.filterByModel() - assertEquals(setOf("ProjectIndexingTask"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.filterByModel() - assertEquals(setOf("ScoresFileManager"), neighbours) - } - - private suspend fun Iterable.filterByModel(): Set { - return filter { - smartReadAction(project) { - model.getElementsByName(it, false, it).any { element -> - (element as PsiElement).isValid - } - } - }.toSet() - } - - private suspend fun setupTest(vararg filePaths: String) { - myFixture.configureByFiles(*filePaths) - SearchEverywhereSemanticSettings.getInstance().enabledInClassesTab = true - storageWrapper.clearStorage(project) - FileBasedEmbeddingIndexer.getInstance().prepareForSearch(project).join() - } -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticFileSearchTest.kt b/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticFileSearchTest.kt deleted file mode 100644 index 51908e3cc80f..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticFileSearchTest.kt +++ /dev/null @@ -1,161 +0,0 @@ -package com.intellij.searchEverywhereMl.semantics.tests - -import com.intellij.ide.actions.searcheverywhere.PsiItemWithSimilarity -import com.intellij.ide.actions.searcheverywhere.SearchEverywhereUI -import com.intellij.ide.util.gotoByName.GotoFileModel -import com.intellij.openapi.application.EDT -import com.intellij.openapi.application.readAction -import com.intellij.openapi.application.smartReadAction -import com.intellij.openapi.command.WriteCommandAction -import com.intellij.openapi.util.Disposer -import com.intellij.ml.llm.embeddings.core.indexer.FileBasedEmbeddingIndexer -import com.intellij.ml.llm.embeddings.core.indexer.IndexId -import com.intellij.ml.llm.embeddings.core.indexer.configuration.EmbeddingsConfiguration -import com.intellij.ml.llm.embeddings.core.indexer.entities.IndexableFile -import com.intellij.ml.llm.embeddings.core.jvm.indices.EntityId -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiFile -import com.intellij.ml.llm.embeddings.searchEverywhere.contributors.SemanticFileSearchEverywhereContributor -import com.intellij.ml.llm.embeddings.searchEverywhere.settings.SearchEverywhereSemanticSettings -import com.intellij.testFramework.utils.vfs.deleteRecursively -import com.intellij.util.TimeoutUtil -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.test.runTest -import java.io.BufferedReader -import java.nio.file.Path -import kotlin.io.path.inputStream - -class SemanticFileSearchTest : SemanticSearchBaseTestCase() { - private val storageWrapper - get() = EmbeddingsConfiguration.getStorageManagerWrapper(IndexId.FILES) - - private val model - get() = GotoFileModel(project) - - fun `test basic semantics`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/ProjectIndexingTask.kt", "java/ScoresFileManager.java") - assertEquals(3, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("IndexProjectAction.java", "ProjectIndexingTask.kt"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("ScoresFileManager.java"), neighbours) - } - - fun `test index ids are not duplicated`() = runTest { - myFixture.copyFileToProject("java/IndexProjectAction.java", "src/first/IndexProjectAction.java") - myFixture.copyFileToProject("java/IndexProjectAction.java", "src/second/IndexProjectAction.java") - setupTest() - - assertEquals(1, storageWrapper.getStorageStats(project).size) - } - - fun `test search everywhere contributor`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/ProjectIndexingTask.kt", "java/ScoresFileManager.java") - assertEquals(3, storageWrapper.getStorageStats(project).size) - - val contributor = readAction { SemanticFileSearchEverywhereContributor (createEvent()) } - Disposer.register(project, contributor) - val searchEverywhereUI = runBlocking(Dispatchers.EDT) { SearchEverywhereUI (project, listOf(contributor), { _ -> null }, null) } - Disposer.register(project, searchEverywhereUI) - - val elements = runOnEdt { searchEverywhereUI.findElementsForPattern("index project job") }.await() - - val items: List = elements.filterIsInstance>().mapNotNull { extractPsiElement(it) } - assertEquals(2, items.size) - - val files = items.filterIsInstance().map { IndexableFile(it.virtualFile) } - - assertEquals(2, files.size) - assertEquals(setOf(EntityId("IndexProjectAction.java"), EntityId("ProjectIndexingTask.kt")), files.map { it.id }.toSet()) - } - - fun `test file renaming changes the index`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/ProjectIndexingTask.kt", "java/ScoresFileManager.java") - assertEquals(3, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("ProjectIndexingTask.kt", "IndexProjectAction.java"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("ScoresFileManager.java"), neighbours) - - WriteCommandAction.runWriteCommandAction(project) { - myFixture.editor.virtualFile.rename(this, "ScoresFileHandler.java") - } - - TimeoutUtil.sleep(2000) // wait for two seconds for index update - - neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.filterByModel() - assertEquals(setOf("ProjectIndexingTask.kt"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.filterByModel() - assertEquals(setOf("ScoresFileManager.java", "ScoresFileHandler.java"), neighbours) - } - - fun `test file removal changes the index`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/ProjectIndexingTask.kt", "java/ScoresFileManager.java") - assertEquals(3, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("IndexProjectAction.java", "ProjectIndexingTask.kt"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("ScoresFileManager.java"), neighbours) - - WriteCommandAction.runWriteCommandAction(project) { - myFixture.editor.virtualFile.deleteRecursively() // deletes the currently open file: java/IndexProjectAction.java - } - - TimeoutUtil.sleep(2000) // wait for two seconds for index update - - neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.filterByModel() - assertEquals(setOf("ProjectIndexingTask.kt"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.filterByModel() - assertEquals(setOf("ScoresFileManager.java"), neighbours) - } - - fun `test file creation changes the index`() = runTest { - setupTest("java/IndexProjectAction.java", "java/ScoresFileManager.java") - assertEquals(2, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("IndexProjectAction.java"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("ScoresFileManager.java"), neighbours) - - val fileStream = Path.of(testDataPath, "kotlin/ProjectIndexingTask.kt").inputStream() - myFixture.configureByText("ProjectIndexingTask.kt", fileStream.bufferedReader().use(BufferedReader::readText)) - - TimeoutUtil.sleep(2000) // wait for two seconds for index update - - assertEquals(3, storageWrapper.getStorageStats(project).size) - - neighbours = storageWrapper.search(project, "index project job", 10, 0.5f).map { it.id }.filterByModel() - assertEquals(setOf("IndexProjectAction.java", "ProjectIndexingTask.kt"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.filterByModel() - assertEquals(setOf("ScoresFileManager.java"), neighbours) - } - - private suspend fun Iterable.filterByModel(): Set { - return filter { - smartReadAction(project) { - model.getElementsByName(it, false, it).any { element -> - (element as PsiElement).isValid - } - } - }.toSet() - } - - private suspend fun setupTest(vararg filePaths: String) { - myFixture.configureByFiles(*filePaths) - SearchEverywhereSemanticSettings.getInstance().enabledInFilesTab = true - storageWrapper.clearStorage(project) - FileBasedEmbeddingIndexer.getInstance().prepareForSearch(project).join() - } -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSearchBaseTestCase.kt b/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSearchBaseTestCase.kt deleted file mode 100644 index 36d0cc8a3b4e..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSearchBaseTestCase.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.intellij.searchEverywhereMl.semantics.tests - -import com.intellij.openapi.actionSystem.ActionPlaces -import com.intellij.openapi.actionSystem.ActionUiKind -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.impl.SimpleDataContext -import com.intellij.openapi.application.PluginPathManager -import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase - -abstract class SemanticSearchBaseTestCase : LightJavaCodeInsightFixtureTestCase() { - override fun getTestDataPath() = PluginPathManager - .getPluginHome("search-everywhere-ml").resolve("semantics/tests/testData").toString() - // .getPluginHome("llm").resolve("embeddings/searchEverywhere/tests/testData").toString() - - protected fun createEvent(): AnActionEvent { - return AnActionEvent.createEvent(SimpleDataContext.getProjectContext(project), null, ActionPlaces.UNKNOWN, ActionUiKind.NONE, null) - } - - override fun runInDispatchThread(): Boolean = false -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSearchTestUtils.kt b/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSearchTestUtils.kt deleted file mode 100644 index 30632ed8c561..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSearchTestUtils.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.intellij.searchEverywhereMl.semantics.tests - -import com.intellij.ide.actions.searcheverywhere.PSIPresentationBgRendererWrapper -import com.intellij.ide.actions.searcheverywhere.PsiItemWithSimilarity -import com.intellij.openapi.application.EDT -import com.intellij.psi.PsiElement -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.future.asDeferred -import kotlinx.coroutines.runBlocking -import java.util.concurrent.CompletionStage -import java.util.concurrent.Future - - -fun extractPsiElement(element: PsiItemWithSimilarity<*>): PsiElement? { - return when (val value = element.value) { - is PSIPresentationBgRendererWrapper.PsiItemWithPresentation -> value.item - is PsiElement -> value - else -> null - } -} - -fun runOnEdt(f: () -> Future): Deferred { - val future = runBlocking(Dispatchers.EDT) { f() } - return (future as CompletionStage).asDeferred() -} diff --git a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSymbolSearchTest.kt b/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSymbolSearchTest.kt deleted file mode 100644 index 59db7b9ac3fb..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/test/com/intellij/searchEverywhereMl/semantics/tests/SemanticSymbolSearchTest.kt +++ /dev/null @@ -1,145 +0,0 @@ -package com.intellij.searchEverywhereMl.semantics.tests - -import com.intellij.ide.actions.searcheverywhere.PsiItemWithSimilarity -import com.intellij.ide.actions.searcheverywhere.SearchEverywhereUI -import com.intellij.ide.util.gotoByName.GotoSymbolModel2 -import com.intellij.openapi.application.EDT -import com.intellij.openapi.application.readAction -import com.intellij.openapi.application.smartReadAction -import com.intellij.openapi.command.WriteCommandAction -import com.intellij.openapi.util.Disposer -import com.intellij.ml.llm.embeddings.core.indexer.FileBasedEmbeddingIndexer -import com.intellij.ml.llm.embeddings.core.indexer.IndexId -import com.intellij.ml.llm.embeddings.core.indexer.configuration.EmbeddingsConfiguration -import com.intellij.ml.llm.embeddings.core.indexer.entities.IndexableClass -import com.intellij.ml.llm.embeddings.core.jvm.indices.EntityId -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod -import com.intellij.ml.llm.embeddings.searchEverywhere.contributors.SemanticSymbolSearchEverywhereContributor -import com.intellij.ml.llm.embeddings.searchEverywhere.settings.SearchEverywhereSemanticSettings -import com.intellij.testFramework.utils.editor.commitToPsi -import com.intellij.testFramework.utils.editor.saveToDisk -import com.intellij.testFramework.utils.vfs.deleteRecursively -import com.intellij.util.TimeoutUtil -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.test.runTest -import org.jetbrains.kotlin.psi.KtFunction -import kotlin.time.Duration.Companion.seconds - - -class SemanticSymbolSearchTest : SemanticSearchBaseTestCase() { - private val storageWrapper - get() = EmbeddingsConfiguration.getStorageManagerWrapper(IndexId.SYMBOLS) - - private val model - get() = GotoSymbolModel2(project, testRootDisposable) - - fun `test basic semantics`() = runTest { - setupTest("java/ProjectIndexingTask.java", "kotlin/ScoresFileManager.kt") - assertEquals(5, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "begin indexing", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("startIndexing", "ProjectIndexingTask"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("handleScoresFile", "clearFileWithScores"), neighbours) - } - - fun `test index ids are not duplicated`() = runTest { - setupTest("java/IndexProjectAction.java", "kotlin/IndexProjectAction.kt") - assertEquals(1, storageWrapper.getStorageStats(project).size) - } - - fun `test search everywhere contributor`() = runTest( - timeout = 45.seconds // increased timeout because of a bug in symbol index - ) { - setupTest("java/ProjectIndexingTask.java", "kotlin/ScoresFileManager.kt") - - val contributor = readAction { SemanticSymbolSearchEverywhereContributor(createEvent()) } - Disposer.register(project, contributor) - val searchEverywhereUI = runBlocking(Dispatchers.EDT) { SearchEverywhereUI(project, listOf(contributor), { _ -> null }, null) } - Disposer.register(project, searchEverywhereUI) - - val elements = runOnEdt { searchEverywhereUI.findElementsForPattern("begin indexing") }.await() - - val items: List = elements.filterIsInstance>().mapNotNull { extractPsiElement(it) } - assertEquals(2, items.size) - - val methods = items.filterIsInstance().map { IndexableClass(EntityId(it.name)) } + - items.filterIsInstance().map { IndexableClass(EntityId(it.name ?: "")) } + - items.filterIsInstance().map { - IndexableClass(EntityId(it.name ?: "")) - } // we might have constructors in the results - assertEquals(2, methods.size) - assertEquals(setOf(EntityId("ProjectIndexingTask"), EntityId("startIndexing")), methods.map { it.id }.toSet()) - } - - fun `test method renaming changes the index`() = runTest { - setupTest("java/ProjectIndexingTask.java", "kotlin/ScoresFileManager.kt") - assertEquals(5, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "begin indexing", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("ProjectIndexingTask", "startIndexing"), neighbours) - - neighbours = storageWrapper.search(project, "helicopter purchase", 10, 0.5f).map { it.id }.toSet() - assertEquals(emptySet(), neighbours) - - val nameToReplace = "startIndexing" - val startOffset = myFixture.editor.document.text.indexOf(nameToReplace) - WriteCommandAction.runWriteCommandAction(project) { - myFixture.editor.document.replaceString(startOffset, startOffset + nameToReplace.length, "buyHelicopter") - myFixture.editor.document.saveToDisk() // This is how we trigger reindexing - myFixture.editor.document.commitToPsi(project) - } - - TimeoutUtil.sleep(2000) // wait for two seconds for index update - - neighbours = storageWrapper.search(project, "begin indexing", 10, 0.5f).map{ it.id }.filterByModel() - assertEquals(setOf("ProjectIndexingTask"), neighbours) - - neighbours = storageWrapper.search(project, "helicopter purchase", 10, 0.5f).map{ it.id }.filterByModel() - assertEquals(setOf("buyHelicopter"), neighbours) - } - - fun `test removal of file with method changes the index`() = runTest { - setupTest("java/ProjectIndexingTask.java", "kotlin/ScoresFileManager.kt") - assertEquals(5, storageWrapper.getStorageStats(project).size) - - var neighbours = storageWrapper.search(project, "begin indexing", 10, 0.5f).map { it.id }.toSet() - assertEquals(setOf("startIndexing", "ProjectIndexingTask"), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.toSet() - assertEquals(setOf("handleScoresFile", "clearFileWithScores"), neighbours) - - WriteCommandAction.runWriteCommandAction(project) { - myFixture.editor.virtualFile.deleteRecursively() // deletes the currently open file: java/ProjectIndexingTask.java - } - - TimeoutUtil.sleep(2000) // wait for two seconds for index update - - neighbours = storageWrapper.search(project, "begin indexing", 10, 0.5f).map { it.id }.filterByModel() - assertEquals(emptySet(), neighbours) - - neighbours = storageWrapper.search(project, "handle file with scores", 10, 0.4f).map { it.id }.filterByModel() - assertEquals(setOf("handleScoresFile", "clearFileWithScores"), neighbours) - } - - private suspend fun Iterable.filterByModel(): Set { - return filter { - smartReadAction(project) { - model.getElementsByName(it, false, it).any { element -> - (element as PsiElement).isValid - } - } - }.toSet() - } - - private suspend fun setupTest(vararg filePaths: String) { - myFixture.configureByFiles(*filePaths) - SearchEverywhereSemanticSettings.getInstance().enabledInSymbolsTab = true - storageWrapper.clearStorage(project) - FileBasedEmbeddingIndexer.getInstance().prepareForSearch(project).join() - } -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/testData/java/IndexProjectAction.java b/plugins/search-everywhere-ml/semantics/tests/testData/java/IndexProjectAction.java deleted file mode 100644 index 740621d41a2c..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/testData/java/IndexProjectAction.java +++ /dev/null @@ -1,6 +0,0 @@ -public class IndexProjectAction { - private boolean isIndexed = false; - void run() { - isIndexed = true; - } -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/testData/java/ProjectIndexingTask.java b/plugins/search-everywhere-ml/semantics/tests/testData/java/ProjectIndexingTask.java deleted file mode 100644 index 8e306f2482d9..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/testData/java/ProjectIndexingTask.java +++ /dev/null @@ -1,19 +0,0 @@ -import java.lang.Thread; - -public class ProjectIndexingTask { - private final String project; - - public ProjectIndexingTask(String project) { - this.project = project; - } - - private static String taskTitle = "Collecting project files..."; - - public static void startIndexing(long timeout) throws InterruptedException { - Thread.sleep(timeout); - } - - private void getUsedMemory() { - System.out.println("too much"); - } -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/testData/java/ScoresFileManager.java b/plugins/search-everywhere-ml/semantics/tests/testData/java/ScoresFileManager.java deleted file mode 100644 index c25de29b4aeb..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/testData/java/ScoresFileManager.java +++ /dev/null @@ -1,11 +0,0 @@ -import java.io.*; - -public class ScoresFileManager { - public void handleScoresFile() { - integer count = 0 - for (int i = 0; i < 10; i++) { - System.out.println("score: " + count); - count++; - } - } -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/IndexProjectAction.kt b/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/IndexProjectAction.kt deleted file mode 100644 index 36cb0cae7b0a..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/IndexProjectAction.kt +++ /dev/null @@ -1,6 +0,0 @@ -class IndexProjectAction { - private var isIndexed = false - fun run() { - isIndexed = true - } -} \ No newline at end of file diff --git a/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/ProjectIndexingTask.kt b/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/ProjectIndexingTask.kt deleted file mode 100644 index 9fddd38b8031..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/ProjectIndexingTask.kt +++ /dev/null @@ -1,16 +0,0 @@ -private const val MB = 1024 * 1024 - -class ProjectIndexingTask(project: String) { - companion object { - private const val taskTitle = "Collecting project files..." - - fun startIndexing(timeout: Int) { - Thread.sleep(timeout.toLong()) - } - } - - private fun getUsedMemory(): Long { - val runtime = Runtime.getRuntime() - return (runtime.totalMemory() - runtime.freeMemory()) / MB - } -} diff --git a/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/ScoresFileManager.kt b/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/ScoresFileManager.kt deleted file mode 100644 index e6b4337a69ff..000000000000 --- a/plugins/search-everywhere-ml/semantics/tests/testData/kotlin/ScoresFileManager.kt +++ /dev/null @@ -1,15 +0,0 @@ -class ScoresFileManager { - fun handleScoresFile() { - var count = 0 - repeat(10) { - println("score: $count") - count++ - } - } - - companion object { - fun clearFileWithScores(file: String) { - println("cleared") - } - } -}