Fix MutableDiagnosticsTest#testCaching()

Sadly relying on implementation details
This commit is contained in:
Pavel V. Talanov
2014-10-13 19:41:49 +04:00
parent df8232c555
commit c1f8db5962
3 changed files with 41 additions and 19 deletions
@@ -26,6 +26,7 @@ import com.intellij.util.containers.ConcurrentWeakValueHashMap;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FilteringIterator; import com.intellij.util.containers.FilteringIterator;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory; import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory;
@@ -298,4 +299,10 @@ public class DiagnosticsWithSuppression implements Diagnostics {
return other instanceof EmptySuppressor; return other instanceof EmptySuppressor;
} }
} }
@TestOnly
@NotNull
public Collection<Diagnostic> getDiagnostics() {
return diagnostics;
}
} }
@@ -22,6 +22,7 @@ import com.intellij.openapi.util.CompositeModificationTracker
import com.intellij.util.CachedValueImpl import com.intellij.util.CachedValueImpl
import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.annotations.TestOnly
public class MutableDiagnosticsWithSuppression( public class MutableDiagnosticsWithSuppression(
private val bindingContext: BindingContext, private val bindingContext: BindingContext,
@@ -56,4 +57,5 @@ public class MutableDiagnosticsWithSuppression(
modificationTracker.incModificationCount() modificationTracker.incModificationCount()
} }
} TestOnly public fun getReadonlyView(): DiagnosticsWithSuppression = readonlyView()
}
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.resolve.lazy.KotlinTestWithEnvironment
import org.jetbrains.jet.config.CompilerConfiguration import org.jetbrains.jet.config.CompilerConfiguration
import org.jetbrains.jet.lang.resolve.BindingTrace import org.jetbrains.jet.lang.resolve.BindingTrace
import org.jetbrains.jet.lang.resolve.Diagnostics import org.jetbrains.jet.lang.resolve.Diagnostics
import org.jetbrains.jet.lang.resolve.MutableDiagnosticsWithSuppression
class MutableDiagnosticsTest : KotlinTestWithEnvironment() { class MutableDiagnosticsTest : KotlinTestWithEnvironment() {
override fun createEnvironment(): JetCoreEnvironment? { override fun createEnvironment(): JetCoreEnvironment? {
@@ -44,7 +45,7 @@ class MutableDiagnosticsTest : KotlinTestWithEnvironment() {
Assert.assertTrue(middle.diagnostics.isEmpty()) Assert.assertTrue(middle.diagnostics.isEmpty())
Assert.assertTrue(derived.diagnostics.isEmpty()) Assert.assertTrue(derived.diagnostics.isEmpty())
middle.report(DummyDiagnostic()) middle.reportDiagnostic()
Assert.assertTrue(base.diagnostics.isEmpty()) Assert.assertTrue(base.diagnostics.isEmpty())
Assert.assertFalse(middle.diagnostics.isEmpty()) Assert.assertFalse(middle.diagnostics.isEmpty())
@@ -63,9 +64,9 @@ class MutableDiagnosticsTest : KotlinTestWithEnvironment() {
Assert.assertTrue(middle.diagnostics.isEmpty()) Assert.assertTrue(middle.diagnostics.isEmpty())
Assert.assertTrue(derived.diagnostics.isEmpty()) Assert.assertTrue(derived.diagnostics.isEmpty())
base.report(DummyDiagnostic()) base.reportDiagnostic()
middle.report(DummyDiagnostic()) middle.reportDiagnostic()
derived.report(DummyDiagnostic()) derived.reportDiagnostic()
Assert.assertEquals(1, base.diagnostics.all().size) Assert.assertEquals(1, base.diagnostics.all().size)
Assert.assertEquals(2, middle.diagnostics.all().size) Assert.assertEquals(2, middle.diagnostics.all().size)
@@ -83,40 +84,52 @@ class MutableDiagnosticsTest : KotlinTestWithEnvironment() {
val middle = DelegatingBindingTrace(base.getBindingContext(), "middle") val middle = DelegatingBindingTrace(base.getBindingContext(), "middle")
val derived = DelegatingBindingTrace(middle.getBindingContext(), "derived") val derived = DelegatingBindingTrace(middle.getBindingContext(), "derived")
base.reportDiagnostic()
middle.reportDiagnostic()
derived.reportDiagnostic()
val cachedBase = base.diagnostics val cachedBase = base.diagnostics
val cachedMiddle = middle.diagnostics val cachedMiddle = middle.diagnostics
val cachedDerived = derived.diagnostics val cachedDerived = derived.diagnostics
val cachedListForBase = cachedBase.all() val cachedListForBase = cachedBase.contents()
val cachedListForMiddle = cachedMiddle.all() val cachedListForMiddle = cachedMiddle.contents()
val cachedListForDerived = cachedDerived.all() val cachedListForDerived = cachedDerived.contents()
Assert.assertSame(cachedListForBase, base.diagnostics.all()) Assert.assertSame(cachedListForBase, base.diagnostics.contents())
Assert.assertSame(cachedListForMiddle, middle.diagnostics.all()) Assert.assertSame(cachedListForMiddle, middle.diagnostics.contents())
Assert.assertSame(cachedListForDerived, derived.diagnostics.all()) Assert.assertSame(cachedListForDerived, derived.diagnostics.contents())
Assert.assertSame(cachedBase, base.diagnostics) Assert.assertSame(cachedBase, base.diagnostics)
Assert.assertSame(cachedMiddle, middle.diagnostics) Assert.assertSame(cachedMiddle, middle.diagnostics)
Assert.assertSame(cachedDerived, derived.diagnostics) Assert.assertSame(cachedDerived, derived.diagnostics)
derived.report(DummyDiagnostic()) derived.reportDiagnostic()
Assert.assertSame(cachedListForBase, base.diagnostics.all()) Assert.assertSame(cachedListForBase, base.diagnostics.contents())
Assert.assertSame(cachedListForMiddle, middle.diagnostics.all()) Assert.assertSame(cachedListForMiddle, middle.diagnostics.contents())
Assert.assertNotSame(cachedListForDerived, derived.diagnostics.all()) Assert.assertNotSame(cachedListForDerived, derived.diagnostics.contents())
Assert.assertSame(cachedBase, base.diagnostics) Assert.assertSame(cachedBase, base.diagnostics)
Assert.assertSame(cachedMiddle, middle.diagnostics) Assert.assertSame(cachedMiddle, middle.diagnostics)
middle.report(DummyDiagnostic()) middle.reportDiagnostic()
Assert.assertSame(cachedListForBase, base.diagnostics.all()) Assert.assertSame(cachedListForBase, base.diagnostics.contents())
Assert.assertNotSame(cachedListForMiddle, middle.diagnostics.all()) Assert.assertNotSame(cachedListForMiddle, middle.diagnostics.contents())
Assert.assertNotSame(cachedListForDerived, derived.diagnostics.all()) Assert.assertNotSame(cachedListForDerived, derived.diagnostics.contents())
Assert.assertSame(cachedBase, base.diagnostics) Assert.assertSame(cachedBase, base.diagnostics)
} }
private fun BindingTrace.reportDiagnostic() {
report(DummyDiagnostic())
}
//NOTE: cannot simply call all() since it applies filter on every query and produces new collection
private fun Diagnostics.contents(): MutableCollection<Diagnostic> {
return (this as MutableDiagnosticsWithSuppression).getReadonlyView().getDiagnostics()
}
private inner class DummyDiagnostic : Diagnostic { private inner class DummyDiagnostic : Diagnostic {
val dummyElement = JetPsiFactory(getEnvironment().getProject()).createType("Int") val dummyElement = JetPsiFactory(getEnvironment().getProject()).createType("Int")