aboutsummaryrefslogtreecommitdiffstats
path: root/test/prism/unescape_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/prism/unescape_test.rb')
-rw-r--r--test/prism/unescape_test.rb165
1 files changed, 165 insertions, 0 deletions
diff --git a/test/prism/unescape_test.rb b/test/prism/unescape_test.rb
new file mode 100644
index 0000000000..a7d955b315
--- /dev/null
+++ b/test/prism/unescape_test.rb
@@ -0,0 +1,165 @@
+# frozen_string_literal: true
+
+require_relative "test_helper"
+
+return if YARP::BACKEND == :FFI
+
+module YARP
+ class UnescapeNoneTest < TestCase
+ def test_backslash
+ assert_unescape_none("\\")
+ end
+
+ def test_single_quote
+ assert_unescape_none("'")
+ end
+
+ private
+
+ def assert_unescape_none(source)
+ assert_equal(source, Debug.unescape_none(source))
+ end
+ end
+
+ class UnescapeMinimalTest < TestCase
+ def test_backslash
+ assert_unescape_minimal("\\", "\\\\")
+ end
+
+ def test_single_quote
+ assert_unescape_minimal("'", "\\'")
+ end
+
+ def test_single_char
+ assert_unescape_minimal("\\a", "\\a")
+ end
+
+ private
+
+ def assert_unescape_minimal(expected, source)
+ assert_equal(expected, Debug.unescape_minimal(source))
+ end
+ end
+
+ class UnescapeAllTest < TestCase
+ def test_backslash
+ assert_unescape_all("\\", "\\\\")
+ end
+
+ def test_single_quote
+ assert_unescape_all("'", "\\'")
+ end
+
+ def test_single_char
+ assert_unescape_all("\a", "\\a")
+ assert_unescape_all("\b", "\\b")
+ assert_unescape_all("\e", "\\e")
+ assert_unescape_all("\f", "\\f")
+ assert_unescape_all("\n", "\\n")
+ assert_unescape_all("\r", "\\r")
+ assert_unescape_all("\s", "\\s")
+ assert_unescape_all("\t", "\\t")
+ assert_unescape_all("\v", "\\v")
+ end
+
+ def test_octal
+ assert_unescape_all("\a", "\\7")
+ assert_unescape_all("#", "\\43")
+ assert_unescape_all("a", "\\141")
+ end
+
+ def test_hexadecimal
+ assert_unescape_all("\a", "\\x7")
+ assert_unescape_all("#", "\\x23")
+ assert_unescape_all("a", "\\x61")
+ end
+
+ def test_deletes
+ assert_unescape_all("\x7f", "\\c?")
+ assert_unescape_all("\x7f", "\\C-?")
+ end
+
+ def test_unicode_codepoint
+ assert_unescape_all("a", "\\u0061")
+ assert_unescape_all("Ā", "\\u0100", "UTF-8")
+ assert_unescape_all("က", "\\u1000", "UTF-8")
+ assert_unescape_all("တ", "\\u1010", "UTF-8")
+
+ assert_nil(unescape_all("\\uxxxx"))
+ end
+
+ def test_unicode_codepoints
+ assert_unescape_all("a", "\\u{61}")
+ assert_unescape_all("Ā", "\\u{0100}", "UTF-8")
+ assert_unescape_all("က", "\\u{1000}", "UTF-8")
+ assert_unescape_all("တ", "\\u{1010}", "UTF-8")
+ assert_unescape_all("𐀀", "\\u{10000}", "UTF-8")
+ assert_unescape_all("𐀐", "\\u{10010}", "UTF-8")
+ assert_unescape_all("aĀကတ𐀀𐀐", "\\u{ 61\s100\n1000\t1010\r10000\v10010 }", "UTF-8")
+
+ assert_nil(unescape_all("\\u{110000}"))
+ assert_nil(unescape_all("\\u{110000 110001 110002}"))
+ end
+
+ def test_control_characters
+ each_printable do |chr|
+ byte = eval("\"\\c#{chr}\"").bytes.first
+ assert_unescape_all(byte.chr, "\\c#{chr}")
+
+ byte = eval("\"\\C-#{chr}\"").bytes.first
+ assert_unescape_all(byte.chr, "\\C-#{chr}")
+ end
+ end
+
+ def test_meta_characters
+ each_printable do |chr|
+ byte = eval("\"\\M-#{chr}\"").bytes.first
+ assert_unescape_all(byte.chr, "\\M-#{chr}")
+ end
+ end
+
+ def test_meta_control_characters
+ each_printable do |chr|
+ byte = eval("\"\\M-\\c#{chr}\"").bytes.first
+ assert_unescape_all(byte.chr, "\\M-\\c#{chr}")
+
+ byte = eval("\"\\M-\\C-#{chr}\"").bytes.first
+ assert_unescape_all(byte.chr, "\\M-\\C-#{chr}")
+
+ byte = eval("\"\\c\\M-#{chr}\"").bytes.first
+ assert_unescape_all(byte.chr, "\\c\\M-#{chr}")
+ end
+ end
+
+ def test_escaping_normal_characters
+ assert_unescape_all("d", "\\d")
+ assert_unescape_all("g", "\\g")
+ end
+
+ def test_whitespace_escaping_string_list
+ assert_equal("a b", Debug.unescape_whitespace("a\\ b"))
+ assert_equal("a\tb", Debug.unescape_whitespace("a\\\tb"))
+ assert_equal("a\nb", Debug.unescape_whitespace("a\\\nb"))
+ assert_equal("a\nb", Debug.unescape_whitespace("a\\\r\nb"))
+ end
+
+ private
+
+ def unescape_all(source)
+ Debug.unescape_all(source)
+ end
+
+ def assert_unescape_all(expected, source, forced_encoding = nil)
+ result = unescape_all(source)
+ result.force_encoding(forced_encoding) if forced_encoding
+ assert_equal(expected, result)
+ end
+
+ def each_printable
+ (1..127).each do |ord|
+ chr = ord.chr
+ yield chr if chr.match?(/[[:print:]]/) && chr != " " && chr != "\\"
+ end
+ end
+ end
+end