Из вашего репозитория github я нашел этот тест для класса Throbber:
should 'work correctly' do
ostream = StringIO.new
thread = Thread.new { sleep 1 }
throbber = Throbber.new(ostream, thread)
thread.join
throbber.join
assert_equal " \b-\b\\\b|\b/\b", ostream.string
end
Я предполагаю, что пульсатор итерирует по ['-', '\', '|', '/']
, отступая перед каждой записью, один раз в секунду. Рассмотрим следующий тест:
should 'work correctly' do
ostream = StringIO.new
started_at = Time.now
ended_at = nil
thread = Thread.new { sleep 1; ended_at = Time.now }
throbber = Throbber.new(ostream, thread)
thread.join
throbber.join
duration = ended_at - started_at
iterated_chars = " -\\|/"
expected = ""
if duration >= 1
# After n seconds we should have n copies of " -\\|/", excluding \b for now
expected << iterated_chars * duration.to_i
end
# Next append the characters we'd get from working for fractions of a second:
remainder = duration - duration.to_i
expected << iterated_chars[0..((iterated_chars.length*remainder).to_i)] if remainder > 0.0
expected = expected.split('').join("\b") + "\b"
assert_equal expected, ostream.string
end
Последнее присваивание expected
немного неприятно, но я сделал предположение, что пульсатор будет записывать пары символ / обратное пространство атомарно. Если это не так, вы сможете вставить escape-последовательность \ b в строку iterated_chars и полностью удалить последнее назначение.