home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / usr.bin / sed / sed.test < prev    next >
Encoding:
Text File  |  1992-12-02  |  11.3 KB  |  546 lines

  1. #!/bin/sh -
  2. #
  3. # Copyright (c) 1992 Diomidis Spinellis.
  4. # Copyright (c) 1992 The Regents of the University of California.
  5. # All rights reserved.
  6. #
  7. # Redistribution and use in source and binary forms, with or without
  8. # modification, are permitted provided that the following conditions
  9. # are met:
  10. # 1. Redistributions of source code must retain the above copyright
  11. #    notice, this list of conditions and the following disclaimer.
  12. # 2. Redistributions in binary form must reproduce the above copyright
  13. #    notice, this list of conditions and the following disclaimer in the
  14. #    documentation and/or other materials provided with the distribution.
  15. # 3. All advertising materials mentioning features or use of this software
  16. #    must display the following acknowledgement:
  17. #    This product includes software developed by the University of
  18. #    California, Berkeley and its contributors.
  19. # 4. Neither the name of the University nor the names of its contributors
  20. #    may be used to endorse or promote products derived from this software
  21. #    without specific prior written permission.
  22. #
  23. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  24. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  27. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33. # SUCH DAMAGE.
  34. #
  35. #    @(#)sed.test    5.6 (Berkeley) 8/28/92
  36. #
  37.  
  38. # sed Regression Tests
  39. #
  40. # The following files are created:
  41. # lines[1-4], script1, script2
  42. # Two directories *.out contain the test results
  43.  
  44. main()
  45. {
  46.     BASE=/usr/old/bin/sed
  47.     BASELOG=sed.out
  48.     TEST=../obj/sed
  49.     TESTLOG=nsed.out
  50.     DICT=/usr/share/dict/words
  51.  
  52.     test_error | more
  53.  
  54.     awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' </dev/null >lines1
  55.     awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' </dev/null >lines2
  56.  
  57.     exec 4>&1 5>&2
  58.  
  59.     # Set these flags to get messages about known problems
  60.     BSD=1
  61.     GNU=0
  62.     SUN=0
  63.     tests $BASE $BASELOG
  64.  
  65.     BSD=0
  66.     GNU=0
  67.     SUN=0
  68.     tests $TEST $TESTLOG
  69.     exec 1>&4 2>&5
  70.     diff -c $BASELOG $TESTLOG | more
  71. }
  72.  
  73. tests()
  74. {
  75.     SED=$1
  76.     DIR=$2
  77.     rm -rf $DIR
  78.     mkdir $DIR
  79.     MARK=100
  80.  
  81.     test_args
  82.     test_addr
  83.     echo Testing commands
  84.     test_group
  85.     test_acid
  86.     test_branch
  87.     test_pattern
  88.     test_print
  89.     test_subst
  90. }
  91.  
  92. mark()
  93. {
  94.     MARK=`expr $MARK + 1`
  95.     exec 1>&4 2>&5
  96.     exec >"$DIR/${MARK}_$1"
  97.     echo "Test $1:$MARK"
  98.     # Uncomment this line to match tests with sed error messages
  99.     echo "Test $1:$MARK" >&5
  100. }
  101.  
  102. test_args()
  103. {
  104.     mark '1.1'
  105.     echo Testing argument parsing
  106.     echo First type
  107.     if [ $SUN -eq 1 ] ; then
  108.         echo SunOS sed prints only with -n
  109.     else
  110.         $SED 's/^/e1_/p' lines1
  111.     fi
  112.     mark '1.2' ; $SED -n 's/^/e1_/p' lines1
  113.     mark '1.3'
  114.     if [ $SUN -eq 1 ] ; then
  115.         echo SunOS sed prints only with -n
  116.     else
  117.         $SED 's/^/e1_/p' <lines1
  118.     fi
  119.     mark '1.4' ; $SED -n 's/^/e1_/p' <lines1
  120.     echo Second type
  121.     mark '1.4.1'
  122.     if [ $SUN -eq 1 ] ; then
  123.         echo SunOS sed fails this
  124.     fi
  125.     $SED -e '' <lines1
  126.     echo 's/^/s1_/p' >script1
  127.     echo 's/^/s2_/p' >script2
  128.     mark '1.5'
  129.     if [ $SUN -eq 1 ] ; then
  130.         echo SunOS sed prints only with -n
  131.     else
  132.         $SED -f script1 lines1
  133.     fi
  134.     mark '1.6'
  135.     if [ $SUN -eq 1 ] ; then
  136.         echo SunOS sed prints only with -n
  137.     else
  138.         $SED -f script1 <lines1
  139.     fi
  140.     mark '1.7'
  141.     if [ $SUN -eq 1 ] ; then
  142.         echo SunOS sed prints only with -n
  143.     else
  144.         $SED -e 's/^/e1_/p' lines1
  145.     fi
  146.     mark '1.8'
  147.     if [ $SUN -eq 1 ] ; then
  148.         echo SunOS sed prints only with -n
  149.     else
  150.         $SED -e 's/^/e1_/p' <lines1
  151.     fi
  152.     mark '1.9' ; $SED -n -f script1 lines1
  153.     mark '1.10' ; $SED -n -f script1 <lines1
  154.     mark '1.11' ; $SED -n -e 's/^/e1_/p' lines1
  155.     mark '1.12'
  156.     if [ $SUN -eq 1 ] ; then
  157.         echo SunOS sed prints only with -n
  158.     else
  159.         $SED -n -e 's/^/e1_/p' <lines1
  160.     fi
  161.     mark '1.13'
  162.     if [ $SUN -eq 1 ] ; then
  163.         echo SunOS sed prints only with -n
  164.     else
  165.         $SED -e 's/^/e1_/p' -e 's/^/e2_/p' lines1
  166.     fi
  167.     mark '1.14'
  168.     if [ $SUN -eq 1 ] ; then
  169.         echo SunOS sed prints only with -n
  170.     else
  171.         $SED -f script1 -f script2 lines1
  172.     fi
  173.     mark '1.15'
  174.     if [ $GNU -eq 1 -o $SUN -eq 1 ] ; then
  175.         echo GNU and SunOS sed fail this following older POSIX draft
  176.     else
  177.         $SED -e 's/^/e1_/p' -f script1 lines1
  178.     fi
  179.     mark '1.16'
  180.     if [ $SUN -eq 1 ] ; then
  181.         echo SunOS sed prints only with -n
  182.     else
  183.         $SED -e 's/^/e1_/p' lines1 lines1
  184.     fi
  185.     # POSIX D11.2:11251
  186.     mark '1.17' ; $SED p <lines1 lines1
  187. cat >script1 <<EOF
  188. #n
  189. # A comment
  190.  
  191. p
  192. EOF
  193.     mark '1.18' ; $SED -f script1 <lines1 lines1
  194. }
  195.  
  196. test_addr()
  197. {
  198.     echo Testing address ranges
  199.     mark '2.1' ; $SED -n -e '4p' lines1
  200.     mark '2.2' ; $SED -n -e '20p' lines1 lines2
  201.     mark '2.3' ; $SED -n -e '$p' lines1
  202.     mark '2.4' ; $SED -n -e '$p' lines1 lines2
  203.     mark '2.5' ; $SED -n -e '$a\
  204. hello' /dev/null
  205.     mark '2.6' ; $SED -n -e '$p' lines1 /dev/null lines2
  206.     # Should not print anything
  207.     mark '2.7' ; $SED -n -e '20p' lines1
  208.     mark '2.8' ; $SED -n -e '0p' lines1
  209.     mark '2.9' ; $SED -n '/l1_7/p' lines1
  210.     mark '2.10' ; $SED -n ' /l1_7/ p' lines1
  211.     mark '2.11'
  212.     if [ $BSD -eq 1 ] ; then
  213.         echo BSD sed fails this test
  214.     fi
  215.     if [ $GNU -eq 1 ] ; then
  216.         echo GNU sed fails this
  217.     fi
  218.     $SED -n '\_l1\_7_p' lines1
  219.     mark '2.12' ; $SED -n '1,4p' lines1
  220.     mark '2.13' ; $SED -n '1,$p' lines1 lines2
  221.     mark '2.14' ; $SED -n '1,/l2_9/p' lines1 lines2
  222.     mark '2.15' ; $SED -n '/4/,$p' lines1 lines2
  223.     mark '2.16' ; $SED -n '/4/,20p' lines1 lines2
  224.     mark '2.17' ; $SED -n '/4/,/10/p' lines1 lines2
  225.     mark '2.18' ; $SED -n '/l2_3/,/l1_8/p' lines1 lines2
  226.     mark '2.19'
  227.     if [ $GNU -eq 1 ] ; then
  228.         echo GNU sed fails this
  229.     fi
  230.     $SED -n '12,3p' lines1 lines2
  231.     mark '2.20'
  232.     if [ $GNU -eq 1 ] ; then
  233.         echo GNU sed fails this
  234.     fi
  235.     $SED -n '/l1_7/,3p' lines1 lines2
  236. }
  237.  
  238. test_group()
  239. {
  240.     echo Brace and other grouping
  241.     mark '3.1' ; $SED -e '
  242. 4,12 {
  243.     s/^/^/
  244.     s/$/$/
  245.     s/_/T/
  246. }' lines1
  247.     mark '3.2' ; $SED -e '
  248. 4,12 {
  249.     s/^/^/
  250.     /6/,/10/ {
  251.         s/$/$/
  252.         /8/ s/_/T/
  253.     }
  254. }' lines1
  255.     mark '3.3' ; $SED -e '
  256. 4,12 !{
  257.     s/^/^/
  258.     /6/,/10/ !{
  259.         s/$/$/
  260.         /8/ !s/_/T/
  261.     }
  262. }' lines1
  263.     mark '3.4' ; $SED -e '4,12!s/^/^/' lines1
  264. }
  265.  
  266. test_acid()
  267. {
  268.     echo Testing a c d and i commands
  269.     mark '4.1' ; $SED -n -e '
  270. s/^/before_i/p
  271. 20i\
  272. inserted
  273. s/^/after_i/p
  274. ' lines1 lines2
  275.     mark '4.2' ; $SED -n -e '
  276. 5,12s/^/5-12/
  277. s/^/before_a/p
  278. /5-12/a\
  279. appended
  280. s/^/after_a/p
  281. ' lines1 lines2
  282.     mark '4.3'
  283.     if [ $GNU -eq 1 ] ; then
  284.         echo GNU sed fails this
  285.     fi
  286.     $SED -n -e '
  287. s/^/^/p
  288. /l1_/a\
  289. appended
  290. 8,10N
  291. s/$/$/p
  292. ' lines1 lines2
  293.     mark '4.4' ; $SED -n -e '
  294. c\
  295. hello
  296. ' lines1
  297.     mark '4.5' ; $SED -n -e '
  298. 8c\
  299. hello
  300. ' lines1
  301.     mark '4.6' ; $SED -n -e '
  302. 3,14c\
  303. hello
  304. ' lines1
  305. # SunOS and GNU sed behave differently.   We follow POSIX
  306. #    mark '4.7' ; $SED -n -e '
  307. #8,3c\
  308. #hello
  309. #' lines1
  310.     mark '4.8' ; $SED d <lines1
  311. }
  312.  
  313. test_branch()
  314. {
  315.     echo Testing labels and branching
  316.     mark '5.1' ; $SED -n -e '
  317. b label4
  318. :label3
  319. s/^/label3_/p
  320. b end
  321. :label4
  322. 2,12b label1
  323. b label2
  324. :label1
  325. s/^/label1_/p
  326. b
  327. :label2
  328. s/^/label2_/p
  329. b label3
  330. :end
  331. ' lines1
  332.     mark '5.2'
  333.     if [ $BSD -eq 1 ] ; then
  334.         echo BSD sed fails this test
  335.     fi
  336.     $SED -n -e '
  337. s/l1_/l2_/
  338. t ok
  339. b
  340. :ok
  341. s/^/tested /p
  342. ' lines1 lines2
  343. # SunOS sed behaves differently here.  Clarification needed.
  344. #    mark '5.3' ; $SED -n -e '
  345. #5,8b inside
  346. #1,5 {
  347. #    s/^/^/p
  348. #    :inside
  349. #    s/$/$/p
  350. #}
  351. #' lines1
  352. # Check that t clears the substitution done flag
  353.     mark '5.4' ; $SED -n -e '
  354. 1,8s/^/^/
  355. t l1
  356. :l1
  357. t l2
  358. s/$/$/p
  359. b
  360. :l2
  361. s/^/ERROR/
  362. ' lines1
  363. # Check that reading a line clears the substitution done flag
  364.     mark '5.5'
  365.     if [ $BSD -eq 1 ] ; then
  366.         echo BSD sed fails this test
  367.     fi
  368.     $SED -n -e '
  369. t l2
  370. 1,8s/^/^/p
  371. 2,7N
  372. b
  373. :l2
  374. s/^/ERROR/p
  375. ' lines1
  376.     mark '5.6' ; $SED 5q lines1
  377.     mark '5.7' ; $SED -e '
  378. 5i\
  379. hello
  380. 5q' lines1
  381. }
  382.  
  383. test_pattern()
  384. {
  385. echo Pattern space commands
  386. # Check that the pattern space is deleted
  387.     mark '6.1' ; $SED -n -e '
  388. c\
  389. changed
  390. p
  391. ' lines1
  392.     mark '6.2' ; $SED -n -e '
  393. 4d
  394. p
  395. ' lines1
  396. # SunOS sed refused to print here
  397. #    mark '6.3' ; $SED -e '
  398. #N
  399. #N
  400. #N
  401. #D
  402. #P
  403. #4p
  404. #' lines1
  405.     mark '6.4' ; $SED -e '
  406. 2h
  407. 3H
  408. 4g
  409. 5G
  410. 6x
  411. 6p
  412. 6x
  413. 6p
  414. ' lines1
  415.     mark '6.5' ; $SED -e '4n' lines1
  416.     mark '6.6' ; $SED -n -e '4n' lines1
  417. }
  418.  
  419. test_print()
  420. {
  421.     echo Testing print and file routines
  422.     awk 'END {for (i = 1; i < 256; i++) printf("%c", i);print "\n"}' \
  423.         </dev/null >lines3
  424.     # GNU and SunOS sed behave differently here
  425.     mark '7.1'
  426.     if [ $BSD -eq 1 ] ; then
  427.         echo 'BSD sed drops core on this one; TEST SKIPPED'
  428.     else
  429.         $SED -n l lines3
  430.     fi
  431.     mark '7.2' ; $SED -e '/l2_/=' lines1 lines2
  432.     rm -f lines4
  433.     mark '7.3' ; $SED -e '3,12w lines4' lines1
  434.     echo w results
  435.     cat lines4
  436.     mark '7.4' ; $SED -e '4r lines2' lines1
  437.     mark '7.5' ; $SED -e '5r /dev/dds' lines1
  438.     mark '7.6' ; $SED -e '6r /dev/null' lines1
  439.     mark '7.7'
  440.     if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then
  441.         echo BSD, GNU and SunOS cannot pass this one
  442.     else
  443.         sed '200q' $DICT | sed 's$.*$s/^/&/w tmpdir/&$' >script1
  444.         rm -rf tmpdir
  445.         mkdir tmpdir
  446.         $SED -f script1 lines1
  447.         cat tmpdir/*
  448.         rm -rf tmpdir
  449.     fi
  450.     mark '7.8'
  451.     if [ $BSD -eq 1 ] ; then
  452.         echo BSD sed cannot pass 7.7
  453.     else
  454.         echo line1 > lines3
  455.         echo "" >> lines3
  456.         $SED -n -e '$p' lines3 /dev/null
  457.     fi
  458.         
  459. }
  460.  
  461. test_subst()
  462. {
  463.     echo Testing substitution commands
  464.     mark '8.1' ; $SED -e 's/./X/g' lines1
  465.     mark '8.2' ; $SED -e 's,.,X,g' lines1
  466. # GNU and SunOS sed thinks we are escaping . as wildcard, not as separator
  467. #    mark '8.3' ; $SED -e 's.\..X.g' lines1
  468. # POSIX does not say that this should work
  469. #    mark '8.4' ; $SED -e 's/[/]/Q/' lines1
  470.     mark '8.4' ; $SED -e 's/[\/]/Q/' lines1
  471.     mark '8.5' ; $SED -e 's_\__X_' lines1
  472.     mark '8.6' ; $SED -e 's/./(&)/g' lines1
  473.     mark '8.7' ; $SED -e 's/./(\&)/g' lines1
  474.     mark '8.8' ; $SED -e 's/\(.\)\(.\)\(.\)/x\3x\2x\1/g' lines1
  475.     mark '8.9' ; $SED -e 's/_/u0\
  476. u1\
  477. u2/g' lines1
  478.     mark '8.10'
  479.     if [ $BSD -eq 1 -o $GNU -eq 1 ] ; then
  480.         echo 'BSD/GNU sed do not understand digit flags on s commands'
  481.     fi
  482.     $SED -e 's/./X/4' lines1
  483.     rm -f lines4
  484.     mark '8.11' ; $SED -e 's/1/X/w lines4' lines1
  485.     echo s wfile results
  486.     cat lines4
  487.     mark '8.12' ; $SED -e 's/[123]/X/g' lines1
  488.     mark '8.13' ; $SED -e 'y/0123456789/9876543210/' lines1
  489.     mark '8.14' ; 
  490.     if [ $BSD -eq 1 -o $GNU -eq 1 -o $SUN -eq 1 ] ; then
  491.         echo BSD/GNU/SUN sed fail this test
  492.     else
  493.         $SED -e 'y10\123456789198765432\101' lines1
  494.     fi
  495.     mark '8.15' ; $SED -e '1N;2y/\n/X/' lines1
  496.     mark '8.16'
  497.     if [ $BSD -eq 1 ] ; then
  498.         echo 'BSD sed does not handle branch defined REs'
  499.     else
  500.         echo 'eeefff' | $SED -e 'p' -e 's/e/X/p' -e ':x' \
  501.             -e 's//Y/p' -e '/f/bx'
  502.     fi
  503. }
  504.  
  505. test_error()
  506. {
  507.     exec 0>&3 4>&1 5>&2
  508.     exec 0</dev/null
  509.     exec 2>&1
  510.     set -x
  511.     $TEST -x && exit 1
  512.     $TEST -f && exit 1
  513.     $TEST -e && exit 1
  514.     $TEST -f /dev/dds && exit 1
  515.     $TEST p /dev/dds && exit 1
  516.     $TEST -f /bin/sh && exit 1
  517.     $TEST '{' && exit 1
  518.     $TEST '{' && exit 1
  519.     $TEST '/hello/' && exit 1
  520.     $TEST '1,/hello/' && exit 1
  521.     $TEST -e '-5p' && exit 1
  522.     $TEST '/jj' && exit 1
  523.     $TEST 'a hello' && exit 1
  524.     $TEST 'a \ hello' && exit 1
  525.     $TEST 'b foo' && exit 1
  526.     $TEST 'd hello' && exit 1
  527.     $TEST 's/aa' && exit 1
  528.     $TEST 's/aa/' && exit 1
  529.     $TEST 's/a/b' && exit 1
  530.     $TEST 's/a/b/c/d' && exit 1
  531.     $TEST 's/a/b/ 1 2' && exit 1
  532.     $TEST 's/a/b/ 1 g' && exit 1
  533.     $TEST 's/a/b/w' && exit 1
  534.     $TEST 'y/aa' && exit 1
  535.     $TEST 'y/aa/b/' && exit 1
  536.     $TEST 'y/aa/' && exit 1
  537.     $TEST 'y/a/b' && exit 1
  538.     $TEST 'y/a/b/c/d' && exit 1
  539.     $TEST '!' && exit 1
  540.     $TEST supercalifrangolisticexprialidociussupercalifrangolisticexcius
  541.     set +x
  542.     exec 0>&3 1>&4 2>&5
  543. }
  544.  
  545. main
  546.