---
- win_shell: $AnsiPart = Get-Partition -DriveLetter T; $AnsiVol = Get-Volume -DriveLetter T; "$($AnsiPart.Size),$($AnsiVol.Size)"
  register: shell_result

- name: Assert volume size is 0 for pristine volume
  assert:
    that:
      - shell_result.stdout | trim == "2096037888,0"

- name: Get partition access path
  win_shell: (Get-Partition -DriveLetter T).AccessPaths[1]
  register: shell_partition_result

- name: Try to format using mutually exclusive parameters
  win_format:
    drive_letter: T
    path: "{{ shell_partition_result.stdout | trim }}"
  register: format_mutex_result
  ignore_errors: True

- assert:
    that:
      - format_mutex_result is failed
      - 'format_mutex_result.msg == "parameters are mutually exclusive: drive_letter, path, label"'

- name: Fully format volume and assign label (check)
  win_format:
    drive_letter: T
    new_label: Formatted
    full: True
  register: format_result_check
  check_mode: True

- win_shell: $AnsiPart = Get-Partition -DriveLetter T; $AnsiVol = Get-Volume -DriveLetter T; "$($AnsiPart.Size),$($AnsiVol.Size),$($AnsiVol.FileSystemLabel)"
  register: formatted_value_result_check

- name: Fully format volume and assign label
  win_format:
    drive_letter: T
    new_label: Formatted
    full: True
  register: format_result

- win_shell: $AnsiPart = Get-Partition -DriveLetter T; $AnsiVol = Get-Volume -DriveLetter T; "$($AnsiPart.Size),$($AnsiVol.Size),$($AnsiVol.FileSystemLabel)"
  register: formatted_value_result

- assert:
    that:
      - format_result_check is changed
      - format_result is changed
      - formatted_value_result_check.stdout | trim == "2096037888,0,"
      - formatted_value_result.stdout | trim == "2096037888,2096033792,Formatted"

- name: Format NTFS volume with integrity streams enabled
  win_format:
    path: "{{ shell_partition_result.stdout | trim }}"
    file_system: ntfs
    integrity_streams: True
  ignore_errors: True
  register: ntfs_integrity_streams

- assert:
    that:
      - ntfs_integrity_streams is failed
      - 'ntfs_integrity_streams.msg == "Integrity streams can be enabled only on ReFS volumes. You specified: ntfs"'

- name: Format volume (require force_format for specifying different file system)
  win_format:
    path: "{{ shell_partition_result.stdout | trim }}"
    file_system: fat32
  ignore_errors: True
  register: require_force_format

- assert:
    that:
      - require_force_format is failed
      - 'require_force_format.msg == "Force format must be specified since target file system: fat32 is different from the current file system of the volume: ntfs"'

- name: Format volume (forced) (check)
  win_format:
    path: "{{ shell_partition_result.stdout | trim }}"
    file_system: refs
    force: True
  check_mode: True
  ignore_errors: True
  register: not_pristine_forced_check

- name: Format volume (forced)
  win_format:
    path: "{{ shell_partition_result.stdout | trim }}"
    file_system: refs
    force: True
  register: not_pristine_forced

- name: Format volume (forced) (idempotence will not work)
  win_format:
    path: "{{ shell_partition_result.stdout | trim }}"
    file_system: refs
    force: True
  register: not_pristine_forced_idem_fails

- name: Format volume (idempotence)
  win_format:
    path: "{{ shell_partition_result.stdout | trim }}"
    file_system: refs
  register: not_pristine_forced_idem

- assert:
    that:
      - not_pristine_forced_check is changed
      - not_pristine_forced is changed
      - not_pristine_forced_idem_fails is changed
      - not_pristine_forced_idem is not changed

- name: Add a file
  win_file:
    path: T:\path\to\directory
    state: directory
  register: add_file_to_volume

- name: Format volume with file inside without force
  win_format:
    path: "{{ shell_partition_result.stdout | trim }}"
  register: format_volume_without_force
  ignore_errors: True

- name: Format volume with file inside with force
  win_format:
    path: "{{ shell_partition_result.stdout | trim }}"
    force: True
  register: format_volume_with_force

- assert:
    that:
      - add_file_to_volume is changed
      - format_volume_without_force is failed
      - 'format_volume_without_force.msg == "Force format must be specified to format non-pristine volumes"'
      - format_volume_with_force is changed
