- argspec:
    required: value
    required_one_of_one: value

- argspec:
    required_one_of_one: value
  register: argspec_required_fail
  ignore_errors: true

- argspec:
    required: value
    required_one_of_two: value

- argspec:
    required: value
  register: argspec_required_one_of_fail
  ignore_errors: true

- argspec:
    required: value
    required_one_of_two: value
    required_by_one: value
    required_by_two: value
    required_by_three: value

- argspec:
    required: value
    required_one_of_two: value
    required_by_one: value
    required_by_two: value
  register: argspec_required_by_fail
  ignore_errors: true

- argspec:
    state: absent
    required: value
    required_one_of_one: value

- argspec:
    state: present
    required: value
    required_one_of_one: value
  register: argspec_required_if_fail
  ignore_errors: true

- argspec:
    state: present
    path: foo
    required: value
    required_one_of_one: value

- argspec:
    state: present
    content: foo
    required: value
    required_one_of_one: value

- argspec:
    state: present
    content: foo
    path: foo
    required: value
    required_one_of_one: value
  register: argspec_mutually_exclusive_fail
  ignore_errors: true

- argspec:
    mapping:
      foo: bar
    required: value
    required_one_of_one: value
  register: argspec_good_mapping

- argspec:
    mapping: foo=bar
    required: value
    required_one_of_one: value
  register: argspec_good_mapping_kv

- argspec:
    mapping: !!str '{"foo": "bar"}'
    required: value
    required_one_of_one: value
  register: argspec_good_mapping_json

- argspec:
    mapping: !!str '{"foo": False}'
    required: value
    required_one_of_one: value
  register: argspec_good_mapping_dict_repr

- argspec:
    mapping: foo
    required: value
    required_one_of_one: value
  register: argspec_bad_mapping_string
  ignore_errors: true

- argspec:
    mapping: 1
    required: value
    required_one_of_one: value
  register: argspec_bad_mapping_int
  ignore_errors: true

- argspec:
    mapping:
      - foo
      - bar
    required: value
    required_one_of_one: value
  register: argspec_bad_mapping_list
  ignore_errors: true

- argspec:
    required_together:
      - thing: foo
        other: bar
        another: baz
    required: value
    required_one_of_one: value

- argspec:
    required_together:
      - another: baz
    required: value
    required_one_of_one: value

- argspec:
    required_together:
      - thing: foo
    required: value
    required_one_of_one: value
  register: argspec_required_together_fail
  ignore_errors: true

- argspec:
    required_together:
      - thing: foo
        other: bar
    required: value
    required_one_of_one: value

- argspec:
    required_if:
      - thing: bar
    required: value
    required_one_of_one: value

- argspec:
    required_if:
      - thing: foo
        other: bar
    required: value
    required_one_of_one: value

- argspec:
    required_if:
      - thing: foo
    required: value
    required_one_of_one: value
  register: argspec_required_if_fail_2
  ignore_errors: true

- argspec:
    required_one_of:
      - thing: foo
        other: bar
    required: value
    required_one_of_one: value

- argspec:
    required_one_of:
      - {}
    required: value
    required_one_of_one: value
  register: argspec_required_one_of_fail_2
  ignore_errors: true

- argspec:
    required_by:
      - thing: foo
        other: bar
    required: value
    required_one_of_one: value

- argspec:
    required_by:
      - thing: foo
    required: value
    required_one_of_one: value
  register: argspec_required_by_fail_2
  ignore_errors: true

- argspec:
    json: !!str '{"foo": "bar"}'
    required: value
    required_one_of_one: value
  register: argspec_good_json_string

- argspec:
    json:
      foo: bar
    required: value
    required_one_of_one: value
  register: argspec_good_json_dict

- argspec:
    json: 1
    required: value
    required_one_of_one: value
  register: argspec_bad_json
  ignore_errors: true

- argspec:
    fail_on_missing_params:
      - needed_param
    needed_param: whatever
    required: value
    required_one_of_one: value

