Blame testing/058_bracket_recursion.tcl

Packit 1c1d7e
#// objective: tests processing of commands inside brackets [], only references/referencedby relations are relevant
Packit 1c1d7e
#// check: 058__bracket__recursion_8tcl.xml
Packit 1c1d7e
#// config: REFERENCED_BY_RELATION = yes
Packit 1c1d7e
#// config: REFERENCES_RELATION = yes
Packit 1c1d7e
#// config: EXTRACT_ALL = yes
Packit 1c1d7e
#// config: INLINE_SOURCES = yes
Packit 1c1d7e
Packit 1c1d7e
##
Packit 1c1d7e
# \brief should be reference by every proc below
Packit 1c1d7e
proc Invoked args {
Packit 1c1d7e
    puts "Procedure \"Invoked\" is invoked indeed. Ok."
Packit 1c1d7e
    return $args
Packit 1c1d7e
}
Packit 1c1d7e
##
Packit 1c1d7e
# \brief must not be reference by every proc below
Packit 1c1d7e
proc NotInvoked args {
Packit 1c1d7e
    puts "Procedure \"NotInvoked\" is invoked. Not Ok!"
Packit 1c1d7e
    return $args
Packit 1c1d7e
}
Packit 1c1d7e
#
Packit 1c1d7e
# check if call references work at all
Packit 1c1d7e
proc a args {
Packit 1c1d7e
    Invoked NotInvoked
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
#
Packit 1c1d7e
# check brackets with various quoting, bracing
Packit 1c1d7e
proc b args {
Packit 1c1d7e
    set r [Invoked]
Packit 1c1d7e
    set r [list \[NotInvoked \]]
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc c args {
Packit 1c1d7e
    set r \{[Invoked]\}
Packit 1c1d7e
    set r {[NotInvoked]}
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc d args {
Packit 1c1d7e
    set r "[Invoked]"
Packit 1c1d7e
    set r "\[NotInvoked \]"
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc e args {
Packit 1c1d7e
    set r [list \[NotInvoked [Invoked]\]]
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc f args {
Packit 1c1d7e
    set r [list [Invoked \[NotInvoked \]]]
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc g args {
Packit 1c1d7e
    set r "{[Invoked]}"
Packit 1c1d7e
    set r "{\[NotInvoked \]}"
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc h args {
Packit 1c1d7e
    [Invoked set] r {[NotInvoked]}
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
# check brackets in tcl commands containing script arguments
Packit 1c1d7e
#
Packit 1c1d7e
# example generated according to
Packit 1c1d7e
# https://groups.google.com/d/msg/comp.lang.tcl/G5-mc3GiIyY/e-AVD9t7xMkJ
Packit 1c1d7e
proc i args {
Packit 1c1d7e
    foreach item [Invoked] {
Packit 1c1d7e
    return
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
proc j args {
Packit 1c1d7e
    foreach [Invoked item] [list one two three] {
Packit 1c1d7e
    }
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc k args {
Packit 1c1d7e
    while {[Invoked 0]} {
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
proc l args {
Packit 1c1d7e
    for {} {[Invoked 0]} {} {
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
proc m args {
Packit 1c1d7e
    if {[Invoked 1]} {
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
proc n args {
Packit 1c1d7e
    if [Invoked 1] {
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
proc o args {
Packit 1c1d7e
    if {0} {
Packit 1c1d7e
    } elseif {[Invoked 0]} {
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
# these are really nasty examples
Packit 1c1d7e
# they shows, that the condition argument may not be parsed as a script
Packit 1c1d7e
set NotInvoked \$NotInvoked
Packit 1c1d7e
proc $NotInvoked args {
Packit 1c1d7e
    puts "Procedure \"\$NotInvoked\" is invoked. Not Ok!"
Packit 1c1d7e
    return $args
Packit 1c1d7e
}
Packit 1c1d7e
proc p args {
Packit 1c1d7e
    set NotInvoked \$NotInvoked
Packit 1c1d7e
    if {$NotInvoked eq [Invoked 1]} {
Packit 1c1d7e
    }
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc q args {
Packit 1c1d7e
    set NotInvoked \$NotInvoked
Packit 1c1d7e
    if {0} {
Packit 1c1d7e
    } elseif {$NotInvoked eq [Invoked 1]} {
Packit 1c1d7e
    }
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc r args {
Packit 1c1d7e
    set NotInvoked \$NotInvoked
Packit 1c1d7e
    while {$NotInvoked eq [Invoked 1]} {
Packit 1c1d7e
    }
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
proc s args {
Packit 1c1d7e
    set NotInvoked \$NotInvoked
Packit 1c1d7e
    for {} {$NotInvoked eq [Invoked 1]} {} {
Packit 1c1d7e
    }
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
# dangling open brackets should not confuse the scanner
Packit 1c1d7e
proc t args {
Packit 1c1d7e
    set foo ]]]][Invoked]
Packit 1c1d7e
    return
Packit 1c1d7e
}
Packit 1c1d7e
# Example according to
Packit 1c1d7e
# https://bugzilla.gnome.org/show_bug.cgi?id=729135
Packit 1c1d7e
#                                       |
Packit 1c1d7e
# Note the subtle difference in this    | whitespace
Packit 1c1d7e
#                                       V
Packit 1c1d7e
proc y {} {
Packit 1c1d7e
    set classifier_state {{bphy} }
Packit 1c1d7e
    if { ($classifier_state == {{bphy} }) } {
Packit 1c1d7e
        Invoked
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
proc z {} {
Packit 1c1d7e
    set classifier_state {{bphy} }
Packit 1c1d7e
    if { ($classifier_state == {{bphy} } ) } {
Packit 1c1d7e
        Invoked
Packit 1c1d7e
    }
Packit 1c1d7e
}
Packit 1c1d7e
#
Packit 1c1d7e
# call all single letter procs
Packit 1c1d7e
# let tcl check what is called and what is not called
Packit 1c1d7e
foreach p [info procs ?] {
Packit 1c1d7e
    puts "Check procedure \"$p\""
Packit 1c1d7e
    $p
Packit 1c1d7e
}
Packit 1c1d7e
exit
Packit 1c1d7e