#!/usr/bin/env zunit

@setup {
    load "../you-should-use.plugin.zsh"
    # Simplify format for tests
    YSU_MESSAGE_FORMAT='Found existing %alias_type for "%command". You should use: "%alias"'
    unset YSU_MESSAGE_POSITION
}

@teardown {
}

@test 'aliases no match' {
    export YSU_MODE="ALL"
    alias ls="less -R"
    run _check_aliases "less"

    assert "$output" is_empty
    assert $state equals 0
}

@test 'aliases longer or the same length as their commands are ignored' {
    export YSU_MODE="ALL"
    alias longalias='ls -lA'
    alias ls_-lA='ls -lA'
    run _check_aliases "ls -lA"

    assert "$output" is_empty
    assert $state equals 0
}

@test 'aliases match - all with alphabetical ordering' {
    export YSU_MODE="ALL"
    alias c="git status -v"
    alias a="git status"
    alias b="git"
    run _check_aliases "git status -v"

    assert $lines[1] contains 'Found existing alias for "git status". You should use: "a"'
    assert $lines[2] contains 'Found existing alias for "git". You should use: "b"'
    assert $lines[3] contains 'Found existing alias for "git status -v". You should use: "c"'
    assert $state equals 0
}

@test 'aliases bestmatch default' {
    unset YSU_MODE
    alias gs="git status"
    alias g="git"
    run _check_aliases "git status -v"

    assert "$output" contains 'Found existing alias for "git status". You should use: "gs"'
    assert $state equals 0
}

@test 'aliases bestmatch - chooses longest matching alias value' {
    export YSU_MODE="BESTMATCH"
    alias gs="git status"
    alias g="git"
    alias gsv="git status -v"
    run _check_aliases "git status -v"

    assert "$output" contains 'Found existing alias for "git status -v". You should use: "gsv"'
    assert $state equals 0
}

@test 'aliases bestmatch - chooses longest matching alias value case 2' {
    export YSU_MODE="BESTMATCH"
    alias gco="git checkout"
    alias gcom="git checkout master"
    run _check_aliases "git checkout master"

    assert "$output" contains 'Found existing alias for "git checkout master". You should use: "gcom"'
    assert $state equals 0
}

@test 'aliases bestmatch - chooses shortest alias key on equal value lengths' {
    export YSU_MODE="BESTMATCH"
    alias v="vim"
    alias nvim="vim"

    run _check_aliases "vim"

    assert "$output" contains 'Found existing alias for "vim". You should use: "v"'
    assert $state equals 0
}

@test 'aliases ignore if sudo' {
    unset YSU_MODE
    alias gs="git status"
    run _check_aliases "sudo git status -v"

    assert "$output" is_empty
    assert $state equals 0
}

@test 'aliases exact match' {
    export YSU_MODE="ALL"
    alias hu='hg update'
    run _check_aliases 'hg update'

    assert "$output" contains 'Found existing alias for "hg update". You should use: "hu"'
    assert $state equals 0
}

@test 'aliases substring match' {
    export YSU_MODE="ALL"
    alias hu='hg update'
    run _check_aliases 'hg update -all'

    assert "$output" contains 'Found existing alias for "hg update". You should use: "hu"'
    assert $state equals 0
}

@test 'aliases ignores - does not report an ignored alias' {
    export YSU_MODE="ALL"
    export YSU_IGNORED_ALIASES=("something" "e" "else")
    alias e="echo"
    alias l="ls"
    run _check_aliases "echo hello"

    assert $output is_empty
    assert $state equals 0
}

@test 'aliases ignores only - only ignores specified aliases' {
    export YSU_MODE="ALL"
    export YSU_IGNORED_ALIASES=("something" "else")
    alias e="echo"
    alias l="ls"
    run _check_aliases "echo hello"

    assert $output contains 'Found existing alias for "echo"'
    assert $state equals 0
}

@test 'dont display recommendations for an alias if it is used' {
    alias hu='hg update'
    run _check_aliases 'hu' 'hg update'

    assert "$output" is_empty
    assert $state equals 0
}

@test 'dont display recommendations for an alias if it is used - 2' {
    alias eh='echo hello'
    run _check_aliases 'eh world' 'echo hello world'

    assert "$output" is_empty
    assert $state equals 0
}

@test 'dont display recommendations for an alias if it is used - 4' {
    alias ..='cd ..'
    alias cd..='cd ..'

    run _check_aliases '..' 'cd ..'

    assert "$output" is_empty
    assert $state equals 0
}

@test 'dont display recommendations for an alias if it is used - 3' {
    alias ls='ls --color=auto'
    alias ll='ls -lh --group-directories-first'

    run _check_aliases 'll' 'ls --color=auto -lh --group-directories-first'

    assert "$output" is_empty
    assert $state equals 0
}