From a940eb1e809e480eb61b5214ee19fb23cc7ad149 Mon Sep 17 00:00:00 2001
From: Jordan Borean <jborean93@gmail.com>
Date: Wed, 20 Sep 2017 15:17:26 +1000
Subject: [PATCH] CamelConverter - more fixes picked up in testing (#30601)

---
 .../Ansible.ModuleUtils.CamelConversion.psm1  | 10 +++---
 .../library/camel_conversion_test.ps1         | 34 ++++++++++++-------
 2 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 b/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1
index 4de80c74199..7386c03f1b8 100644
--- a/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1
+++ b/lib/ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1
@@ -28,15 +28,15 @@ Function Convert-ListToSnakeCase($list) {
     foreach ($value in $list) {
         if ($value -is [Hashtable]) {
             $new_value = Convert-DictToSnakeCase -dict $value
-        } elseif ($value -is [Array]) {
+        } elseif ($value -is [Array] -or $value -is [System.Collections.ArrayList]) {
             $new_value = Convert-ListToSnakeCase -list $value
         } else {
             $new_value = $value
         }
-        $snake_list.Add($new_value) | Out-Null
+        [void]$snake_list.Add($new_value)
     }
 
-    return $snake_list
+    return ,$snake_list
 }
 
 # converts a dict/hashtable keys from camelCase to snake_case
@@ -51,14 +51,14 @@ Function Convert-DictToSnakeCase($dict) {
         $value = $dict_entry.Value
         if ($value -is [Hashtable]) {
             $snake_dict.$snake_key = Convert-DictToSnakeCase -dict $value          
-        } elseif ($value -is [Array]) {
+        } elseif ($value -is [Array] -or $value -is [System.Collections.ArrayList]) {
             $snake_dict.$snake_key = Convert-ListToSnakeCase -list $value
         } else {
             $snake_dict.$snake_key = $value
         }
     }
 
-    return $snake_dict
+    return ,$snake_dict
 }
 
 # this line must stay at the bottom to ensure all defined module parts are exported
diff --git a/test/integration/targets/win_module_utils/library/camel_conversion_test.ps1 b/test/integration/targets/win_module_utils/library/camel_conversion_test.ps1
index 45de2bd7790..5fc3534ae74 100644
--- a/test/integration/targets/win_module_utils/library/camel_conversion_test.ps1
+++ b/test/integration/targets/win_module_utils/library/camel_conversion_test.ps1
@@ -3,7 +3,7 @@
 #Requires -Module Ansible.ModuleUtils.Legacy
 #Requires -Module Ansible.ModuleUtils.CamelConversion
 
-$ErrorActionPreference = 'Continue'
+$ErrorActionPreference = 'Stop'
 
 Function Assert-Equals($actual, $expected) {
     if ($actual -cne $expected) {
@@ -31,6 +31,8 @@ $input_dict = @{
         ID = 'id'
         IEnumerable = 'i_enumerable'
     }
+    emptyList = @()
+    singleList = @("a")
 }
 
 $output_dict = Convert-DictToSnakeCase -dict $input_dict
@@ -38,24 +40,32 @@ foreach ($entry in $output_dict.GetEnumerator()) {
     $key = $entry.Name
     $value = $entry.Value
 
+    $type = $value.GetType()
     if ($value -is [Hashtable]) {
         Assert-Equals -actual $key -expected "inner_hash_table"
         foreach ($inner_hash in $value.GetEnumerator()) {
             Assert-Equals -actual $inner_hash.Name -expected $inner_hash.Value
         }
-    } elseif ($value -is [Array]) {
-        # there is one array in our original dict, we know the structure
-        foreach ($inner_list in $value) {
-            if ($inner_list -is [Hashtable]) {
-                foreach ($inner_list_hash in $inner_list.GetEnumerator()) {
-                    Assert-Equals -actual $inner_list_hash.Name -expected $inner_list_hash.Value
+    } elseif ($value -is [Array] -or $value -is [System.Collections.ArrayList]) {
+        if ($key -eq "list_dict") {
+            foreach ($inner_list in $value) {
+                if ($inner_list -is [Hashtable]) {
+                    foreach ($inner_list_hash in $inner_list.GetEnumerator()) {
+                        Assert-Equals -actual $inner_list_hash.Name -expected $inner_list_hash.Value
+                    }
+                } elseif ($inner_list -is [String]) {
+                    # this is not a string key so we need to keep it the same
+                    Assert-Equals -actual $inner_list -expected "stringTwo"
+                } else {
+                    Assert-Equals -actual $inner_list -expected 0
                 }
-            } elseif ($inner_list -is [String]) {
-                # this is not a string key so we need to keep it the same
-                Assert-Equals -actual $inner_list -expected "stringTwo"
-            } else {
-                Assert-Equals -actual $inner_list -expected 0
             }
+        } elseif ($key -eq "empty_list") {
+            Assert-Equals -actual $value.Count -expected 0
+        } elseif ($key -eq "single_list") {
+            Assert-Equals -actual $value.Count -expected 1
+        } else {
+            Fail-Json -obj $result -message "invalid key found for list $key"
         }
     } else {
         Assert-Equals -actual $key -expected $value