t / t0040-parse-options.shon commit Merge branch 'jk/git-dir-lookup' into maint (0cfba96)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Johannes Schindelin
   4#
   5
   6test_description='our own option parser'
   7
   8. ./test-lib.sh
   9
  10cat > expect << EOF
  11usage: test-parse-options <options>
  12
  13    -b, --boolean         get a boolean
  14    -4, --or4             bitwise-or boolean with ...0100
  15    --neg-or4             same as --no-or4
  16
  17    -i, --integer <n>     get a integer
  18    -j <n>                get a integer, too
  19    --set23               set integer to 23
  20    -t <time>             get timestamp of <time>
  21    -L, --length <str>    get length of <str>
  22    -F, --file <file>     set file to <file>
  23
  24String options
  25    -s, --string <string>
  26                          get a string
  27    --string2 <str>       get another string
  28    --st <st>             get another string (pervert ordering)
  29    -o <str>              get another string
  30    --default-string      set string to default
  31    --list <str>          add str to list
  32
  33Magic arguments
  34    --quux                means --quux
  35    -NUM                  set integer to NUM
  36    +                     same as -b
  37    --ambiguous           positive ambiguity
  38    --no-ambiguous        negative ambiguity
  39
  40Standard options
  41    --abbrev[=<n>]        use <n> digits to display SHA-1s
  42    -v, --verbose         be verbose
  43    -n, --dry-run         dry run
  44    -q, --quiet           be quiet
  45
  46EOF
  47
  48test_expect_success 'test help' '
  49        test_must_fail test-parse-options -h > output 2> output.err &&
  50        test ! -s output.err &&
  51        test_cmp expect output
  52'
  53
  54mv expect expect.err
  55
  56cat > expect << EOF
  57boolean: 2
  58integer: 1729
  59timestamp: 0
  60string: 123
  61abbrev: 7
  62verbose: 2
  63quiet: no
  64dry run: yes
  65file: prefix/my.file
  66EOF
  67
  68test_expect_success 'short options' '
  69        test-parse-options -s123 -b -i 1729 -b -vv -n -F my.file \
  70        > output 2> output.err &&
  71        test_cmp expect output &&
  72        test ! -s output.err
  73'
  74
  75cat > expect << EOF
  76boolean: 2
  77integer: 1729
  78timestamp: 0
  79string: 321
  80abbrev: 10
  81verbose: 2
  82quiet: no
  83dry run: no
  84file: prefix/fi.le
  85EOF
  86
  87test_expect_success 'long options' '
  88        test-parse-options --boolean --integer 1729 --boolean --string2=321 \
  89                --verbose --verbose --no-dry-run --abbrev=10 --file fi.le\
  90                --obsolete > output 2> output.err &&
  91        test ! -s output.err &&
  92        test_cmp expect output
  93'
  94
  95test_expect_success 'missing required value' '
  96        test-parse-options -s;
  97        test $? = 129 &&
  98        test-parse-options --string;
  99        test $? = 129 &&
 100        test-parse-options --file;
 101        test $? = 129
 102'
 103
 104cat > expect << EOF
 105boolean: 1
 106integer: 13
 107timestamp: 0
 108string: 123
 109abbrev: 7
 110verbose: 0
 111quiet: no
 112dry run: no
 113file: (not set)
 114arg 00: a1
 115arg 01: b1
 116arg 02: --boolean
 117EOF
 118
 119test_expect_success 'intermingled arguments' '
 120        test-parse-options a1 --string 123 b1 --boolean -j 13 -- --boolean \
 121                > output 2> output.err &&
 122        test ! -s output.err &&
 123        test_cmp expect output
 124'
 125
 126cat > expect << EOF
 127boolean: 0
 128integer: 2
 129timestamp: 0
 130string: (not set)
 131abbrev: 7
 132verbose: 0
 133quiet: no
 134dry run: no
 135file: (not set)
 136EOF
 137
 138test_expect_success 'unambiguously abbreviated option' '
 139        test-parse-options --int 2 --boolean --no-bo > output 2> output.err &&
 140        test ! -s output.err &&
 141        test_cmp expect output
 142'
 143
 144test_expect_success 'unambiguously abbreviated option with "="' '
 145        test-parse-options --int=2 > output 2> output.err &&
 146        test ! -s output.err &&
 147        test_cmp expect output
 148'
 149
 150test_expect_success 'ambiguously abbreviated option' '
 151        test-parse-options --strin 123;
 152        test $? = 129
 153'
 154
 155cat > expect << EOF
 156boolean: 0
 157integer: 0
 158timestamp: 0
 159string: 123
 160abbrev: 7
 161verbose: 0
 162quiet: no
 163dry run: no
 164file: (not set)
 165EOF
 166
 167test_expect_success 'non ambiguous option (after two options it abbreviates)' '
 168        test-parse-options --st 123 > output 2> output.err &&
 169        test ! -s output.err &&
 170        test_cmp expect output
 171'
 172
 173cat > typo.err << EOF
 174error: did you mean \`--boolean\` (with two dashes ?)
 175EOF
 176
 177test_expect_success 'detect possible typos' '
 178        test_must_fail test-parse-options -boolean > output 2> output.err &&
 179        test ! -s output &&
 180        test_cmp typo.err output.err
 181'
 182
 183cat > expect <<EOF
 184boolean: 0
 185integer: 0
 186timestamp: 0
 187string: (not set)
 188abbrev: 7
 189verbose: 0
 190quiet: no
 191dry run: no
 192file: (not set)
 193arg 00: --quux
 194EOF
 195
 196test_expect_success 'keep some options as arguments' '
 197        test-parse-options --quux > output 2> output.err &&
 198        test ! -s output.err &&
 199        test_cmp expect output
 200'
 201
 202cat > expect <<EOF
 203boolean: 0
 204integer: 0
 205timestamp: 1
 206string: default
 207abbrev: 7
 208verbose: 0
 209quiet: yes
 210dry run: no
 211file: (not set)
 212arg 00: foo
 213EOF
 214
 215test_expect_success 'OPT_DATE() and OPT_SET_PTR() work' '
 216        test-parse-options -t "1970-01-01 00:00:01 +0000" --default-string \
 217                foo -q > output 2> output.err &&
 218        test ! -s output.err &&
 219        test_cmp expect output
 220'
 221
 222cat > expect <<EOF
 223Callback: "four", 0
 224boolean: 5
 225integer: 4
 226timestamp: 0
 227string: (not set)
 228abbrev: 7
 229verbose: 0
 230quiet: no
 231dry run: no
 232file: (not set)
 233EOF
 234
 235test_expect_success 'OPT_CALLBACK() and OPT_BIT() work' '
 236        test-parse-options --length=four -b -4 > output 2> output.err &&
 237        test ! -s output.err &&
 238        test_cmp expect output
 239'
 240
 241cat > expect <<EOF
 242Callback: "not set", 1
 243EOF
 244
 245test_expect_success 'OPT_CALLBACK() and callback errors work' '
 246        test_must_fail test-parse-options --no-length > output 2> output.err &&
 247        test_cmp expect output &&
 248        test_cmp expect.err output.err
 249'
 250
 251cat > expect <<EOF
 252boolean: 1
 253integer: 23
 254timestamp: 0
 255string: (not set)
 256abbrev: 7
 257verbose: 0
 258quiet: no
 259dry run: no
 260file: (not set)
 261EOF
 262
 263test_expect_success 'OPT_BIT() and OPT_SET_INT() work' '
 264        test-parse-options --set23 -bbbbb --no-or4 > output 2> output.err &&
 265        test ! -s output.err &&
 266        test_cmp expect output
 267'
 268
 269test_expect_success 'OPT_NEGBIT() and OPT_SET_INT() work' '
 270        test-parse-options --set23 -bbbbb --neg-or4 > output 2> output.err &&
 271        test ! -s output.err &&
 272        test_cmp expect output
 273'
 274
 275cat > expect <<EOF
 276boolean: 6
 277integer: 0
 278timestamp: 0
 279string: (not set)
 280abbrev: 7
 281verbose: 0
 282quiet: no
 283dry run: no
 284file: (not set)
 285EOF
 286
 287test_expect_success 'OPT_BIT() works' '
 288        test-parse-options -bb --or4 > output 2> output.err &&
 289        test ! -s output.err &&
 290        test_cmp expect output
 291'
 292
 293test_expect_success 'OPT_NEGBIT() works' '
 294        test-parse-options -bb --no-neg-or4 > output 2> output.err &&
 295        test ! -s output.err &&
 296        test_cmp expect output
 297'
 298
 299test_expect_success 'OPT_BOOLEAN() with PARSE_OPT_NODASH works' '
 300        test-parse-options + + + + + + > output 2> output.err &&
 301        test ! -s output.err &&
 302        test_cmp expect output
 303'
 304
 305cat > expect <<EOF
 306boolean: 0
 307integer: 12345
 308timestamp: 0
 309string: (not set)
 310abbrev: 7
 311verbose: 0
 312quiet: no
 313dry run: no
 314file: (not set)
 315EOF
 316
 317test_expect_success 'OPT_NUMBER_CALLBACK() works' '
 318        test-parse-options -12345 > output 2> output.err &&
 319        test ! -s output.err &&
 320        test_cmp expect output
 321'
 322
 323cat >expect <<EOF
 324boolean: 0
 325integer: 0
 326timestamp: 0
 327string: (not set)
 328abbrev: 7
 329verbose: 0
 330quiet: no
 331dry run: no
 332file: (not set)
 333EOF
 334
 335test_expect_success 'negation of OPT_NONEG flags is not ambiguous' '
 336        test-parse-options --no-ambig >output 2>output.err &&
 337        test ! -s output.err &&
 338        test_cmp expect output
 339'
 340
 341cat >>expect <<'EOF'
 342list: foo
 343list: bar
 344list: baz
 345EOF
 346test_expect_success '--list keeps list of strings' '
 347        test-parse-options --list foo --list=bar --list=baz >output &&
 348        test_cmp expect output
 349'
 350
 351test_expect_success '--no-list resets list' '
 352        test-parse-options --list=other --list=irrelevant --list=options \
 353                --no-list --list=foo --list=bar --list=baz >output &&
 354        test_cmp expect output
 355'
 356
 357test_done