From 6e71aaea2d084dd5664acfed9449d0ce5eb7c162 Mon Sep 17 00:00:00 2001 From: Staffan Gustafsson Date: Sat, 22 Apr 2017 17:19:16 +0200 Subject: [PATCH 1/3] Fixing #3619 - Missing tab completion for select-object Starting on test suite for tab completion. --- .../CommandCompletion/CompletionCompleters.cs | 2 + .../TabCompletion/TabCompletion.Tests.ps1 | 97 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 diff --git a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs index f7eb2ea69f5..41258697b11 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs @@ -6438,6 +6438,8 @@ internal static List CompleteHashtableKey(CompletionContext co completionContext, inferredType, result, completionContext.WordToComplete + "*", IsWriteablePropertyMember, isStatic: false); return result; + case "Select-Object": + return GetSpecialHashTableKeyMembers("Name", "Expression"); case "Sort-Object": return GetSpecialHashTableKeyMembers("Expression", "Ascending", "Descending"); case "Group-Object": diff --git a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 new file mode 100644 index 00000000000..20b6d092837 --- /dev/null +++ b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 @@ -0,0 +1,97 @@ +Describe "TabCompletion" { + It 'Should complete Command' { + $res = TabExpansion2 -inputScript 'Get-Com' -cursorColumn 'Get-Com'.Length + $res.CompletionMatches[0].CompletionText | Should be Get-Command + } + + It 'Should complete native exe' { + $res = TabExpansion2 -inputScript 'notep' -cursorColumn 'notep'.Length + $res.CompletionMatches[0].CompletionText | Should be notepad.exe + } + + It 'Should complete dotnet method' { + $res = TabExpansion2 -inputScript '(1).ToSt' -cursorColumn '(1).ToSt'.Length + $res.CompletionMatches[0].CompletionText | Should be 'ToString(' + } + + It 'Should complete Magic foreach' { + $res = TabExpansion2 -inputScript '(1..10).Fo' -cursorColumn '(1..10).Fo'.Length + $res.CompletionMatches[0].CompletionText | Should be 'Foreach(' + } + + It 'Should complete types' { + $res = TabExpansion2 -inputScript '[pscu' -cursorColumn '[pscu'.Length + $res.CompletionMatches[0].CompletionText | Should be 'pscustomobject' + } + + It 'Should complete namespaces' { + $res = TabExpansion2 -inputScript 'using namespace Sys' -cursorColumn 'using namespace Sys'.Length + $res.CompletionMatches[0].CompletionText | Should be 'System' + } + + + It 'Should complete format-table hashtable' { + $res = TabExpansion2 -inputScript 'Get-ChildItem | Format-Table @{ ' -cursorColumn 'Get-ChildItem | Format-Table @{ '.Length + $res.CompletionMatches.Count | Should Be 5 + $res.CompletionMatches.Foreach{$_.CompletionText -in 'Label', 'Width', 'Alignment', 'Expression', 'FormatString' | Should Be $true} + } + + + It 'Should complete format-* hashtable on GroupBy' -TestCases ( + @{cmd = 'Format-Table'}, + @{cmd = 'Format-List'}, + @{cmd = 'Format-Wide'}, + @{cmd = 'Format-Custom'} + ) { + param($cmd) + $res = TabExpansion2 -inputScript "Get-ChildItem | $cmd -GroupBy @{ " -cursorColumn "Get-ChildItem | $cmd -GroupBy @{ ".Length + $res.CompletionMatches.Count | Should Be 3 + $res.CompletionMatches.Foreach{$_.CompletionText -in 'Label', 'Expression', 'FormatString' | Should Be $true} + } + + It 'Should complete format-list hashtable' { + $res = TabExpansion2 -inputScript 'Get-ChildItem | Format-List @{ ' -cursorColumn 'Get-ChildItem | Format-List @{ '.Length + $res.CompletionMatches.Count | Should Be 3 + $res.CompletionMatches.Foreach{$_.CompletionText -in 'Label', 'Expression', 'FormatString' | Should Be $true} + } + + It 'Should complete format-wide hashtable' { + $res = TabExpansion2 -inputScript 'Get-ChildItem | Format-Wide @{ ' -cursorColumn 'Get-ChildItem | Format-Wide @{ '.Length + $res.CompletionMatches.Count | Should Be 2 + $res.CompletionMatches.Foreach{$_.CompletionText -in 'Expression', 'FormatString' | Should Be $true} + } + + It 'Should complete format-custom hashtable' { + $res = TabExpansion2 -inputScript 'Get-ChildItem | Format-Custom @{ ' -cursorColumn 'Get-ChildItem | Format-Custom @{ '.Length + $res.CompletionMatches.Count | Should Be 2 + $res.CompletionMatches.Foreach{$_.CompletionText -in 'Expression', 'Depth' | Should Be $true} + } + + It 'Should complete Select-Object hashtable' { + $res = TabExpansion2 -inputScript 'Get-ChildItem | Select-Object @{ ' -cursorColumn 'Get-ChildItem | Select-Object @{ '.Length + $res.CompletionMatches.Count | Should Be 2 + $res.CompletionMatches.Foreach{$_.CompletionText -in 'Name', 'Expression' | Should Be $true} + } + + It 'Should complete Sort-Object hashtable' { + $res = TabExpansion2 -inputScript 'Get-ChildItem | Sort-Object @{ ' -cursorColumn 'Get-ChildItem | Sort-Object @{ '.Length + $res.CompletionMatches.Count | Should Be 3 + $res.CompletionMatches.Foreach{$_.CompletionText -in 'Expression', 'Ascending', 'Descending' | Should Be $true} + } + + It 'Should complete New-Object hashtable' { + class X { + $A + $B + $C + } + $res = TabExpansion2 -inputScript 'New-Object -TypeName X -Property @{ ' -cursorColumn 'New-Object -TypeName X -Property @{ '.Length + $res.CompletionMatches.Count | Should Be 3 + $res.CompletionMatches.Foreach{$_.CompletionText -in 'A', 'B', 'C' | Should Be $true} + } + + It 'Should complete keyword' -skip { + $res = TabExpansion2 -inputScript 'using nam' -cursorColumn 'using nam'.Length + $res.CompletionMatches[0].CompletionText | Should be 'namespace' + } +} From ef142b2c8ee90e921e1dbdbae76b786eee60963d Mon Sep 17 00:00:00 2001 From: Staffan Gustafsson Date: Sat, 22 Apr 2017 17:48:32 +0200 Subject: [PATCH 2/3] Adding CI test tag --- test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 index 20b6d092837..425f7d696e8 100644 --- a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 +++ b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 @@ -1,4 +1,4 @@ -Describe "TabCompletion" { +Describe "TabCompletion" -Tags CI { It 'Should complete Command' { $res = TabExpansion2 -inputScript 'Get-Com' -cursorColumn 'Get-Com'.Length $res.CompletionMatches[0].CompletionText | Should be Get-Command From b430bd00dcb92a299d9f668bea8eab785dac6c64 Mon Sep 17 00:00:00 2001 From: Staffan Gustafsson Date: Sat, 22 Apr 2017 18:25:57 +0200 Subject: [PATCH 3/3] Skipping notepad test on non-windows platforms --- test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 index 425f7d696e8..a462b0a3099 100644 --- a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 +++ b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 @@ -4,7 +4,7 @@ Describe "TabCompletion" -Tags CI { $res.CompletionMatches[0].CompletionText | Should be Get-Command } - It 'Should complete native exe' { + It 'Should complete native exe' -Skip:(!$IsWindows) { $res = TabExpansion2 -inputScript 'notep' -cursorColumn 'notep'.Length $res.CompletionMatches[0].CompletionText | Should be notepad.exe }