diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/block/reworked/TerminalOutputModelImpl.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/block/reworked/TerminalOutputModelImpl.kt index 30d95c54b1b0..90e8940c7e7d 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/block/reworked/TerminalOutputModelImpl.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/block/reworked/TerminalOutputModelImpl.kt @@ -13,6 +13,7 @@ import org.jetbrains.plugins.terminal.block.output.TerminalOutputHighlightingsSn import org.jetbrains.plugins.terminal.block.output.TextStyleAdapter import org.jetbrains.plugins.terminal.block.session.StyleRange import org.jetbrains.plugins.terminal.block.ui.BlockTerminalColorPalette +import kotlin.math.max /** * [maxOutputLength] limits the length of the document. Zero means unlimited length. @@ -92,7 +93,7 @@ internal class TerminalOutputModelImpl( val trimmedCount = trimToSize() - return replaceStartOffset - trimmedCount + return max(0, replaceStartOffset - trimmedCount) } /** Returns trimmed characters count */ diff --git a/plugins/terminal/tests/org/jetbrains/plugins/terminal/reworked/TerminalOutputModelTest.kt b/plugins/terminal/tests/org/jetbrains/plugins/terminal/reworked/TerminalOutputModelTest.kt index f8573e8fb329..041abf741380 100644 --- a/plugins/terminal/tests/org/jetbrains/plugins/terminal/reworked/TerminalOutputModelTest.kt +++ b/plugins/terminal/tests/org/jetbrains/plugins/terminal/reworked/TerminalOutputModelTest.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.runBlocking import org.jetbrains.plugins.terminal.block.output.HighlightingInfo import org.jetbrains.plugins.terminal.block.output.TerminalOutputHighlightingsSnapshot import org.jetbrains.plugins.terminal.block.output.TextStyleAdapter +import org.jetbrains.plugins.terminal.block.reworked.TerminalOutputModelListener import org.jetbrains.plugins.terminal.block.session.StyleRange import org.jetbrains.plugins.terminal.block.ui.BlockTerminalColorPalette import org.jetbrains.plugins.terminal.reworked.util.TerminalSessionTestUtil @@ -140,6 +141,38 @@ internal class TerminalOutputModelTest : BasePlatformTestCase() { assertEquals(expectedHighlightingsSnapshot, model.getHighlightings()) } + @Test + fun `update exceeds maxCapacity`() = runBlocking(Dispatchers.EDT) { + val model = TerminalSessionTestUtil.createOutputModel(maxLength = 10) + val startOffsets = mutableListOf() + model.addListener(testRootDisposable, object: TerminalOutputModelListener { + override fun afterContentChanged(startOffset: Int) { + startOffsets.add(startOffset) + } + }) + + model.update(0, """ + abcdef + ghijkl + """.trimIndent(), emptyList()) + + assertEquals(""" + def + ghijkl + """.trimIndent(), model.document.text) + + model.update(1, """ + mnopqrs + tuvwxyz + """.trimIndent(), emptyList()) + + assertEquals(""" + rs + tuvwxyz + """.trimIndent(), model.document.text) + assertEquals(listOf(0, 0), startOffsets) + } + @Test fun `update editor content from the start when some lines were trimmed already (clear)`() = runBlocking(Dispatchers.EDT) { val model = TerminalSessionTestUtil.createOutputModel(maxLength = 10)