test_arg_parser.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import pytest
  2. from openhands.core.config import OH_DEFAULT_AGENT, OH_MAX_ITERATIONS, get_parser
  3. def test_parser_default_values():
  4. parser = get_parser()
  5. args = parser.parse_args([])
  6. assert args.directory is None
  7. assert args.task == ''
  8. assert args.file is None
  9. assert args.agent_cls == OH_DEFAULT_AGENT
  10. assert args.max_iterations == OH_MAX_ITERATIONS
  11. assert args.max_budget_per_task is None
  12. assert args.eval_output_dir == 'evaluation/evaluation_outputs/outputs'
  13. assert args.eval_n_limit is None
  14. assert args.eval_num_workers == 4
  15. assert args.eval_note is None
  16. assert args.llm_config is None
  17. assert args.name == 'default'
  18. assert not args.no_auto_continue
  19. def test_parser_custom_values():
  20. parser = get_parser()
  21. args = parser.parse_args(
  22. [
  23. '-d',
  24. '/path/to/dir',
  25. '-t',
  26. 'custom task',
  27. '-f',
  28. 'task.txt',
  29. '-c',
  30. 'CustomAgent',
  31. '-i',
  32. '50',
  33. '-b',
  34. '100.5',
  35. '--eval-output-dir',
  36. 'custom/output',
  37. '--eval-n-limit',
  38. '10',
  39. '--eval-num-workers',
  40. '8',
  41. '--eval-note',
  42. 'Test run',
  43. '-l',
  44. 'gpt4',
  45. '-n',
  46. 'test_session',
  47. '--no-auto-continue',
  48. ]
  49. )
  50. assert args.directory == '/path/to/dir'
  51. assert args.task == 'custom task'
  52. assert args.file == 'task.txt'
  53. assert args.agent_cls == 'CustomAgent'
  54. assert args.max_iterations == 50
  55. assert args.max_budget_per_task == pytest.approx(100.5)
  56. assert args.eval_output_dir == 'custom/output'
  57. assert args.eval_n_limit == 10
  58. assert args.eval_num_workers == 8
  59. assert args.eval_note == 'Test run'
  60. assert args.llm_config == 'gpt4'
  61. assert args.name == 'test_session'
  62. assert args.no_auto_continue
  63. def test_parser_file_overrides_task():
  64. parser = get_parser()
  65. args = parser.parse_args(['-t', 'task from command', '-f', 'task_file.txt'])
  66. assert args.task == 'task from command'
  67. assert args.file == 'task_file.txt'
  68. def test_parser_invalid_max_iterations():
  69. parser = get_parser()
  70. with pytest.raises(SystemExit):
  71. parser.parse_args(['-i', 'not_a_number'])
  72. def test_parser_invalid_max_budget():
  73. parser = get_parser()
  74. with pytest.raises(SystemExit):
  75. parser.parse_args(['-b', 'not_a_number'])
  76. def test_parser_invalid_eval_n_limit():
  77. parser = get_parser()
  78. with pytest.raises(SystemExit):
  79. parser.parse_args(['--eval-n-limit', 'not_a_number'])
  80. def test_parser_invalid_eval_num_workers():
  81. parser = get_parser()
  82. with pytest.raises(SystemExit):
  83. parser.parse_args(['--eval-num-workers', 'not_a_number'])
  84. def test_help_message(capsys):
  85. parser = get_parser()
  86. with pytest.raises(SystemExit):
  87. parser.parse_args(['--help'])
  88. captured = capsys.readouterr()
  89. help_output = captured.out
  90. print(help_output)
  91. expected_elements = [
  92. 'usage:',
  93. 'Run an agent with a specific task',
  94. 'options:',
  95. '-h, --help',
  96. '-d DIRECTORY, --directory DIRECTORY',
  97. '-t TASK, --task TASK',
  98. '-f FILE, --file FILE',
  99. '-c AGENT_CLS, --agent-cls AGENT_CLS',
  100. '-i MAX_ITERATIONS, --max-iterations MAX_ITERATIONS',
  101. '-b MAX_BUDGET_PER_TASK, --max-budget-per-task MAX_BUDGET_PER_TASK',
  102. '--eval-output-dir EVAL_OUTPUT_DIR',
  103. '--eval-n-limit EVAL_N_LIMIT',
  104. '--eval-num-workers EVAL_NUM_WORKERS',
  105. '--eval-note EVAL_NOTE',
  106. '--eval-ids EVAL_IDS',
  107. '-l LLM_CONFIG, --llm-config LLM_CONFIG',
  108. '-n NAME, --name NAME',
  109. '--config-file CONFIG_FILE',
  110. '--no-auto-continue',
  111. ]
  112. for element in expected_elements:
  113. assert element in help_output, f"Expected '{element}' to be in the help message"
  114. option_count = help_output.count(' -')
  115. assert option_count == 16, f'Expected 16 options, found {option_count}'