module DRbQS
  module Test
    class Server < DRbQS::Server
      PROF_FILE = 'drbqs_prof.txt'

      def exit
        throw(:exit_loop)
      end

      def loop_for_test(limit, profile, printer, &block)
        result = { :start => Time.now }
        num = 0
        if profile
          require 'drbqs/server/prof'
          result[:profile] = FileName.create(PROF_FILE, :position => :middle)
          prof = DRbQS::Prof.new(printer || :flat, result[:profile])
          prof.start
        end
        begin
          catch(:exit_loop) do
            loop do
              yield
              if limit
                num += 1
                if num >= limit
                  exec_finish_hook
                  break
                end
              end
            end
          end
        rescue Exception => err
          $stdout.puts "*** Error occurs in calculation roop ***"
          b = err.backtrace
          $stdout.puts "#{b[0]}: #{err.to_s} (#{err.class})"
          $stdout.puts b[1..-1].join("\n") if b.size > 1
        end
        if profile
          prof.finish
        end
        result[:end] = Time.now
        result
      end
      private :loop_for_test

      def test_exec(opts = {})
        require 'drbqs/server/test/node'
        first_task_generator_init
        set_file_transfer(nil)
        test_node = DRbQS::Test::Node.new(@logger.level, @ts[:transfer], @ts[:queue])
        n = 0
        data = loop_for_test(opts[:limit], opts[:profile], opts[:printer]) do
          exec_hook
          if ary = test_node.calc
            @queue.exec_task_hook(self, *ary)
            n += 1
          end
        end
        test_node.finalize(@finalization_task)
        data[:task] = n
        data
      end

      def test_task_generator(opts = {})
        @task_generator.each_with_index do |t, i|
          puts "Test task generator [#{i}]"
          t.init
          set_num, task_num = t.debug_all_tasks(opts)
          puts "Create: task sets #{set_num}, all tasks #{task_num}"
        end
      end
    end
  end
end