# -*- tcl -*-
# interp.test:  tests for the interp alias and creation utilities
#
# Sourcing this file into Tcl runs the tests and
# generates output for errors.  No output means no errors were found.

# -------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.3
testsNeedTcltest 1.0

support {
    use snit/snit.tcl   snit
    testsNeed           snit 1.3.1 ; # method introspection arguments/body
}
testing {
    useLocal deleg_method.tcl interp::delegate::method
}

# -------------------------------------------------------------------------

test dmethod-1.0 {wrong#args} {
    catch {snit::type foo {interp::delegate::method}} msg
    set msg
} {wrong # args}

test dmethod-1.1 {wrong#args} {
    catch {snit::type foo {interp::delegate::method a}} msg
    set msg
} {wrong # args}

test dmethod-1.2 {wrong#args} {
    catch {snit::type foo {interp::delegate::method a b}} msg
    set msg
} {wrong # args}

test dmethod-1.3 {wrong#args} {
    catch {snit::type foo {interp::delegate::method a b c}} msg
    set msg
} {wrong # args}

test dmethod-1.4 {wrong#args} {
    catch {snit::type foo {interp::delegate::method a b c d e}} msg
    set msg
} {wrong # args}

# -------------------------------------------------------------------------

test dmethod-2.0 {bad switch} {
    catch {snit::type foo {interp::delegate::method -bogus}} msg
    set msg
} {unknown option "-bogus", expected -async}

# -------------------------------------------------------------------------

test dmethod-3.0 {delegation result} {
    snit::type foo {
	interp::delegate::method request {} COMM ID
    }
    res!
    foo bar
    res+ [info commands foo::Snit_methodrequest]
    res+ [lsort [bar info methods]]
    bar destroy
    foo destroy
    res?
} {::foo::Snit_methodrequest {{destroy info request}}}

# -------------------------------------------------------------------------

test dmethod-4.0 {signature} {
    snit::type foo {
	interp::delegate::method request {} COMM ID
    }
    foo X
    res!
    res+ \
	    [X info args request] \
	    [string trimleft [X info body request]]
    X   destroy
    foo destroy
    res?
} {{{} {COMM send ID request}}}

test dmethod-4.1 {signature} {
    snit::type foo {
	interp::delegate::method request {a b} COMM ID
    }
    foo X
    res!
    res+ \
	    [X info args request] \
	    [string trimleft [X info body request]]
    X   destroy
    foo destroy
    res?
} {{{a b} {COMM send ID [list request $a $b]}}}

test dmethod-4.2 {signature} {
    snit::type foo {
	interp::delegate::method request {a b args} COMM ID
    }
    foo X
    res!
    res+ \
	    [X info args request] \
	    [string trimleft [X info body request]]
    X   destroy
    foo destroy
    res?
} {{{a b args} {COMM send ID [linsert $args 0 request $a $b]}}}

test dmethod-4.3 {signature} {
    snit::type foo {
	interp::delegate::method request {args} COMM ID
    }
    foo X
    res!
    res+ \
	    [X info args request] \
	    [string trimleft [X info body request]]
    X   destroy
    foo destroy
    res?
} {{args {COMM send ID [linsert $args 0 request]}}}

# -------------------------------------------------------------------------

test dmethod-5.0 {signature} {
    snit::type foo {
	interp::delegate::method -async request {} COMM ID
    }
    foo X
    res!
    res+ \
	    [X info args request] \
	    [string trimleft [X info body request]]
    X   destroy
    foo destroy
    res?
} {{{} {COMM send -async ID request}}}

test dmethod-5.1 {signature} {
    snit::type foo {
	interp::delegate::method -async request {a b} COMM ID
    }
    foo X
    res!
    res+ \
	    [X info args request] \
	    [string trimleft [X info body request]]
    X   destroy
    foo destroy
    res?
} {{{a b} {COMM send -async ID [list request $a $b]}}}

test dmethod-5.2 {signature} {
    snit::type foo {
	interp::delegate::method -async request {a b args} COMM ID
    }
    foo X
    res!
    res+ \
	    [X info args request] \
	    [string trimleft [X info body request]]
    X   destroy
    foo destroy
    res?
} {{{a b args} {COMM send -async ID [linsert $args 0 request $a $b]}}}

test dmethod-5.3 {signature} {
    snit::type foo {
	interp::delegate::method -async request {args} COMM ID
    }
    foo X
    res!
    res+ \
	    [X info args request] \
	    [string trimleft [X info body request]]
    X   destroy
    foo destroy
    res?
} {{args {COMM send -async ID [linsert $args 0 request]}}}

# -------------------------------------------------------------------------

testsuiteCleanup
return