
Describe "Get-Alias DRT Unit Tests" -Tags "CI" {
    It "Get-Alias Bogus Scope Name should throw PSArgumentException"{
        try {
            Get-Alias -Name "ABCD" -Scope "bogus"
            Throw "Execution OK"
        }
        catch {
            $_.FullyQualifiedErrorId | Should be "Argument,Microsoft.PowerShell.Commands.GetAliasCommand"
        }
    }
    It "Get-Alias OutOfRange Scope"{
        try {
            Get-Alias -Name "ABCD" -Scope "99999"
            Throw "Execution OK"
        }
        catch {
            $_.FullyQualifiedErrorId | Should be "ArgumentOutOfRange,Microsoft.PowerShell.Commands.GetAliasCommand"
        }
    }
    It "Get-Alias Named Single Valid"{
            Set-Alias -Name ABCD -Value "foo"
            $result=Get-Alias -Name ABCD
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"
    }
    It "Get-Alias Positional Single Valid"{
            Set-Alias -Name ABCD -Value "foo"
            $result=Get-Alias ABCD
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"
    }
    It "Get-Alias Named Multiple Valid"{
            Set-Alias -Name ABCD -Value "foo"
            Set-Alias -Name AEFG -Value "bar"
            $result=Get-Alias -Name ABCD,AEFG
            $result[0].Name| Should Be "ABCD"
            $result[0].Definition| Should Be "foo"
            $result[0].Description| Should Be ""
            $result[0].Options| Should Be "None"
            $result[1].Name| Should Be "AEFG"
            $result[1].Definition| Should Be "bar"
            $result[1].Description| Should Be ""
            $result[1].Options| Should Be "None"
    }
    It "Get-Alias Named Wildcard Valid"{
            Set-Alias -Name ABCD -Value "foo"
            Set-Alias -Name ABCG -Value "bar"
            $result=Get-Alias -Name ABC*
            $result[0].Name| Should Be "ABCD"
            $result[0].Definition| Should Be "foo"
            $result[0].Description| Should Be ""
            $result[0].Options| Should Be "None"
            $result[1].Name| Should Be "ABCG"
            $result[1].Definition| Should Be "bar"
            $result[1].Description| Should Be ""
            $result[1].Options| Should Be "None"
    }
    It "Get-Alias Positional Wildcard Valid"{
            Set-Alias -Name ABCD -Value "foo"
            Set-Alias -Name ABCG -Value "bar"
            $result=Get-Alias ABC*
            $result[0].Name| Should Be "ABCD"
            $result[0].Definition| Should Be "foo"
            $result[0].Description| Should Be ""
            $result[0].Options| Should Be "None"
            $result[1].Name| Should Be "ABCG"
            $result[1].Definition| Should Be "bar"
            $result[1].Description| Should Be ""
            $result[1].Options| Should Be "None"
    }
    It "Get-Alias Named Wildcard And Exclude Valid"{
            Set-Alias -Name ABCD -Value "foo"
            Set-Alias -Name ABCG -Value "bar"
            $result=Get-Alias -Name ABC* -Exclude "*BCG"
            $result[0].Name| Should Be "ABCD"
            $result[0].Definition| Should Be "foo"
            $result[0].Description| Should Be ""
            $result[0].Options| Should Be "None"
    }
    It "Get-Alias Scope Valid"{
            Set-Alias -Name ABCD -Value "foo"
            $result=Get-Alias -Name ABCD
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"

            Set-Alias -Name ABCD -Value "localfoo" -scope local
            $result=Get-Alias -Name ABCD -scope local
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "localfoo"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"

            Set-Alias -Name ABCD -Value "globalfoo" -scope global
            Set-Alias -Name ABCD -Value "scriptfoo" -scope "script"
            Set-Alias -Name ABCD -Value "foo0" -scope "0"
            Set-Alias -Name ABCD -Value "foo1" -scope "1"

            $result=Get-Alias -Name ABCD
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo0"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"

            $result=Get-Alias -Name ABCD -scope local
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo0"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"

            $result=Get-Alias -Name ABCD -scope global
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "globalfoo"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"

            $result=Get-Alias -Name ABCD -scope "script"
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "scriptfoo"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"

            $result=Get-Alias -Name ABCD -scope "0"
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo0"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"

            $result=Get-Alias -Name ABCD -scope "1"
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo1"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"
    }
    It "Get-Alias Expose Bug 1065828, BugId:905235"{
        try {
            Get-Alias -Name "ABCD" -Scope "100"
            Throw "Execution OK"
        }
        catch {
            $_.FullyQualifiedErrorId | Should be "ArgumentOutOfRange,Microsoft.PowerShell.Commands.GetAliasCommand"
        }
    }
    It "Get-Alias Zero Scope Valid"{
            Set-Alias -Name ABCD -Value "foo"
            $result=Get-Alias -Name ABCD
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"

            $result=Get-Alias -Name ABCD -scope "0"
            $result.Name| Should Be "ABCD"
            $result.Definition| Should Be "foo"
            $result.Description| Should Be ""
            $result.Options| Should Be "None"
    }

    It "Test get-alias with Definition parameter" {
        $returnObject = Get-Alias -Definition Get-Command
        For($i = 0; $i -lt $returnObject.Length;$i++)
        {
            $returnObject[$i] | Should Not BeNullOrEmpty
            $returnObject[$i].CommandType | Should Be 'Alias'
            $returnObject[$i].Definition | Should Be 'Get-Command'
        }
    }
}

Describe "Get-Alias" -Tags "CI" {
    It "Should have a return type of System.Array when gal returns more than one object" {
        $val1=(Get-Alias a*)
        $val2=(Get-Alias c*)
        $i=0

        $val1 | Should Not BeNullOrEmpty
        $val2 | Should Not BeNullOrEmpty

        $val1 | ForEach-Object{ $i++};
        if($i -lt 2) {
            $val1 | Should BeOfType "System.Management.Automation.CommandInfo"
        }
        else
        {
            ,$val1 | Should BeOfType "System.Array"
        }

        $val2 | ForEach-Object{ $i++};
        if($i -lt 2) {
            $val2 | Should BeOfType "System.Management.Automation.CommandInfo"
        }
        else
        {
            ,$val2 | Should BeOfType "System.Array"
        }
    }

    It "should return an array of objects" {
        $val = Get-Alias a*
        $alias = gal a*

        $val.Count | Should Be $alias.Count
        for ($i=0; $i -lt $val.Count;$i++)
        {
            $val[$i].CommandType | Should Be $alias[$i].CommandType
            $val[$i].Name | Should Be $alias[$i].Name
            $val[$i].ModuleName | Should Be $alias[$i].ModuleName
        }
    }
}

Describe "Get-Alias null tests" -Tags "CI" {

  $testCases =
    @{ data = $null; value = 'null' },
    @{ data = [String]::Empty; value = 'empty string' }

  Context 'Check null or empty value to the -Name parameter' {
    It 'Should throw if <value> is passed to -Name parameter' -TestCases $testCases {
      param($data)
      try
      {
          Get-Alias -Name $data
          throw "No Exception!"
      }
      catch { $_.FullyQualifiedErrorId | Should Be 'ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetAliasCommand' }
    }
  }
  Context 'Check null or empty value to the -Name parameter via pipeline' {
    It 'Should throw if <value> is passed through pipeline to -Name parameter' -TestCases $testCases {
      param($data)
      try
      {
          $data | Get-Alias -ErrorAction Stop
          throw "No Exception!"
      }
      catch { $_.FullyQualifiedErrorId | Should Be 'ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetAliasCommand' }
    }
  }
}
