# repeatable tests for each key type
# takes in the following variables
#   test_win_regedit_key_type: the type of key
#   test_win_regedit_key_expected_type: the expected key type
#   test_win_regedit_key_data1: the data to create first
#   test_win_regedit_key_data2: the data to change tp
#   test_win_regedit_key_expected_value_null: the expected value for a null key
#   test_win_regedit_key_expected_value1: the expected value for the data1
#   test_win_regedit_key_expected_value2: the expected value for the data2
---
- name: create a null {{test_win_regedit_key_type}} check
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: empty_{{test_win_regedit_key_type}}
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: null_check
  check_mode: yes

- name: get actual on null {{test_win_regedit_key_type}} check
  win_reg_stat:
    path: '{{test_win_regedit_local_key}}'
    name: empty_{{test_win_regedit_key_type}}
  register: null_actual_check

- name: assert create a null {{test_win_regedit_key_type}} check
  assert:
    that:
    - null_check|changed
    - null_check.data_changed == False
    - null_check.data_type_changed == False
    - null_actual_check.exists == False

- name: create a null {{test_win_regedit_key_type}}
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: empty_{{test_win_regedit_key_type}}
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: null_create

- name: get actual on null {{test_win_regedit_key_type}}
  win_reg_stat:
    path: '{{test_win_regedit_local_key}}'
    name: empty_{{test_win_regedit_key_type}}
  register: null_create_actual

- name: assert create a null {{test_win_regedit_key_type}}
  assert:
    that:
    - null_create|changed
    - null_create.data_changed == False
    - null_create.data_type_changed == False
    - null_create_actual.exists == True
    - null_create_actual.raw_value == test_win_regedit_key_expected_value_null
    - null_create_actual.type == test_win_regedit_key_expected_type
  when: test_win_regedit_key_type not in ['dword', 'qword']

# dword and qword are different, need to convert the expected value null to an int
- name: assert create a null {{test_win_regedit_key_type}} for dword and qword
  assert:
    that:
    - null_create|changed
    - null_create.data_changed == False
    - null_create.data_type_changed == False
    - null_create_actual.exists == True
    - null_create_actual.raw_value == test_win_regedit_key_expected_value_null|int
    - null_create_actual.type == test_win_regedit_key_expected_type
  when: test_win_regedit_key_type in ['dword', 'qword']

- name: create a null {{test_win_regedit_key_type}} again
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: empty_{{test_win_regedit_key_type}}
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: null_create_again

- name: assert create a null {{test_win_regedit_key_type}} again
  assert:
    that:
    - not null_create_again|changed

- name: create a {{test_win_regedit_key_type}} check
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
    data: '{{test_win_regedit_key_data1}}'
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: data_create_check
  check_mode: yes

- name: get actual on {{test_win_regedit_key_type}} check
  win_reg_stat:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
  register: data_create_actual_check

- name: assert create a {{test_win_regedit_key_type}} check
  assert:
    that:
    - data_create_check|changed
    - data_create_check.data_changed == False
    - data_create_check.data_type_changed == False
    - data_create_actual_check.exists == False

- name: create a {{test_win_regedit_key_type}}
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
    data: '{{test_win_regedit_key_data1}}'
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: data_create

- name: get actual on {{test_win_regedit_key_type}}
  win_reg_stat:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
  register: data_create_actual

- name: assert create a {{test_win_regedit_key_type}}
  assert:
    that:
    - data_create|changed
    - data_create.data_changed == False
    - data_create.data_type_changed == False
    - data_create_actual.exists == True
    - data_create_actual.raw_value == test_win_regedit_key_expected_value1
    - data_create_actual.type == test_win_regedit_key_expected_type
  when: test_win_regedit_key_type not in ['dword', 'qword']

- name: debug 1
  debug:
    var: test_win_regedit_key_expected_value1

- name: debug 2
  debug:
    var: test_win_regedit_key_expected_value1|int

- name: assert create a {{test_win_regedit_key_type}} for dword or qword
  assert:
    that:
    - data_create|changed
    - data_create.data_changed == False
    - data_create.data_type_changed == False
    - data_create_actual.exists == True
    - data_create_actual.raw_value == test_win_regedit_key_expected_value1|int
    - data_create_actual.type == test_win_regedit_key_expected_type
  when: test_win_regedit_key_type in ['dword', 'qword']

- name: create a {{test_win_regedit_key_type}} again
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
    data: '{{test_win_regedit_key_data1}}'
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: data_create_again

- name: assert create a {{test_win_regedit_key_type}} again
  assert:
    that:
    - not data_create_again|changed

- name: change existing {{test_win_regedit_key_type}} data check
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
    data: '{{test_win_regedit_key_data2}}'
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: change_data_check
  check_mode: yes

- name: get actual of change existing {{test_win_regedit_key_type}} data check
  win_reg_stat:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
  register: change_data_actual_check

- name: assert change existing {{test_win_regedit_key_type}} data check
  assert:
    that:
    - change_data_check|changed
    - change_data_check.data_changed == True
    - change_data_check.data_type_changed == False
    - change_data_actual_check == data_create_actual

- name: change existing {{test_win_regedit_key_type}} data
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
    data: '{{test_win_regedit_key_data2}}'
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: change_data

- name: get actual of change existing {{test_win_regedit_key_type}} data
  win_reg_stat:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
  register: change_data_actual

- name: assert change existing {{test_win_regedit_key_type}} data
  assert:
    that:
    - change_data|changed
    - change_data.data_changed == True
    - change_data.data_type_changed == False
    - change_data_actual.raw_value == test_win_regedit_key_expected_value2
  when: test_win_regedit_key_type not in ['dword', 'qword']

- name: assert change existing {{test_win_regedit_key_type}} data for dword or qword
  assert:
    that:
    - change_data|changed
    - change_data.data_changed == True
    - change_data.data_type_changed == False
    - change_data_actual.raw_value == test_win_regedit_key_expected_value2|int
  when: test_win_regedit_key_type in ['dword', 'qword']

- name: change existing {{test_win_regedit_key_type}} data again
  win_regedit:
    path: '{{test_win_regedit_local_key}}'
    name: data_{{test_win_regedit_key_type}}
    data: '{{test_win_regedit_key_data2}}'
    type: '{{test_win_regedit_key_type}}'
    state: present
  register: change_data_again

- name: assert change existing {{test_win_regedit_key_type}} data again
  assert:
    that:
    - not change_data_again|changed
