@@ -208,6 +208,19 @@ array set configlockable [list\
208208 implicit_default 1\
209209]
210210
211+ array set configkind [list\
212+ avail_output l\
213+ avail_terse_output l\
214+ colors l\
215+ list_output l\
216+ list_terse_output l\
217+ protected_envvars l\
218+ shells_with_ksh_fpath l\
219+ tag_abbrev l\
220+ tag_color_name l\
221+ variant_shortcut l\
222+ ]
223+
211224set statelist [list always_read_full_file autoinit clock_seconds cmdline commandname domainname error_count extra_siteconfig_loaded false_rendered force hiding_threshold inhibit_errreport inhibit_interp init_error_report is_stderr_tty is_win kernelversion lm_info_cached machine modulefile nodename os osversion paginate path_separator report_format reportfd return_false shell shelltype siteconfig_loaded sub1_separator sub2_separator subcmd subcmd_args supported_shells tcl_ext_lib_loaded tcl_version term_columns usergroups username]
212225
213226if {[is_quick_mode]} {
@@ -514,6 +527,170 @@ set ans [list [list set $configvar(auto_handling) 0]]
514527testouterr_cmd_re sh "config --dump-state auto_handling 0" $ans {}
515528
516529
530+ #
531+ # config value append or subtract
532+ #
533+
534+ if {![is_quick_mode]} {
535+
536+ # basic test on all colon-separated list configuration option
537+ foreach param [array names configkind] {
538+ if {$configkind($param) eq {l}} {
539+ if {[info exists configvalidkind($param)] && $configvalidkind($param)\
540+ eq {eltlist}} {
541+ set val [lindex $configvalid($param) 1]
542+ } else {
543+ set val bar
544+ }
545+
546+ # append test
547+ set ans [list [list set $configvar($param) $configset($param):$val]]
548+ testouterr_cmd sh "config $param +$val" $ans {}
549+
550+ # subtract test
551+ set ans [list [list set $configvar($param) {}]]
552+ testouterr_cmd sh "config $param -$configset($param)" $ans {}
553+ }
554+ }
555+
556+
557+ # detailed tests on one representative config
558+ set param avail_output
559+ set envvar $configvar($param)
560+
561+ # detailed append tests
562+
563+ # no value currently defined
564+ unsetenv_var $envvar
565+ set ans [list [list set $envvar $configdfl($param):variant]]
566+ testouterr_cmd sh "config $param +variant" $ans {}
567+
568+ # value already defined in default
569+ set ans [list [list set $envvar $configdfl($param)]]
570+ testouterr_cmd sh "config $param +$configset($param)" $ans {}
571+
572+ # two-value add, one already defined in default
573+ set ans [list [list set $envvar $configdfl($param):variant]]
574+ testouterr_cmd sh "config $param +key:variant" $ans {}
575+ testouterr_cmd sh "config $param +variant:key" $ans {}
576+ testouterr_cmd sh "config $param +modulepath:variant:key" $ans {}
577+
578+ # two value add, both already defined in default
579+ set ans [list [list set $envvar $configdfl($param)]]
580+ testouterr_cmd sh "config $param +modulepath:key" $ans {}
581+
582+ # empty value defined
583+ setenv_var $envvar {}
584+ set ans [list [list set $envvar variant]]
585+ testouterr_cmd sh "config $param +variant" $ans {}
586+
587+ # empty value defined, two value add
588+ set ans [list [list set $envvar variant:sym]]
589+ testouterr_cmd sh "config $param +variant:sym" $ans {}
590+
591+ # value already defined
592+ setenv_var $envvar $configset($param)
593+ set ans [list [list set $envvar $configset($param)]]
594+ testouterr_cmd sh "config $param +$configset($param)" $ans {}
595+
596+ # two-value add, none already defined
597+ set ans [list [list set $envvar $configset($param):key:alias]]
598+ testouterr_cmd sh "config $param +key:alias" $ans {}
599+
600+ # unauthorized value
601+ set tserr "$error_msgs: Invalid element in value list for config. option '$param'\n Allowed elements are: $configvalid($param) (separated by ':')"
602+ testouterr_cmd sh "config $param +foo" ERR $tserr
603+
604+ # two-value add, 1 unauthorized
605+ testouterr_cmd sh "config $param +foo:variant" ERR $tserr
606+
607+ # two-value add, both unauthorized
608+ testouterr_cmd sh "config $param +foo:bar" ERR $tserr
609+
610+ # multiple value add, with one empty element in front
611+ testouterr_cmd sh "config $param +:variant:key" ERR $tserr
612+
613+ # multiple value add, with one empty element in the middle
614+ testouterr_cmd sh "config $param +variant::key" ERR $tserr
615+
616+ # multiple value add, with one empty element at the end
617+ testouterr_cmd sh "config $param +variant:key:" ERR $tserr
618+
619+
620+ # detailed subtract tests
621+
622+ # no value currently defined
623+ unsetenv_var $envvar
624+ set ans [list [list set $envvar $configdfl($param)]]
625+ testouterr_cmd sh "config $param -variant" $ans {}
626+
627+ # value already defined in default
628+ set ans [list [list set $envvar [join [lsearch -exact -all -inline -not\
629+ [split $configdfl($param) :] $configset($param)] :]]]
630+ testouterr_cmd sh "config $param -$configset($param)" $ans {}
631+
632+ # two-value del, one already defined in default
633+ set ans [list [list set $envvar [join [lsearch -exact -all -inline -not\
634+ [split $configdfl($param) :] key] :]]]
635+ testouterr_cmd sh "config $param -key:variant" $ans {}
636+ testouterr_cmd sh "config $param -variant:key" $ans {}
637+
638+ # two value del, both already defined in default
639+ set ans [list [list set $envvar [join [lsearch -regexp -all -inline -not\
640+ [split $configdfl($param) :] {^(key|modulepath)$}] :]]]
641+ testouterr_cmd sh "config $param -modulepath:key" $ans {}
642+
643+ # empty value defined
644+ setenv_var $envvar {}
645+ set ans [list [list set $envvar {}]]
646+ testouterr_cmd sh "config $param -variant" $ans {}
647+
648+ # empty value defined, two value add
649+ set ans [list [list set $envvar {}]]
650+ testouterr_cmd sh "config $param -variant:sym" $ans {}
651+
652+ # value already defined
653+ setenv_var $envvar $configset($param)
654+ set ans [list [list set $envvar {}]]
655+ testouterr_cmd sh "config $param -$configset($param)" $ans {}
656+
657+ # two-value add, none already defined
658+ set ans [list [list set $envvar $configset($param)]]
659+ testouterr_cmd sh "config $param -key:alias" $ans {}
660+
661+ # unauthorized value
662+ set ans [list [list set $envvar $configset($param)]]
663+ testouterr_cmd sh "config $param -foo" $ans {}
664+
665+ # two-value add, 1 unauthorized
666+ testouterr_cmd sh "config $param -foo:variant" $ans {}
667+
668+ # two-value add, both unauthorized
669+ testouterr_cmd sh "config $param -foo:bar" $ans {}
670+
671+ # multiple value add, with one empty element in front
672+ testouterr_cmd sh "config $param -:variant:key" $ans {}
673+
674+ # multiple value add, with one empty element in the middle
675+ testouterr_cmd sh "config $param -variant::key" $ans {}
676+
677+ # multiple value add, with one empty element at the end
678+ testouterr_cmd sh "config $param -variant:key:" $ans {}
679+
680+
681+ # restore config test value
682+ setenv_var $envvar $configset($param)
683+
684+ # append/subtract on non-list option (value taken literally)
685+ set param contact
686+ set ans [list [list set $configvar($param) +foo]]
687+ testouterr_cmd_re sh "config $param +foo" $ans {}
688+ set ans [list [list set $configvar($param) -foo]]
689+ testouterr_cmd_re sh "config $param -foo" $ans {}
690+
691+ }
692+
693+
517694#
518695# Cleanup
519696#
0 commit comments