class Test::Unit::AutoRunner

def options

def options
  @options ||= OptionParser.new do |o|
    o.banner = "Test::Unit automatic runner."
    o.banner += "\nUsage: #{$0} [options] [-- untouched arguments]"
    o.on("-r", "--runner=RUNNER", RUNNERS,
         "Use the given RUNNER.",
         "(" + keyword_display(RUNNERS) + ")") do |r|
      @runner = r
    end
    o.on("--collector=COLLECTOR", COLLECTORS,
         "Use the given COLLECTOR.",
         "(" + keyword_display(COLLECTORS) + ")") do |collector|
      @collector = collector
    end
    if (@standalone)
      o.on("-b", "--basedir=DIR", "Base directory of test suites.") do |b|
        @base = b
      end
      o.on("-w", "--workdir=DIR", "Working directory to run tests.") do |w|
        @workdir = w
      end
      o.on("--default-test-path=PATH",
           "Add PATH to the default test paths.",
           "The PATH is used when user doesn't specify any test path.",
           "You can specify this option multiple times.") do |path|
        @default_test_paths << path
      end
      o.on("-a", "--add=TORUN", Array,
           "Add TORUN to the list of things to run;",
           "can be a file or a directory.") do |paths|
        paths.each do |path|
          add_test_path(path)
        end
      end
      @pattern = []
      o.on("-p", "--pattern=PATTERN", Regexp,
           "Match files to collect against PATTERN.") do |e|
        @pattern << e
      end
      @exclude = []
      o.on("-x", "--exclude=PATTERN", Regexp,
           "Ignore files to collect against PATTERN.") do |e|
        @exclude << e
      end
    end
    o.on("-n", "--name=NAME", String,
         "Runs tests matching NAME.",
         "Use '/PATTERN/' for NAME to use regular expression.",
         "Regular expression accepts options.",
         "Example: '/taRget/i' matches 'target' and 'TARGET'") do |name|
      name = prepare_name(name)
      @filters << lambda do |test|
        match_test_name(test, name)
      end
    end
    o.on("--ignore-name=NAME", String,
         "Ignores tests matching NAME.",
         "Use '/PATTERN/' for NAME to use regular expression.",
         "Regular expression accepts options.",
         "Example: '/taRget/i' matches 'target' and 'TARGET'") do |name|
      name = prepare_name(name)
      @filters << lambda do |test|
        not match_test_name(test, name)
      end
    end
    o.on("-t", "--testcase=TESTCASE", String,
         "Runs tests in TestCases matching TESTCASE.",
         "Use '/PATTERN/' for TESTCASE to use regular expression.",
         "Regular expression accepts options.",
         "Example: '/taRget/i' matches 'target' and 'TARGET'") do |name|
      name = prepare_name(name)
      @filters << lambda do |test|
        match_test_case_name(test, name)
      end
    end
    o.on("--ignore-testcase=TESTCASE", String,
         "Ignores tests in TestCases matching TESTCASE.",
         "Use '/PATTERN/' for TESTCASE to use regular expression.",
         "Regular expression accepts options.",
         "Example: '/taRget/i' matches 'target' and 'TARGET'") do |name|
      name = prepare_name(name)
      @filters << lambda do |test|
        not match_test_case_name(test, name)
      end
    end
    o.on("--location=LOCATION", String,
         "Runs tests that defined in LOCATION.",
         "LOCATION is one of PATH:LINE, PATH or LINE.") do |location|
      case location
      when /\A(\d+)\z/
        path = nil
        line = $1.to_i
      when /:(\d+)\z/
        path = $PREMATCH
        line = $1.to_i
      else
        path = location
        line = nil
      end
      add_location_filter(path, line)
    end
    o.on("--attribute=EXPRESSION", String,
         "Runs tests that matches EXPRESSION.",
         "EXPRESSION is evaluated as Ruby's expression.",
         "Test attribute name can be used with no receiver in EXPRESSION.",
         "EXPRESSION examples:",
         "  !slow",
         "  tag == 'important' and !slow") do |expression|
      @filters << lambda do |test|
        matcher = AttributeMatcher.new(test)
        matcher.match?(expression)
      end
    end
    priority_filter = Proc.new do |test|
      if @filters == [priority_filter]
        Priority::Checker.new(test).need_to_run?
      else
        nil
      end
    end
    o.on("--[no-]priority-mode",
         "Runs some tests based on their priority.") do |priority_mode|
      if priority_mode
        Priority.enable
        @filters |= [priority_filter]
      else
        Priority.disable
        @filters -= [priority_filter]
      end
    end
    o.on("--default-priority=PRIORITY",
         Priority.available_values,
         "Uses PRIORITY as default priority",
         "(#{keyword_display(Priority.available_values)})") do |priority|
      Priority.default = priority
    end
    o.on("-I", "--load-path=DIR[#{File::PATH_SEPARATOR}DIR...]",
         "Appends directory list to $LOAD_PATH.") do |dirs|
      $LOAD_PATH.concat(dirs.split(File::PATH_SEPARATOR))
    end
    color_schemes = ColorScheme.all
    o.on("--color-scheme=SCHEME", color_schemes,
         "Use SCHEME as color scheme.",
         "(#{keyword_display(color_schemes)})") do |scheme|
      @color_scheme = scheme
    end
    o.on("--config=FILE",
         "Use YAML format FILE content as configuration file.") do |file|
      load_config(file)
    end
    o.on("--order=ORDER", TestCase::AVAILABLE_ORDERS,
         "Run tests in a test case in ORDER order.",
         "(#{keyword_display(TestCase::AVAILABLE_ORDERS)})") do |order|
      TestCase.test_order = order
    end
    assertion_message_class = Test::Unit::Assertions::AssertionMessage
    o.on("--max-diff-target-string-size=SIZE", Integer,
         "Shows diff if both expected result string size and " +
         "actual result string size are " +
         "less than or equal SIZE in bytes.",
         "(#{assertion_message_class.max_diff_target_string_size})") do |size|
      assertion_message_class.max_diff_target_string_size = size
    end
    o.on("--[no-]stop-on-failure",
         "Stops immediately on the first non success test",
         "(#{@stop_on_failure})") do |boolean|
      @stop_on_failure = boolean
    end
    o.on("--[no-]debug-on-failure",
         "Run debugger if available on failure",
         "(#{AssertionFailedError.debug_on_failure?})") do |boolean|
      AssertionFailedError.debug_on_failure = boolean
    end
    o.on("--[no-]gc-stress",
         "Enable GC.stress only while each test is running",
         "(#{@gc_stress})") do |boolean|
      @gc_stress = boolean
    end
    parallel_options = [
      :thread,
    ]
    o.on("--[no-]parallel=[thread]", parallel_options,
         "Runs tests in parallel",
         "(#{parallel_options.first})") do |parallel|
      case parallel
      when nil, :thread
        @test_suite_runner_class = TestSuiteThreadRunner
      else
        @test_suite_runner_class = TestSuiteRunner
      end
    end
    o.on("--n-workers=N", Integer,
         "The number of parallelism",
         "(#{TestSuiteRunner.n_workers})") do |n|
      TestSuiteRunner.n_workers = n
    end
    ADDITIONAL_OPTIONS.each do |option_builder|
      option_builder.call(self, o)
    end
    o.on("--",
         "Stop processing options so that the",
         "remaining options will be passed to the",
         "test."){o.terminate}
    o.on("-h", "--help", "Display this help."){puts o; exit}
    o.on_tail
    o.on_tail("Deprecated options:")
    o.on_tail("--console", "Console runner (use --runner).") do
      warn("Deprecated option (--console).")
      @runner = self.class.runner(:console)
    end
    if RUNNERS[:fox]
      o.on_tail("--fox", "Fox runner (use --runner).") do
        warn("Deprecated option (--fox).")
        @runner = self.class.runner(:fox)
      end
    end
    o.on_tail
  end
end