#!/usr/bin/ruby

#
## Test 1
#

var args = ['-foo=2', '--bar', '3.14159', '--baz', 'sidef']

var bar = 1.23
var baz = 'baz'
var qux = 42

args.getopt(
    'foo=i' => \var foo,
    'bar=f' => \bar,
    'baz=s' => \baz,
    'qux=i' => \qux,
)

assert_eq(foo, 2)
assert_eq(bar, 3.14159)
assert_eq(baz, 'sidef')
assert_eq(qux, 42)


#
## Test 2
#

args = ['-f', '42']

args.getopt!(
    'foo=i' => \foo,
    'bar=s' => \bar,
)

assert_eq(args, [])
assert_eq(foo, 42)
assert_eq(bar, 3.14159)


#
## Test 3
#

args = ['--baz=hi', '-f=1.234']

args.getopt(
    'baz=s' => \baz,
    'foo=f' => \foo,
)

assert_eq(args, ['--baz=hi', '-f=1.234'])

assert_eq(baz, 'hi')
assert_eq(foo, 1.234)


#
## Test 4
#

class Example(value) { }

var obj = Example(1234)

args = ['--bool', '--foo', '42', 'extra', 'arguments', '--baz', '69']

var bool = false

args.getopt!(
    'foo=i' => \obj,
    'baz=s' => \baz,
    'bool!' => \bool,
)

assert_eq(bool, true)
assert_eq(obj.value, 42)
assert_eq(baz, '69')
assert_eq(args, ['extra', 'arguments'])

#
## Test 5
#

var b1 = false
var b2 = true
var b3 = false

['--no-b1', '--no-b2', '--b3'].getopt!(
    'b1!' => \bool,
    'b2!' => \b2,
    'b3!' => \b3,
)

assert_eq(b1, false)
assert_eq(b2, false)
assert_eq(b3, true)

#
## Test 6
#

var file = File('file.dat')
var length = 42
var verbose = false

var args = ['--file', 'foo.txt', '--length', '1234', '--verbose']

args.getopt(
    'length=i' => \length,
    'file=s'   => \file,
    'verbose'  => \verbose
)

assert_eq(file, File('foo.txt'))
assert_eq(length, 1234)
assert_eq(verbose, true)


say "** Test passed!"