1#!/usr/bin/env tclsh
2#
3# pkgreq.test --
4#
5# Test loading of all tcl packages installed in /System/Library/Tcl
6#
7
8if {[lsearch [namespace children] ::tcltest] == -1} {
9    package require tcltest 2.2
10}
11
12if {[catch {tcltest::testConstraint notLoadable}]} {
13    tcltest::testConstraint notLoadable 0
14}
15tcltest::testConstraint req85 [expr {![catch {package present Tcl 8.5-}]}]
16tcltest::testConstraint req86 [expr {![catch {package present Tcl 8.6-}]}]
17
18proc constraint {pkg} {
19    # packages not intended for direct loading or known not to be present
20    if {[regexp {^(dom::c|page::((analysis|compiler|transform)::.*|(gen::peg|writer)::(me|mecpu)|(reader|util::norm)::(peg|lemon))|xotcl::.*::(ldap|.*gdbm)|(doctools::(toc|idx)|pt::peg)::(import|export)::.*)$} $pkg]} {
21	return notLoadable
22    }
23    # packages requiring tcl 8.5 or later
24    if {[regexp {^(chatwidget|canvas::(mvg|snap)|char|configuration|controlwidget|diagram(|::.*)|gpx|huddle|yaml|imap4|json(|::.*)|JSONRPC|namespacex|ntext|paths|pt::.*|rest|S3|sqlite3|struct::graph::op|tablelist_tile|tcl::randomseed|text::write|vfs::webdav|xsxp|xyplot)$} $pkg]} {
25	return req85
26    }
27    # packages requiring tcl 8.6 or later
28    if {[regexp {^(coroutine(|::auto)|menubar(|::.*)|tcl::(chan|transform)::.*)$} $pkg]} {
29        return req86
30    }
31    return {}
32}
33
34# get all package names
35set pkgs [exec find -L /System/Library/Tcl \
36	! -path "*/Tcl/[expr {[tcltest::testConstraint req85] ? "8.4" : "8.5"}]/*" \
37	-name pkgIndex.tcl -print0 | \
38	xargs -0 awk {/^[ \t]*package ifneeded/ && $3 !~ /^\$/ {print $3}} | \
39	sort -fu]
40
41foreach pkg $pkgs {
42    tcltest::test pkgreq-$pkg "\[package require $pkg\]" \
43	-constraints [constraint $pkg] -setup {interp create i} \
44	-body {interp eval i "package require $pkg"} \
45	-cleanup {interp delete i} -match regexp -result {^[\d\.]+$}
46}
47
48tcltest::cleanupTests
49