From 0bdea488518a235b3343ce1e943338c7e96d821f Mon Sep 17 00:00:00 2001 From: Sandro Barbera Date: Wed, 20 Sep 2023 22:29:16 +0200 Subject: [PATCH 1/8] FixStacktraceLanguage --- src/Pester.Runtime.ps1 | 28 ++++++++++++++++++++++++ src/functions/Output.ps1 | 8 +++---- src/functions/assertions/PesterThrow.ps1 | 2 +- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/Pester.Runtime.ps1 b/src/Pester.Runtime.ps1 index c5fdae7c7..ba475963f 100644 --- a/src/Pester.Runtime.ps1 +++ b/src/Pester.Runtime.ps1 @@ -58,6 +58,34 @@ $flags = [System.Reflection.BindingFlags]'Instance,NonPublic' $script:SessionStateInternalProperty = [System.Management.Automation.SessionState].GetProperty('Internal', $flags) $script:ScriptBlockSessionStateInternalProperty = [System.Management.Automation.ScriptBlock].GetProperty('SessionStateInternal', $flags) $script:ScriptBlockSessionStateProperty = [System.Management.Automation.ScriptBlock].GetProperty("SessionState", $flags) +# function for extracting StacktraceSystemLanguage +function Get-StackTraceLanguage { + $StacktraceLanguage = [PSCustomObject]@{ + At = "at" + Line = "line" + } + try { + if ($PSVersionTable.PSVersion.Major -gt 5) { + $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' + } + else { + $StackTraceRessourceName = 'DebuggerStrings' + } + $r = [System.Resources.ResourceManager]::new($StackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) + $result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' + if (!($result)) { + throw "" + } + $StacktraceLanguage.At = $Matches["At"] + $StacktraceLanguage.Line = $Matches["Line"] + } + catch { + write-warning "No StackTraceAssembly found setting english as default StackTraceLanguage" + } + Return $StacktraceLanguage +} +#defining script variable +$script:StackTraceLanguage = Get-StackTraceLanguage if (notDefined PesterPreference) { $PesterPreference = [PesterConfiguration]::Default diff --git a/src/functions/Output.ps1 b/src/functions/Output.ps1 index ccdd8ac9b..186cb83e1 100644 --- a/src/functions/Output.ps1 +++ b/src/functions/Output.ps1 @@ -529,13 +529,13 @@ function ConvertTo-FailureLines { else { # omit the lines internal to Pester if ((GetPesterOS) -ne 'Windows') { - [String]$isPesterFunction = '^at .*, .*/Pester.psm1: line [0-9]*$' - [String]$isShould = '^at (Should|Invoke-Assertion), .*/Pester.psm1: line [0-9]*$' + [String]$isPesterFunction = '^{0}.*, .*/Pester.psm1: {1} [0-9]*$' -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Line + [String]$isShould = '^{0} (Should|Invoke-Assertion), .*/Pester.psm1: {1} [0-9]*$' -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Line # [String]$pattern6 = '^at , (|.*/Pester.psm1): line [0-9]*$' } else { - [String]$isPesterFunction = '^at .*, .*\\Pester.psm1: line [0-9]*$' - [String]$isShould = '^at (Should|Invoke-Assertion), .*\\Pester.psm1: line [0-9]*$' + [String]$isPesterFunction = '^{0} .*, .*\\Pester.psm1: {1} [0-9]*$' -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Line + [String]$isShould = '^{0} (Should|Invoke-Assertion), .*\\Pester.psm1: {1} [0-9]*$' -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Line } # PESTER_BUILD diff --git a/src/functions/assertions/PesterThrow.ps1 b/src/functions/assertions/PesterThrow.ps1 index 9ac8b9a03..9e7322192 100644 --- a/src/functions/assertions/PesterThrow.ps1 +++ b/src/functions/assertions/PesterThrow.ps1 @@ -153,7 +153,7 @@ function Get-DoValuesMatch($ActualValue, $ExpectedValue) { function Get-ExceptionLineInfo($info) { # $info.PositionMessage has a leading blank line that we need to account for in PowerShell 2.0 $positionMessage = $info.PositionMessage -split '\r?\n' -match '\S' -join [System.Environment]::NewLine - return ($positionMessage -replace "^At ", "from ") + return ($positionMessage -replace "^$($script:StackTraceLanguage.At) ", "from ") } function ShouldThrowFailureMessage { From b2410c4feb182d7b4fafd3477324d6d57d89b016 Mon Sep 17 00:00:00 2001 From: Sandro Barbera Date: Thu, 21 Sep 2023 00:06:26 +0200 Subject: [PATCH 2/8] Fix exclude for StackTraceLanguage for POSH V3/4 --- src/Pester.Runtime.ps1 | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/Pester.Runtime.ps1 b/src/Pester.Runtime.ps1 index ba475963f..a727c2794 100644 --- a/src/Pester.Runtime.ps1 +++ b/src/Pester.Runtime.ps1 @@ -64,24 +64,30 @@ function Get-StackTraceLanguage { At = "at" Line = "line" } - try { - if ($PSVersionTable.PSVersion.Major -gt 5) { - $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' - } - else { - $StackTraceRessourceName = 'DebuggerStrings' + #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) + if ($PSVersionTable.PSVersion.Major -ge 5) { + try { + if ($PSVersionTable.PSVersion.Major -gt 5) { + $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' + } + else { + $StackTraceRessourceName = 'DebuggerStrings' + } + $r = [System.Resources.ResourceManager]::new($StackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) + $result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' + if (!($result)) { + #write-warning "StackTraceFormat in a unknown format" + } + else { + $StacktraceLanguage.At = $Matches["At"] + $StacktraceLanguage.Line = $Matches["Line"] + } } - $r = [System.Resources.ResourceManager]::new($StackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) - $result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' - if (!($result)) { - throw "" + catch { + #write-warning "No StackTraceAssembly found setting english as default StackTraceLanguage" } - $StacktraceLanguage.At = $Matches["At"] - $StacktraceLanguage.Line = $Matches["Line"] - } - catch { - write-warning "No StackTraceAssembly found setting english as default StackTraceLanguage" } + Return $StacktraceLanguage } #defining script variable From ce24250aa54e9236879d873b7af868c6b4e3a272 Mon Sep 17 00:00:00 2001 From: Sandro Barbera Date: Wed, 27 Sep 2023 22:32:52 +0200 Subject: [PATCH 3/8] Enhanced Fallback for all Version and Support for POSH 3/4 --- src/Pester.Runtime.ps1 | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/Pester.Runtime.ps1 b/src/Pester.Runtime.ps1 index a727c2794..f17a7dcfc 100644 --- a/src/Pester.Runtime.ps1 +++ b/src/Pester.Runtime.ps1 @@ -59,14 +59,27 @@ $script:SessionStateInternalProperty = [System.Management.Automation.SessionStat $script:ScriptBlockSessionStateInternalProperty = [System.Management.Automation.ScriptBlock].GetProperty('SessionStateInternal', $flags) $script:ScriptBlockSessionStateProperty = [System.Management.Automation.ScriptBlock].GetProperty("SessionState", $flags) # function for extracting StacktraceSystemLanguage -function Get-StackTraceLanguage { +function Get-StackTraceLanguageFallBack { + param( + [Parameter(Mandatory = $true)] + [string]$StackTrace + ) $StacktraceLanguage = [PSCustomObject]@{ At = "at" Line = "line" } - #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) - if ($PSVersionTable.PSVersion.Major -ge 5) { - try { + $regex = "(?.*)\s(?\<\w+\>),\s(?\<.+\>)\s*:\s(?\w+)\s(?\w+)\z" + if ($StackTrace -match $regex) { + $StacktraceLanguage.At = $Matches["At"] + $StacktraceLanguage.Line = $Matches["Line"] + } + Return $StacktraceLanguage +} + +function Get-StackTraceLanguage { + #Full fallback scenario to the solution of PR #2276 in case of error + try { + if ($PSVersionTable.PSVersion.Major -ge 5) { if ($PSVersionTable.PSVersion.Major -gt 5) { $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' } @@ -76,18 +89,24 @@ function Get-StackTraceLanguage { $r = [System.Resources.ResourceManager]::new($StackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) $result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' if (!($result)) { - #write-warning "StackTraceFormat in a unknown format" + throw 'StackTraceFormat in a unknown format' } else { - $StacktraceLanguage.At = $Matches["At"] - $StacktraceLanguage.Line = $Matches["Line"] + $StacktraceLanguage = [PSCustomObject]@{ + At = $Matches["At"] + Line = $Matches["Line"] + } } } - catch { - #write-warning "No StackTraceAssembly found setting english as default StackTraceLanguage" + else { + #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) + throw 'Fallback for PSVersion 3/4' } } - + catch { + #Call Fallbackfunction + $StacktraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) + } Return $StacktraceLanguage } #defining script variable From 59c9c93fb885daa6aa3388496673208f0dcb1940 Mon Sep 17 00:00:00 2001 From: Sandro Barbera Date: Fri, 10 Nov 2023 00:34:00 +0100 Subject: [PATCH 4/8] Version 4 Error optimizing --- src/Pester.Runtime.ps1 | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/Pester.Runtime.ps1 b/src/Pester.Runtime.ps1 index f17a7dcfc..091a7e781 100644 --- a/src/Pester.Runtime.ps1 +++ b/src/Pester.Runtime.ps1 @@ -64,53 +64,54 @@ function Get-StackTraceLanguageFallBack { [Parameter(Mandatory = $true)] [string]$StackTrace ) - $StacktraceLanguage = [PSCustomObject]@{ + $stackTraceLanguage = [PSCustomObject]@{ At = "at" Line = "line" } $regex = "(?.*)\s(?\<\w+\>),\s(?\<.+\>)\s*:\s(?\w+)\s(?\w+)\z" if ($StackTrace -match $regex) { - $StacktraceLanguage.At = $Matches["At"] - $StacktraceLanguage.Line = $Matches["Line"] + $stackTraceLanguage.At = $Matches["At"] + $stackTraceLanguage.Line = $Matches["Line"] } - Return $StacktraceLanguage + Return $stackTraceLanguage } function Get-StackTraceLanguage { #Full fallback scenario to the solution of PR #2276 in case of error - try { - if ($PSVersionTable.PSVersion.Major -ge 5) { + + if ($PSVersionTable.PSVersion.Major -ge 5) { + try { if ($PSVersionTable.PSVersion.Major -gt 5) { - $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' + $stackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' } else { - $StackTraceRessourceName = 'DebuggerStrings' + $stackTraceRessourceName = 'DebuggerStrings' } - $r = [System.Resources.ResourceManager]::new($StackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) + $r = [System.Resources.ResourceManager]::new($stackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) $result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' if (!($result)) { throw 'StackTraceFormat in a unknown format' } else { - $StacktraceLanguage = [PSCustomObject]@{ + $stackTraceLanguage = [PSCustomObject]@{ At = $Matches["At"] Line = $Matches["Line"] } } } - else { - #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) - throw 'Fallback for PSVersion 3/4' + catch { + #Call Fallbackfunction + $stackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) } } - catch { - #Call Fallbackfunction - $StacktraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) + else { + #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) + $stackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) } - Return $StacktraceLanguage + Return $stackTraceLanguage } #defining script variable -$script:StackTraceLanguage = Get-StackTraceLanguage +$script:stackTraceLanguage = Get-StackTraceLanguage if (notDefined PesterPreference) { $PesterPreference = [PesterConfiguration]::Default From 086fddfbb185ba5285aeaf0ef72d3a832ebce970 Mon Sep 17 00:00:00 2001 From: Sandro Barbera Date: Thu, 23 Nov 2023 21:54:38 +0100 Subject: [PATCH 5/8] Reset to 27.09 --- src/Pester.Runtime.ps1 | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/Pester.Runtime.ps1 b/src/Pester.Runtime.ps1 index f17a7dcfc..091a7e781 100644 --- a/src/Pester.Runtime.ps1 +++ b/src/Pester.Runtime.ps1 @@ -64,53 +64,54 @@ function Get-StackTraceLanguageFallBack { [Parameter(Mandatory = $true)] [string]$StackTrace ) - $StacktraceLanguage = [PSCustomObject]@{ + $stackTraceLanguage = [PSCustomObject]@{ At = "at" Line = "line" } $regex = "(?.*)\s(?\<\w+\>),\s(?\<.+\>)\s*:\s(?\w+)\s(?\w+)\z" if ($StackTrace -match $regex) { - $StacktraceLanguage.At = $Matches["At"] - $StacktraceLanguage.Line = $Matches["Line"] + $stackTraceLanguage.At = $Matches["At"] + $stackTraceLanguage.Line = $Matches["Line"] } - Return $StacktraceLanguage + Return $stackTraceLanguage } function Get-StackTraceLanguage { #Full fallback scenario to the solution of PR #2276 in case of error - try { - if ($PSVersionTable.PSVersion.Major -ge 5) { + + if ($PSVersionTable.PSVersion.Major -ge 5) { + try { if ($PSVersionTable.PSVersion.Major -gt 5) { - $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' + $stackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' } else { - $StackTraceRessourceName = 'DebuggerStrings' + $stackTraceRessourceName = 'DebuggerStrings' } - $r = [System.Resources.ResourceManager]::new($StackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) + $r = [System.Resources.ResourceManager]::new($stackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) $result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' if (!($result)) { throw 'StackTraceFormat in a unknown format' } else { - $StacktraceLanguage = [PSCustomObject]@{ + $stackTraceLanguage = [PSCustomObject]@{ At = $Matches["At"] Line = $Matches["Line"] } } } - else { - #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) - throw 'Fallback for PSVersion 3/4' + catch { + #Call Fallbackfunction + $stackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) } } - catch { - #Call Fallbackfunction - $StacktraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) + else { + #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) + $stackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) } - Return $StacktraceLanguage + Return $stackTraceLanguage } #defining script variable -$script:StackTraceLanguage = Get-StackTraceLanguage +$script:stackTraceLanguage = Get-StackTraceLanguage if (notDefined PesterPreference) { $PesterPreference = [PesterConfiguration]::Default From 4d0a432aa5e73b659f115e7890afbe721fd633c9 Mon Sep 17 00:00:00 2001 From: Sandro Barbera Date: Thu, 23 Nov 2023 22:13:29 +0100 Subject: [PATCH 6/8] Variabels corrected --- src/Pester.Runtime.ps1 | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Pester.Runtime.ps1 b/src/Pester.Runtime.ps1 index 091a7e781..d96331424 100644 --- a/src/Pester.Runtime.ps1 +++ b/src/Pester.Runtime.ps1 @@ -64,16 +64,16 @@ function Get-StackTraceLanguageFallBack { [Parameter(Mandatory = $true)] [string]$StackTrace ) - $stackTraceLanguage = [PSCustomObject]@{ + $StackTraceLanguage = [PSCustomObject]@{ At = "at" Line = "line" } - $regex = "(?.*)\s(?\<\w+\>),\s(?\<.+\>)\s*:\s(?\w+)\s(?\w+)\z" - if ($StackTrace -match $regex) { - $stackTraceLanguage.At = $Matches["At"] - $stackTraceLanguage.Line = $Matches["Line"] + $Regex = "(?.*)\s(?\<\w+\>),\s(?\<.+\>)\s*:\s(?\w+)\s(?\w+)\z" + if ($StackTrace -match $Regex) { + $StackTraceLanguage.At = $Matches["At"] + $StackTraceLanguage.Line = $Matches["Line"] } - Return $stackTraceLanguage + Return $StackTraceLanguage } function Get-StackTraceLanguage { @@ -82,18 +82,18 @@ function Get-StackTraceLanguage { if ($PSVersionTable.PSVersion.Major -ge 5) { try { if ($PSVersionTable.PSVersion.Major -gt 5) { - $stackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' + $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' } else { - $stackTraceRessourceName = 'DebuggerStrings' + $StackTraceRessourceName = 'DebuggerStrings' } - $r = [System.Resources.ResourceManager]::new($stackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) - $result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' - if (!($result)) { + $R = [System.Resources.ResourceManager]::new($StackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) + $Result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' + if (!($Result)) { throw 'StackTraceFormat in a unknown format' } else { - $stackTraceLanguage = [PSCustomObject]@{ + $StackTraceLanguage = [PSCustomObject]@{ At = $Matches["At"] Line = $Matches["Line"] } @@ -101,17 +101,17 @@ function Get-StackTraceLanguage { } catch { #Call Fallbackfunction - $stackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) + $StackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) } } else { #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) - $stackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) + $StackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) } - Return $stackTraceLanguage + Return $StackTraceLanguage } #defining script variable -$script:stackTraceLanguage = Get-StackTraceLanguage +$script:StackTraceLanguage = Get-StackTraceLanguage if (notDefined PesterPreference) { $PesterPreference = [PesterConfiguration]::Default From 8c25c0aebf524cbe0f2e7626adcb52cd16197c15 Mon Sep 17 00:00:00 2001 From: Sandro Barbera Date: Thu, 23 Nov 2023 22:36:38 +0100 Subject: [PATCH 7/8] Revert to Commit from 27.09 --- src/Pester.Runtime.ps1 | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Pester.Runtime.ps1 b/src/Pester.Runtime.ps1 index d96331424..464bd97c2 100644 --- a/src/Pester.Runtime.ps1 +++ b/src/Pester.Runtime.ps1 @@ -78,9 +78,8 @@ function Get-StackTraceLanguageFallBack { function Get-StackTraceLanguage { #Full fallback scenario to the solution of PR #2276 in case of error - - if ($PSVersionTable.PSVersion.Major -ge 5) { - try { + try { + if ($PSVersionTable.PSVersion.Major -ge 5) { if ($PSVersionTable.PSVersion.Major -gt 5) { $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' } @@ -99,13 +98,13 @@ function Get-StackTraceLanguage { } } } - catch { - #Call Fallbackfunction - $StackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) + else { + #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) + throw 'Fallback for PSVersion 3/4' } } - else { - #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) + catch { + #Call Fallbackfunction $StackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) } Return $StackTraceLanguage From f352060afa6708bb82f9542cc4c8833199c467c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Jare=C5=A1?= Date: Thu, 11 Apr 2024 01:09:20 +0200 Subject: [PATCH 8/8] Parse words from exception --- src/Pester.Runtime.ps1 | 53 ++++++---------------------------------- src/functions/Output.ps1 | 22 +++-------------- 2 files changed, 10 insertions(+), 65 deletions(-) diff --git a/src/Pester.Runtime.ps1 b/src/Pester.Runtime.ps1 index 4a4a5d5d3..7df31a8f5 100644 --- a/src/Pester.Runtime.ps1 +++ b/src/Pester.Runtime.ps1 @@ -58,56 +58,17 @@ $flags = [System.Reflection.BindingFlags]'Instance,NonPublic' $script:SessionStateInternalProperty = [System.Management.Automation.SessionState].GetProperty('Internal', $flags) $script:ScriptBlockSessionStateInternalProperty = [System.Management.Automation.ScriptBlock].GetProperty('SessionStateInternal', $flags) $script:ScriptBlockSessionStateProperty = [System.Management.Automation.ScriptBlock].GetProperty("SessionState", $flags) -# function for extracting StacktraceSystemLanguage -function Get-StackTraceLanguageFallBack { - param( - [Parameter(Mandatory = $true)] - [string]$StackTrace - ) - $StackTraceLanguage = [PSCustomObject]@{ - At = "at" - Line = "line" - } - $Regex = "(?.*)\s(?\<\w+\>),\s(?\<.+\>)\s*:\s(?\w+)\s(?\w+)\z" - if ($StackTrace -match $Regex) { - $StackTraceLanguage.At = $Matches["At"] - $StackTraceLanguage.Line = $Matches["Line"] - } - Return $StackTraceLanguage -} function Get-StackTraceLanguage { - #Full fallback scenario to the solution of PR #2276 in case of error - try { - if ($PSVersionTable.PSVersion.Major -ge 5) { - if ($PSVersionTable.PSVersion.Major -gt 5) { - $StackTraceRessourceName = 'System.Management.Automation.resources.DebuggerStrings' - } - else { - $StackTraceRessourceName = 'DebuggerStrings' - } - $R = [System.Resources.ResourceManager]::new($StackTraceRessourceName, [System.Reflection.Assembly]::GetAssembly([System.Management.Automation.Breakpoint])) - $Result = $r.GetString('StackTraceFormat') -match '^(?.*) \{0\}, \{1\}: (?.*) \{2\}$' - if (!($Result)) { - throw 'StackTraceFormat in a unknown format' - } - else { - $StackTraceLanguage = [PSCustomObject]@{ - At = $Matches["At"] - Line = $Matches["Line"] - } - } + $err = try { throw "err" } catch { $_ } + $firstFrame = ($err.ScriptStackTrace -split [System.Environment]::NewLine, 2 )[0] + if ($firstFrame -match "(?.[^G]?)\s+Get-StackTraceLanguage(?.).+:\s+(?.\S+)\s\d+") { + @{ + At = $Matches["at"] + Separator = $Matches["separator"] + Line = $Matches["line"] } - else { - #Prior to version 5 there are no ressources in the Assembly available (System.Management.Automation) - throw 'Fallback for PSVersion 3/4' - } - } - catch { - #Call Fallbackfunction - $StackTraceLanguage = Get-StackTraceLanguageFallBack -StackTrace $($PSItem.ScriptStackTrace) } - Return $StackTraceLanguage } #defining script variable $script:StackTraceLanguage = Get-StackTraceLanguage diff --git a/src/functions/Output.ps1 b/src/functions/Output.ps1 index db579253f..d61a82a28 100644 --- a/src/functions/Output.ps1 +++ b/src/functions/Output.ps1 @@ -539,25 +539,9 @@ function ConvertTo-FailureLines { } else { # omit the lines internal to Pester - if ((GetPesterOS) -ne 'Windows') { - [String]$isPesterFunction = '^{0}.*, .*/Pester.psm1: {1} [0-9]*$' -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Line - [String]$isShould = '^{0} (Should|Invoke-Assertion), .*/Pester.psm1: {1} [0-9]*$' -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Line - # [String]$pattern6 = '^at , (|.*/Pester.psm1): line [0-9]*$' - } - else { - [String]$isPesterFunction = '^{0} .*, .*\\Pester.psm1: {1} [0-9]*$' -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Line - [String]$isShould = '^{0} (Should|Invoke-Assertion), .*\\Pester.psm1: {1} [0-9]*$' -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Line - } - - # PESTER_BUILD - if ($true) { - # no code - # non inlined scripts will have different paths just omit everything from the src folder - $path = [regex]::Escape(($PSScriptRoot | & $SafeCommands["Split-Path"])) - [String]$isPesterFunction = "^at .*, .*$path.*: line [0-9]*$" - [String]$isShould = "^at (Should|Invoke-Assertion), .*$path.*: line [0-9]*$" - } - # end PESTER_BUILD + $path = [regex]::Escape(($PSScriptRoot | & $SafeCommands["Split-Path"])) + [String]$isPesterFunction = "^{0}.*{1} .*$path.*: {2} [0-9]*$" -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Separator, $script:StackTraceLanguage.Line + [String]$isShould = "^{0} (Should|Invoke-Assertion){1} .*$path.*: {2} [0-9]*$" -f $script:StackTraceLanguage.At, $script:StackTraceLanguage.Separator, $script:StackTraceLanguage.Line # reducing the stack trace so we see only stack trace until the current It block and not up until the invocation of the # whole test script itself. This is achieved by shortening the stack trace when any Runtime function is hit.