basic.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:23k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # This file contains tests for the tclBasic.c source file. Tests appear in
  2. # the same order as the C code that they test. The set of tests is
  3. # currently incomplete since it currently includes only new tests for
  4. # code changed for the addition of Tcl namespaces. Other variable-
  5. # related tests appear in several other test files including
  6. # assocd.test, cmdInfo.test, eval.test, expr.test, interp.test,
  7. # and trace.test.
  8. #
  9. # Sourcing this file into Tcl runs the tests and generates output for
  10. # errors. No output means no errors were found.
  11. #
  12. # Copyright (c) 1997 Sun Microsystems, Inc.
  13. # Copyright (c) 1998-1999 by Scriptics Corporation.
  14. #
  15. # See the file "license.terms" for information on usage and redistribution
  16. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  17. #
  18. # RCS: @(#) $Id: basic.test,v 1.25.2.8 2007/06/27 17:29:24 dgp Exp $
  19. #
  20. package require tcltest 2
  21. namespace import -force ::tcltest::*
  22. testConstraint testcmdtoken [llength [info commands testcmdtoken]]
  23. testConstraint testcmdtrace [llength [info commands testcmdtrace]]
  24. testConstraint testcreatecommand [llength [info commands testcreatecommand]]
  25. testConstraint testevalex [llength [info commands testevalex]]
  26. testConstraint exec [llength [info commands exec]]
  27. # This variable needs to be changed when the major or minor version number for
  28. # Tcl changes.
  29. set tclvers 8.4
  30. catch {namespace delete test_ns_basic}
  31. catch {interp delete test_interp}
  32. catch {rename p ""}
  33. catch {rename q ""}
  34. catch {rename cmd ""}
  35. catch {unset x}
  36. test basic-1.1 {Tcl_CreateInterp, creates interp's global namespace} {
  37.     catch {interp delete test_interp}
  38.     interp create test_interp
  39.     interp eval test_interp {
  40.         namespace eval test_ns_basic {
  41.             proc p {} {
  42.                 return [namespace current]
  43.             }
  44.         }
  45.     }
  46.     list [interp eval test_interp {test_ns_basic::p}] 
  47.          [interp delete test_interp]
  48. } {::test_ns_basic {}}
  49. test basic-2.1 {TclHideUnsafeCommands} {emptyTest} {
  50. } {}
  51. test basic-3.1 {Tcl_CallWhenDeleted: see dcall.test} {emptyTest} {
  52. } {}
  53. test basic-4.1 {Tcl_DontCallWhenDeleted: see dcall.test} {emptyTest} {
  54. } {}
  55. test basic-5.1 {Tcl_SetAssocData: see assoc.test} {emptyTest} {
  56. } {}
  57. test basic-6.1 {Tcl_DeleteAssocData: see assoc.test} {emptyTest} {
  58. } {}
  59. test basic-7.1 {Tcl_GetAssocData: see assoc.test} {emptyTest} {
  60. } {}
  61. test basic-8.1 {Tcl_InterpDeleted} {emptyTest} {
  62. } {}
  63. test basic-9.1 {Tcl_DeleteInterp: see interp.test} {emptyTest} {
  64. } {}
  65. test basic-10.1 {DeleteInterpProc, destroys interp's global namespace} {
  66.     catch {interp delete test_interp}
  67.     interp create test_interp
  68.     interp eval test_interp {
  69.         namespace eval test_ns_basic {
  70.             namespace export p
  71.             proc p {} {
  72.                 return [namespace current]
  73.             }
  74.         }
  75.         namespace eval test_ns_2 {
  76.             namespace import ::test_ns_basic::p
  77.             variable v 27
  78.             proc q {} {
  79.                 variable v
  80.                 return "[p] $v"
  81.             }
  82.         }
  83.     }
  84.     list [interp eval test_interp {test_ns_2::q}] 
  85.          [interp eval test_interp {namespace delete ::}] 
  86.          [catch {interp eval test_interp {set a 123}} msg] $msg 
  87.          [interp delete test_interp]
  88. } {{::test_ns_basic 27} {} 1 {invalid command name "set"} {}}
  89. test basic-11.1 {HiddenCmdsDeleteProc, invalidate cached refs to deleted hidden cmd} {
  90.     catch {interp delete test_interp}
  91.     interp create test_interp
  92.     interp eval test_interp {
  93.         proc p {} {
  94.             return 27
  95.         }
  96.     }
  97.     interp alias {} localP test_interp p
  98.     list [interp eval test_interp {p}] 
  99.          [localP] 
  100.          [test_interp hide p] 
  101.          [catch {localP} msg] $msg 
  102.          [interp delete test_interp] 
  103.          [catch {localP} msg] $msg
  104. } {27 27 {} 1 {invalid command name "p"} {} 1 {invalid command name "localP"}}
  105. # NB: More tests about hide/expose are found in interp.test
  106. test basic-12.1 {Tcl_HideCommand, names of hidden cmds can't have namespace qualifiers} {
  107.     catch {interp delete test_interp}
  108.     interp create test_interp
  109.     interp eval test_interp {
  110.         namespace eval test_ns_basic {
  111.             proc p {} {
  112.                 return [namespace current]
  113.             }
  114.         }
  115.     }
  116.     list [catch {test_interp hide test_ns_basic::p x} msg] $msg 
  117.  [catch {test_interp hide x test_ns_basic::p} msg1] $msg1 
  118.          [interp delete test_interp]
  119. } {1 {can only hide global namespace commands (use rename then hide)} 1 {cannot use namespace qualifiers in hidden command token (rename)} {}}
  120. test basic-12.2 {Tcl_HideCommand, a hidden cmd remembers its containing namespace} {
  121.     catch {namespace delete test_ns_basic}
  122.     catch {rename cmd ""}
  123.     proc cmd {} {   ;# note that this is global
  124.         return [namespace current]
  125.     }
  126.     namespace eval test_ns_basic {
  127.         proc hideCmd {} {
  128.             interp hide {} cmd
  129.         }
  130.         proc exposeCmd {} {
  131.             interp expose {} cmd
  132.         }
  133.         proc callCmd {} {
  134.             cmd
  135.         }
  136.     }
  137.     list [test_ns_basic::callCmd] 
  138.          [test_ns_basic::hideCmd] 
  139.          [catch {cmd} msg] $msg 
  140.          [test_ns_basic::exposeCmd] 
  141.          [test_ns_basic::callCmd] 
  142.          [namespace delete test_ns_basic]
  143. } {:: {} 1 {invalid command name "cmd"} {} :: {}}
  144. test basic-13.1 {Tcl_ExposeCommand, a command stays in the global namespace and can not go to another namespace} {
  145.     catch {namespace delete test_ns_basic}
  146.     catch {rename cmd ""}
  147.     proc cmd {} {   ;# note that this is global
  148.         return [namespace current]
  149.     }
  150.     namespace eval test_ns_basic {
  151.         proc hideCmd {} {
  152.             interp hide {} cmd
  153.         }
  154.         proc exposeCmdFailing {} {
  155.             interp expose {} cmd ::test_ns_basic::newCmd
  156.         }
  157.         proc exposeCmdWorkAround {} {
  158.             interp expose {} cmd;
  159.     rename cmd ::test_ns_basic::newCmd;
  160.         }
  161.         proc callCmd {} {
  162.             cmd
  163.         }
  164.     }
  165.     list [test_ns_basic::callCmd] 
  166.          [test_ns_basic::hideCmd] 
  167.          [catch {test_ns_basic::exposeCmdFailing} msg] $msg 
  168.          [test_ns_basic::exposeCmdWorkAround] 
  169.          [test_ns_basic::newCmd] 
  170.          [namespace delete test_ns_basic]
  171. } {:: {} 1 {can not expose to a namespace (use expose to toplevel, then rename)} {} ::test_ns_basic {}}
  172. test basic-13.2 {Tcl_ExposeCommand, invalidate cached refs to cmd now being exposed} {
  173.     catch {rename p ""}
  174.     catch {rename cmd ""}
  175.     proc p {} {
  176.         cmd
  177.     }
  178.     proc cmd {} {
  179.         return 42
  180.     }
  181.     list [p] 
  182.          [interp hide {} cmd] 
  183.          [proc cmd {} {return Hello}] 
  184.          [cmd] 
  185.          [rename cmd ""] 
  186.          [interp expose {} cmd] 
  187.          [p]
  188. } {42 {} {} Hello {} {} 42}
  189. test basic-14.1 {Tcl_CreateCommand, new cmd goes into a namespace specified in its name, if any} {testcreatecommand} {
  190.     catch {eval namespace delete [namespace children :: test_ns_*]}
  191.     list [testcreatecommand create] 
  192.  [test_ns_basic::createdcommand] 
  193.  [testcreatecommand delete]
  194. } {{} {CreatedCommandProc in ::test_ns_basic} {}}
  195. test basic-14.2 {Tcl_CreateCommand, namespace code ignore single ":"s in middle or end of names} {testcreatecommand} {
  196.     catch {eval namespace delete [namespace children :: test_ns_*]}
  197.     catch {rename value:at: ""}
  198.     list [testcreatecommand create2] 
  199.  [value:at:] 
  200.  [testcreatecommand delete2]
  201. } {{} {CreatedCommandProc2 in ::} {}}
  202. test basic-15.1 {Tcl_CreateObjCommand, new cmd goes into a namespace specified in its name, if any} {
  203.     catch {eval namespace delete [namespace children :: test_ns_*]}
  204.     namespace eval test_ns_basic {}
  205.     proc test_ns_basic::cmd {} {  ;# proc requires that ns already exist
  206.         return [namespace current]
  207.     }
  208.     list [test_ns_basic::cmd] 
  209.          [namespace delete test_ns_basic]
  210. } {::test_ns_basic {}}
  211. test basic-16.1 {TclInvokeStringCommand} {emptyTest} {
  212. } {}
  213. test basic-17.1 {TclInvokeObjCommand} {emptyTest} {
  214. } {}
  215. test basic-18.1 {TclRenameCommand, name of existing cmd can have namespace qualifiers} {
  216.     catch {eval namespace delete [namespace children :: test_ns_*]}
  217.     catch {rename cmd ""}
  218.     namespace eval test_ns_basic {
  219.         proc p {} {
  220.             return "p in [namespace current]"
  221.         }
  222.     }
  223.     list [test_ns_basic::p] 
  224.          [rename test_ns_basic::p test_ns_basic::q] 
  225.          [test_ns_basic::q] 
  226. } {{p in ::test_ns_basic} {} {p in ::test_ns_basic}}
  227. test basic-18.2 {TclRenameCommand, existing cmd must be found} {
  228.     catch {eval namespace delete [namespace children :: test_ns_*]}
  229.     list [catch {rename test_ns_basic::p test_ns_basic::q} msg] $msg
  230. } {1 {can't rename "test_ns_basic::p": command doesn't exist}}
  231. test basic-18.3 {TclRenameCommand, delete cmd if new name is empty} {
  232.     catch {eval namespace delete [namespace children :: test_ns_*]}
  233.     namespace eval test_ns_basic {
  234.         proc p {} {
  235.             return "p in [namespace current]"
  236.         }
  237.     }
  238.     list [info commands test_ns_basic::*] 
  239.          [rename test_ns_basic::p ""] 
  240.          [info commands test_ns_basic::*]
  241. } {::test_ns_basic::p {} {}}
  242. test basic-18.4 {TclRenameCommand, bad new name} {
  243.     catch {eval namespace delete [namespace children :: test_ns_*]}
  244.     namespace eval test_ns_basic {
  245.         proc p {} {
  246.             return "p in [namespace current]"
  247.         }
  248.     }
  249.     rename test_ns_basic::p :::george::martha
  250. } {}
  251. test basic-18.5 {TclRenameCommand, new name must not already exist} {
  252.     namespace eval test_ns_basic {
  253.         proc q {} {
  254.             return 42
  255.         }
  256.     }
  257.     list [catch {rename test_ns_basic::q :::george::martha} msg] $msg
  258. } {1 {can't rename to ":::george::martha": command already exists}}
  259. test basic-18.6 {TclRenameCommand, check for command shadowing by newly renamed cmd} {
  260.     catch {eval namespace delete [namespace children :: test_ns_*]}
  261.     catch {rename p ""}
  262.     catch {rename q ""}
  263.     proc p {} {
  264.         return "p in [namespace current]"
  265.     }
  266.     proc q {} {
  267.         return "q in [namespace current]"
  268.     }
  269.     namespace eval test_ns_basic {
  270.         proc callP {} {
  271.             p
  272.         }
  273.     }
  274.     list [test_ns_basic::callP] 
  275.          [rename q test_ns_basic::p] 
  276.          [test_ns_basic::callP]
  277. } {{p in ::} {} {q in ::test_ns_basic}}
  278. test basic-19.1 {Tcl_SetCommandInfo} {emptyTest} {
  279. } {}
  280. test basic-20.1 {Tcl_GetCommandInfo, names for commands created inside namespaces} {testcmdtoken} {
  281.     catch {eval namespace delete [namespace children :: test_ns_*]}
  282.     catch {rename p ""}
  283.     catch {rename q ""}
  284.     catch {unset x}
  285.     set x [namespace eval test_ns_basic::test_ns_basic2 {
  286.         # the following creates a cmd in the global namespace
  287.         testcmdtoken create p
  288.     }]
  289.     list [testcmdtoken name $x] 
  290.          [rename ::p q] 
  291.          [testcmdtoken name $x]
  292. } {{p ::p} {} {q ::q}}
  293. test basic-20.2 {Tcl_GetCommandInfo, names for commands created outside namespaces} {testcmdtoken} {
  294.     catch {rename q ""}
  295.     set x [testcmdtoken create test_ns_basic::test_ns_basic2::p]
  296.     list [testcmdtoken name $x] 
  297.          [rename test_ns_basic::test_ns_basic2::p q] 
  298.          [testcmdtoken name $x]
  299. } {{p ::test_ns_basic::test_ns_basic2::p} {} {q ::q}}
  300. test basic-21.1 {Tcl_GetCommandName} {emptyTest} {
  301. } {}
  302. test basic-22.1 {Tcl_GetCommandFullName} {
  303.     catch {eval namespace delete [namespace children :: test_ns_*]}
  304.     namespace eval test_ns_basic1 {
  305.         namespace export cmd*
  306.         proc cmd1 {} {}
  307.         proc cmd2 {} {}
  308.     }
  309.     namespace eval test_ns_basic2 {
  310.         namespace export *
  311.         namespace import ::test_ns_basic1::*
  312.         proc p {} {}
  313.     }
  314.     namespace eval test_ns_basic3 {
  315.         namespace import ::test_ns_basic2::*
  316.         proc q {} {}
  317.         list [namespace which -command foreach] 
  318.              [namespace which -command q] 
  319.              [namespace which -command p] 
  320.              [namespace which -command cmd1] 
  321.              [namespace which -command ::test_ns_basic2::cmd2]
  322.     }
  323. } {::foreach ::test_ns_basic3::q ::test_ns_basic3::p ::test_ns_basic3::cmd1 ::test_ns_basic2::cmd2}
  324. test basic-23.1 {Tcl_DeleteCommand} {emptyTest} {
  325. } {}
  326. test basic-24.1 {Tcl_DeleteCommandFromToken, invalidate all compiled code if cmd has compile proc} {
  327.     catch {interp delete test_interp}
  328.     catch {unset x}
  329.     interp create test_interp
  330.     interp eval test_interp {
  331.         proc useSet {} {
  332.             return [set a 123]
  333.         }
  334.     }
  335.     set x [interp eval test_interp {useSet}]
  336.     interp eval test_interp {
  337.         rename set ""
  338.         proc set {args} {
  339.             return "set called with $args"
  340.         }
  341.     }
  342.     list $x 
  343.          [interp eval test_interp {useSet}] 
  344.          [interp delete test_interp]
  345. } {123 {set called with a 123} {}}
  346. test basic-24.2 {Tcl_DeleteCommandFromToken, deleting commands changes command epoch} {
  347.     catch {eval namespace delete [namespace children :: test_ns_*]}
  348.     catch {rename p ""}
  349.     proc p {} {
  350.         return "global p"
  351.     }
  352.     namespace eval test_ns_basic {
  353.         proc p {} {
  354.             return "namespace p"
  355.         }
  356.         proc callP {} {
  357.             p
  358.         }
  359.     }
  360.     list [test_ns_basic::callP] 
  361.          [rename test_ns_basic::p ""] 
  362.          [test_ns_basic::callP]
  363. } {{namespace p} {} {global p}}
  364. test basic-24.3 {Tcl_DeleteCommandFromToken, delete imported cmds that refer to a deleted cmd} {
  365.     catch {eval namespace delete [namespace children :: test_ns_*]}
  366.     catch {rename p ""}
  367.     namespace eval test_ns_basic {
  368.         namespace export p
  369.         proc p {} {return 42}
  370.     }
  371.     namespace eval test_ns_basic2 {
  372.         namespace import ::test_ns_basic::*
  373.         proc callP {} {
  374.             p
  375.         }
  376.     }
  377.     list [test_ns_basic2::callP] 
  378.          [info commands test_ns_basic2::*] 
  379.          [rename test_ns_basic::p ""] 
  380.          [catch {test_ns_basic2::callP} msg] $msg 
  381.          [info commands test_ns_basic2::*]
  382. } {42 {::test_ns_basic2::callP ::test_ns_basic2::p} {} 1 {invalid command name "p"} ::test_ns_basic2::callP}
  383. test basic-25.1 {TclCleanupCommand} {emptyTest} {
  384. } {}
  385. test basic-26.1 {Tcl_EvalObj: preserve object while evaling it} {
  386.     # If object isn't preserved, errorInfo would be set to
  387.     # "foon    while executingn"garbage bytes"" because the object's
  388.     # string would have been freed, leaving garbage bytes for the error
  389.     # message.
  390.     proc bgerror {args} {set ::x $::errorInfo}
  391.     set fName [makeFile {} test1]
  392.     set f [open $fName w]
  393.     fileevent $f writable "fileevent $f writable {}; error foo"
  394.     set x {}
  395.     vwait x
  396.     close $f
  397.     removeFile test1
  398.     rename bgerror {}
  399.     set x
  400. } "foon    while executingn"error foo""
  401. test basic-26.2 {Tcl_EvalObjEx, pure-list branch: preserve "objv"} {
  402.     #
  403.     # Follow the pure-list branch in a manner that
  404.     #   a - the pure-list internal rep is destroyed by shimmering
  405.     #   b - the command returns an error
  406.     # As the error code in Tcl_EvalObjv accesses the list elements, this will
  407.     # cause a segfault if [Bug 1119369] has not been fixed.
  408.     #
  409.     set SRC [list foo 1] ;# pure-list command 
  410.     proc foo str {
  411. # Shimmer pure-list to cmdName, cleanup and error
  412. proc $::SRC {} {}; $::SRC
  413. error "BAD CALL"
  414.     }
  415.     catch {eval $SRC}
  416. } 1
  417. test basic-27.1 {Tcl_ExprLong} {emptyTest} {
  418. } {}
  419. test basic-28.1 {Tcl_ExprDouble} {emptyTest} {
  420. } {}
  421. test basic-29.1 {Tcl_ExprBoolean} {emptyTest} {
  422. } {}
  423. test basic-30.1 {Tcl_ExprLongObj} {emptyTest} {
  424. } {}
  425. test basic-31.1 {Tcl_ExprDoubleObj} {emptyTest} {
  426. } {}
  427. test basic-32.1 {Tcl_ExprBooleanObj} {emptyTest} {
  428. } {}
  429. test basic-33.1 {TclInvoke} {emptyTest} {
  430. } {}
  431. test basic-34.1 {TclGlobalInvoke} {emptyTest} {
  432. } {}
  433. test basic-35.1 {TclObjInvokeGlobal} {emptyTest} {
  434. } {}
  435. test basic-36.1 {TclObjInvoke, lookup of "unknown" command} {
  436.     catch {eval namespace delete [namespace children :: test_ns_*]}
  437.     catch {interp delete test_interp}
  438.     interp create test_interp
  439.     interp eval test_interp {
  440.         proc unknown {args} {
  441.             return "global unknown"
  442.         }
  443.         namespace eval test_ns_basic {
  444.             proc unknown {args} {
  445.                 return "namespace unknown"
  446.             }
  447.         }
  448.     }
  449.     list [interp alias test_interp newAlias test_interp doesntExist] 
  450.          [catch {interp eval test_interp {newAlias}} msg] $msg 
  451.          [interp delete test_interp]
  452. } {newAlias 0 {global unknown} {}}
  453. test basic-37.1 {Tcl_ExprString: see expr.test} {emptyTest} {
  454. } {}
  455. test basic-38.1 {Tcl_ExprObj} {emptyTest} {
  456. } {}
  457. test basic-39.1 {Tcl_CreateTrace, correct command and argc/argv arguments of trace proc} {testcmdtrace} {
  458.     testcmdtrace tracetest {set stuff [expr 14 + 16]}
  459. } {{expr 14 + 16} {expr 14 + 16} {set stuff [expr 14 + 16]} {set stuff 30}}
  460. test basic-39.2 {Tcl_CreateTrace, correct command and argc/argv arguments of trace proc} {testcmdtrace} {
  461.     testcmdtrace tracetest {set stuff [info tclversion]}
  462. } [list {info tclversion} {info tclversion} {set stuff [info tclversion]} "set stuff $tclvers"]
  463. test basic-39.3 {Tcl_CreateTrace, correct command and argc/argv arguments of trace proc} {testcmdtrace} {
  464.     testcmdtrace deletetest {set stuff [info tclversion]}
  465. } $tclvers
  466. test basic-39.4 {Tcl_CreateTrace, check that tracing doesn't cause memory faults} {testcmdtrace} {
  467.     # Note that the proc call is the same as the variable name, and that
  468.     # the call can be direct or indirect by way of another procedure
  469.     proc tracer {args} {}
  470.     proc tracedLoop {level} {
  471. incr level
  472. tracer
  473. foreach tracer [expr {$level==1 ? {1 2} : {}}] {tracedLoop $level}
  474.     }
  475.     testcmdtrace tracetest {tracedLoop 0}
  476. } {{tracedLoop 0} {tracedLoop 0} {incr level} {incr level} tracer {tracer} {expr {$level==1 ? {1 2} : {}}} {expr {$level==1 ? {1 2} : {}}} {foreach tracer [expr {$level==1 ? {1 2} : {}}] {tracedLoop $level}} {foreach tracer {1 2} {tracedLoop $level}} {tracedLoop $level} {tracedLoop 1} {incr level} {incr level} tracer {tracer} {expr {$level==1 ? {1 2} : {}}} {expr {$level==1 ? {1 2} : {}}} {foreach tracer [expr {$level==1 ? {1 2} : {}}] {tracedLoop $level}} {foreach tracer {} {tracedLoop $level}} {tracedLoop $level} {tracedLoop 1} {incr level} {incr level} tracer {tracer} {expr {$level==1 ? {1 2} : {}}} {expr {$level==1 ? {1 2} : {}}} {foreach tracer [expr {$level==1 ? {1 2} : {}}] {tracedLoop $level}} {foreach tracer {} {tracedLoop $level}}}
  477. catch {rename tracer {}}
  478. catch {rename tracedLoop {}}
  479. test basic-39.5 {Tcl_CreateObjTrace, status return TCL_ERROR} {testcmdtrace} {
  480.     proc Error { args } { error "Shouldn't get here" }
  481.     set x 1;
  482.     list [catch {testcmdtrace resulttest {Error $x}} result] [set result]
  483. } {1 {Error $x}}
  484. test basic-39.6 {Tcl_CreateObjTrace, status return TCL_RETURN} {testcmdtrace} {
  485.     proc Return { args } { error "Shouldn't get here" }
  486.     set x 1;
  487.     list [catch {testcmdtrace resulttest {Return $x}} result] [set result]
  488. } {2 {}}
  489. test basic-39.7 {Tcl_CreateObjTrace, status return TCL_BREAK} {testcmdtrace} {
  490.     proc Break { args } { error "Shouldn't get here" }
  491.     set x 1;
  492.     list [catch {testcmdtrace resulttest {Break $x}} result] [set result]
  493. } {3 {}}
  494. test basic-39.8 {Tcl_CreateObjTrace, status return TCL_CONTINUE} {testcmdtrace} {
  495.     proc Continue { args } { error "Shouldn't get here" }
  496.     set x 1;
  497.     list [catch {testcmdtrace resulttest {Continue $x}} result] [set result]
  498. } {4 {}}
  499. test basic-39.9 {Tcl_CreateObjTrace, status return unknown} {testcmdtrace} {
  500.     proc OtherStatus { args } { error "Shouldn't get here" }
  501.     set x 1;
  502.     list [catch {testcmdtrace resulttest {OtherStatus $x}} result] [set result]
  503. } {6 {}}
  504. test basic-39.10 {Tcl_CreateTrace, correct level interpretation} {testcmdtrace} {
  505.     proc foo {} {uplevel 1 bar}
  506.     proc bar {} {uplevel 1 grok}
  507.     proc grok {} {uplevel 1 spock}
  508.     proc spock {} {uplevel 1 fascinating}
  509.     proc fascinating {} {}
  510.     testcmdtrace leveltest {foo}
  511. } {foo {foo} {uplevel 1 bar} {uplevel 1 bar} bar {bar} {uplevel 1 grok} {uplevel 1 grok}}
  512. test basic-39.11 {Tcl_CreateTrace, multiple traces} {testcmdtrace} {
  513.     testcmdtrace doubletest {format xx}
  514. } {{format xx} {format xx}}
  515. test basic-40.1 {Tcl_DeleteTrace} {emptyTest} {
  516.     # the above tests have tested Tcl_DeleteTrace
  517. } {}
  518. test basic-41.1 {Tcl_AddErrorInfo} {emptyTest} {
  519. } {}
  520. test basic-42.1 {Tcl_AddObjErrorInfo} {emptyTest} {
  521. } {}
  522. test basic-43.1 {Tcl_VarEval} {emptyTest} {
  523. } {}
  524. test basic-44.1 {Tcl_GlobalEval} {emptyTest} {
  525. } {}
  526. test basic-45.1 {Tcl_SetRecursionLimit: see interp.test} {emptyTest} {
  527. } {}
  528. test basic-46.1 {Tcl_AllowExceptions: exception return not allowed} {stdio} {
  529.     catch {close $f}
  530.     set res [catch {
  531. set f [open |[list [interpreter]] w+]
  532. fconfigure $f -buffering line
  533. puts $f {fconfigure stdout -buffering line}
  534. puts $f continue
  535. puts $f {puts $errorInfo}
  536. puts $f {puts DONE}
  537. set newMsg {}
  538. set msg {}
  539. while {$newMsg != "DONE"} {
  540.     set newMsg [gets $f]
  541.     append msg "${newMsg}n"
  542. }
  543. close $f
  544.     } error]
  545.     list $res $msg
  546. } {1 {invoked "continue" outside of a loop
  547.     while executing
  548. "continue"
  549. DONE
  550. }}
  551. test basic-46.2 {Tcl_AllowExceptions: exception return not allowed} -setup {
  552.     set fName [makeFile {
  553. puts hello
  554. break
  555.     } BREAKtest]
  556. } -constraints {
  557.     exec
  558. } -body {
  559.     exec [interpreter] $fName
  560. } -cleanup {
  561.     removeFile BREAKtest
  562. } -returnCodes error -match glob -result {hello
  563. invoked "break" outside of a loop
  564.     while executing
  565. "break"
  566.     (file "*BREAKtest" line 3)}    
  567. test basic-46.3 {Tcl_AllowExceptions: exception return not allowed} -setup {
  568.     set fName [makeFile {
  569. interp alias {} patch {} info patchlevel
  570. patch
  571. break
  572.     } BREAKtest]
  573. } -constraints {
  574.     exec
  575. } -body {
  576.     exec [interpreter] $fName
  577. } -cleanup {
  578.     removeFile BREAKtest
  579. } -returnCodes error -match glob -result {invoked "break" outside of a loop
  580.     while executing
  581. "break"
  582.     (file "*BREAKtest" line 4)}    
  583. test basic-46.4 {Tcl_AllowExceptions: exception return not allowed} -setup {
  584.     set fName [makeFile {
  585. foo [set a 1] [break]
  586.     } BREAKtest]
  587. } -constraints {
  588.     exec
  589. } -body {
  590.     exec [interpreter] $fName
  591. } -cleanup {
  592.     removeFile BREAKtest
  593. } -returnCodes error -match glob -result {invoked "break" outside of a loop
  594.     while executing*
  595. "foo [set a 1] [break]"
  596.     (file "*BREAKtest" line 2)}
  597. test basic-46.5 {Tcl_AllowExceptions: exception return not allowed} -setup {
  598.     set fName [makeFile {
  599. return -code return
  600.     } BREAKtest]
  601. } -constraints {
  602.     exec
  603. } -body {
  604.     exec [interpreter] $fName
  605. } -cleanup {
  606.     removeFile BREAKtest
  607. } -returnCodes error -match glob -result {command returned bad code: 2
  608.     while executing
  609. "return -code return"
  610.     (file "*BREAKtest" line 2)}
  611. test basic-47.1 {Tcl_EvalEx: check for missing close-bracket} -body {
  612.     subst {a[set b [format cd]}
  613. } -returnCodes error -result {missing close-bracket}
  614. test basic-49.1 {Tcl_EvalEx: verify TCL_EVAL_GLOBAL operation} testevalex {
  615.     set ::x global
  616.     namespace eval ns {
  617.         variable x namespace
  618.         testevalex {set x changed} global
  619.         set ::result [list $::x $x]
  620.     } 
  621.     namespace delete ns
  622.     set ::result
  623. } {changed namespace}
  624. test basic-49.2 {Tcl_EvalEx: verify TCL_EVAL_GLOBAL operation} testevalex {
  625.     set ::x global
  626.     namespace eval ns {
  627.         variable x namespace
  628.         testevalex {set ::context $x} global
  629.     }
  630.     namespace delete ns
  631.     set ::context
  632. } {global}
  633. # cleanup
  634. catch {eval namespace delete [namespace children :: test_ns_*]}
  635. catch {namespace delete george}
  636. catch {interp delete test_interp}
  637. catch {rename p ""}
  638. catch {rename q ""}
  639. catch {rename cmd ""}
  640. catch {rename value:at: ""}
  641. catch {unset x}
  642. ::tcltest::cleanupTests
  643. return