home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / rc / part04 / trip.rc < prev    next >
Text File  |  1992-05-30  |  15KB  |  543 lines

  1. # trip.rc -- take a tour of rc
  2. # Invoke as "path-to-new-rc < trip.rc"
  3.  
  4. rc=$0
  5. echo tripping $rc
  6.  
  7. fn fail {
  8.     echo >[1=2] trip took a wrong turn: $*
  9.     rm -f $tmp
  10.     exit 1
  11. }
  12. fn expect {
  13.     echo >[1=2] -n expect $^*^': '
  14. }
  15. fn submatch {
  16.     if (!~ $#* 3)
  17.         fail incorrect invocation of submatch
  18.     prompt=$nl if (!~ `` $nl {$rc -ic $1>[2=1]} $2)
  19.         fail $3
  20. }
  21. fn sigexit sigint sigquit sigsegv
  22. fn sigexit {
  23.     echo trip complete
  24. }
  25. tmp=/tmp/trip.$pid
  26. rm -f $tmp
  27. nl='
  28. '
  29.  
  30. #
  31. # rc -c
  32. #
  33.  
  34. if ($rc -c >[2]/dev/null) fail 'rc -c didn''t report a bad exit status'
  35. x=`{$rc -c 'echo $0 $2 $#*' a b c d e f}
  36. if (false) {                    # WARNING: this differs from sh
  37.     if (!~ $x(1) a) fail rc -c reports '$0' incorrectly as $x(1)
  38.     if (!~ $x(2) c) fail rc -c reports '$2' incorrectly as $x(2)
  39.     if (!~ $x(3) 5) fail rc -c reports '$#' incorrectly as $x(3)
  40. } else {
  41.     if (!~ $x(1) $rc) fail rc -c reports '$0' incorrectly as $x(1)
  42.     if (!~ $x(2) b) fail rc -c reports '$2' incorrectly as $x(2)
  43.     if (!~ $x(3) 6) fail rc -c reports '$#' incorrectly as $x(3)
  44. }
  45.  
  46. #
  47. # umask
  48. #
  49.  
  50. umask 0
  51. > $tmp
  52. x=`{ls -l $tmp}
  53. if (!~ $x(1) '-rw-rw-rw-') fail umask 0 produced incorrect result: $x(1)
  54. rm -f $tmp
  55. umask 027
  56. > $tmp
  57. y=`{ls -l $tmp}
  58. if (!~ $y(1) '-rw-r-----') fail umask 027 produced incorrect file: $y(1)
  59. rm -f $tmp
  60. if (!~ `umask 027) fail umask reported bad value: `umask
  61.  
  62. submatch 'umask bad' 'bad umask' 'bad umask'
  63. submatch 'umask -027' 'bad umask' 'bad umask'
  64. submatch 'umask 999999' 'bad umask' 'bad umask'
  65. submatch 'umask hi there' 'too many arguments to umask' 'umask arg count'
  66.  
  67. if (!~ `umask 027) fail bad umask changed umask value to `umask
  68.  
  69. #
  70. # redirections
  71. #
  72.  
  73. fn bytes { for (i) x=`{wc -c $i} echo $x(1) }
  74. echo foo > foo > bar
  75. if (!~ `{bytes foo} 0) fail double redirection created non-empty empty file
  76. if (!~ `{bytes bar} 4) fail double redirection created wrong sized file: `{bytes bar}
  77. rm -f foo bar
  78. echo -n >1 >[2]2 >[1=2] foo
  79. x = `` '' {cat 1}
  80. if (!~ $#x 0) fail dup created non-empty empty file: `` '' {cat 1}
  81. if (!~ `` '' {cat 2} foo) fail dup put wrong contents in file : `` '' {cat 2}
  82. rm -f 1 2
  83.  
  84. expect error from cat, closing stdin
  85. cat >[0=]
  86.  
  87. submatch 'cat>(1 2 3)' 'multi-word filename in redirection' 'redirection error'
  88. submatch 'cat>()' 'null filename in redirection' 'redirection error'
  89.  
  90. #
  91. # blow the input stack
  92. #
  93.  
  94. if (!~ hi `{
  95. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  96. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  97. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  98. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  99. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  100. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  101. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  102. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  103. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  104. eval eval eval eval eval eval eval eval eval eval eval eval eval \
  105. eval eval eval eval eval eval eval eval eval eval eval echo hi
  106. })
  107.     fail huge eval
  108.  
  109. #
  110. # heredocs and herestrings
  111. #
  112.  
  113. bigfile=/tmp/big.$pid
  114. od $rc | sed 5000q > $bigfile
  115. abc=(this is a)
  116. x=()
  117. result='this is a heredoc
  118. this is an heredoc
  119. '
  120. if (!~ `` '' {<<[5] EOF cat <[0=5]} $result) fail unquoted heredoc
  121. $abc heredoc$x
  122. $abc^n $x^here$x^doc
  123. EOF
  124. {if (!~ `` $nl cat '    ') fail quoted heredoc} << ' '
  125.     
  126.  
  127.  
  128. <<<[9] ``''{cat $bigfile} \
  129. {
  130.      if(!~ ``''{cat <[0=9]}``'' cat)fail large herestrings
  131. } < \
  132. $bigfile
  133.  
  134. rm -f $bigfile
  135.  
  136. if (!~ `{cat<<eof
  137. $$
  138. eof
  139. } '$')
  140.     fail quoting '$' in heredoc
  141.  
  142. submatch 'cat<<eof' 'heredoc incomplete' 'incomplete heredoc'
  143. submatch 'cat<<eof
  144. ' 'heredoc incomplete' 'incomplete heredoc'
  145.  
  146. submatch 'cat<<(eof eof)' 'eof-marker not a single literal word' 'bad heredoc marker'
  147.  
  148. #
  149. # lexical analysis
  150. #
  151.  
  152. expect warning
  153.  
  154. echo here_is_a_really_long_word.It_has_got_to_be_longer_than_1000_characters_for_the_lexical_analyzers_buffer_to_overflow_but_that_should_not_be_too_difficult_to_do.Let_me_start_writing_some_Lewis_Carroll.Twas_brillig_and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe.All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.Beware_the_Jabberwock_my_son,The_jaws_that_bite,the_claws_that_catch.Beware_the_Jub-jub_bird,and_shun_The_frumious_Bandersnatch.He_took_his_vorpal_sword_in_hand,Long_time_the_manxome_foe_he_sought,So_rested_he_by_the_Tumtum_tree,And_stood_awhile_in_thought.And_as_in_uffish_thought_he_stood,The_Jabberwock,with_eyes_of_flame,Came_whiffling_through_the_tulgey_wood,And_burbled_as_it_came.One_two,one_two.And_through_and_through_The_vorpal_blade_went_snicker-snack.He_left_it_dead_and_with_its_head,He_went_galumphing_back.And_hast_thou_slain_the_Jabberwock?Come_to_my_arms,my_beamish_boy,Oh_frabjous_day.Callooh_callay.He_chortled_in_his_joy.Twas_brillig,and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe,All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe. > /tmp/$pid.lw
  155.  
  156. echo 'here_is_a_really_long_word.It_has_got_to_be_longer_than_1000_characters_for_the_lexical_analyzers_buffer_to_overflow_but_that_should_not_be_too_difficult_to_do.Let_me_start_writing_some_Lewis_Carroll.Twas_brillig_and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe.All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.Beware_the_Jabberwock_my_son,The_jaws_that_bite,the_claws_that_catch.Beware_the_Jub-jub_bird,and_shun_The_frumious_Bandersnatch.He_took_his_vorpal_sword_in_hand,Long_time_the_manxome_foe_he_sought,So_rested_he_by_the_Tumtum_tree,And_stood_awhile_in_thought.And_as_in_uffish_thought_he_stood,The_Jabberwock,with_eyes_of_flame,Came_whiffling_through_the_tulgey_wood,And_burbled_as_it_came.One_two,one_two.And_through_and_through_The_vorpal_blade_went_snicker-snack.He_left_it_dead_and_with_its_head,He_went_galumphing_back.And_hast_thou_slain_the_Jabberwock?Come_to_my_arms,my_beamish_boy,Oh_frabjous_day.Callooh_callay.He_chortled_in_his_joy.Twas_brillig,and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe,All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.' > /tmp/$pid.lq
  157.  
  158. if (!~ ``(){cat /tmp/$pid.lw} ``(){cat /tmp/$pid.lq})
  159.     fail expected long string and long word to be identical
  160. if (! x=`{wc -c /tmp/$pid.lw} ~ $x(1) 1088)
  161.     fail expected long word to be 1088 bytes
  162. if (! x=`{wc -c /tmp/$pid.lq} ~ $x(1) 1088)
  163.     fail expected long quote to be 1088 bytes
  164.  
  165. rm /tmp/$pid.lw
  166. rm /tmp/$pid.lq
  167.  
  168. submatch 'echo hi |[2' 'expected ''='' or '']'' after digit' 'scan error'
  169. submatch 'echo hi |[92=]' 'expected digit after ''=''' 'scan error'
  170. submatch 'echo hi |[a]' 'expected digit after ''[''' 'scan error'
  171. submatch 'echo hi |[2-' 'expected ''='' or '']'' after digit' 'scan error'
  172. submatch 'echo hi |[2=99a]' 'expected '']'' after digit' 'scan error'
  173. submatch 'echo hi |[2=a99]' 'expected digit or '']'' after ''=''' 'scan error'
  174. submatch 'echo ''hi' 'eof in quoted string' 'scan error'
  175.  
  176. ifs='' {
  177.     if (!~ 'h i' `{echo -n h\
  178. i})
  179.         fail backslash-newline to space conversion
  180.     if (!~ $rc^\rc `{echo -n $rc\rc})
  181.         fail backslash after variable name did not terminate variable name scan
  182.     if (!~ $rc^' rc' `{echo -n $rc\
  183. rc})
  184.         fail backslash-newline after variable name space conversion
  185.     if (!~ 'h\i' `{echo -n h\i})
  186.         fail backslash in the middle of word
  187.     if (!~ 'h \ i' `{echo -n h \ i})
  188.         fail free-standing backslash
  189. }
  190.  
  191. if (! $rc -c '# eof in comment')
  192.     fail eof in comment exited with nonzero status
  193.  
  194. # test the syntax error printer
  195.  
  196. prompt='' if (!~ `` $nl {$rc -cif>[2=1]} 'line 1: '*' error near if')
  197.     fail print syntax error
  198.  
  199. prompt='' if (!~ `` $nl {$rc -icif>[2=1]} *' error')
  200.     fail print syntax error
  201.  
  202. #
  203. # builtins
  204. #
  205.  
  206. fn foo {
  207.     return sigfpe
  208. }
  209.  
  210. foo
  211. if (!~ $status sigfpe)
  212.     fail return builtin did not return sigfpe
  213.  
  214. fn foo # test deleting of function
  215. fn bar {
  216.     for (i in 1 2 3 4 5)
  217.         if (~ $i 3)
  218.             return
  219. }
  220.  
  221. bar
  222. if (!~ $i 3)
  223.     fail return inside loop inside function failed
  224.  
  225. submatch return 'return outside of function' 'return outside of function'
  226. submatch 'break 1' 'too many arguments to break' 'break arg count'
  227. submatch break 'break outside of loop' 'break outside of loop'
  228.  
  229. for (i in 1 2 3 4 5)
  230.     if (~ $i 2)
  231.         break
  232. if (!~ $i 2)
  233.     fail break out of loop
  234.  
  235. submatch 'wait foo' 'foo is a bad number' 'bogus argument to wait'
  236.  
  237. if (~ `{echo -n} ?)
  238.     fail echo -n
  239. if (~! `` '' {echo --} $nl)
  240.     fail echo --
  241.  
  242. pwd=`/bin/pwd cdpath=/ { # some local assignments
  243.     home=/tmp cd
  244.     if (!~ `/bin/pwd `{sh -c 'cd /tmp; /bin/pwd'})
  245.         fail could not cd to '$home'
  246.  
  247.     cdpath=/ cd tmp
  248.     if (!~ `/bin/pwd `{sh -c 'cd /tmp; /bin/pwd'})
  249.         fail could not cd to /tmp
  250.  
  251.     cd $pwd
  252.     if (!~ `/bin/pwd `{sh -c 'cd $pwd; /bin/pwd'})
  253.         fail could not cd to current directory!
  254. }
  255.  
  256. *=(1 2 3 4 5) {
  257.     expect bad number
  258.     shift foo
  259.     expect arg count
  260.     shift 1 2 3
  261.     expect shift overflow
  262.     shift 123
  263.     shift 3
  264.     if (!~ $#* 2)
  265.         fail shift 3 of '(1 2 3 4 5)' failed
  266.     shift
  267.     if (!~ $* 5)
  268.         fail shift failed to shift left-to-right
  269. }
  270.  
  271. /bin/false
  272. eval && fail null eval reset '$status'
  273.  
  274. if (!~ `{rm=(); fn rm; path=(. /bin); whatis rm} /bin/rm)
  275.     fail rm isn''''t in bin!?
  276.  
  277. expect list of signal handlers
  278. whatis -s
  279.  
  280. expect list of variables and functions
  281. whatis
  282.  
  283. submatch 'whatis -f' 'whatis: bad option: -f' 'bad option to whatis'
  284.  
  285. submatch 'whatis /frobnatz' '/frobnatz not found' 'search for /frobnatz'
  286.  
  287. if (~ `{whatis limit >[2]/dev/null} builtin) {
  288.     limit coredumpsize 0
  289.     if (!~ `{limit coredumpsize} 0*)
  290.         fail failed to set coredumpsize to zero
  291.     if (!~ `` () {limit coredumpsize} `` () {limit|grep coredumpsize})
  292.         fail limit limit
  293.     submatch 'limit foo' 'no such limit' 'bad limit'
  294. }
  295.  
  296. fn cd
  297.  
  298. submatch 'cd a b c' 'too many arguments to cd' 'cd arg count'
  299. $rc -c 'cdpath=() cd /frobnatz' >[2]/dev/null && fail 'cd to /frobnatz succeeded!?'
  300. submatch 'cdpath='''' cd frobnatz' 'couldn''t cd to frobnatz' 'cd to frobnatz succeeded!?'
  301.  
  302. 'if'=keyword {
  303.     {whatis if | fgrep '''if''=keyword' >/dev/null} || fail whatis of keyword is not quoted
  304. }
  305.  
  306. #
  307. # wait
  308. #
  309.  
  310. submatch 'wait 1 2 3' 'too many arguments to wait' 'arg count'
  311. $rc -c 'wait 1' >[2]/dev/null && fail wait 1
  312.  
  313. sleep 5&
  314. expect $apid
  315. echo $apids
  316. wait
  317.  
  318. if (~ `` '' {wait} ?)
  319.     fail waiting for nothing
  320.  
  321. #
  322. # matching
  323. #
  324.  
  325. touch /tmp/abc.$pid /tmp/bbc.$pid
  326. mkdir /tmp/dir.$pid /tmp/dip.$pid
  327. touch /tmp/dir.$pid/^(a b c) /tmp/dip.$pid/^(a b c)
  328.  
  329. if (!~ 123 [~x]?[0-9])
  330.     fail match
  331. if (!~ () *)
  332.     fail match of null list with '*'
  333. if (~ () *v*)
  334.     fail match of null list with '*v*' succeeded
  335. if (!~ (foo bar zar) *****z*****)
  336.     fail match of list by one pattern failed
  337. if (~ (foo bar zar) *c*)
  338.     fail bad match
  339. if (!~ [aaa [aaa)
  340.     fail bad rangematch
  341. if (!~ ']' []])
  342.     fail match right bracket
  343. if (~ x [y])
  344.     fail rangematch out of range
  345. if (~ x x?)
  346.     fail too many characters in pattern
  347.  
  348. test -f /////tmp//////a?c.$pid || fail glob with many slashes
  349. if (!~ /////tmp//////a*.$pid /////tmp//////a?c.$pid)
  350.     fail glob with many slashes
  351. if (!~ ////tmp////di?.$pid////* ////tmp////dir.$pid////*b*)
  352.     fail glob with more slashes
  353. if (! @{cd /; ~ */a*.$pid tmp/a*})
  354.     fail glob in current directory
  355. if (!~ /tmp/?bc.$pid /tmp/bbc.$pid)
  356.     fail match of bbc.$pid against '('abc.$pid bbc.$pid')'
  357.  
  358. rm /tmp/abc.$pid /tmp/bbc.$pid
  359. rm -rf /tmp/dir.$pid /tmp/dip.$pid
  360.  
  361. #
  362. # signals
  363. #
  364.  
  365. fn sigint {eval}
  366. kill -2 $pid
  367. fn sigint
  368.  
  369. #
  370. # path searching
  371. #
  372.  
  373. $rc -c /frobnatz >[2]/dev/null && fail 'search error'
  374.  
  375. touch /tmp/noexec.$pid
  376. chmod a-x /tmp/noexec.$pid
  377. $rc -c /tmp/noexec.$pid >[2]/dev/null && fail /tmp/noexec.$pid is found!?
  378. rm /tmp/noexec.$pid
  379.  
  380. submatch 'path='''' frobnatz' 'frobnatz not found' 'search error'
  381.  
  382. {path=() /bin/sh -c 'exit 0'} || fail abs pathname with path set to null
  383.  
  384. #
  385. # options
  386. #
  387.  
  388. # this test is meaningless; not really a trip
  389. expect prompt, echo hi
  390. home=/frobnatz $rc -nolpeivdxc 'echo hi'
  391. if (!~ `` $nl {$rc -c>[2=1]} *': option requires an argument -- c')
  392.     fail getopt on -c
  393. if (!~ `` $nl {$rc -q>[2=1]} *': bad option: -q')
  394.     fail getopt on -q (bogus option)
  395. if (!~ `{echo '#echo' | $rc -v |[2] sed 's/#//'} echo)
  396.     fail rc -v
  397.  
  398. #
  399. # dot
  400. #
  401.  
  402. if (~ `` '' . ?*)
  403.     fail null dot
  404. if (~ `` '' {. -i} ?*)
  405.     fail null dot -i
  406.  
  407. cat > /tmp/dot.$pid << eof
  408. echo hi
  409. eof
  410.  
  411. prompt=';' if (~! `` '' {. -i /tmp/dot.$pid>[2=1]} ';hi'^$nl';')
  412.     fail dot -i
  413. submatch .' '/tmp/dot.$pid hi dot
  414.  
  415. rm /tmp/dot.$pid
  416.  
  417. $rc -c '. /frobnatz' >[2]/dev/null && fail 'dot of a nonexistent file'
  418.  
  419. #
  420. # stdin
  421. #
  422.  
  423. if (!~ `{echo echo hi | $rc} hi)
  424.     fail piping stdin to rc
  425.  
  426. #
  427. # functions, variables & environment
  428. #
  429.  
  430. fn --- {for(i)a|[2=3]b>>c<<<'e'&f>[2=1]}
  431.  
  432. if (whatis printenv >/dev/null>[2=1]) {
  433.     printenv=printenv
  434. } else if (whatis env >/dev/null>[2=1]) {
  435.     printenv=env
  436. } else
  437.     printenv=()
  438.  
  439. if (~ $#printenv 1 && !~ `` $nl {$printenv | grep fn___2d__2d__2d} 'fn___2d__2d__2d={for(i in $*)a|[2=3]b >>c <<<''e''&f >[2=1]}')
  440.     fail protect_env
  441.  
  442. fn --- {replace}
  443. ~ `{whatis -- ---} *replace* || fail replace a function definition
  444. fn ---
  445. whatis -- --- >[2]/dev/null && fail function deletion
  446. foo=bar *=bar
  447. foo=nest *=nest {
  448.     ~ $foo nest || fail local assignment
  449.     ~ $* nest || fail local assignment to '$*'
  450.     foo=()
  451.     *=()
  452.     ~ $foo () || fail local deletion
  453.     ~ $* () || fail local deletion to '$*'
  454. }
  455. ~ $foo bar || fail restore of global after local group
  456. ~ $* bar || fail restore of '$*' after local group
  457. ~ `{exec>[2=1];$rc -xc 'foo=()'} 'foo=()' || fail -x echo of variable deletion
  458.  
  459. fn_ff='{' prompt='' if (~! `` $nl {$rc -cff>[2=1]} 'line 1: '*' error near eof')
  460.     fail 'bogus function in environment'
  461.  
  462. #
  463. # statuses
  464. #
  465.  
  466. ~ `{$rc -ec 'sleep 10&kill -9 $apid;wait'>[2=1]} killed ||
  467.     fail status diagnostic
  468.  
  469. $rc -c 'exit 0 sigfpe' && fail exit of bad pipeline is true
  470.  
  471. submatch 'exit foo' 'bad status' 'exit diagnostic'
  472.  
  473. #
  474. # control structures
  475. #
  476.  
  477. if (!~ `{false || echo hi} hi)
  478.     fail '||'
  479. if (!~ `{true && echo hi} hi)
  480.     fail '&&'
  481. if (~ `{true || echo hi} hi)
  482.     fail '||'
  483. if (~ `{false && echo hi} hi)
  484.     fail '&&'
  485.  
  486. while (false)
  487.     fail false while
  488. while (true) {
  489.     break
  490.     fail break in while
  491. }
  492.  
  493. switch (foo) {
  494.     case bar
  495.         fail matched bar in switch
  496.     case foo
  497.         eval
  498.     case *
  499.         fail match foo in switch
  500. }
  501.  
  502. switch (nothing) {
  503.     case bar
  504.         fail matched bar in switch
  505.     case *
  506.         i=frobnatz
  507. }
  508.  
  509. ~ $i frobnatz || fail match '*' in switch
  510.  
  511. submatch '()=()' 'null variable name' 'assignment diagnostic'
  512. submatch 'fn () {eval}' 'null function name' 'assigning null function name'
  513.  
  514. #
  515. # prompt
  516. #
  517.  
  518. fn prompt {echo hi}
  519. prompt=() if (~! `{$rc -i /dev/null>[2]/dev/null} hi) fail fn prompt
  520. fn prompt
  521.  
  522. #
  523. # history
  524. #
  525.  
  526. history=/tmp/hist.$pid prompt='' echo 'history=()' | $rc -i
  527.  
  528. if (!~ `{cat /tmp/hist.$pid} 'history=()')
  529.     fail output to history file
  530.  
  531. history=/tmp/hist.$pid prompt='' echo 'history=()' | $rc -i
  532.  
  533. if (!~ `` () {cat /tmp/hist.$pid} 'history=()
  534. history=()
  535. ')
  536.     fail append to history file
  537.  
  538. rm /tmp/hist.$pid
  539.  
  540. if (!~ `{history=/frobnatz/foo prompt='' echo eval | $rc -i >[2=1]} ?*)
  541.     fail accessing bad history file
  542.