Tests/GenXdev.FileSystem/Find-DuplicateFiles.Tests.ps1
|
Pester\Describe 'Find-DuplicateFiles' { Pester\BeforeAll { $Script:testRoot = GenXdev.FileSystem\Expand-Path "$env:TEMP\GenXdev.FileSystem.Tests\Find-DuplicateFiles\" -CreateDirectory # Helper function to create random binary file $Script:CreateRandomBinaryFile = { param([string]$Path, [int]$SizeInMB = 1) $buffer = [byte[]]::new($SizeInMB * 1MB) [System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($buffer) $null = [System.IO.File]::WriteAllBytes($Path, $buffer) return $Path } } Pester\AfterAll { GenXdev.FileSystem\Remove-AllItems $Script:testRoot -DeleteFolder } Pester\BeforeEach { $Script:files = GenXdev.FileSystem\Expand-Path "$Script:testRoot\files\" -CreateDirectory } Pester\AfterEach { @($Script:files) | Microsoft.PowerShell.Core\ForEach-Object { GenXdev.FileSystem\Remove-AllItems -Path $_ } } Pester\It 'Should detect exact duplicates' { # create test data - 10 files with exact duplicates $group1Base = "$Script:files\exact_dup_1a.bin" & $Script:CreateRandomBinaryFile $group1Base 2 Microsoft.PowerShell.Management\Copy-Item $group1Base "$Script:files\exact_dup_1b.bin" -Force Microsoft.PowerShell.Management\Copy-Item $group1Base "$Script:files\exact_dup_1c.bin" -Force $group2Base = "$Script:files\exact_dup_2a.bin" & $Script:CreateRandomBinaryFile $group2Base 2 Microsoft.PowerShell.Management\Copy-Item $group2Base "$Script:files\exact_dup_2b.bin" -Force & $Script:CreateRandomBinaryFile "$Script:files\unique_1.bin" 1 & $Script:CreateRandomBinaryFile "$Script:files\unique_2.bin" 1 & $Script:CreateRandomBinaryFile "$Script:files\unique_3.bin" 1 & $Script:CreateRandomBinaryFile "$Script:files\unique_4.bin" 1 & $Script:CreateRandomBinaryFile "$Script:files\unique_5.bin" 1 # execute $results = @(GenXdev.FileSystem\Find-DuplicateFiles "$Script:files\*.bin") # assert $results | Pester\Should -Not -BeNullOrEmpty $results.Count | Pester\Should -Be 2 $duplicateCounts = $results | Microsoft.PowerShell.Core\ForEach-Object { $_.Duplicates.Count } | Microsoft.PowerShell.Utility\Sort-Object $duplicateCounts | Pester\Should -Be @(1, 2) } Pester\It 'Should detect partial duplicates' { # create test data - partial duplicates only (no exact duplicates in same group) $basePath = "$Script:files\base_file_3mb.bin" & $Script:CreateRandomBinaryFile $basePath 3 $baseContent = [System.IO.File]::ReadAllBytes($basePath) $partialMatchData = $baseContent[0..((2MB) - 1)] [System.IO.File]::WriteAllBytes("$Script:files\partial_match_1.bin", $partialMatchData) [System.IO.File]::WriteAllBytes("$Script:files\partial_match_2.bin", $partialMatchData) & $Script:CreateRandomBinaryFile "$Script:files\unique_x1.bin" 1 & $Script:CreateRandomBinaryFile "$Script:files\unique_x2.bin" 1 & $Script:CreateRandomBinaryFile "$Script:files\unique_x3.bin" 1 & $Script:CreateRandomBinaryFile "$Script:files\unique_x4.bin" 1 & $Script:CreateRandomBinaryFile "$Script:files\unique_x5.bin" 1 $results = @(GenXdev.FileSystem\Find-DuplicateFiles "$Script:files\*.bin" -ComparePartial) $results | Pester\Should -Not -BeNullOrEmpty $results.Count | Pester\Should -Be 1 $results[0].Duplicates.Count | Pester\Should -Be 2 } } |