File: tc_priority_queue.rb

package info (click to toggle)
ruby-ferret 0.11.8.4%2Bdebian-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,368 kB
  • sloc: ansic: 69,786; ruby: 8,131; makefile: 5
file content (106 lines) | stat: -rw-r--r-- 2,452 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
require File.dirname(__FILE__) + "/../../test_helper"


class PriorityQueueTest < Test::Unit::TestCase
  include Ferret::Utils

  PQ_STRESS_SIZE = 1000

  def test_pq()
    pq = PriorityQueue.new(4)
    assert_equal(0, pq.size)
    assert_equal(4, pq.capacity)
    pq.insert("bword")
    assert_equal(1, pq.size)
    assert_equal("bword", pq.top)

    pq.insert("cword")
    assert_equal(2, pq.size)
    assert_equal("bword", pq.top)

    pq << "dword"
    assert_equal(3, pq.size)
    assert_equal("bword", pq.top)
    
    pq << "eword"
    assert_equal(4, pq.size)
    assert_equal("bword", pq.top)

    pq << "aword"
    assert_equal(4, pq.size)
    assert_equal("bword", pq.top, "aword < all other elements so ignore")

    pq << "fword"
    assert_equal(4, pq.size)
    assert_equal("cword", pq.top, "bword got pushed off the bottom of the queue")

    assert_equal("cword", pq.pop())
    assert_equal(3, pq.size)
    assert_equal("dword", pq.pop())
    assert_equal(2, pq.size)
    assert_equal("eword", pq.pop())
    assert_equal(1, pq.size)
    assert_equal("fword", pq.pop())
    assert_equal(0, pq.size)
    assert_nil(pq.top)
    assert_nil(pq.pop)
  end

  def test_pq_clear()
    pq = PriorityQueue.new(3)
    pq << "word1"
    pq << "word2"
    pq << "word3"
    assert_equal(3, pq.size)
    pq.clear()
    assert_equal(0, pq.size)
    assert_nil(pq.top)
    assert_nil(pq.pop)
  end

  #define PQ_STRESS_SIZE 1000
  def test_stress_pq
    pq = PriorityQueue.new(PQ_STRESS_SIZE)
    PQ_STRESS_SIZE.times do
      pq.insert("<#{rand(PQ_STRESS_SIZE)}>")
    end

    prev = pq.pop()
    (PQ_STRESS_SIZE - 1).times do
      curr = pq.pop()
      assert(prev <= curr, "#{prev} should be less than #{curr}")
      prev = curr
    end
    pq.clear()
  end

  def test_pq_block
    pq = PriorityQueue.new(21) {|a, b| a > b}
    100.times do
      pq.insert("<#{rand(50)}>")
    end

    prev = pq.pop()
    20.times do
      curr = pq.pop()
      assert(prev >= curr, "#{prev} should be greater than #{curr}")
      prev = curr
    end
    assert_equal 0, pq.size 
  end

  def test_pq_proc
    pq = PriorityQueue.new({:less_than => lambda {|a, b| a.size > b.size}, :capacity => 21})
    100.times do
      pq.insert("x" * rand(50))
    end

    prev = pq.pop()
    20.times do
      curr = pq.pop()
      assert(prev.size >= curr.size, "#{prev} should be greater than #{curr}")
      prev = curr
    end
    assert_equal 0, pq.size 
  end
end