Tests/dynamicParamFunctions.tests.ps1

.  (Join-path $PSScriptRoot ..\makeDynamicParam.ps1)

function processIt {
    param( $bindings )

        Set-StrictMode -Version Latest
        $dyn = $bindings["dyn"]

        Write-Verbose "params are $($bindings | out-string)"

        $dyn
    }

    function simpleDynamicParam {
    [CmdletBinding()]
    param()

    DynamicParam {
        makeDynamicParam "dyn" -ValidateSetScript {
            return 'cow','pig','horse'
        } -DebugFile C:\temp\test.txt

    }

    process {
        processIt $PSBoundParameters
    }

    }

    function twoSimpleDynamicParam {
    [CmdletBinding()]
    param()

    DynamicParam {
        makeDynamicParam "dynAnimal" -ValidateSet 'cow','pig','horse' -Mandatory |
        makeDynamicParam "dynColor" -ValidateSet 'red','light blue','green' -Mandatory
    }

    process {
        $PSBoundParameters["dynAnimal"]
        $PSBoundParameters["dynColor"]
    }

    }

    function twoSimpleDynamicParamPositional {
        [CmdletBinding()]
        param(
        # this breaks it since it thinks test is always 1
        #[Parameter(Position=3)]
        #[string] $test
        )

        DynamicParam {
            makeDynamicParam "dynAnimal" -ValidateSet 'cow','pig','horse' -Mandatory -Position 1|
            makeDynamicParam "dynColor" -ValidateSet 'red','light blue','green' -Position 2 -Mandatory
        }

        process {
            $PSBoundParameters["dynAnimal"]
            $PSBoundParameters["dynColor"]
        }

        }

    <#
    .SYNOPSIS
    Test dynamic parameter function that does not work, since no [CmdletBinding] or [Parameter]
    #>

    function simpleDynamicParamNoBinding {
        param()

        DynamicParam
        {
            makeDynamicParam "dyn" -ValidateSet 'cow','pig','horse'
        }

        process
        {
            processIt $PSBoundParameters
        }

    }


    function conditionalDynamicParam {
    [Cmdletbinding()]
    param(
    [Parameter()]
    [switch] $Colors
    )

    DynamicParam
    {
        makeDynamicParam "dyn" -ValidateSetScript {
            if ( (Test-Path variable:colors) -and $colors )
            {
                'red','light blue','green'
            }
            else
            {
                'cow','pig','horse'
            }
        }
    }

    process
    {
        processIt $PSBoundParameters
    }

    }

    <#
    Try to get it so can not pass in -dyn and just use "red"
    Help says -dyn is optional, but can't get it to take it w/o
    e.g.
    noNameDynamicParam red # sets staticParam to red, prompts for dyn
    noNameDynamicParam -dyn red # ok
 
    Setting explicit postion and CmdletBinding(PositionalBinding) doesn't help
    DefaultParameterSetName="dyn" didn't help
    PositionalBinding=$false and removing position worked, but have to supply -static for second
    #>


    function noNameDynamicParam {
        [CmdletBinding(PositionalBinding=$false)]
        param(
        [Parameter()]
        [string] $staticParam
        )

        DynamicParam
        {
            makeDynamicParam -ParameterName "dyn" -ValidateSet 'red','light blue','green' -Mandatory
        }

        process
        {
            processIt $PSBoundParameters
        }

    }