Describe "Toolset" {
    $tools = (Get-ToolsetContent).toolcache

    $toolsExecutables = @{
        Python = @{
            tools = @("python", "bin/pip")
            command = "--version"
        }
        node = @{
            tools = @("bin/node", "bin/npm")
            command = "--version"
        }
        PyPy = @{
            tools = @("bin/python", "bin/pip")
            command = "--version"
        }
        go = @{
            tools = @("bin/go")
            command = "version"
        }
        Ruby = @{
            tools = @("bin/ruby")
            command = "--version"
        }
        CodeQL = @{
            tools = @("codeql/codeql")
            command = "version"
        }
    }

    foreach ($tool in $tools) {
        $toolName = $tool.Name
        Context "$toolName" {
            $toolExecs = $toolsExecutables[$toolName]

            foreach ($version in $tool.versions) {
                # Add wildcard if missing
                if ($version.Split(".").Length -lt 3) {
                    $version += ".*"
                }

                $expectedVersionPath = Join-Path $env:AGENT_TOOLSDIRECTORY $toolName $version

                It "$version version folder exists" -TestCases @{ ExpectedVersionPath = $expectedVersionPath} {
                    $ExpectedVersionPath | Should -Exist
                }

                $foundVersion = Get-Item $expectedVersionPath `
                    | Sort-Object -Property {[SemVer]$_.name} -Descending `
                    | Select-Object -First 1
                $foundVersionPath = Join-Path $foundVersion $tool.arch

                if ($toolExecs) {
                    foreach ($executable in $toolExecs["tools"]) {
                        $executablePath = Join-Path $foundVersionPath $executable

                        It "Validate $executable" -TestCases @{ExecutablePath = $executablePath} {
                            $ExecutablePath | Should -Exist
                        }
                    }
                }
            }
        }
    }
}
