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