source [file dirname [info script]]/testing.tcl

proc a {n args} {
	if {$n eq "trace"} {
		return [basename-stacktrace [stacktrace {*}$args]]
	}
	set frame [info frame $n]
	if {![dict exists $frame proc]} {
		dict set frame proc {}
	}
	basename-stacktrace [list [dict get $frame proc] [file tail [dict get $frame file]] [dict get $frame line] [dict get $frame cmd]]
}

proc b {args} {
	a {*}$args
}

proc c {args} {
	b {*}$args
}

# --- Don't change line numbers above

test info-frame-1.1 {Current command} -body {
	c 0
} -result {a infoframe.test 7 {info frame 0}}

test info-frame-1.2 {Current Proc} -body {
	c -1
} -result {b infoframe.test 15 {a -1}}

test info-frame-1.3 Caller -body {
	c -2
} -result {c infoframe.test 19 {b -2}}

test info-frame-1.4 {Caller of Caller} -body {
	c -3
} -result {test infoframe.test 37 {c -3}}

test stacktrace-1.1 {Full stack trace} -body {
	c trace
} -result {a infoframe.test 5 stacktrace b infoframe.test 15 {a trace} c infoframe.test 19 {b trace} test infoframe.test 41 {c trace} {} infoframe.test 40 test\ stacktrace-1.1\ \{...}

test stacktrace-1.2 {Stack trace with limited depth} -body {
	# This will limit the stack trace to omit "this" level and below
	c trace 0 [info frame]
} -result {a infoframe.test 5 {stacktrace 0 2} b infoframe.test 15 {a trace 0 2} c infoframe.test 19 {b trace 0 2}}


testreport
