summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2023-07-31 13:34:22 -0400
committerTakashi Kokubun <takashikkbn@gmail.com>2023-08-16 17:47:32 -0700
commitf1658efe38347ec90c87c64dcee4f8e4656aa388 (patch)
treebb5d178a592964e6bd0811d0329414be61df92b1 /test
parent41e8ba01ae644d10e6aebc832fc616e1af8e7159 (diff)
[ruby/yarp] Split out newline test
https://github.com/ruby/yarp/commit/eeb4f6cb9d
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/8226
Diffstat (limited to 'test')
-rw-r--r--test/newline_test.rb77
1 files changed, 77 insertions, 0 deletions
diff --git a/test/newline_test.rb b/test/newline_test.rb
new file mode 100644
index 0000000000..09d0c09e5b
--- /dev/null
+++ b/test/newline_test.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require "yarp_test_helper"
+
+class NewlineTest < Test::Unit::TestCase
+ class NewlineVisitor < YARP::Visitor
+ attr_reader :source, :newlines
+
+ def initialize(source)
+ @source = source
+ @newlines = []
+ end
+
+ def visit(node)
+ newlines << source.line(node.location.start_offset) if node&.newline?
+ super(node)
+ end
+ end
+
+ root = File.dirname(__dir__)
+ Dir["{lib,test}/**/*.rb", base: root].each do |relative|
+ filepath = File.join(root, relative)
+
+ define_method "test_newline_flags_#{relative}" do
+ source = File.read(filepath, binmode: true, external_encoding: Encoding::UTF_8)
+ expected = rubyvm_lines(source)
+
+ result = YARP.parse(source, relative)
+ assert_empty result.errors
+
+ result.mark_newlines
+ visitor = NewlineVisitor.new(result.source)
+ result.value.accept(visitor)
+ actual = visitor.newlines
+
+ if relative == "lib/yarp/serialize.rb"
+ # while (b = io.getbyte) >= 128 has 2 newline flags
+ expected.delete_at actual.index(62)
+ elsif relative == "lib/yarp/lex_compat.rb"
+ # extra flag for: dedent_next =\n ((token.event: due to bytecode order
+ actual.delete(514)
+ # different line for: token =\n case event: due to bytecode order
+ actual.delete(571)
+ expected.delete(572)
+ # extra flag for: lex_state =\n if RIPPER: due to bytecode order
+ actual.delete(604)
+ # extra flag for: (token[2].start_with?("\#$") || token[2].start_with?("\#@"))
+ # unclear when ParenthesesNode should allow a second flag on the same line or not
+ actual.delete(731)
+ end
+
+ assert_equal expected, actual
+ end
+ end
+
+ private
+
+ def ignore_warnings
+ previous_verbosity = $VERBOSE
+ $VERBOSE = nil
+ yield
+ ensure
+ $VERBOSE = previous_verbosity
+ end
+
+ def rubyvm_lines(source)
+ queue = [ignore_warnings { RubyVM::InstructionSequence.compile(source) }]
+ lines = []
+
+ while iseq = queue.shift
+ lines.concat(iseq.trace_points.filter_map { |line, event| line if event == :line })
+ iseq.each_child { |insn| queue << insn unless insn.label.start_with?("ensure in ") }
+ end
+
+ lines.sort
+ end
+end