You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
461 lines
12 KiB
461 lines
12 KiB
#!/usr/bin/ruby
|
|
# encoding: utf-8
|
|
|
|
require 'antlr3'
|
|
require 'test/unit'
|
|
require 'spec'
|
|
|
|
|
|
include ANTLR3
|
|
|
|
class TestStringStream < Test::Unit::TestCase
|
|
def setup
|
|
@stream = StringStream.new( "oh\nhey!\n" )
|
|
end
|
|
|
|
def test_size
|
|
@stream.size.should == 8
|
|
end
|
|
|
|
def test_index
|
|
@stream.index.should == 0
|
|
end
|
|
|
|
def test_consume
|
|
@stream.consume # o
|
|
@stream.index.should == 1
|
|
@stream.column.should == 1
|
|
@stream.line.should == 1
|
|
|
|
@stream.consume # h
|
|
@stream.index.should == 2
|
|
@stream.column.should == 2
|
|
@stream.line.should == 1
|
|
|
|
@stream.consume # \n
|
|
@stream.index.should == 3
|
|
@stream.column.should == 0
|
|
@stream.line.should == 2
|
|
|
|
@stream.consume # h
|
|
@stream.index.should == 4
|
|
@stream.column.should == 1
|
|
@stream.line.should == 2
|
|
|
|
@stream.consume # e
|
|
@stream.index.should == 5
|
|
@stream.column.should == 2
|
|
@stream.line.should == 2
|
|
|
|
@stream.consume # y
|
|
@stream.index.should == 6
|
|
@stream.column.should == 3
|
|
@stream.line.should == 2
|
|
|
|
@stream.consume # !
|
|
@stream.index.should == 7
|
|
@stream.column.should == 4
|
|
@stream.line.should == 2
|
|
|
|
@stream.consume # \n
|
|
@stream.index.should == 8
|
|
@stream.column.should == 0
|
|
@stream.line.should == 3
|
|
|
|
@stream.consume # EOF
|
|
@stream.index.should == 8
|
|
@stream.column.should == 0
|
|
@stream.line.should == 3
|
|
|
|
@stream.consume # EOF
|
|
@stream.index.should == 8
|
|
@stream.column.should == 0
|
|
@stream.line.should == 3
|
|
end
|
|
|
|
def test_reset
|
|
2.times { @stream.consume }
|
|
@stream.reset
|
|
@stream.index.should == 0
|
|
@stream.line.should == 1
|
|
@stream.column.should == 0
|
|
@stream.peek(1).should == ?o.ord
|
|
end
|
|
|
|
def test_look
|
|
@stream.look(1).should == 'o'
|
|
@stream.look(2).should == 'h'
|
|
@stream.look(3).should == "\n"
|
|
@stream.peek(1).should == ?o.ord
|
|
@stream.peek(2).should == ?h.ord
|
|
@stream.peek(3).should == ?\n.ord
|
|
|
|
6.times { @stream.consume }
|
|
@stream.look(1).should == '!'
|
|
@stream.look(2).should == "\n"
|
|
@stream.look(3).should be_nil
|
|
@stream.peek(1).should == ?!.ord
|
|
@stream.peek(2).should == ?\n.ord
|
|
@stream.peek(3).should == EOF
|
|
end
|
|
|
|
def test_substring
|
|
@stream.substring(0,0).should == 'o'
|
|
@stream.substring(0,1).should == 'oh'
|
|
@stream.substring(0,8).should == "oh\nhey!\n"
|
|
@stream.substring(3,6).should == "hey!"
|
|
end
|
|
|
|
def test_seek_forward
|
|
@stream.seek(3)
|
|
@stream.index.should == 3
|
|
@stream.line.should == 2
|
|
@stream.column.should == 0
|
|
@stream.peek(1).should == ?h.ord
|
|
end
|
|
|
|
def test_mark
|
|
@stream.seek(4)
|
|
marker = @stream.mark
|
|
marker.should == 1
|
|
|
|
2.times { @stream.consume }
|
|
marker = @stream.mark
|
|
|
|
marker.should == 2
|
|
end
|
|
|
|
def test_release_last
|
|
@stream.seek(4)
|
|
marker1 = @stream.mark
|
|
|
|
2.times { @stream.consume }
|
|
marker2 = @stream.mark
|
|
|
|
@stream.release
|
|
@stream.mark_depth.should == 2
|
|
@stream.release
|
|
@stream.mark_depth.should == 1
|
|
end
|
|
|
|
def test_release_nested
|
|
@stream.seek(4)
|
|
marker1 = @stream.mark()
|
|
|
|
@stream.consume()
|
|
marker2 = @stream.mark()
|
|
|
|
@stream.consume()
|
|
marker3 = @stream.mark()
|
|
|
|
@stream.release(marker2)
|
|
@stream.mark_depth.should == 2
|
|
|
|
end
|
|
|
|
def test_rewind_last
|
|
@stream.seek(4)
|
|
|
|
marker = @stream.mark
|
|
@stream.consume
|
|
@stream.consume
|
|
|
|
@stream.rewind
|
|
@stream.mark_depth.should == 1
|
|
@stream.index.should == 4
|
|
@stream.line.should == 2
|
|
@stream.column.should == 1
|
|
@stream.peek(1).should == ?e.ord
|
|
|
|
end
|
|
|
|
def test_through
|
|
@stream.through( 2 ).should == 'oh'
|
|
@stream.through( -2 ).should == ''
|
|
@stream.seek( 5 )
|
|
@stream.through( 0 ).should == ''
|
|
@stream.through( 1 ).should == 'y'
|
|
@stream.through( -2 ).should == 'he'
|
|
@stream.through( 5 ).should == "y!\n"
|
|
end
|
|
|
|
def test_rewind_nested
|
|
@stream.seek(4)
|
|
marker1 = @stream.mark()
|
|
|
|
@stream.consume
|
|
marker2 = @stream.mark
|
|
|
|
@stream.consume
|
|
marker3 = @stream.mark
|
|
|
|
@stream.rewind(marker2)
|
|
@stream.mark_depth.should == 2
|
|
@stream.index().should == 5
|
|
@stream.line.should == 2
|
|
@stream.column.should == 2
|
|
@stream.peek(1).should == ?y.ord
|
|
end
|
|
end
|
|
|
|
class TestFileStream < Test::Unit::TestCase
|
|
|
|
|
|
def test_no_encoding
|
|
|
|
path = File.join(File.dirname(__FILE__), 'sample-input/file-stream-1')
|
|
@stream = FileStream.new(path)
|
|
|
|
@stream.seek(4)
|
|
marker1 = @stream.mark()
|
|
|
|
@stream.consume()
|
|
marker2 = @stream.mark()
|
|
|
|
@stream.consume()
|
|
marker3 = @stream.mark()
|
|
|
|
@stream.rewind(marker2)
|
|
@stream.index().should == 5
|
|
@stream.line.should == 2
|
|
@stream.column.should == 1
|
|
@stream.mark_depth.should == 2
|
|
@stream.look(1).should == 'a'
|
|
@stream.peek(1).should == ?a.ord
|
|
end
|
|
|
|
def test_encoded
|
|
|
|
end
|
|
end
|
|
|
|
class TestInputStream < Test::Unit::TestCase
|
|
def test_no_encoding
|
|
|
|
end
|
|
|
|
def test_encoded
|
|
|
|
end
|
|
end
|
|
|
|
class TestCommonTokenStream < Test::Unit::TestCase
|
|
class MockSource
|
|
include ANTLR3::TokenSource
|
|
attr_accessor :tokens
|
|
def initialize
|
|
@tokens = []
|
|
end
|
|
def next_token
|
|
@tokens.shift
|
|
end
|
|
end
|
|
|
|
# vvvvvvvv tests vvvvvvvvv
|
|
def test_init
|
|
@source = MockSource.new
|
|
@stream = CommonTokenStream.new( @source )
|
|
@stream.position.should == 0
|
|
end
|
|
|
|
def test_rebuild
|
|
@source1 = MockSource.new
|
|
@source2 = MockSource.new
|
|
@source2.tokens << new_token( 10, :channel => ANTLR3::HIDDEN ) << new_token( 11 )
|
|
@stream = CommonTokenStream.new( @source1 )
|
|
|
|
@stream.position.should == 0
|
|
@stream.tokens.length.should == 0
|
|
|
|
@stream.rebuild( @source2 )
|
|
@stream.token_source.should == @source2
|
|
@stream.position.should == 1
|
|
@stream.tokens.should have( 2 ).things
|
|
end
|
|
|
|
def test_look_empty_source
|
|
@source = MockSource.new
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.look.should == ANTLR3::EOF_TOKEN
|
|
end
|
|
|
|
def test_look1
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12)
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.look(1).type.should == 12
|
|
end
|
|
|
|
def test_look1_with_hidden
|
|
# FIX
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12, :channel => ANTLR3::HIDDEN_CHANNEL) <<
|
|
new_token(13)
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.look(1).type.should == 13
|
|
end
|
|
|
|
def test_look2_beyond_end
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12) <<
|
|
new_token(13, :channel => ANTLR3::HIDDEN_CHANNEL)
|
|
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.look(2).type.should == EOF
|
|
end
|
|
|
|
def test_look_negative
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12) << new_token(13)
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.consume
|
|
|
|
@stream.look(-1).type.should == 12
|
|
end
|
|
|
|
def test_lb1
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12) << new_token(13)
|
|
@stream = CommonTokenStream.new(@source)
|
|
|
|
@stream.consume
|
|
@stream.look(-1).type.should == 12
|
|
end
|
|
|
|
def test_look_zero
|
|
# FIX
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12) << new_token(13)
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.look(0).should == nil
|
|
end
|
|
|
|
def test_lb_beyond_begin
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(10) <<
|
|
new_token(11, :channel => HIDDEN_CHANNEL) <<
|
|
new_token(12, :channel => HIDDEN_CHANNEL) <<
|
|
new_token(13)
|
|
@stream = CommonTokenStream.new(@source)
|
|
|
|
@stream.look(-1).should == nil
|
|
2.times { @stream.consume }
|
|
@stream.look(-3).should == nil
|
|
end
|
|
|
|
def test_fill_buffer
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12) << new_token(13) << new_token(14) << new_token(EOF)
|
|
@stream = CommonTokenStream.new(@source)
|
|
|
|
@stream.instance_variable_get(:@tokens).length.should == 3
|
|
@stream.tokens[0].type.should == 12
|
|
@stream.tokens[1].type.should == 13
|
|
@stream.tokens[2].type.should == 14
|
|
end
|
|
|
|
def test_consume
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12) << new_token(13) << new_token(EOF)
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.peek.should == 12
|
|
@stream.consume
|
|
@stream.peek.should == 13
|
|
@stream.consume
|
|
@stream.peek.should == EOF
|
|
@stream.consume
|
|
@stream.peek.should == EOF
|
|
end
|
|
|
|
def test_seek
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12) << new_token(13) << new_token(EOF)
|
|
@stream = CommonTokenStream.new(@source)
|
|
|
|
@stream.peek(1).should == 12
|
|
@stream.seek(2).peek.should == EOF
|
|
@stream.seek(0).peek.should == 12
|
|
@stream.seek(-3).position.should == 0
|
|
@stream.seek(10).position.should == 2
|
|
end
|
|
|
|
def test_mark_rewind
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12) << new_token(13) << new_token(EOF)
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.consume
|
|
marker = @stream.mark
|
|
@stream.consume
|
|
@stream.rewind(marker)
|
|
@stream.peek(1).should == 13
|
|
end
|
|
|
|
def test_to_string
|
|
@source = MockSource.new
|
|
@source.tokens << new_token(12, 'foo') <<
|
|
new_token(13, 'bar') << new_token(14, 'gnurz') <<
|
|
new_token(15, 'blarz')
|
|
@stream = CommonTokenStream.new(@source)
|
|
@stream.to_s.should == "foobargnurzblarz"
|
|
@stream.to_s(1,2).should == 'bargnurz'
|
|
@stream.to_s(@stream[1], @stream[-2]).should == 'bargnurz'
|
|
end
|
|
|
|
def new_token(type, opts = {})
|
|
fields = {}
|
|
case type
|
|
when Hash then fields.update(type)
|
|
else
|
|
fields[:type] = type
|
|
end
|
|
case opts
|
|
when Hash then fields.update(opts)
|
|
when String then fields[:text] = opts
|
|
end
|
|
CommonToken.create(fields)
|
|
end
|
|
|
|
end
|
|
|
|
|
|
__END__
|
|
teststreams.py | LN | STATUS
|
|
----------------------------------------------+-----+--------------
|
|
class TestStringStream(unittest.TestCase) | 009 | [x]
|
|
def testSize(self) | 012 | [x]
|
|
def testIndex(self) | 020 | [x]
|
|
def testConsume(self) | 028 | [x]
|
|
def testReset(self) | 079 | [x]
|
|
def testLA(self) | 094 | [x]
|
|
def testSubstring(self) | 111 | [x]
|
|
def testSeekForward(self) | 122 | [x]
|
|
def testMark(self) | 150 | [x]
|
|
def testReleaseLast(self) | 167 | [x]
|
|
def testReleaseNested(self) | 186 | [x]
|
|
def testRewindLast(self) | 204 | [x]
|
|
def testRewindNested(self) | 223 | [x]
|
|
class TestFileStream(unittest.TestCase) | 245 | [o]
|
|
def testNoEncoding(self) | 249 | [x]
|
|
def testEncoded(self) | 272 | [ ]
|
|
class TestInputStream(unittest.TestCase) | 296 | [ ]
|
|
def testNoEncoding(self) | 299 | [ ]
|
|
def testEncoded(self) | 322 | [ ]
|
|
class TestCommonTokenStream(unittest.TestCase)| 345 | [ ]
|
|
def setUp(self) | 348 | [x]
|
|
def testInit(self) | 369 | [x]
|
|
def testSetTokenSource(self) | 376 | [x]
|
|
def testLTEmptySource(self) | 385 | [x]
|
|
def testLT1(self) | 394 | [x]
|
|
def testLT1WithHidden(self) | 407 | [x]
|
|
def testLT2BeyondEnd(self) | 424 | [x]
|
|
def testLTNegative(self) | 442 | [x]
|
|
def testLB1(self) | 461 | [x]
|
|
def testLTZero(self) | 479 | [x]
|
|
def testLBBeyondBegin(self) | 496 | [x]
|
|
def testFillBuffer(self) | 523 | [x]
|
|
def testConsume(self) | 551 | [x]
|
|
def testSeek(self) | 579 | [x]
|
|
def testMarkRewind(self) | 604 | [x]
|
|
def testToString(self) | 631 | [x]
|
|
|