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
    }
}