def self.validate(klass_name, method_name = nil,
nodes = Heckle::MUTATABLE_NODES, force = false)
load_test_files
klass = klass_name.to_class
klass_methods = klass.singleton_methods(false).collect {|meth| "self.#{meth}"}
if method_name
if method_name =~ %rself\./
abort "Unknown method: #{klass_name}.#{method_name.gsub('self.', '')}" unless klass_methods.include? method_name
else
abort "Unknown method: #{klass_name}##{method_name}" unless klass.instance_methods(false).include? method_name
end
end
initial_time = Time.now
heckle = self.new(klass_name)
passed = heckle.tests_pass?
unless force or passed then
abort "Initial run of tests failed... fix and run heckle again"
end
if self.guess_timeout? then
running_time = Time.now - initial_time
adjusted_timeout = (running_time * 2 < 5) ? 5 : (running_time * 2).ceil
self.timeout = adjusted_timeout
end
puts "Timeout set to #{adjusted_timeout} seconds."
if passed then
puts "Initial tests pass. Let's rumble."
else
puts "Initial tests failed but you forced things. Let's rumble."
end
puts
methods = method_name ? Array(method_name) : klass.instance_methods(false) + klass_methods
counts = Hash.new(0)
methods.sort.each do |method_name|
result = self.new(klass_name, method_name, nodes).validate
counts[result] += 1
end
all_good = counts[false] == 0
puts "Heckle Results:"
puts
puts "Passed : %3d" % counts[true]
puts "Failed : %3d" % counts[false]
puts "Thick Skin: %3d" % counts[nil]
puts
if all_good then
puts "All heckling was thwarted! YAY!!!"
else
puts "Improve the tests and try again."
end
all_good
end