calog/vendor/mruby/mrbgems/mruby-task/test/task.rb
2026-07-04 20:25:00 -05:00

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