185 lines
4.4 KiB
Ruby
Vendored
185 lines
4.4 KiB
Ruby
Vendored
# Sleep/usleep tests (from mruby-sleep)
|
|
# Note: Use minimal sleep times to avoid test slowdown
|
|
|
|
assert("sleep accepts non-negative values") do
|
|
assert_nothing_raised { sleep(0) }
|
|
end
|
|
|
|
assert("sleep accepts non-negative float values") do
|
|
skip unless Object.const_defined?(:Float)
|
|
assert_nothing_raised { sleep(0.0) }
|
|
assert_nothing_raised { sleep(-0.0) }
|
|
end
|
|
|
|
assert("sleep raises ArgumentError for negative integer") do
|
|
assert_raise(ArgumentError) { sleep(-1) }
|
|
end
|
|
|
|
assert("sleep raises ArgumentError for negative float") do
|
|
skip unless Object.const_defined?(:Float)
|
|
assert_raise(ArgumentError) { sleep(-0.1) }
|
|
end
|
|
|
|
assert("usleep accepts non-negative values") do
|
|
assert_nothing_raised { usleep(0) }
|
|
end
|
|
|
|
assert("usleep raises ArgumentError for negative value") do
|
|
assert_raise(ArgumentError) { usleep(-100) }
|
|
end
|
|
|
|
# Task creation tests
|
|
|
|
assert("Task.new creates a task") do
|
|
task = Task.new { }
|
|
assert_kind_of Task, task
|
|
end
|
|
|
|
assert("Task.new accepts name") do
|
|
task = Task.new(name: "test") { }
|
|
assert_equal "test", task.name
|
|
end
|
|
|
|
assert("Task.new accepts priority") do
|
|
task = Task.new(priority: 100) { }
|
|
assert_equal 100, task.priority
|
|
end
|
|
|
|
assert("Task.new raises without block") do
|
|
assert_raise(ArgumentError) { Task.new }
|
|
end
|
|
|
|
# Task state tests
|
|
|
|
assert("Task#status returns symbol") do
|
|
task = Task.new { }
|
|
status = task.status
|
|
assert_true [:READY, :RUNNING, :WAITING, :SUSPENDED, :DORMANT, :UNKNOWN].include?(status)
|
|
end
|
|
|
|
assert("new task has READY status") do
|
|
task = Task.new { }
|
|
assert_equal :READY, task.status
|
|
end
|
|
|
|
assert("Task#inspect returns formatted string") do
|
|
task = Task.new(name: "test") { }
|
|
inspect_str = task.inspect
|
|
assert_kind_of String, inspect_str
|
|
assert_true inspect_str.include?("Task")
|
|
assert_true inspect_str.include?("test")
|
|
end
|
|
|
|
assert("Task#inspect shows status") do
|
|
task = Task.new { }
|
|
inspect_str = task.inspect
|
|
assert_true inspect_str.include?("READY") || inspect_str.include?("DORMANT")
|
|
end
|
|
|
|
# Task control methods
|
|
|
|
assert("Task#suspend doesn't raise") do
|
|
task = Task.new { }
|
|
assert_nothing_raised { task.suspend }
|
|
end
|
|
|
|
assert("Task#resume doesn't raise") do
|
|
task = Task.new { }
|
|
assert_nothing_raised { task.resume }
|
|
end
|
|
|
|
assert("Task#terminate doesn't raise") do
|
|
task = Task.new { }
|
|
assert_nothing_raised { task.terminate }
|
|
end
|
|
|
|
# Task.current tests
|
|
|
|
assert("Task.current in root context") do
|
|
# In root context, Task.current might be nil or a special value
|
|
current = Task.current
|
|
assert_true current.nil? || current.kind_of?(Task)
|
|
end
|
|
|
|
# Task.pass tests
|
|
|
|
assert("Task.pass yields control") do
|
|
assert_nothing_raised { Task.pass }
|
|
end
|
|
|
|
# Task.stat tests
|
|
|
|
assert("Task.stat returns hash") do
|
|
stat = Task.stat
|
|
assert_kind_of Hash, stat
|
|
end
|
|
|
|
assert("Task.stat includes tick") do
|
|
stat = Task.stat
|
|
assert_true stat.has_key?(:tick)
|
|
assert_kind_of Integer, stat[:tick]
|
|
end
|
|
|
|
assert("Task.stat includes wakeup_tick") do
|
|
stat = Task.stat
|
|
assert_true stat.has_key?(:wakeup_tick)
|
|
assert_kind_of Integer, stat[:wakeup_tick]
|
|
end
|
|
|
|
assert("Task.stat includes queue counts") do
|
|
stat = Task.stat
|
|
[:ready, :waiting, :suspended, :dormant].each do |queue|
|
|
assert_true stat.has_key?(queue), "Missing queue: #{queue}"
|
|
assert_kind_of Hash, stat[queue]
|
|
assert_true stat[queue].has_key?(:count)
|
|
assert_kind_of Integer, stat[queue][:count]
|
|
assert_true stat[queue].has_key?(:tasks)
|
|
assert_kind_of Array, stat[queue][:tasks]
|
|
end
|
|
end
|
|
|
|
assert("Task.stat tracks task counts") do
|
|
stat_before = Task.stat
|
|
ready_before = stat_before[:ready][:count]
|
|
|
|
task1 = Task.new { sleep 0 }
|
|
task2 = Task.new { sleep 0 }
|
|
|
|
stat_after = Task.stat
|
|
ready_after = stat_after[:ready][:count]
|
|
|
|
assert_equal ready_before + 2, ready_after
|
|
end
|
|
|
|
# Priority tests
|
|
|
|
assert("Task.new accepts different priorities") do
|
|
low = Task.new(priority: 200) { }
|
|
high = Task.new(priority: 50) { }
|
|
med = Task.new(priority: 128) { }
|
|
|
|
assert_equal 200, low.priority
|
|
assert_equal 50, high.priority
|
|
assert_equal 128, med.priority
|
|
end
|
|
|
|
# Name handling
|
|
|
|
assert("Task with string name") do
|
|
task = Task.new(name: "string_name") { }
|
|
assert_equal "string_name", task.name
|
|
end
|
|
|
|
assert("Task without name returns (noname)") do
|
|
task = Task.new { }
|
|
assert_equal "(noname)", task.name
|
|
end
|
|
|
|
# Edge cases
|
|
|
|
assert("Task.new with block doesn't execute immediately") do
|
|
executed = false
|
|
task = Task.new { executed = true }
|
|
# Block should not execute until scheduler runs
|
|
assert_false executed
|
|
end
|