- argspec:
    fail_on_missing_params:
      - needed_param
    required: value
    required_one_of_one: value
  register: argspec_fail_on_missing_params_bad
  ignore_errors: true

- argspec:
    required_together_one: foo
    required_together_two: bar
    required: value
    required_one_of_one: value

- argspec:
    required_together_one: foo
    required: value
    required_one_of_one: value
  register: argspec_fail_required_together_2
  ignore_errors: true

- argspec:
    suboptions_list_no_elements:
      - thing: foo
    required: value
    required_one_of_one: value
  register: argspec_suboptions_list_no_elements

- argspec:
    choices_with_strings_like_bools: on
    required: value
    required_one_of_one: value
  register: argspec_choices_with_strings_like_bools_true

- argspec:
    choices_with_strings_like_bools: 'on'
    required: value
    required_one_of_one: value
  register: argspec_choices_with_strings_like_bools_true_bool

- argspec:
    choices_with_strings_like_bools: off
    required: value
    required_one_of_one: value
  register: argspec_choices_with_strings_like_bools_false

- argspec:
    required: value
    required_one_of_one: value
    choices: foo

- argspec:
    required: value
    required_one_of_one: value
    choices: baz
  register: argspec_choices_bad_choice
  ignore_errors: true

- argspec:
    required: value
    required_one_of_one: value
    list_choices:
      - bar
      - baz

- argspec:
    required: value
    required_one_of_one: value
    list_choices:
      - bar
      - baz
      - qux
  register: argspec_list_choices_bad_choice
  ignore_errors: true

- argspec:
    required: value
    required_one_of_one: value
    primary: foo
  register: argspec_aliases_primary

- argspec:
    required: value
    required_one_of_one: value
    alias: foo
  register: argspec_aliases_alias

- argspec:
    required: value
    required_one_of_one: value
    primary: foo
    alias: foo
  register: argspec_aliases_both

- argspec:
    required: value
    required_one_of_one: value
    primary: foo
    alias: bar
  register: argspec_aliases_both_different

- command: >-
    ansible localhost -m argspec
    -a 'required=value required_one_of_one=value primary=foo alias=bar'
  environment:
    ANSIBLE_LIBRARY: '{{ role_path }}/library'
  register: argspec_aliases_both_warning

- command: ansible localhost -m import_role -a 'role=argspec tasks_from=password_no_log.yml'
  register: argspec_password_no_log

- argspec:
    required: value
    required_one_of_one: value
    int: 1

- argspec:
    required: value
    required_one_of_one: value
    int: foo
  register: argspec_int_invalid
  ignore_errors: true

- argspec:
    required: value
    required_one_of_one: value
  register: argspec_apply_defaults_not_specified

- argspec:
    required: value
    required_one_of_one: value
    apply_defaults: ~
  register: argspec_apply_defaults_none

- argspec:
    required: value
    required_one_of_one: value
    apply_defaults: {}
  register: argspec_apply_defaults_empty

- argspec:
    required: value
    required_one_of_one: value
    apply_defaults:
      foo: bar
  register: argspec_apply_defaults_one

- argspec:
    required: value
    required_one_of_one: value
    deprecation_aliases_version: value
  register: deprecation_alias_version

- argspec:
    required: value
    required_one_of_one: value
    deprecation_aliases_date: value
  register: deprecation_alias_date

- argspec:
    required: value
    required_one_of_one: value
    deprecation_param_version: value
  register: deprecation_param_version

- argspec:
    required: value
    required_one_of_one: value
    deprecation_param_date: value
  register: deprecation_param_date

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation:
      deprecation_aliases_version: value
  register: sub_deprecation_alias_version

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation:
      deprecation_aliases_date: value
  register: sub_deprecation_alias_date

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation:
      deprecation_param_version: value
  register: sub_deprecation_param_version

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation:
      deprecation_param_date: value
  register: sub_deprecation_param_date

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation_alias:
      deprecation_aliases_version: value
  register: subalias_deprecation_alias_version

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation_alias:
      deprecation_aliases_date: value
  register: subalias_deprecation_alias_date

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation_alias:
      deprecation_param_version: value
  register: subalias_deprecation_param_version

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation_alias:
      deprecation_param_date: value
  register: subalias_deprecation_param_date

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation_list:
      - deprecation_aliases_version: value
  register: sublist_deprecation_alias_version

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation_list:
      - deprecation_aliases_date: value
  register: sublist_deprecation_alias_date

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation_list:
      - deprecation_param_version: value
  register: sublist_deprecation_param_version

