assert.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 namespace ::control {
00008
00009 namespace assert {
00010 namespace export EnabledAssert DisabledAssert
00011 variable CallbackCmd [list return -code error]
00012
00013 namespace import [namespace parent]::no-op
00014 rename no-op DisabledAssert
00015
00016 ret EnabledAssert (type expr , type args) {
00017 variable CallbackCmd
00018
00019 set code [catch {uplevel 1 [list expr $expr]} res]
00020 if {$code} {
00021 return -code $code $res
00022 }
00023 if {![string is boolean -strict $res]} {
00024 return -code error "invalid boolean expression: $expr"
00025 }
00026 if {$res} {return}
00027 if {[llength $args]} {
00028 set msg [join $args]
00029 } else {
00030 set msg "assertion failed: $expr"
00031 }
00032 # Might want to catch this
00033 namespace eval :: $CallbackCmd [list $msg]
00034 }
00035
00036 ret enabled (type args) {
00037 set n [llength $args]
00038 if {$n > 1} {
00039 return -code error "wrong # args: should be\
00040 \"[lindex [info level 0] 0] ?boolean?\""
00041 }
00042 if {$n} {
00043 set val [lindex $args 0]
00044 if {![string is boolean -strict $val]} {
00045 return -code error "invalid boolean value: $val"
00046 }
00047 if {$val} {
00048 [namespace parent]::AssertSwitch Disabled Enabled
00049 } else {
00050 [namespace parent]::AssertSwitch Enabled Disabled
00051 }
00052 } else {
00053 return [string equal [namespace origin EnabledAssert] \
00054 [namespace origin [namespace parent]::assert]]
00055 }
00056 return ""
00057 }
00058
00059 ret callback (type args) {
00060 set n [llength $args]
00061 if {$n > 1} {
00062 return -code error "wrong # args: should be\
00063 \"[lindex [info level 0] 0] ?command?\""
00064 }
00065 if {$n} {
00066 return [variable CallbackCmd [lindex $args 0]]
00067 }
00068 variable CallbackCmd
00069 return $CallbackCmd
00070 }
00071
00072 }
00073
00074 ret AssertSwitch (type old , type new) {
00075 if {[string equal [namespace origin assert] \
00076 [namespace origin assert::${new}Assert]]} {return}
00077 rename assert ${old}Assert
00078 rename ${new}Assert assert
00079 }
00080
00081 namespace import assert::DisabledAssert assert::EnabledAssert
00082
00083
00084 ret assert args #
00085 rename assert ()
00086
00087 # Initial default: disabled asserts
00088 rename DisabledAssert assert
00089
00090 }
00091
00092