diff --git a/platform/workspaceModel-core-tests/test/com/intellij/workspace/api/pstorage/VirtualFileIndexTest.kt b/platform/workspaceModel-core-tests/test/com/intellij/workspace/api/pstorage/VirtualFileIndexTest.kt index 9f9f2f510d0a..67bdd08ab804 100644 --- a/platform/workspaceModel-core-tests/test/com/intellij/workspace/api/pstorage/VirtualFileIndexTest.kt +++ b/platform/workspaceModel-core-tests/test/com/intellij/workspace/api/pstorage/VirtualFileIndexTest.kt @@ -1,10 +1,7 @@ // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.workspace.api.pstorage -import com.intellij.workspace.api.EntitySource -import com.intellij.workspace.api.TypedEntityStorageBuilder -import com.intellij.workspace.api.VirtualFileUrl -import com.intellij.workspace.api.VirtualFileUrlManager +import com.intellij.idea.Bombed import com.intellij.workspace.api.* import com.intellij.workspace.api.pstorage.indices.VirtualFileUrlListProperty import com.intellij.workspace.api.pstorage.indices.VirtualFileUrlNullableProperty @@ -12,6 +9,7 @@ import com.intellij.workspace.api.pstorage.indices.VirtualFileUrlProperty import org.junit.Assert.* import org.junit.Before import org.junit.Test +import java.util.* internal class PVFUEntityData : PEntityData() { lateinit var data: String @@ -21,6 +19,15 @@ internal class PVFUEntityData : PEntityData() { } } +internal class PVFUWithTwoPropertiesEntityData : PEntityData() { + lateinit var data: String + lateinit var fileProperty: VirtualFileUrl + lateinit var secondFileProperty: VirtualFileUrl + override fun createEntity(snapshot: TypedEntityStorage): PVFUWithTwoPropertiesEntity { + return PVFUWithTwoPropertiesEntity(data, fileProperty, secondFileProperty).also { addMetaData(it, snapshot) } + } +} + internal class PNullableVFUEntityData : PEntityData() { lateinit var data: String var fileProperty: VirtualFileUrl? = null @@ -38,6 +45,7 @@ internal class PListVFUEntityData : PEntityData() { } internal class PVFUEntity(val data: String, val fileProperty: VirtualFileUrl) : PTypedEntity() +internal class PVFUWithTwoPropertiesEntity(val data: String, val fileProperty: VirtualFileUrl, val secondFileProperty: VirtualFileUrl) : PTypedEntity() internal class PNullableVFUEntity(val data: String, val fileProperty: VirtualFileUrl?) : PTypedEntity() internal class PListVFUEntity(val data: String, val fileProperty: List) : PTypedEntity() @@ -46,6 +54,12 @@ internal class ModifiablePVFUEntity : PModifiableTypedEntity() { var fileProperty: VirtualFileUrl by VirtualFileUrlProperty() } +internal class ModifiablePVFUWithTwoPropertiesEntity : PModifiableTypedEntity() { + var data: String by EntityDataDelegation() + var fileProperty: VirtualFileUrl by VirtualFileUrlProperty() + var secondFileProperty: VirtualFileUrl by VirtualFileUrlProperty() +} + internal class ModifiablePNullableVFUEntity : PModifiableTypedEntity() { var data: String by EntityDataDelegation() var fileProperty: VirtualFileUrl? by VirtualFileUrlNullableProperty() @@ -66,6 +80,18 @@ internal fun TypedEntityStorageBuilder.addPVFUEntity(data: String, } } +internal fun TypedEntityStorageBuilder.addPVFU2Entity(data: String, + fileUrl: String, + secondFileUrl: String, + virtualFileManager: VirtualFileUrlManager, + source: EntitySource = PSampleEntitySource("test")): PVFUWithTwoPropertiesEntity { + return addEntity(ModifiablePVFUWithTwoPropertiesEntity::class.java, source) { + this.data = data + this.fileProperty = virtualFileManager.fromUrl(fileUrl) + this.secondFileProperty = virtualFileManager.fromUrl(secondFileUrl) + } +} + internal fun TypedEntityStorageBuilder.addPNullableVFUEntity(data: String, fileUrl: String?, virtualFileManager: VirtualFileUrlManager, @@ -102,6 +128,25 @@ class VirtualFileIndexTest { assertEquals(entity.fileProperty, builder.indexes.virtualFileIndex.getVirtualFiles(entity.id)?.first()) } + @Test + fun `change virtual file url`() { + val fileUrl = "/user/opt/app/a.txt" + val fileUrl2 = "/user/opt/app/b.txt" + val fileUrl3 = "/user/opt/app/c.txt" + val builder = PEntityStorageBuilder.create() + val entity = builder.addPVFUEntity("hello", fileUrl, virtualFileManager) + assertEquals(fileUrl, entity.fileProperty.url) + + val modifiedEntity = builder.modifyEntity(ModifiablePVFUEntity::class.java, entity) { + this.fileProperty = virtualFileManager.fromUrl(fileUrl2) + this.fileProperty = virtualFileManager.fromUrl(fileUrl3) + } + assertEquals(fileUrl3, modifiedEntity.fileProperty.url) + val virtualFiles = builder.indexes.virtualFileIndex.getVirtualFiles(modifiedEntity.id) ?: error("") + assertEquals(1, virtualFiles.size) + assertEquals(modifiedEntity.fileProperty, virtualFiles.first()) + } + @Test fun `add entity with nullable vfu`() { val builder = PEntityStorageBuilder.create() @@ -110,6 +155,22 @@ class VirtualFileIndexTest { assertTrue(builder.indexes.virtualFileIndex.getVirtualFiles(entity.id)?.isEmpty() ?: false) } + @Test + @Bombed(year = 2020, month = Calendar.JUNE, day = 20, user = "Mikhail Mazurkevich") + fun `add entity with two properties`() { + val fileUrl = "/user/opt/app/a.txt" + val secondUrl = "/user/opt/app/b.txt" + val builder = PEntityStorageBuilder.create() + val entity = builder.addPVFU2Entity("hello", fileUrl, secondUrl, virtualFileManager) + assertEquals(fileUrl, entity.fileProperty.url) + assertEquals(secondUrl, entity.secondFileProperty.url) + + val virtualFiles = builder.indexes.virtualFileIndex.getVirtualFiles(entity.id) ?: error("") + assertEquals(2, virtualFiles.size) + assertEquals(entity.fileProperty, virtualFiles.first()) + assertEquals(entity.secondFileProperty, virtualFiles.last()) + } + @Test fun `add entity with vfu list`() { val fileUrlList = listOf("/user/a.txt", "/user/opt/app/a.txt", "/user/opt/app/b.txt")