tests/XdgSplit.Tests.ps1

BeforeAll {
    . "$PSScriptRoot/TestSupport.ps1"
    foreach ($f in Get-DFTestModuleFile) { . $f }
    $script:RealTools = Join-Path $PSScriptRoot '../Tools'
}

Describe 'xdg.vars is path-templates-only after the split' {
    BeforeEach { Reset-DFTestSession }
    It 'tool <Name> has no non-XDG value in xdg.vars' -ForEach @(
        @{ Name = 'fzf' }, @{ Name = 'delta' }, @{ Name = 'less' }, @{ Name = 'mdcat' },
        @{ Name = 'rustup' }, @{ Name = 'vcpkg' }
    ) {
        $j = Get-Content (Join-Path $script:RealTools "$Name.json") -Raw | ConvertFrom-Json
        $vars = $j.xdg.PSObject.Properties['vars']?.Value
        if ($vars) {
            foreach ($p in $vars.PSObject.Properties) {
                $p.Value | Should -Match '\$\{XDG_(CONFIG|DATA|STATE|CACHE)_HOME\}' `
                    -Because "$Name xdg.vars['$($p.Name)'] must be an XDG path template"
            }
        }
    }
}

Describe 'env-block relocation preserves the migrated values' {
    BeforeEach { Reset-DFTestSession }
    It 'fzf env carries the fuzzy-finder settings' {
        $j = Get-Content (Join-Path $script:RealTools 'fzf.json') -Raw | ConvertFrom-Json
        $j.env.FZF_DEFAULT_COMMAND | Should -Be 'fd --type f --strip-cwd-prefix --hidden --follow --exclude .git'
        # Exact full-value match so corruption anywhere in the multiline opts is caught
        # (JSON \n decodes to LF, so compare against a `n-joined string). Color flags
        # moved to Tools/fzf/catppuccin-mocha.json + Tools/fzf.ps1 -- see fzf.Tests.ps1.
        # Matches the user's zsh config exactly (fuzzy match, not --exact/--no-sort/
        # --cycle) -- see the 2026-09-06 zsh-parity investigation.
        $expectedFzfOpts = @(
            '--layout=reverse'
            '--inline-info'
            '--height=40%'
            '--border'
        ) -join "`n"
        $j.env.FZF_DEFAULT_OPTS | Should -Be $expectedFzfOpts
        $j.env.FZF_CTRL_T_OPTS  | Should -Be "--preview `"bat -n --color=always {}`" --bind 'ctrl-/:change-preview-window(down|hidden|)'"
    }
    It 'delta carries GIT_PAGER in its diff role block (DELTA_FEATURES moved to the sidecar)' {
        $j = Get-Content (Join-Path $script:RealTools 'delta.json') -Raw | ConvertFrom-Json
        $j.roles.diff.env.GIT_PAGER | Should -Be 'delta'
        $j.PSObject.Properties['env'] | Should -BeNullOrEmpty
    }
    It 'less keeps its XDG paths and moves LESS to env' {
        $j = Get-Content (Join-Path $script:RealTools 'less.json') -Raw | ConvertFrom-Json
        $j.xdg.vars.LESSHISTFILE | Should -Match '\$\{XDG_STATE_HOME\}'
        $j.xdg.vars.LESSKEYIN    | Should -Match '\$\{XDG_CONFIG_HOME\}'
        $j.xdg.vars.PSObject.Properties['LESS'] | Should -BeNullOrEmpty
        $j.env.LESS | Should -Be '--RAW-CONTROL-CHARS --quit-if-one-screen --no-init'
    }
    It 'mdcat moves MDCAT_THEME to env and is method default' {
        $j = Get-Content (Join-Path $script:RealTools 'mdcat.json') -Raw | ConvertFrom-Json
        $j.xdg.method     | Should -Be 'default'
        $j.env.MDCAT_THEME | Should -Be 'catppuccin-mocha'
    }
}

Describe 'Register applies the migrated env settings (tools without a sidecar)' {
    BeforeEach { Reset-DFTestSession;
        $script:DFToolAvailability = @{}
        $script:SavedFzf   = $Env:FZF_DEFAULT_OPTS
        $script:SavedPager = $Env:GIT_PAGER
        $script:SavedLess  = $Env:LESS
        $script:SavedLessHist = $Env:LESSHISTFILE
        # tool xdg.vars never overwrite a variable that is already set, so start
        # from none (the developer's own profile may have set it)
        Remove-Item Env:\LESSHISTFILE -ErrorAction Ignore
        Set-DFTestXdg

        $script:SavedGitConfigGlobal = $Env:GIT_CONFIG_GLOBAL


        # Registering delta for real (below) dot-sources the real Tools/delta.setup.ps1,
        # which calls `git config --global`. Redirect it explicitly rather than relying
        # on XDG_CONFIG_HOME alone -- git only falls back to $XDG_CONFIG_HOME/git/config
        # when no ~/.gitconfig exists, so a developer machine that has one would
        # otherwise have this test write into its real global git config.
        $Env:GIT_CONFIG_GLOBAL = Join-Path $TestDrive 'gitconfig'
        Mock Get-Command { [PSCustomObject]@{ Path = 'C:\fake\tool.exe' } }
    }
    AfterEach {
        $Env:FZF_DEFAULT_OPTS = $script:SavedFzf
        $Env:GIT_PAGER        = $script:SavedPager
        $Env:LESS             = $script:SavedLess
        $Env:LESSHISTFILE     = $script:SavedLessHist

        $Env:GIT_CONFIG_GLOBAL = $script:SavedGitConfigGlobal
        Restore-DFTestXdg
    }

    It 'sets FZF_DEFAULT_OPTS from fzf.json env' {
        Register-DFTool -Name 'fzf' -ToolsPath $script:RealTools
        $Env:FZF_DEFAULT_OPTS | Should -Match '--layout=reverse'
    }
    It 'sets GIT_PAGER from delta.json env' {
        Register-DFTool -Name 'delta' -ToolsPath $script:RealTools
        $Env:GIT_PAGER | Should -Be 'delta'
    }
    It 'sets LESS from less.json env and still sets the XDG history path' {
        Register-DFTool -Name 'less' -ToolsPath $script:RealTools
        $Env:LESS         | Should -Be '--RAW-CONTROL-CHARS --quit-if-one-screen --no-init'
        $Env:LESSHISTFILE | Should -Be (Join-Path $Env:XDG_STATE_HOME 'less' 'history')
    }
}