diff --git a/src/main/resources/messages/IdeaVimBundle.properties b/src/main/resources/messages/IdeaVimBundle.properties index 92ca2490b..054ef52d8 100644 --- a/src/main/resources/messages/IdeaVimBundle.properties +++ b/src/main/resources/messages/IdeaVimBundle.properties @@ -67,6 +67,7 @@ E363=E363: pattern caused out-of-stack error E369=E369: invalid item in {0}%[] E384=E384: Search hit TOP without match for: {0} E385=E385: Search hit BOTTOM without match for: {0} +E418=E418: I am a teapot E471=E471: Argument required E474=E474: Invalid argument: {0} E475=E475: Invalid argument: {0} @@ -77,6 +78,7 @@ E488=E488: Trailing characters: {0} # Vim's message includes alternate files and the :p:h file name modifier, which we don't support # E499: Empty file name for '%' or '#', only works with ":p:h" E499=E499: Empty file name for '%' +E503=E503: Coffee is currently not available E518=E518: Unknown option: {0} E521=E521: Number required after =: {0} E545=E545: Missing colon: {0} diff --git a/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/variousFunctions/ErrTeapotFunctionTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/variousFunctions/ErrTeapotFunctionTest.kt new file mode 100644 index 000000000..ed68c65b5 --- /dev/null +++ b/src/test/java/org/jetbrains/plugins/ideavim/ex/implementation/functions/variousFunctions/ErrTeapotFunctionTest.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2003-2025 The IdeaVim authors + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE.txt file or at + * https://opensource.org/licenses/MIT. + */ + +package org.jetbrains.plugins.ideavim.ex.implementation.functions.variousFunctions + +import org.jetbrains.plugins.ideavim.VimTestCase +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInfo + +class ErrTeapotFunctionTest : VimTestCase() { + @BeforeEach + override fun setUp(testInfo: TestInfo) { + super.setUp(testInfo) + configureByText("\n") + } + + @Test + fun `test err_teapot`() { + enterCommand("echo err_teapot()") + assertPluginError(true) + assertPluginErrorMessageContains("E418: I am a teapot") + } + + @Test + fun `test err_teapot with boolean false argument`() { + enterCommand("echo err_teapot(0)") + assertPluginError(true) + assertPluginErrorMessageContains("E418: I am a teapot") + } + + @Test + fun `test err_teapot with boolean true argument`() { + enterCommand("echo err_teapot(1)") + assertPluginError(true) + assertPluginErrorMessageContains("E503: Coffee is currently not available") + } + + @Test + fun `test err_teapot with false string argument`() { + enterCommand("echo err_teapot(\"0\")") + assertPluginError(true) + assertPluginErrorMessageContains("E418: I am a teapot") + } + + @Test + fun `test err_teapot with true string argument`() { + enterCommand("echo err_teapot(\"1\")") + assertPluginError(true) + assertPluginErrorMessageContains("E503: Coffee is currently not available") + } + + @Test + fun `test err_teapot with list argument`() { + enterCommand("echo err_teapot([0])") + assertPluginError(true) + assertPluginErrorMessageContains("E745: Using a List as a Number") + } + + @Test + fun `test err_teapot with dictionary argument`() { + enterCommand("echo err_teapot({1: 0})") + assertPluginError(true) + assertPluginErrorMessageContains("E728: Using a Dictionary as a Number") + } +} diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/variousFunctions/ErrTeapotFunctionHandler.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/variousFunctions/ErrTeapotFunctionHandler.kt new file mode 100644 index 000000000..b810ba839 --- /dev/null +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/variousFunctions/ErrTeapotFunctionHandler.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2003-2025 The IdeaVim authors + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE.txt file or at + * https://opensource.org/licenses/MIT. + */ + +package com.maddyhome.idea.vim.vimscript.model.functions.handlers.variousFunctions + +import com.intellij.vim.annotations.VimscriptFunction +import com.maddyhome.idea.vim.api.ExecutionContext +import com.maddyhome.idea.vim.api.VimEditor +import com.maddyhome.idea.vim.ex.exExceptionMessage +import com.maddyhome.idea.vim.vimscript.model.VimLContext +import com.maddyhome.idea.vim.vimscript.model.datatypes.VimDataType +import com.maddyhome.idea.vim.vimscript.model.expressions.Expression +import com.maddyhome.idea.vim.vimscript.model.functions.FunctionHandler + +@VimscriptFunction(name = "err_teapot") +class ErrTeapotFunctionHandler : FunctionHandler() { + override val minimumNumberOfArguments = 0 + override val maximumNumberOfArguments: Int? = 1 + + override fun doFunction( + argumentValues: List<Expression>, + editor: VimEditor, + context: ExecutionContext, + vimContext: VimLContext, + ): VimDataType { + val arg1 = argumentValues.getOrNull(0)?.evaluate(editor, context, vimContext)?.asBoolean() ?: false + if (arg1) { + throw exExceptionMessage("E503") + } + else { + throw exExceptionMessage("E418") + } + } +} diff --git a/vim-engine/src/main/resources/ksp-generated/engine_vimscript_functions.json b/vim-engine/src/main/resources/ksp-generated/engine_vimscript_functions.json index ea8284eaa..a6c7c023d 100644 --- a/vim-engine/src/main/resources/ksp-generated/engine_vimscript_functions.json +++ b/vim-engine/src/main/resources/ksp-generated/engine_vimscript_functions.json @@ -10,6 +10,7 @@ "cos": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.floatFunctions.CosFunctionHandler", "cosh": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.floatFunctions.CoshFunctionHandler", "empty": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.EmptyFunctionHandler", + "err_teapot": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.variousFunctions.ErrTeapotFunctionHandler", "escape": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.stringFunctions.EscapeFunctionHandler", "exists": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.variousFunctions.ExistsFunctionHandler", "exp": "com.maddyhome.idea.vim.vimscript.model.functions.handlers.floatFunctions.ExpFunctionHandler",