---
- name: ensure idempotency installed
  package:
    name: patch
  when: ansible_distribution != "MacOSX"

- name: create a directory for the result
  file:
    dest: "{{ output_dir }}/patch"
    state: directory
  register: result

- name: assert the directory was created
  assert:
    that:
    - "result.state == 'directory'"

- name: copy the origin file
  copy:
    src: "./origin.txt"
    dest: "{{ output_dir }}/patch/workfile.txt"
  register: result

- name: patch the origin file in check mode
  patch:
    src: result.patch
    dest: "{{ output_dir }}/patch/workfile.txt"
  check_mode: yes
  register: result

- name: verify patch the origin file in check mode
  assert:
    that:
    - result is changed

- name: patch the origin file
  patch:
    src: result.patch
    dest: "{{ output_dir }}/patch/workfile.txt"
  register: result

- name: verify patch the origin file
  assert:
    that:
    - result is changed

- name: test patch the origin file idempotency
  patch:
    src: result.patch
    dest: "{{ output_dir }}/patch/workfile.txt"
  register: result

- name: verify test patch the origin file idempotency
  assert:
    that:
    - result is not changed

- name: verify the resulted file matches expectations
  copy:
    src: "./result.txt"
    dest: "{{ output_dir }}/patch/workfile.txt"
  register: result
  failed_when: result is changed

- name: patch the workfile file in check mode state absent
  patch:
    src: result.patch
    dest: "{{ output_dir }}/patch/workfile.txt"
    state: absent
  check_mode: yes
  register: result

- name: verify patch the workfile file in check mode state absent
  assert:
    that:
    - result is changed

- name: patch the workfile file state absent
  patch:
    src: result.patch
    dest: "{{ output_dir }}/patch/workfile.txt"
    state: absent
  register: result

- name: verify patch the workfile file state absent
  assert:
    that:
    - result is changed

- name: patch the workfile file state absent idempotency
  patch:
    src: result.patch
    dest: "{{ output_dir }}/patch/workfile.txt"
    state: absent
  register: result

- name: verify patch the workfile file state absent idempotency
  assert:
    that:
    - result is not changed

- name: verify the resulted file matches expectations
  copy:
    src: "./origin.txt"
    dest: "{{ output_dir }}/patch/workfile.txt"
  register: result
  failed_when: result is changed
