26754: tweak zgetdir() and test for realpath()
[zsh.git] / Test / D01prompt.ztst
blob3074efe606c17e1674466a501e4d80290c7ff99a
1 %prep
3   mkdir prompt.tmp
4   cd prompt.tmp
5   mydir=$PWD
6   SHLVL=2
7   setopt extendedglob
9 %test
11   hash -d mydir=$mydir
12   print -P '  %%%):  %)
13   %%~:  %~
14   %%d:  %d
15   %%1/: %1/
16   %%h:  %h
17   %%L:  %L
18   %%M:  %M
19   %%m:  %m
20   %%n:  %n
21   %%N:  %N
22   %%i:  %i
23   a%%{...%%}b:  a%{%}b
24   '
25 0q:Basic prompt escapes as shown.
26 >  %):  )
27 >  %~:  ~mydir
28 >  %d:  $mydir
29 >  %1/: ${mydir:t}
30 >  %h:  0
31 >  %L:  2
32 >  %M:  $HOST
33 >  %m:  ${HOST%%.*}
34 >  %n:  $USERNAME
35 >  %N:  (eval)
36 >  %i:  2
37 >  a%{...%}b:  ab
38 >  
40   true
41   print -P '%?'
42   false
43   print -P '%?'
44 0:`%?' prompt escape
48   PS4="%_> "
49   setopt xtrace
50   if true; then true; else false; fi
51   unsetopt xtrace
52 0:`%_' prompt escape
53 ?if> true
54 ?then> true
55 ?> unsetopt xtrace
57   diff =(print -P '%#') =(print -P '%(!.#.%%)')
58 0:`%#' prompt escape and its equivalent
60   psvar=(caesar adsum jam forte)
61   print -P '%v' '%4v'
62 0:`%v' prompt escape
63 >caesar forte
65   true
66   print -P '%(?.true.false)'
67   false
68   print -P '%(?.true.false)'
69 0:ternary prompt escapes
70 >true
71 >false
73   print -P 'start %10<...<truncated at 10%<< Not truncated%3< ...<Not shown'
74   print -P 'start %10>...>truncated at 10%>> Not truncated%3> ...>Not shown'
75 0:prompt truncation
76 >start ...d at 10 Not truncated ...
77 >start truncat... Not truncated ...
79 # It's hard to check the time and date as they are moving targets.
80 # We therefore just check that various forms of the date are consistent.
81 # In fact, if you perform this at midnight it can still fail.
82 # We could test for that, but we can't be bothered.
83 # I hope LC_ALL is enough to make the format what's expected.
85   LC_ALL=C
86   date1=$(print -P %w)
87   date2=$(print -P %W)
88   date3=$(print -P %D)
89   if [[ $date1 != [A-Z][a-z][a-z][[:blank:]]##[0-9]## ]]; then
90     print "Date \`$date1' is not in the form \`Day DD' (e.g. \`Mon 1'"
91   fi
92   if [[ $date2 != [0-9][0-9]/[0-9][0-9]/[0-9][0-9] ]]; then
93     print "Date \`$date2' is not in the form \`DD/MM/YYYY'"
94   fi
95   if [[ $date3 != [0-9][0-9]-[0-9][0-9]-[0-9][0-9] ]]; then
96     print "Date \`$date3' is not in the form \`YY-MM-DD'"
97   fi
98   if (( $date1[5,-1] != $date2[4,5] )) || (( $date2[4,5] != $date3[7,8] ))
99   then
100     print "Days of month do not agree in $date1, $date2, $date3"
101   fi
102   if (( $date2[1,2] != $date3[4,5] )); then
103     print "Months do not agree in $date2, $date3"
104   fi
105   if (( $date2[7,8] != $date3[1,2] )); then
106     print "Years do not agree in $date2, $date3"
107   fi
108 0:Dates produced by prompt escapes
110   mkdir foo
111   mkdir foo/bar
112   mkdir foo/bar/rod
113   (zsh_directory_name() {
114     emulate -L zsh
115     setopt extendedglob
116     local -a match mbegin mend
117     if [[ $1 = d ]]; then
118       if [[ $2 = (#b)(*bar)/rod ]]; then
119         reply=(barmy ${#match[1]})
120       else
121         return 1
122       fi
123     else
124       if [[ $2 = barmy ]]; then
125         reply=($mydir/foo/bar)
126       else
127         return 1
128       fi
129     fi
130   }
131   # success
132   print ~[barmy]/anything
133   cd foo/bar/rod
134   print -P %~
135   # failure
136   setopt nonomatch
137   print ~[scuzzy]/rubbish
138   cd ../..
139   print -P %~
140   # catastrophic failure
141   unsetopt nonomatch
142   print ~[scuzzy]/rubbish
143   )
144 1q:Dynamic named directories
145 >$mydir/foo/bar/anything
146 >~[barmy]/rod
147 >~[scuzzy]/rubbish
148 >~mydir/foo
149 ?(eval):33: no directory expansion: ~[scuzzy]
151   (
152   zsh_directory_name() {
153   emulate -L zsh
154   setopt extendedglob
155   local -a match mbegin mend
156   if [[ $1 = n ]]; then
157       if [[ $2 = *:l ]]; then
158           reply=(${2%%:l}/very_long_directory_name)
159           return 0
160       else
161           return 1
162       fi
163   else
164       if [[ $2 = (#b)(*)/very_long_directory_name ]]; then
165         reply=(${match[1]}:l ${#2})
166         return 0
167       else
168         return 1
169       fi
170   fi
171   }
172   parent=$PWD
173   dir=$parent/very_long_directory_name
174   mkdir $dir
175   cd $dir
176   fn() {
177      PS4='+%N:%i> '
178      setopt localoptions xtrace
179      # The following is the key to the test.
180      # It invokes zsh_directory_name which does PS4 output stuff
181      # while we're doing prompt handling for the parameter
182      # substitution.  This checks recursion works OK.
183      local d=${(%):-%~}
184      print ${d//$parent/\<parent\>}
185   }
186   fn 2>stderr
187   # post process error to remove variable contents
188   while read line; do
189     # tricky: reply is set to include directory length which is variable
190     [[ $line = *reply* ]] && continue
191     print ${line//$parent/\<parent\>}
192   done <stderr >&2
193   )
194 0:Recursive use of prompts
195 >~[<parent>:l]
196 ?+zsh_directory_name:1> emulate -L zsh
197 ?+zsh_directory_name:2> setopt extendedglob
198 ?+zsh_directory_name:3> local -a match mbegin mend
199 ?+zsh_directory_name:4> [[ d == n ]]
200 ?+zsh_directory_name:12> [[ <parent>/very_long_directory_name == (#b)(*)/very_long_directory_name ]]
201 ?+zsh_directory_name:14> return 0
202 ?+fn:7> local 'd=~[<parent>:l]'
203 ?+fn:8> print '~[<parent>:l]'