- argspec:
    required: value
    required_one_of_one: value
    subdeprecation_list:
      - deprecation_param_date: value
  register: sublist_deprecation_param_date

- argspec:
    required: value
    required_one_of_one: value
    apply_defaults:
      bar_alias1: foo
      bar_alias2: baz
  register: alias_warning_dict

- argspec:
    required: value
    required_one_of_one: value
    required_one_of:
      - other: foo
        other_alias: bar
  register: alias_warning_listdict

- assert:
    that:
      - argspec_required_fail is failed

      - argspec_required_one_of_fail is failed

      - argspec_required_by_fail is failed

      - argspec_required_if_fail is failed

      - argspec_mutually_exclusive_fail is failed

      - argspec_good_mapping is successful
      - >-
        argspec_good_mapping.mapping == {'foo': 'bar'}
      - argspec_good_mapping_json is successful
      - >-
        argspec_good_mapping_json.mapping == {'foo': 'bar'}
      - argspec_good_mapping_dict_repr is successful
      - >-
        argspec_good_mapping_dict_repr.mapping == {'foo': False}
      - argspec_good_mapping_kv is successful
      - >-
        argspec_good_mapping_kv.mapping == {'foo': 'bar'}
      - argspec_bad_mapping_string is failed
      - argspec_bad_mapping_int is failed
      - argspec_bad_mapping_list is failed

      - argspec_required_together_fail is failed

      - argspec_required_if_fail_2 is failed

      - argspec_required_one_of_fail_2 is failed

      - argspec_required_by_fail_2 is failed

      - argspec_good_json_string is successful
      - >-
        argspec_good_json_string.json == '{"foo": "bar"}'
      - argspec_good_json_dict is successful
      - >-
        argspec_good_json_dict.json == '{"foo": "bar"}'
      - argspec_bad_json is failed

      - argspec_fail_on_missing_params_bad is failed

      - argspec_fail_required_together_2 is failed

      - >-
        argspec_suboptions_list_no_elements.suboptions_list_no_elements.0 == {'thing': 'foo'}

      - argspec_choices_with_strings_like_bools_true.choices_with_strings_like_bools == 'on'
      - argspec_choices_with_strings_like_bools_true_bool.choices_with_strings_like_bools == 'on'
      - argspec_choices_with_strings_like_bools_false.choices_with_strings_like_bools == 'off'

      - argspec_choices_bad_choice is failed

      - argspec_list_choices_bad_choice is failed

      - argspec_aliases_primary.primary == 'foo'
      - argspec_aliases_primary.alias is undefined
      - argspec_aliases_alias.primary == 'foo'
      - argspec_aliases_alias.alias == 'foo'
      - argspec_aliases_both.primary == 'foo'
      - argspec_aliases_both.alias == 'foo'
      - argspec_aliases_both_different.primary == 'bar'
      - argspec_aliases_both_different.alias == 'bar'
      - '"[WARNING]: Both option primary and its alias alias are set." in argspec_aliases_both_warning.stderr'

      - '"Module did not set no_log for maybe_password" in argspec_password_no_log.stderr'
      - '"Module did not set no_log for password" not in argspec_password_no_log.stderr'
      - '"Module did not set no_log for not_a_password" not in argspec_password_no_log.stderr'
      - argspec_password_no_log.stdout|regex_findall('VALUE_SPECIFIED_IN_NO_LOG_PARAMETER')|length == 1

      - argspec_int_invalid is failed

      - "argspec_apply_defaults_not_specified.apply_defaults == {'foo': none, 'bar': 'baz'}"
      - "argspec_apply_defaults_none.apply_defaults == {'foo': none, 'bar': 'baz'}"
      - "argspec_apply_defaults_empty.apply_defaults == {'foo': none, 'bar': 'baz'}"
      - "argspec_apply_defaults_one.apply_defaults == {'foo': 'bar', 'bar': 'baz'}"

      - deprecation_alias_version.deprecations | length == 1
      - deprecation_alias_version.deprecations[0].msg == "Alias 'deprecation_aliases_version' is deprecated. See the module docs for more information"
      - deprecation_alias_version.deprecations[0].collection_name == 'foo.bar'
      - deprecation_alias_version.deprecations[0].version == '2.0.0'
      - "'date' not in deprecation_alias_version.deprecations[0]"
      - deprecation_alias_date.deprecations | length == 1
      - deprecation_alias_date.deprecations[0].msg == "Alias 'deprecation_aliases_date' is deprecated. See the module docs for more information"
      - deprecation_alias_date.deprecations[0].collection_name == 'foo.bar'
      - deprecation_alias_date.deprecations[0].date == '2023-01-01'
      - "'version' not in deprecation_alias_date.deprecations[0]"
      - deprecation_param_version.deprecations | length == 1
      - deprecation_param_version.deprecations[0].msg == "Param 'deprecation_param_version' is deprecated. See the module docs for more information"
      - deprecation_param_version.deprecations[0].collection_name == 'foo.bar'
      - deprecation_param_version.deprecations[0].version == '2.0.0'
      - "'date' not in deprecation_param_version.deprecations[0]"
      - deprecation_param_date.deprecations | length == 1
      - deprecation_param_date.deprecations[0].msg == "Param 'deprecation_param_date' is deprecated. See the module docs for more information"
      - deprecation_param_date.deprecations[0].collection_name == 'foo.bar'
      - deprecation_param_date.deprecations[0].date == '2023-01-01'
      - "'version' not in deprecation_param_date.deprecations[0]"

      - sub_deprecation_alias_version.deprecations | length == 1
      - sub_deprecation_alias_version.deprecations[0].msg == "Alias 'subdeprecation.deprecation_aliases_version' is deprecated. See the module docs for more information"
      - sub_deprecation_alias_version.deprecations[0].collection_name == 'foo.bar'
      - sub_deprecation_alias_version.deprecations[0].version == '2.0.0'
      - "'date' not in sub_deprecation_alias_version.deprecations[0]"
      - sub_deprecation_alias_date.deprecations | length == 1
      - sub_deprecation_alias_date.deprecations[0].msg == "Alias 'subdeprecation.deprecation_aliases_date' is deprecated. See the module docs for more information"
      - sub_deprecation_alias_date.deprecations[0].collection_name == 'foo.bar'
      - sub_deprecation_alias_date.deprecations[0].date == '2023-01-01'
      - "'version' not in sub_deprecation_alias_date.deprecations[0]"
      - sub_deprecation_param_version.deprecations | length == 1
      - sub_deprecation_param_version.deprecations[0].msg == "Param 'subdeprecation[\"deprecation_param_version\"]' is deprecated. See the module docs for more information"
      - sub_deprecation_param_version.deprecations[0].collection_name == 'foo.bar'
      - sub_deprecation_param_version.deprecations[0].version == '2.0.0'
      - "'date' not in sub_deprecation_param_version.deprecations[0]"
      - sub_deprecation_param_date.deprecations | length == 1
      - sub_deprecation_param_date.deprecations[0].msg == "Param 'subdeprecation[\"deprecation_param_date\"]' is deprecated. See the module docs for more information"
      - sub_deprecation_param_date.deprecations[0].collection_name == 'foo.bar'
      - sub_deprecation_param_date.deprecations[0].date == '2023-01-01'
      - "'version' not in sub_deprecation_param_date.deprecations[0]"

      - subalias_deprecation_alias_version.deprecations | length == 1
      - subalias_deprecation_alias_version.deprecations[0].msg == "Alias 'subdeprecation.deprecation_aliases_version' is deprecated. See the module docs for more information"
      - subalias_deprecation_alias_version.deprecations[0].collection_name == 'foo.bar'
      - subalias_deprecation_alias_version.deprecations[0].version == '2.0.0'
      - "'date' not in subalias_deprecation_alias_version.deprecations[0]"
      - subalias_deprecation_alias_date.deprecations | length == 1
      - subalias_deprecation_alias_date.deprecations[0].msg == "Alias 'subdeprecation.deprecation_aliases_date' is deprecated. See the module docs for more information"
      - subalias_deprecation_alias_date.deprecations[0].collection_name == 'foo.bar'
      - subalias_deprecation_alias_date.deprecations[0].date == '2023-01-01'
      - "'version' not in subalias_deprecation_alias_date.deprecations[0]"
      - subalias_deprecation_param_version.deprecations | length == 1
      - subalias_deprecation_param_version.deprecations[0].msg == "Param 'subdeprecation[\"deprecation_param_version\"]' is deprecated. See the module docs for more information"
      - subalias_deprecation_param_version.deprecations[0].collection_name == 'foo.bar'
      - subalias_deprecation_param_version.deprecations[0].version == '2.0.0'
      - "'date' not in subalias_deprecation_param_version.deprecations[0]"
      - subalias_deprecation_param_date.deprecations | length == 1
      - subalias_deprecation_param_date.deprecations[0].msg == "Param 'subdeprecation[\"deprecation_param_date\"]' is deprecated. See the module docs for more information"
      - subalias_deprecation_param_date.deprecations[0].collection_name == 'foo.bar'
      - subalias_deprecation_param_date.deprecations[0].date == '2023-01-01'
      - "'version' not in subalias_deprecation_param_date.deprecations[0]"

      - sublist_deprecation_alias_version.deprecations | length == 1
      - sublist_deprecation_alias_version.deprecations[0].msg == "Alias 'subdeprecation_list[0].deprecation_aliases_version' is deprecated. See the module docs for more information"
      - sublist_deprecation_alias_version.deprecations[0].collection_name == 'foo.bar'
      - sublist_deprecation_alias_version.deprecations[0].version == '2.0.0'
      - "'date' not in sublist_deprecation_alias_version.deprecations[0]"
      - sublist_deprecation_alias_date.deprecations | length == 1
      - sublist_deprecation_alias_date.deprecations[0].msg == "Alias 'subdeprecation_list[0].deprecation_aliases_date' is deprecated. See the module docs for more information"
      - sublist_deprecation_alias_date.deprecations[0].collection_name == 'foo.bar'
      - sublist_deprecation_alias_date.deprecations[0].date == '2023-01-01'
      - "'version' not in sublist_deprecation_alias_date.deprecations[0]"
      - sublist_deprecation_param_version.deprecations | length == 1
      - sublist_deprecation_param_version.deprecations[0].msg == "Param 'subdeprecation_list[\"deprecation_param_version\"]' is deprecated. See the module docs for more information"
      - sublist_deprecation_param_version.deprecations[0].collection_name == 'foo.bar'
      - sublist_deprecation_param_version.deprecations[0].version == '2.0.0'
      - "'date' not in sublist_deprecation_param_version.deprecations[0]"
      - sublist_deprecation_param_date.deprecations | length == 1
      - sublist_deprecation_param_date.deprecations[0].msg == "Param 'subdeprecation_list[\"deprecation_param_date\"]' is deprecated. See the module docs for more information"
      - sublist_deprecation_param_date.deprecations[0].collection_name == 'foo.bar'
      - sublist_deprecation_param_date.deprecations[0].date == '2023-01-01'
      - "'version' not in sublist_deprecation_param_date.deprecations[0]"

      - "'Both option apply_defaults.bar and its alias apply_defaults.bar_alias2 are set.' in alias_warning_dict.warnings"
      - "'Both option required_one_of[0].other and its alias required_one_of[0].other_alias are set.' in alias_warning_listdict.warnings"
