# File lib/heckle.rb, line 158
  def validate
    left = mutations_left

    if left == 0 then
      @reporter.no_mutations(method_name)
      return
    end

    @reporter.method_loaded(klass_name, method_name, left)

    until left == 0 do
      @reporter.remaining_mutations left
      reset_tree
      begin
        process current_tree
        timeout(@@timeout, Heckle::Timeout) { run_tests }
      rescue SyntaxError => e
        @reporter.warning "Mutation caused a syntax error:\n\n#{e.message}}"
      rescue Heckle::Timeout
        @reporter.warning "Your tests timed out. Heckle may have caused an infinite loop."
      rescue Interrupt
        @reporter.warning 'Mutation canceled, hit ^C again to exit'
        sleep 2
      end

      left = mutations_left
    end

    reset # in case we're validating again. we should clean up.

    unless @failures.empty?
      @reporter.no_failures
      @failures.each do |failure|
        original = Ruby2Ruby.new.process(@original_tree.deep_clone)
        @reporter.failure(original, failure)
      end
      false
    else
      @reporter.no_surviving_mutants
      true
    end
  end