From 7b7113fc3bf962aaeba625f58341c30a80f0fe6a Mon Sep 17 00:00:00 2001 From: Richard Kuhnt Date: Sun, 16 Dec 2018 15:53:05 +0100 Subject: [PATCH] tests: Move style constraints tests to separate test file - This allows importing these tests in other buckets - Simpler UTF-8 BOM reading function --- test/00-Project.Tests.ps1 | 175 +------------------------------------ test/Import-File-Tests.ps1 | 153 ++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 173 deletions(-) create mode 100644 test/Import-File-Tests.ps1 diff --git a/test/00-Project.Tests.ps1 b/test/00-Project.Tests.ps1 index 5e36a2fb..e379288c 100644 --- a/test/00-Project.Tests.ps1 +++ b/test/00-Project.Tests.ps1 @@ -1,4 +1,4 @@ -$repo_dir = (Get-Item $MyInvocation.MyCommand.Path).directory.parent.FullName +$repo_dir = (Get-Item $MyInvocation.MyCommand.Path).Directory.Parent.FullName $repo_files = @( Get-ChildItem $repo_dir -file -recurse -force ) @@ -75,175 +75,4 @@ describe 'Project code' { } -describe 'Style constraints for non-binary project files' { - - $files = @( - # gather all files except '*.exe', '*.zip', or any .git repository files - $repo_files | - where-object { $_.fullname -inotmatch $($project_file_exclusions -join '|') } | - where-object { $_.fullname -inotmatch '(.exe|.zip|.dll)$' } | - where-object { $_.fullname -inotmatch '(unformated)' } - ) - - $files_exist = ($files.Count -gt 0) - - it $('non-binary project files exist ({0} found)' -f $files.Count) -skip:$(-not $files_exist) { - if (-not ($files.Count -gt 0)) - { - throw "No non-binary project were found" - } - } - - it 'files do not contain leading utf-8 BOM' -skip:$(-not $files_exist) { - # utf-8 BOM == 0xEF 0xBB 0xBF - # see http://www.powershellmagazine.com/2012/12/17/pscxtip-how-to-determine-the-byte-order-mark-of-a-text-file @@ https://archive.is/RgT42 - # ref: http://poshcode.org/2153 @@ https://archive.is/sGnnu - - # As of PowerShell 6.0, `Get-Content` on non-Windows platform does not support `-Encoding Byte` - # The following try-catch is to work around that by using .NET framework - $read_bytes_type = 'default' - function read_bytes ([string]$FileName, [int]$Size) { - if ($read_bytes_type -eq 'default') { - return Get-Content "$FileName" -Encoding Byte -TotalCount $Size - } - else { - $buffer = [byte[]](0, 0, 0) - $fstream = (New-Object -TypeName System.IO.FileStream -ArgumentList ("$FileName", [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)) - $fstream.Read($buffer, 0, $Size) > $null - return $buffer - } - } - try { - # Following would throw exception if `-Encoding Byte` is not supported - $null = read_bytes -FileName $MyInvocation.PSCommandPath -Size 3 - } - catch { - $read_bytes_type = 'dotnet' - } - - $badFiles = @( - foreach ($file in $files) - { - # Ignore previous TestResults.xml - if ($file -match "TestResults.xml") { - continue - } - $buffer = read_bytes -FileName "$($file.FullName)" -Size 3 - $content = ([char[]]$buffer -join '') - if ([regex]::match($content, '(?ms)^\xEF\xBB\xBF').success) - { - $file.FullName - } - } - ) - - if ($badFiles.Count -gt 0) - { - throw "The following files have utf-8 BOM: `r`n`r`n$($badFiles -join "`r`n")" - } - } - - it 'files end with a newline' -skip:$(-not $files_exist) { - $badFiles = @( - foreach ($file in $files) - { - # Ignore previous TestResults.xml - if ($file -match "TestResults.xml") { - continue - } - $string = [System.IO.File]::ReadAllText($file.FullName) - if ($string.Length -gt 0 -and $string[-1] -ne "`n") - { - $file.FullName - } - } - ) - - if ($badFiles.Count -gt 0) - { - throw "The following files do not end with a newline: `r`n`r`n$($badFiles -join "`r`n")" - } - } - - it 'file newlines are CRLF' -skip:$(-not $files_exist) { - $badFiles = @( - foreach ($file in $files) - { - $content = Get-Content -raw $file.FullName - if(!$content) { - throw "File contents are null: $($file.FullName)" - } - $lines = [regex]::split($content, '\r\n') - $lineCount = $lines.Count - - for ($i = 0; $i -lt $lineCount; $i++) - { - if ( [regex]::match($lines[$i], '\r|\n').success ) - { - $file.FullName - break - } - } - } - ) - - if ($badFiles.Count -gt 0) - { - throw "The following files have non-CRLF line endings: `r`n`r`n$($badFiles -join "`r`n")" - } - } - - it 'files have no lines containing trailing whitespace' -skip:$(-not $files_exist) { - $badLines = @( - foreach ($file in $files) - { - # Ignore previous TestResults.xml - if ($file -match "TestResults.xml") { - continue - } - $lines = [System.IO.File]::ReadAllLines($file.FullName) - $lineCount = $lines.Count - - for ($i = 0; $i -lt $lineCount; $i++) - { - if ($lines[$i] -match '\s+$') - { - 'File: {0}, Line: {1}' -f $file.FullName, ($i + 1) - } - } - } - ) - - if ($badLines.Count -gt 0) - { - throw "The following $($badLines.Count) lines contain trailing whitespace: `r`n`r`n$($badLines -join "`r`n")" - } - } - - it 'any leading whitespace consists only of spaces (excepting makefiles)' -skip:$(-not $files_exist) { - $badLines = @( - foreach ($file in $files) - { - if ($file.fullname -inotmatch '(^|.)makefile$') - { - $lines = [System.IO.File]::ReadAllLines($file.FullName) - $lineCount = $lines.Count - - for ($i = 0; $i -lt $lineCount; $i++) - { - if ($lines[$i] -notmatch '^[ ]*(\S|$)') - { - 'File: {0}, Line: {1}' -f $file.FullName, ($i + 1) - } - } - } - } - ) - - if ($badLines.Count -gt 0) - { - throw "The following $($badLines.Count) lines contain TABs within leading whitespace: `r`n`r`n$($badLines -join "`r`n")" - } - } - -} +. "$psscriptroot\Import-File-Tests.ps1" diff --git a/test/Import-File-Tests.ps1 b/test/Import-File-Tests.ps1 new file mode 100644 index 00000000..6eeeb4fb --- /dev/null +++ b/test/Import-File-Tests.ps1 @@ -0,0 +1,153 @@ +if([String]::IsNullOrEmpty($MyInvocation.PSScriptRoot)) { + Write-Error 'This script should not be called directly! It has to be imported from a buckets test file!' + exit 1 +} + +describe 'Style constraints for non-binary project files' { + + $files = @( + # gather all files except '*.exe', '*.zip', or any .git repository files + $repo_files | + where-object { $_.fullname -inotmatch $($project_file_exclusions -join '|') } | + where-object { $_.fullname -inotmatch '(.exe|.zip|.dll)$' } | + where-object { $_.fullname -inotmatch '(unformated)' } + ) + + $files_exist = ($files.Count -gt 0) + + it $('non-binary project files exist ({0} found)' -f $files.Count) -skip:$(-not $files_exist) { + if (-not ($files.Count -gt 0)) + { + throw "No non-binary project were found" + } + } + + it 'files do not contain leading UTF-8 BOM' -skip:$(-not $files_exist) { + # UTF-8 BOM == 0xEF 0xBB 0xBF + # see http://www.powershellmagazine.com/2012/12/17/pscxtip-how-to-determine-the-byte-order-mark-of-a-text-file @@ https://archive.is/RgT42 + # ref: http://poshcode.org/2153 @@ https://archive.is/sGnnu + $badFiles = @( + foreach ($file in $files) + { + if((Get-Command Get-Content).parameters.ContainsKey('AsByteStream')) { + # PowerShell Core (6.0+) '-Encoding byte' is replaced by '-AsByteStream' + $content = ([char[]](Get-Content $file.FullName -AsByteStream -TotalCount 3) -join '') + } else { + $content = ([char[]](Get-Content $file.FullName -Encoding byte -TotalCount 3) -join '') + } + if ([regex]::match($content, '(?ms)^\xEF\xBB\xBF').success) { + $file.FullName + } + } + ) + + if ($badFiles.Count -gt 0) + { + throw "The following files have utf-8 BOM: `r`n`r`n$($badFiles -join "`r`n")" + } + } + + it 'files end with a newline' -skip:$(-not $files_exist) { + $badFiles = @( + foreach ($file in $files) + { + # Ignore previous TestResults.xml + if ($file -match "TestResults.xml") { + continue + } + $string = [System.IO.File]::ReadAllText($file.FullName) + if ($string.Length -gt 0 -and $string[-1] -ne "`n") + { + $file.FullName + } + } + ) + + if ($badFiles.Count -gt 0) + { + throw "The following files do not end with a newline: `r`n`r`n$($badFiles -join "`r`n")" + } + } + + it 'file newlines are CRLF' -skip:$(-not $files_exist) { + $badFiles = @( + foreach ($file in $files) + { + $content = Get-Content -raw $file.FullName + if(!$content) { + throw "File contents are null: $($file.FullName)" + } + $lines = [regex]::split($content, '\r\n') + $lineCount = $lines.Count + + for ($i = 0; $i -lt $lineCount; $i++) + { + if ( [regex]::match($lines[$i], '\r|\n').success ) + { + $file.FullName + break + } + } + } + ) + + if ($badFiles.Count -gt 0) + { + throw "The following files have non-CRLF line endings: `r`n`r`n$($badFiles -join "`r`n")" + } + } + + it 'files have no lines containing trailing whitespace' -skip:$(-not $files_exist) { + $badLines = @( + foreach ($file in $files) + { + # Ignore previous TestResults.xml + if ($file -match "TestResults.xml") { + continue + } + $lines = [System.IO.File]::ReadAllLines($file.FullName) + $lineCount = $lines.Count + + for ($i = 0; $i -lt $lineCount; $i++) + { + if ($lines[$i] -match '\s+$') + { + 'File: {0}, Line: {1}' -f $file.FullName, ($i + 1) + } + } + } + ) + + if ($badLines.Count -gt 0) + { + throw "The following $($badLines.Count) lines contain trailing whitespace: `r`n`r`n$($badLines -join "`r`n")" + } + } + + it 'any leading whitespace consists only of spaces (excepting makefiles)' -skip:$(-not $files_exist) { + $badLines = @( + foreach ($file in $files) + { + if ($file.fullname -inotmatch '(^|.)makefile$') + { + $lines = [System.IO.File]::ReadAllLines($file.FullName) + $lineCount = $lines.Count + + for ($i = 0; $i -lt $lineCount; $i++) + { + if ($lines[$i] -notmatch '^[ ]*(\S|$)') + { + 'File: {0}, Line: {1}' -f $file.FullName, ($i + 1) + } + } + } + } + ) + + if ($badLines.Count -gt 0) + { + throw "The following $($badLines.Count) lines contain TABs within leading whitespace: `r`n`r`n$($badLines -join "`r`n")" + } + } + +}