Posted to tcl by apn at Tue Oct 08 06:28:49 GMT 2024view pretty

# Extremely simplistic to illustrate. Does not deal with namespaces, will not handle 
# mocking commands used within the redefinition (lindex, puts etc.)

proc mock {cmd} {
    rename $cmd ${cmd}_original
    proc $cmd args {
        set me [lindex [info level 0] 0]
        incr ::counts($me)
        puts Trace:[info level 0]
        tailcall {*}${me}_original {*}$args
    }
}

% mock format
% format %s%d foo 42
Trace:format %s%d foo 42
foo42
% format %s%d foo 43
Trace:format %s%d foo 43
foo43
% set counts(format)
2
% format %s%d foo 44
Trace:format %s%d foo 44
foo44
% set counts(format)
3