#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/../src/nulib.sh" || exit 1
require: tests
#NULIB_NO_DISABLE_SET_X=1

function pa() {
    unset count fixed mopt dmopt oopt doopt autoinc autoval a1 a2 a3 a4
    count=
    fixed=
    efixed=1
    mopt=
    dmopt=
    oopt=
    doopt=
    autoinc=
    autoval=
    unset a1
    a2=()
    a3=
    a4=x
    args=(
        "tester la gestion des arguments"
        -o,--eopt count "incrémenter count"
        -f,--fixed fixed=42 "spécifier fixed"
        -e,--efixed efixed= "spécifier efixed"
        -a:,--mopt mopt= "spécifier mopt"
        -A:,--dmopt dmopt=default "spécifier dmopt"
        -b::,--oopt oopt= "spécifier oopt"
        -B::,--doopt doopt=default "spécifier doopt"
        -n,--autoinc . "incrémenter autoinc"
        -N,--no-autoinc . "décrémenter autoinc"
        -v:,--autoval . "spécifier autoval"
        -x: a1 "autoadd a1 qui n'est pas défini"
        -y: a2 "autoadd a2 qui est défini à ()"
        -z: a3 "autoadd a3 qui est défini à vide"
        -t: a4 "autoadd a4 qui est défini à une valeur non vide"
        -s,--sans-arg '$echo "sans_arg option=$option_, name=$name_, value=$value_"'
        -S::,--avec-arg '$echo "avec_arg option=$option_, name=$name_, value=$value_"'
    )
    parse_args "$@"
}

pa
assert_z "$count"
assert_z "$fixed"
assert_eq "$efixed" 1
assert_z "$mopt"
assert_z "$dmopt"
assert_z "$oopt"
assert_z "$doopt"
assert_z "$autoinc"
assert_z "$autoval"
assert_not_defined a1
assert_is_array a2
assert_not_array a3
assert_z "$a3"
assert_not_array a4
assert_same x "$a4"
assert_eq "${#args[*]}" 0

pa -o
assert_eq "$count" 1
pa -oo
assert_eq "$count" 2
pa -ooo
assert_eq "$count" 3

pa -f
assert_eq "$fixed" 42
pa -ff
assert_eq "$fixed" 42
pa -fff
assert_eq "$fixed" 42

assert_same "$efixed" "1"
pa -e
assert_same "$efixed" ""
pa -ee
assert_same "$efixed" ""
pa -eee
assert_same "$efixed" ""

pa -a ""
assert_not_array mopt
assert_same "$mopt" ""
pa -a abc
assert_not_array mopt
assert_same "$mopt" abc
pa -a abc -a xyz
assert_not_array mopt
assert_same "$mopt" xyz

pa -A ""
assert_not_array dmopt
assert_same "$dmopt" default
pa -A abc
assert_not_array dmopt
assert_same "$dmopt" abc
pa -A abc -A xyz
assert_not_array dmopt
assert_same "$dmopt" xyz

pa -b
assert_not_array oopt
assert_same "$oopt" ""
pa -babc
assert_not_array oopt
assert_same "$oopt" abc
pa -babc -bxyz
assert_not_array oopt
assert_same "$oopt" xyz

pa -B
assert_not_array doopt
assert_same "$doopt" default
pa -Babc
assert_not_array doopt
assert_same "$doopt" abc
pa -Babc -Bxyz
assert_not_array doopt
assert_same "$doopt" xyz

pa -n
assert_eq "$autoinc" 1
pa -nn
assert_eq "$autoinc" 2
pa -nnn
assert_eq "$autoinc" 3

pa -nN
assert_z "$autoinc"
pa -nnN
assert_eq "$autoinc" 1
pa -nnnNN
assert_eq "$autoinc" 1

pa -v ""
assert_is_array autoval
assert_array_same autoval ""
pa -v abc
assert_is_array autoval
assert_array_same autoval abc
pa -v abc -v xyz
assert_is_array autoval
assert_array_same autoval abc xyz

pa -xa
assert_not_array a1
assert_same "$a1" a
pa -xa -xb
assert_is_array a1
assert_array_same a1 a b

pa -ya
assert_is_array a2
assert_array_same a2 a
pa -ya -yb
assert_is_array a2
assert_array_same a2 a b

pa -za
assert_is_array a3
assert_array_same a3 a
pa -za -zb
assert_is_array a3
assert_array_same a3 a b

pa -ta
assert_is_array a4
assert_array_same a4 x a
pa -ta -tb
assert_is_array a4
assert_array_same a4 x a b

assert_same "$(pa -s)" "sans_arg option=-s, name=sans_arg, value="
assert_same "$(pa --sans-arg)" "sans_arg option=--sans-arg, name=sans_arg, value="

assert_same "$(pa -S)" "avec_arg option=-S, name=avec_arg, value="
assert_same "$(pa -Sx)" "avec_arg option=-S, name=avec_arg, value=x"
assert_same "$(pa --avec-arg)" "avec_arg option=--avec-arg, name=avec_arg, value="
assert_same "$(pa --avec-arg=x)" "avec_arg option=--avec-arg, name=avec_arg, value=x"

pa x
assert_array_same args x

enote "tests successful"