1 #!/usr/bin/ruby 2 # encoding: utf-8 3 4 require 'antlr3' 5 require 'test/unit' 6 require 'spec' 7 8 9 include ANTLR3 10 11 class TestStringStream < Test::Unit::TestCase 12 def setup 13 @stream = StringStream.new( "oh\nhey!\n" ) 14 end 15 16 def test_size 17 @stream.size.should == 8 18 end 19 20 def test_index 21 @stream.index.should == 0 22 end 23 24 def test_consume 25 @stream.consume # o 26 @stream.index.should == 1 27 @stream.column.should == 1 28 @stream.line.should == 1 29 30 @stream.consume # h 31 @stream.index.should == 2 32 @stream.column.should == 2 33 @stream.line.should == 1 34 35 @stream.consume # \n 36 @stream.index.should == 3 37 @stream.column.should == 0 38 @stream.line.should == 2 39 40 @stream.consume # h 41 @stream.index.should == 4 42 @stream.column.should == 1 43 @stream.line.should == 2 44 45 @stream.consume # e 46 @stream.index.should == 5 47 @stream.column.should == 2 48 @stream.line.should == 2 49 50 @stream.consume # y 51 @stream.index.should == 6 52 @stream.column.should == 3 53 @stream.line.should == 2 54 55 @stream.consume # ! 56 @stream.index.should == 7 57 @stream.column.should == 4 58 @stream.line.should == 2 59 60 @stream.consume # \n 61 @stream.index.should == 8 62 @stream.column.should == 0 63 @stream.line.should == 3 64 65 @stream.consume # EOF 66 @stream.index.should == 8 67 @stream.column.should == 0 68 @stream.line.should == 3 69 70 @stream.consume # EOF 71 @stream.index.should == 8 72 @stream.column.should == 0 73 @stream.line.should == 3 74 end 75 76 def test_reset 77 2.times { @stream.consume } 78 @stream.reset 79 @stream.index.should == 0 80 @stream.line.should == 1 81 @stream.column.should == 0 82 @stream.peek(1).should == ?o.ord 83 end 84 85 def test_look 86 @stream.look(1).should == 'o' 87 @stream.look(2).should == 'h' 88 @stream.look(3).should == "\n" 89 @stream.peek(1).should == ?o.ord 90 @stream.peek(2).should == ?h.ord 91 @stream.peek(3).should == ?\n.ord 92 93 6.times { @stream.consume } 94 @stream.look(1).should == '!' 95 @stream.look(2).should == "\n" 96 @stream.look(3).should be_nil 97 @stream.peek(1).should == ?!.ord 98 @stream.peek(2).should == ?\n.ord 99 @stream.peek(3).should == EOF 100 end 101 102 def test_substring 103 @stream.substring(0,0).should == 'o' 104 @stream.substring(0,1).should == 'oh' 105 @stream.substring(0,8).should == "oh\nhey!\n" 106 @stream.substring(3,6).should == "hey!" 107 end 108 109 def test_seek_forward 110 @stream.seek(3) 111 @stream.index.should == 3 112 @stream.line.should == 2 113 @stream.column.should == 0 114 @stream.peek(1).should == ?h.ord 115 end 116 117 def test_mark 118 @stream.seek(4) 119 marker = @stream.mark 120 marker.should == 1 121 122 2.times { @stream.consume } 123 marker = @stream.mark 124 125 marker.should == 2 126 end 127 128 def test_release_last 129 @stream.seek(4) 130 marker1 = @stream.mark 131 132 2.times { @stream.consume } 133 marker2 = @stream.mark 134 135 @stream.release 136 @stream.mark_depth.should == 2 137 @stream.release 138 @stream.mark_depth.should == 1 139 end 140 141 def test_release_nested 142 @stream.seek(4) 143 marker1 = @stream.mark() 144 145 @stream.consume() 146 marker2 = @stream.mark() 147 148 @stream.consume() 149 marker3 = @stream.mark() 150 151 @stream.release(marker2) 152 @stream.mark_depth.should == 2 153 154 end 155 156 def test_rewind_last 157 @stream.seek(4) 158 159 marker = @stream.mark 160 @stream.consume 161 @stream.consume 162 163 @stream.rewind 164 @stream.mark_depth.should == 1 165 @stream.index.should == 4 166 @stream.line.should == 2 167 @stream.column.should == 1 168 @stream.peek(1).should == ?e.ord 169 170 end 171 172 def test_through 173 @stream.through( 2 ).should == 'oh' 174 @stream.through( -2 ).should == '' 175 @stream.seek( 5 ) 176 @stream.through( 0 ).should == '' 177 @stream.through( 1 ).should == 'y' 178 @stream.through( -2 ).should == 'he' 179 @stream.through( 5 ).should == "y!\n" 180 end 181 182 def test_rewind_nested 183 @stream.seek(4) 184 marker1 = @stream.mark() 185 186 @stream.consume 187 marker2 = @stream.mark 188 189 @stream.consume 190 marker3 = @stream.mark 191 192 @stream.rewind(marker2) 193 @stream.mark_depth.should == 2 194 @stream.index().should == 5 195 @stream.line.should == 2 196 @stream.column.should == 2 197 @stream.peek(1).should == ?y.ord 198 end 199 end 200 201 class TestFileStream < Test::Unit::TestCase 202 203 204 def test_no_encoding 205 206 path = File.join(File.dirname(__FILE__), 'sample-input/file-stream-1') 207 @stream = FileStream.new(path) 208 209 @stream.seek(4) 210 marker1 = @stream.mark() 211 212 @stream.consume() 213 marker2 = @stream.mark() 214 215 @stream.consume() 216 marker3 = @stream.mark() 217 218 @stream.rewind(marker2) 219 @stream.index().should == 5 220 @stream.line.should == 2 221 @stream.column.should == 1 222 @stream.mark_depth.should == 2 223 @stream.look(1).should == 'a' 224 @stream.peek(1).should == ?a.ord 225 end 226 227 def test_encoded 228 229 end 230 end 231 232 class TestInputStream < Test::Unit::TestCase 233 def test_no_encoding 234 235 end 236 237 def test_encoded 238 239 end 240 end 241 242 class TestCommonTokenStream < Test::Unit::TestCase 243 class MockSource 244 include ANTLR3::TokenSource 245 attr_accessor :tokens 246 def initialize 247 @tokens = [] 248 end 249 def next_token 250 @tokens.shift 251 end 252 end 253 254 # vvvvvvvv tests vvvvvvvvv 255 def test_init 256 @source = MockSource.new 257 @stream = CommonTokenStream.new( @source ) 258 @stream.position.should == 0 259 end 260 261 def test_rebuild 262 @source1 = MockSource.new 263 @source2 = MockSource.new 264 @source2.tokens << new_token( 10, :channel => ANTLR3::HIDDEN ) << new_token( 11 ) 265 @stream = CommonTokenStream.new( @source1 ) 266 267 @stream.position.should == 0 268 @stream.tokens.length.should == 0 269 270 @stream.rebuild( @source2 ) 271 @stream.token_source.should == @source2 272 @stream.position.should == 1 273 @stream.tokens.should have( 2 ).things 274 end 275 276 def test_look_empty_source 277 @source = MockSource.new 278 @stream = CommonTokenStream.new(@source) 279 @stream.look.should == ANTLR3::EOF_TOKEN 280 end 281 282 def test_look1 283 @source = MockSource.new 284 @source.tokens << new_token(12) 285 @stream = CommonTokenStream.new(@source) 286 @stream.look(1).type.should == 12 287 end 288 289 def test_look1_with_hidden 290 # FIX 291 @source = MockSource.new 292 @source.tokens << new_token(12, :channel => ANTLR3::HIDDEN_CHANNEL) << 293 new_token(13) 294 @stream = CommonTokenStream.new(@source) 295 @stream.look(1).type.should == 13 296 end 297 298 def test_look2_beyond_end 299 @source = MockSource.new 300 @source.tokens << new_token(12) << 301 new_token(13, :channel => ANTLR3::HIDDEN_CHANNEL) 302 303 @stream = CommonTokenStream.new(@source) 304 @stream.look(2).type.should == EOF 305 end 306 307 def test_look_negative 308 @source = MockSource.new 309 @source.tokens << new_token(12) << new_token(13) 310 @stream = CommonTokenStream.new(@source) 311 @stream.consume 312 313 @stream.look(-1).type.should == 12 314 end 315 316 def test_lb1 317 @source = MockSource.new 318 @source.tokens << new_token(12) << new_token(13) 319 @stream = CommonTokenStream.new(@source) 320 321 @stream.consume 322 @stream.look(-1).type.should == 12 323 end 324 325 def test_look_zero 326 # FIX 327 @source = MockSource.new 328 @source.tokens << new_token(12) << new_token(13) 329 @stream = CommonTokenStream.new(@source) 330 @stream.look(0).should == nil 331 end 332 333 def test_lb_beyond_begin 334 @source = MockSource.new 335 @source.tokens << new_token(10) << 336 new_token(11, :channel => HIDDEN_CHANNEL) << 337 new_token(12, :channel => HIDDEN_CHANNEL) << 338 new_token(13) 339 @stream = CommonTokenStream.new(@source) 340 341 @stream.look(-1).should == nil 342 2.times { @stream.consume } 343 @stream.look(-3).should == nil 344 end 345 346 def test_fill_buffer 347 @source = MockSource.new 348 @source.tokens << new_token(12) << new_token(13) << new_token(14) << new_token(EOF) 349 @stream = CommonTokenStream.new(@source) 350 351 @stream.instance_variable_get(:@tokens).length.should == 3 352 @stream.tokens[0].type.should == 12 353 @stream.tokens[1].type.should == 13 354 @stream.tokens[2].type.should == 14 355 end 356 357 def test_consume 358 @source = MockSource.new 359 @source.tokens << new_token(12) << new_token(13) << new_token(EOF) 360 @stream = CommonTokenStream.new(@source) 361 @stream.peek.should == 12 362 @stream.consume 363 @stream.peek.should == 13 364 @stream.consume 365 @stream.peek.should == EOF 366 @stream.consume 367 @stream.peek.should == EOF 368 end 369 370 def test_seek 371 @source = MockSource.new 372 @source.tokens << new_token(12) << new_token(13) << new_token(EOF) 373 @stream = CommonTokenStream.new(@source) 374 375 @stream.peek(1).should == 12 376 @stream.seek(2).peek.should == EOF 377 @stream.seek(0).peek.should == 12 378 @stream.seek(-3).position.should == 0 379 @stream.seek(10).position.should == 2 380 end 381 382 def test_mark_rewind 383 @source = MockSource.new 384 @source.tokens << new_token(12) << new_token(13) << new_token(EOF) 385 @stream = CommonTokenStream.new(@source) 386 @stream.consume 387 marker = @stream.mark 388 @stream.consume 389 @stream.rewind(marker) 390 @stream.peek(1).should == 13 391 end 392 393 def test_to_string 394 @source = MockSource.new 395 @source.tokens << new_token(12, 'foo') << 396 new_token(13, 'bar') << new_token(14, 'gnurz') << 397 new_token(15, 'blarz') 398 @stream = CommonTokenStream.new(@source) 399 @stream.to_s.should == "foobargnurzblarz" 400 @stream.to_s(1,2).should == 'bargnurz' 401 @stream.to_s(@stream[1], @stream[-2]).should == 'bargnurz' 402 end 403 404 def new_token(type, opts = {}) 405 fields = {} 406 case type 407 when Hash then fields.update(type) 408 else 409 fields[:type] = type 410 end 411 case opts 412 when Hash then fields.update(opts) 413 when String then fields[:text] = opts 414 end 415 CommonToken.create(fields) 416 end 417 418 end 419 420 421 __END__ 422 teststreams.py | LN | STATUS 423 ----------------------------------------------+-----+-------------- 424 class TestStringStream(unittest.TestCase) | 009 | [x] 425 def testSize(self) | 012 | [x] 426 def testIndex(self) | 020 | [x] 427 def testConsume(self) | 028 | [x] 428 def testReset(self) | 079 | [x] 429 def testLA(self) | 094 | [x] 430 def testSubstring(self) | 111 | [x] 431 def testSeekForward(self) | 122 | [x] 432 def testMark(self) | 150 | [x] 433 def testReleaseLast(self) | 167 | [x] 434 def testReleaseNested(self) | 186 | [x] 435 def testRewindLast(self) | 204 | [x] 436 def testRewindNested(self) | 223 | [x] 437 class TestFileStream(unittest.TestCase) | 245 | [o] 438 def testNoEncoding(self) | 249 | [x] 439 def testEncoded(self) | 272 | [ ] 440 class TestInputStream(unittest.TestCase) | 296 | [ ] 441 def testNoEncoding(self) | 299 | [ ] 442 def testEncoded(self) | 322 | [ ] 443 class TestCommonTokenStream(unittest.TestCase)| 345 | [ ] 444 def setUp(self) | 348 | [x] 445 def testInit(self) | 369 | [x] 446 def testSetTokenSource(self) | 376 | [x] 447 def testLTEmptySource(self) | 385 | [x] 448 def testLT1(self) | 394 | [x] 449 def testLT1WithHidden(self) | 407 | [x] 450 def testLT2BeyondEnd(self) | 424 | [x] 451 def testLTNegative(self) | 442 | [x] 452 def testLB1(self) | 461 | [x] 453 def testLTZero(self) | 479 | [x] 454 def testLBBeyondBegin(self) | 496 | [x] 455 def testFillBuffer(self) | 523 | [x] 456 def testConsume(self) | 551 | [x] 457 def testSeek(self) | 579 | [x] 458 def testMarkRewind(self) | 604 | [x] 459 def testToString(self) | 631 | [x] 460 461