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

#!/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]