---
- name: test
  win_file:
    path: "{{win_output_dir}}"
    state: absent

- name: make sure win output dir exists
  win_file:
    path: "{{win_output_dir}}"
    state: directory

- name: template out test registry structure
  win_copy:
    src: test_reg.reg
    dest: "{{win_output_dir}}\\raw_test_reg.reg"

- name: convert the line endings to the windows variant
  win_shell: Get-Content "{{win_output_dir}}\raw_test_reg.reg" | Set-Content "{{win_output_dir}}\test_reg.reg"

- name: import test registry structure
  win_regmerge:
    path: "{{win_output_dir}}\\test_reg.reg"

- name: get value of expand string %windir%
  win_command: powershell.exe $env:windir
  register: win_dir_value

- name: expect failure when not passing in path option
  win_reg_stat:
    name: a
  register: actual
  failed_when: "actual.msg != 'Get-AnsibleParam: Missing required argument: path'"

- name: expect failure when passing in an invalid hive
  win_reg_stat:
    path: ABCD:\test
  register: actual
  failed_when: actual.msg != "the hive in path is 'ABCD'; must be 'HKCR', 'HKCC', 'HKCU', 'HKLM' or 'HKU'"

- name: get known nested reg key structure for testing with short hive form
  win_reg_stat:
    path: HKCU:\Test\nested
  register: actual_short

- name: get known nested reg key structure for testing with quoted yaml
  win_reg_stat:
    path: "HKCU:\\Test\\nested"
  register: actual_quoted

- name: set expected value for reg structure
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      properties:
        binary: { raw_value: ["0x01", "0x16"], type: 'REG_BINARY', value: [1, 22] }
        dword: { raw_value: 1, type: 'REG_DWORD', value: 1 }
        expand: { raw_value: '%windir%\dir', type: 'REG_EXPAND_SZ', value: "{{win_dir_value.stdout_lines[0]}}\\dir" }
        multi: { raw_value: ['a, b', 'c'], type: 'REG_MULTI_SZ', value: ['a, b', 'c'] }
        qword: { raw_value: 1, type: 'REG_QWORD', value: 1 }
        string: { raw_value: 'test', type: 'REG_SZ', value: 'test' }
      sub_keys:
      - nest1
      - nest2

- name: validate test
  assert:
    that:
    - "actual_short == expected"
    - "actual_quoted == expected"

- name: get known reg key with no sub keys but some properties
  win_reg_stat:
    path: HKCU:\Test\single
  register: actual

- name: set expected value for reg key with no sub keys but some properties
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      properties:
        none: { raw_value: [], type: 'REG_NONE', value: [] }
        none1: { raw_value: ["0x00"], type: 'REG_NONE', value: [0] }
        string1: { raw_value: '', type: 'REG_SZ', value: '' }
        string2: { raw_value: 'abc123', type: 'REG_SZ', value: 'abc123' }
      sub_keys: []

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get known reg key without sub keys and properties
  win_reg_stat:
    path: HKCU:\Test\nested\nest2
  register: actual

- name: set expected value for reg key without sub keys or properties
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      properties: {}
      sub_keys: []
  register: expected

- name: validate test
  assert:
    that:
      - "actual == expected"

- name: get non-existent reg key
  win_reg_stat:
    path: HKCU:\Test\Thispathwillneverexist
  register: actual

- name: set expected value for non-existent reg key
  set_fact:
    expected:
      changed: false
      exists: false
      failed: false

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get string property
  win_reg_stat:
    path: HKCU:\Test\nested
    name: string
  register: actual

- name: set expected string property
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      raw_value: 'test'
      type: 'REG_SZ'
      value: 'test'

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get expand string property
  win_reg_stat:
    path: HKCU:\Test\nested
    name: expand
  register: actual

- name: set expected expand string property
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      raw_value: '%windir%\dir'
      type: 'REG_EXPAND_SZ'
      value: "{{win_dir_value.stdout_lines[0]}}\\dir"

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get multi string property
  win_reg_stat:
    path: HKCU:\Test\nested
    name: multi
  register: actual

- name: set expected multi string property
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      raw_value: ['a, b', 'c']
      type: 'REG_MULTI_SZ'
      value: ['a, b', 'c']

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get binary property
  win_reg_stat:
    path: HKCU:\Test\nested
    name: binary
  register: actual

- name: set expected binary property
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      raw_value: ["0x01", "0x16"]
      type: 'REG_BINARY'
      value: [1, 22]

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get dword property
  win_reg_stat:
    path: HKCU:\Test\nested
    name: dword
  register: actual

- name: set expected dword property
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      raw_value: 1
      type: 'REG_DWORD'
      value: 1

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get qword property
  win_reg_stat:
    path: HKCU:\Test\nested
    name: qword
  register: actual

- name: set expected qword property
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      raw_value: 1
      type: 'REG_QWORD'
      value: 1

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get none property
  win_reg_stat:
    path: HKCU:\Test\single
    name: none
  register: actual

- name: set expected none property
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      raw_value: []
      type: 'REG_NONE'
      value: []

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get none with value property
  win_reg_stat:
    path: HKCU:\Test\single
    name: none1
  register: actual

- name: set expected none with value property
  set_fact:
    expected:
      changed: false
      exists: true
      failed: false
      raw_value: ["0x00"]
      type: 'REG_NONE'
      value: [0]

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: get non-existence property
  win_reg_stat:
    path: HKCU:\Test\single
    name: doesnotexist
  register: actual

- name: set expected non-existence property
  set_fact:
    expected:
      changed: false
      exists: false
      failed: false

- name: validate test
  assert:
    that:
    - "actual == expected"

- name: remove registry entry
  win_regedit:
    path: HKCU:\Test
    state: absent
