Class: Test_Timer

Inherits:
Test::Unit::TestCase
  • Object
show all
Defined in:
lib/tkar/timer.rb

Overview

These tests may not work on a slow machine or heavily loaded system; try adjusting FUDGE.

Constant Summary collapse

STEPS =

:nodoc:

100
PERIOD =
0.01
FUDGE =

a constant independent of period.

0.01

Instance Method Summary collapse

Instance Method Details

#generic_test(steps = STEPS, period = PERIOD, fudge = FUDGE) {|steps, period, max_sleep| ... } ⇒ Object

Yields:

  • (steps, period, max_sleep)


93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/tkar/timer.rb', line 93

def generic_test(steps = STEPS, period = PERIOD, fudge = FUDGE)
  max_sleep = period/2
  
  start_time = Time.now
  yield steps, period, max_sleep
  finish_time = Time.now
  
  assert_in_delta(
    start_time.to_f + steps*period,
    finish_time.to_f,
    period + fudge,
    "delta = #{finish_time.to_f - (start_time.to_f + steps*period)}"
  )
end

#test_everyObject



108
109
110
111
112
113
114
115
116
117
118
# File 'lib/tkar/timer.rb', line 108

def test_every
  generic_test do |steps, period, max_sleep|
    Timer.every period do |elapsed|
      s = rand()*max_sleep
      #puts "#{elapsed} elapsed; sleeping #{s}"
      sleep(s)
      steps -= 1
      break if steps == 0
    end
  end
end

#test_every_with_expireObject



120
121
122
123
124
125
126
127
128
# File 'lib/tkar/timer.rb', line 120

def test_every_with_expire
  generic_test do |steps, period, max_sleep|
    Timer.every period, period*steps do
      s = rand()*max_sleep
      #puts "#{elapsed} elapsed; sleeping #{s}"
      sleep(s)
    end
  end
end

#test_if_readyObject



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/tkar/timer.rb', line 155

def test_if_ready
  generic_test do |steps, period, max_sleep|
    timer = Timer.new(period)
    catch :done do
      loop do
        timer.if_ready do |elapsed|
          s = rand()*max_sleep
          #puts "#{elapsed} elapsed; sleeping #{s}"
          sleep(s)
          steps -= 1
          throw :done if steps == 0
        end
      end
    end
  end
end

#test_waitObject



130
131
132
133
134
135
136
137
138
139
140
# File 'lib/tkar/timer.rb', line 130

def test_wait
  generic_test do |steps, period, max_sleep|
    timer = Timer.new(period)
    steps.times do
      s = rand()*max_sleep
      #puts "#{timer.elapsed} elapsed; sleeping #{s}"
      sleep(s)
      timer.wait
    end
  end
end

#test_wait_perObject



142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/tkar/timer.rb', line 142

def test_wait_per
  offset = PERIOD / 2
  generic_test(STEPS, PERIOD, FUDGE + offset) do |steps, period, max_sleep|
    timer = Timer.new(period)
    steps.times do |i|
      s = rand()*max_sleep
      #puts "#{timer.elapsed} elapsed; sleeping #{s}"
      sleep(s)
      timer.wait(i%2==0 ? period + offset : period - offset)
    end
  end
end