diff --git a/src/main/scala/org/camunda/feel/impl/parser/FeelParser.scala b/src/main/scala/org/camunda/feel/impl/parser/FeelParser.scala index 144a94a7b..4086fa208 100644 --- a/src/main/scala/org/camunda/feel/impl/parser/FeelParser.scala +++ b/src/main/scala/org/camunda/feel/impl/parser/FeelParser.scala @@ -694,22 +694,16 @@ object FeelParser { }.getOrElse(ConstNull) } - // replace escaped character with the provided replacement private def translateEscapes(input: String): String = { - val escapeMap = Map( - "\\b" -> "\b", - "\\t" -> "\t", - "\\n" -> "\n", - "\\f" -> "\f", - "\\r" -> "\r", - "\\\"" -> "\"", - "\\'" -> "'", - "\\s" -> " " - // Add more escape sequences as needed - ) - - escapeMap.foldLeft(input) { case (result, (escape, replacement)) => - result.replace(escape, replacement) - } + // replace all escape sequences + input + .replaceAll("(? "Hello\nWorld")) should returnResult("Hello\nWorld") + private val escapeSequences = Table( + ("Character", "Expected", "Display name"), + ('\n', '\n', "new line"), + ('\r', '\r', "carriage return"), + ('\t', '\t', "tab"), + ('\b', '\b', "backspace"), + ('\f', '\f', "form feed"), + ('\'', '\'', "single quote"), + ("\\\"", '"', "double quote"), + ("\\\\", '\\', "backslash") + ) - evaluateExpression(""" "Hello\rWorld" """) should returnResult("Hello\rWorld") - evaluateExpression(" x ", Map("x" -> "Hello\rWorld")) should returnResult("Hello\rWorld") + it should "contains an escape sequence" in { + forEvery(escapeSequences) { (character, expected, _) => + val expectedString = s"a $expected b" - evaluateExpression(""" "Hello\'World" """) should returnResult("Hello\'World") - evaluateExpression(" x ", Map("x" -> "Hello\'World")) should returnResult("Hello\'World") + evaluateExpression(s" \"a $character b\" ") should returnResult(expectedString) + evaluateExpression("char", Map("char" -> expectedString)) should returnResult(expectedString) + } + } - evaluateExpression(""" "Hello\tWorld" """) should returnResult("Hello\tWorld") - evaluateExpression(" x ", Map("x" -> "Hello\tWorld")) should returnResult("Hello\tWorld") + private val unicodeCharacters = Table( + ("Character", "Display name"), + ('\u269D', "\\u269D"), + ("\\U101EF", "\\U101EF") + ) - evaluateExpression(""" "Hello\"World" """) should returnResult("Hello\"World") - evaluateExpression(" x ", Map("x" -> "Hello\"World")) should returnResult("Hello\"World") + it should "contains unicode characters" in { + forEvery(unicodeCharacters) { (character, _) => + evaluateExpression(s" \"a $character b\" ") should returnResult(s"a $character b") + } } - List( - " \' ", - " \\ ", - " \n ", - " \r ", - " \t ", - """ \u269D """, - """ \U101EF """ + private val regexCharacters = Table( + ("Character", "Display name"), + ("\\s", "\\s"), + ("\\S", "\\S"), + ("\\d", "\\d"), + ("\\w", "\\w"), + ("\\R", "\\R"), + ("\\h", "\\h"), + ("\\v", "\\v"), + ("\\\n", "\\n"), + ("\\\r", "\\r") ) - .foreach { notEscapeChar => - it should s"contains a not escape sequence ($notEscapeChar)" in { - evaluateExpression(s""" "a $notEscapeChar b" """) should returnResult( - s"""a $notEscapeChar b""" - ) - } + it should "contains a regex character" in { + forEvery(regexCharacters) { (character, _) => + val expectedString = s"a $character b" + + evaluateExpression(s" \"a $character b\" ") should returnResult(expectedString) + evaluateExpression("char", Map("char" -> expectedString)) should returnResult(expectedString) } + } }