1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
# frozen_string_literal: true
require 'helper'
class TestSourceBuffer < Minitest::Test
def setup
@buffer = Parser::Source::Buffer.new('(string)')
end
def test_initialize
buffer = Parser::Source::Buffer.new(nil)
assert_equal '', buffer.name
buffer = Parser::Source::Buffer.new(Pathname('a/b'))
assert_equal 'a/b', buffer.name
buffer = Parser::Source::Buffer.new('(string)')
assert_equal '(string)', buffer.name
assert_equal 1, buffer.first_line
buffer = Parser::Source::Buffer.new('(string)', 5)
assert_equal 5, buffer.first_line
buffer = Parser::Source::Buffer.new('(string)', source: '2+2')
assert_equal '2+2', buffer.source
end
def test_source_setter
@buffer.source = 'foo'
assert_equal 'foo', @buffer.source
assert @buffer.source.frozen?
end
def test_source_double_setter
@buffer.source = 'foo'
assert_raises(ArgumentError) do
@buffer.source = 'bar'
end
end
def test_source_setter_encoding_error
error = assert_raises EncodingError do
@buffer.source = [
'# encoding: utf-8',
"# \xf9"
].join("\n")
end
assert_match(/invalid byte sequence in UTF\-8/, error.message)
end
def test_read
tempfile = Tempfile.new('parser')
tempfile.write('foobar')
tempfile.flush
buffer = Parser::Source::Buffer.new(tempfile.path)
buffer.read
assert_equal 'foobar', buffer.source
assert buffer.source.frozen?
end
def test_uninitialized
assert_raises RuntimeError do
@buffer.source
end
end
def test_decompose_position
@buffer.source = "1\nfoo\nbar"
assert_equal [1, 0], @buffer.decompose_position(0)
assert_equal [1, 1], @buffer.decompose_position(1)
assert_equal [2, 0], @buffer.decompose_position(2)
assert_equal [3, 1], @buffer.decompose_position(7)
assert_equal [3, 36], @buffer.decompose_position(42)
assert_equal [0, -52], @buffer.decompose_position(-42)
end
def test_decompose_position_mapped
@buffer = Parser::Source::Buffer.new('(string)', 5)
@buffer.source = "1\nfoo\nbar"
assert_equal [5, 0], @buffer.decompose_position(0)
assert_equal [6, 0], @buffer.decompose_position(2)
end
def test_line
@buffer.source = "1\nfoo\nbar"
assert_equal '1', @buffer.source_line(1)
assert_equal 'foo', @buffer.source_line(2)
end
def test_line_mutate
@buffer.source = "1\nfoo\nbar"
assert_equal '1', @buffer.source_line(1)
@buffer.source_line(1)[0] = '2'
assert_equal '1', @buffer.source_line(1)
end
def test_line_mapped
@buffer = Parser::Source::Buffer.new('(string)', 5)
@buffer.source = "1\nfoo\nbar"
assert_equal '1', @buffer.source_line(5)
assert_equal 'foo', @buffer.source_line(6)
end
def test_line_range
@buffer = Parser::Source::Buffer.new('(string)', 5)
@buffer.source = "abc\ndef\nghi\n"
assert_raises IndexError do
@buffer.line_range(4)
end
assert_equal 'abc', @buffer.line_range(5).source
assert_equal 'def', @buffer.line_range(6).source
assert_equal 'ghi', @buffer.line_range(7).source
assert_equal '', @buffer.line_range(8).source
assert_raises IndexError do
@buffer.line_range(9)
end
end
def test_source_range
@buffer = Parser::Source::Buffer.new('(string)', 5)
assert_raises RuntimeError do
@buffer.source_range
end
@buffer.source = "abc\ndef\nghi\n"
assert_equal Parser::Source::Range.new(@buffer, 0, @buffer.source.size), @buffer.source_range
end
def test_last_line
@buffer.source = "1\nfoo\nbar"
assert_equal 3, @buffer.last_line
@buffer = Parser::Source::Buffer.new('(string)', 5)
@buffer.source = ""
assert_equal 5, @buffer.last_line
@buffer = Parser::Source::Buffer.new('(string)', 5)
@buffer.source = "abc\n"
assert_equal 6, @buffer.last_line
end
def test_source_lines
@buffer.source = "1\nfoo\nbar\n"
assert_equal ['1', 'foo', 'bar', ''], @buffer.source_lines
assert @buffer.source_lines.frozen?
assert @buffer.source_lines.all?(&:frozen?)
@buffer = Parser::Source::Buffer.new('(string)', 5)
@buffer.source = "foo\nbar"
assert_equal ['foo', 'bar'], @buffer.source_lines
end
def test_freeze
@buffer.source = "1\nfoo\nbar\n"
@buffer.freeze
@buffer.source_lines
@buffer.source_range
assert_equal 'foo', @buffer.line_range(2).source
end
def test_ractor
@buffer.source = "hello\n:world\nstrange\nodd"
::Ractor.make_shareable(@buffer)
assert ::Ractor.shareable?(@buffer)
assert_equal ':world', @buffer.line_range(2).source
end if defined?(::Ractor)
def test_inspect
assert_equal '#<Parser::Source::Buffer (string)>', @buffer.inspect
end
end
|