|
2 | 2 | require 'random_compat' |
3 | 3 |
|
4 | 4 | describe Buffer do |
5 | | - EXAMPLES = {} |
6 | | - EXAMPLES[:empty01] = '' |
7 | | - EXAMPLES[:empty02] = '' |
8 | | - EXAMPLES[:copy01] = 'short' |
9 | | - EXAMPLES[:copy02] = 'short'*2 |
10 | | - EXAMPLES[:ref01] = 'short'*128 |
11 | | - EXAMPLES[:ref02] = 'short'*128*2 |
12 | | - EXAMPLES[:ref03] = 'a'*((1024*1024+2)*2) |
13 | | - EXAMPLES[:refcopy01] = 'short'*128 |
14 | | - EXAMPLES[:expand01] = 'short'*1024 |
15 | | - EXAMPLES[:expand02] = 'short'*(127+1024) |
16 | | - EXAMPLES[:offset01] = 'ort'+'short' |
17 | | - EXAMPLES[:offset02] = 'ort'+'short'*127 |
18 | | - EXAMPLES[:offset03] = 'ort'+'short'*(126+1024) |
| 5 | + STATIC_EXAMPLES = {} |
| 6 | + STATIC_EXAMPLES[:empty01] = '' |
| 7 | + STATIC_EXAMPLES[:empty02] = '' |
| 8 | + STATIC_EXAMPLES[:copy01] = 'short' |
| 9 | + STATIC_EXAMPLES[:copy02] = 'short'*2 |
| 10 | + STATIC_EXAMPLES[:ref01] = 'short'*128 |
| 11 | + STATIC_EXAMPLES[:ref02] = 'short'*128*2 |
| 12 | + STATIC_EXAMPLES[:ref03] = 'a'*((1024*1024+2)*2) |
| 13 | + STATIC_EXAMPLES[:refcopy01] = 'short'*128 |
| 14 | + STATIC_EXAMPLES[:expand01] = 'short'*1024 |
| 15 | + STATIC_EXAMPLES[:expand02] = 'short'*(127+1024) |
| 16 | + STATIC_EXAMPLES[:offset01] = 'ort'+'short' |
| 17 | + STATIC_EXAMPLES[:offset02] = 'ort'+'short'*127 |
| 18 | + STATIC_EXAMPLES[:offset03] = 'ort'+'short'*(126+1024) |
19 | 19 |
|
20 | 20 | if ''.respond_to?(:force_encoding) |
21 | | - EXAMPLES.each_value {|v| v.force_encoding('ASCII-8BIT') } |
| 21 | + STATIC_EXAMPLES.each_value {|v| v.force_encoding('ASCII-8BIT') } |
22 | 22 | end |
23 | | - EXAMPLES.each_value {|v| v.freeze } |
| 23 | + STATIC_EXAMPLES.each_value {|v| v.freeze } |
24 | 24 |
|
25 | | - let :examples do |
26 | | - EXAMPLES |
| 25 | + r = Random.new #0xb6f43619478d4eab70bb2a31bf9c7f88 |
| 26 | + RANDOM_SEED = r.seed |
| 27 | + puts "random seed: 0x#{RANDOM_SEED.to_s(16)}" |
| 28 | + |
| 29 | + let :random_cases_examples do |
| 30 | + r = Random.new(RANDOM_SEED) |
| 31 | + cases = {} |
| 32 | + examples = {} |
| 33 | + |
| 34 | + 10.times do |i| |
| 35 | + b = Buffer.new |
| 36 | + s = r.bytes(0) |
| 37 | + r.rand(3).times do |
| 38 | + n = r.rand(1024*1400) |
| 39 | + x = r.bytes(n) |
| 40 | + s << x |
| 41 | + b << x |
| 42 | + end |
| 43 | + r.rand(2).times do |
| 44 | + n = r.rand(1024*1400) |
| 45 | + b.read(n) |
| 46 | + s.slice!(0, n) |
| 47 | + end |
| 48 | + key = :"random#{"%02d"%i}" |
| 49 | + cases[key] = b |
| 50 | + examples[key] = s |
| 51 | + end |
| 52 | + |
| 53 | + [cases, examples] |
27 | 54 | end |
28 | 55 |
|
29 | | - let :cases do |
| 56 | + let :static_cases do |
30 | 57 | map = {} |
31 | 58 | map[:empty01] = empty01 |
32 | 59 | map[:empty02] = empty02 |
|
44 | 71 | map |
45 | 72 | end |
46 | 73 |
|
| 74 | + let :static_examples do |
| 75 | + STATIC_EXAMPLES |
| 76 | + end |
| 77 | + |
| 78 | + let :random_cases do |
| 79 | + random_cases_examples[0] |
| 80 | + end |
| 81 | + |
| 82 | + let :random_examples do |
| 83 | + random_cases_examples[1] |
| 84 | + end |
| 85 | + |
| 86 | + let :cases do |
| 87 | + static_cases.merge(random_cases) |
| 88 | + end |
| 89 | + |
| 90 | + let :examples do |
| 91 | + static_examples.merge(random_examples) |
| 92 | + end |
| 93 | + |
47 | 94 | let :case_keys do |
48 | 95 | examples.keys |
49 | 96 | end |
|
398 | 445 | } |
399 | 446 | end |
400 | 447 |
|
| 448 | + it 'write_to' do |
| 449 | + case_keys.each {|k| |
| 450 | + sio = StringIO.new |
| 451 | + cases[k].write_to(sio).should == examples[k].size |
| 452 | + cases[k].size.should == 0 |
| 453 | + sio.string.should == examples[k] |
| 454 | + } |
| 455 | + end |
| 456 | + |
401 | 457 | it 'random read/write' do |
402 | | - r = Random.new#(0x7ae1a8b4042fd9d589281dbb081caf37) |
| 458 | + r = Random.new(RANDOM_SEED) |
403 | 459 | s = r.bytes(0) |
404 | 460 | b = Buffer.new |
405 | 461 |
|
406 | | - puts "random read/write seed: 0x#{r.seed.to_s(16)}" |
407 | | - 100.times { |
| 462 | + 10.times { |
408 | 463 | # write |
409 | | - r.rand(3).times do |
| 464 | + r.rand(4).times do |
410 | 465 | n = r.rand(1024*1400) |
411 | 466 | x = r.bytes(n) |
412 | 467 | s << x |
413 | 468 | b << x |
414 | 469 | end |
415 | 470 |
|
416 | 471 | # read |
417 | | - r.rand(2).times do |
| 472 | + r.rand(3).times do |
418 | 473 | n = r.rand(1024*1400) |
419 | 474 | ex = s.slice!(0, n) |
420 | 475 | ex = nil if ex.empty? |
|
426 | 481 | } |
427 | 482 | end |
428 | 483 |
|
429 | | - it 'random skip write' do |
430 | | - r = Random.new |
| 484 | + it 'random read_all/write' do |
| 485 | + r = Random.new(RANDOM_SEED) |
431 | 486 | s = r.bytes(0) |
432 | 487 | b = Buffer.new |
433 | 488 |
|
434 | | - puts "random skip/write seed: 0x#{r.seed.to_s(16)}" |
435 | | - 100.times { |
| 489 | + 10.times { |
436 | 490 | # write |
| 491 | + r.rand(4).times do |
| 492 | + n = r.rand(1024*1400) |
| 493 | + x = r.bytes(n) |
| 494 | + s << x |
| 495 | + b << x |
| 496 | + end |
| 497 | + |
| 498 | + # read_all |
437 | 499 | r.rand(3).times do |
| 500 | + n = r.rand(1024*1400) |
| 501 | + begin |
| 502 | + x = b.read_all(n) |
| 503 | + ex = s.slice!(0, n) |
| 504 | + x.size == n |
| 505 | + x.should == ex |
| 506 | + b.size.should == s.size |
| 507 | + rescue EOFError |
| 508 | + b.size.should == s.size |
| 509 | + b.read.should == s |
| 510 | + s.clear |
| 511 | + break |
| 512 | + end |
| 513 | + end |
| 514 | + } |
| 515 | + end |
| 516 | + |
| 517 | + it 'random skip write' do |
| 518 | + r = Random.new(RANDOM_SEED) |
| 519 | + s = r.bytes(0) |
| 520 | + b = Buffer.new |
| 521 | + |
| 522 | + 10.times { |
| 523 | + # write |
| 524 | + r.rand(4).times do |
438 | 525 | n = r.rand(1024*1400) |
439 | 526 | x = r.bytes(n) |
440 | 527 | s << x |
441 | 528 | b << x |
442 | 529 | end |
443 | 530 |
|
444 | 531 | # skip |
445 | | - r.rand(2).times do |
| 532 | + r.rand(3).times do |
446 | 533 | n = r.rand(1024*1400) |
447 | 534 | ex = s.slice!(0, n) |
448 | 535 | b.skip(n).should == ex.size |
449 | 536 | b.size.should == s.size |
450 | 537 | end |
451 | 538 | } |
452 | 539 | end |
| 540 | + |
| 541 | + it 'random skip_all write' do |
| 542 | + r = Random.new(RANDOM_SEED) |
| 543 | + s = r.bytes(0) |
| 544 | + b = Buffer.new |
| 545 | + |
| 546 | + 10.times { |
| 547 | + # write |
| 548 | + r.rand(4).times do |
| 549 | + n = r.rand(1024*1400) |
| 550 | + x = r.bytes(n) |
| 551 | + s << x |
| 552 | + b << x |
| 553 | + end |
| 554 | + |
| 555 | + # skip_all |
| 556 | + r.rand(3).times do |
| 557 | + n = r.rand(1024*1400) |
| 558 | + begin |
| 559 | + b.skip_all(n) |
| 560 | + ex = s.slice!(0, n) |
| 561 | + b.size.should == s.size |
| 562 | + ensure EOFError |
| 563 | + b.size.should == s.size |
| 564 | + b.read.should == s |
| 565 | + s.clear |
| 566 | + break |
| 567 | + end |
| 568 | + end |
| 569 | + } |
| 570 | + end |
453 | 571 | end |
454 | 572 |
|
0 commit comments