#!/usr/bin/env ksh # $Id: ouereg.sh,v 1.8 2009/10/10 20:05:46 ksb Exp $ # regression test for oue, never said it'd be easy. : ${oue_path:=oue} : ${TMPDIR:=/tmp} while T1=$TMPDIR/oAt$$,e$((RANDOM%1000)) ; do [ -f $T1 ] || break done while T2=$TMPDIR/oAt$$,o$((RANDOM%1000)) ; do [ -f $T2 ] || break done D1=$T1.db D2=$T2.db export T1 T2 D1 D2 trap 'rm -f $T1 $T2 $D1 $D2' EXIT cat <<\! >$T1 a b ! cat <<\! >$T2 b c c ! # overhead checks, all tools I code must honor these. $oue_path -V >/dev/null || exit 10 $oue_path -h >/dev/null || exit 11 $oue_path -H >/dev/null || exit 12 # trivial case tests, with -span and -k [ _one = _"`(echo one) |$oue_path`" ] || exit 20 [ _one = _"`(echo one; echo one; echo one; echo one) |$oue_path`" ] || exit 20 [ _"one two" = _"`(echo one; echo two; echo one; echo two) |$oue_path`" ] || exit 20 [ _"one two" = _"`(echo one; echo two; echo one; echo two) |$oue_path -2`" ] || exit 20 [ _"one" = _"`(echo one; echo two; echo one; echo two) |$oue_path -2 -k %1`" ] || exit 20 [ _"two" = _"`(echo one; echo two; echo one; echo two) |$oue_path -2 -k %2`" ] || exit 20 [ 2 -eq `$oue_path $T1 |wc -l` ] || exit 22 [ 2 -eq `$oue_path $T2 |wc -l` ] || exit 22 [ 3 -eq `$oue_path $T1 $T2 |wc -l` ] || exit 22 #a c change the escape character, default '%', try '+' # %% and %0 [ _"%1" = _"`echo 1 |$oue_path -a+ -R %+1`" ] || exit 25 [ _"%1" = _"`echo %1 |$oue_path -a+ -R +1`" ] || exit 25 [ _"@1" = _"`echo @1 |$oue_path -a+`" ] || exit 26 [ _"@1 @3" = _"`(echo @1 ; echo @3) |$oue_path -2 -a+`" ] || exit 27 [ _"+2" = _"`echo 2 |$oue_path -a+ -R +++1`" ] || exit 28 [ _"" = _"`echo 2 |$oue_path -a+ -R +0`" ] || exit 29 #c count unique keys and -s [ -z "`$oue_path -c $T1| egrep -v '^1 [ab]$'`" ] || exit 80 [ -z "`$oue_path -c $T2| egrep -v '^(1 b|2 c)$'`" ] || exit 80 [ -z "`$oue_path -c $T1 $T2| egrep -v '^(2 [bc]|1 a)$'`" ] || exit 80 [ _"1 a 2 b 2 c "_ = _"`$oue_path -cs $T1 $T2 |tr -s ' \n' ' '`"_ ] || exit 80 #c with -v doesn't change anything -- hard to test that it doesn't #d output only duplicate lines (-c, -v) [ -z "`$oue_path -d $T1`" ] || exit 81 [ -z "`$oue_path -d $T2| grep -v '^c$'`" ] || exit 81 [ -z "`$oue_path -d $T1 $T2| egrep -v '^[bc]$'`" ] || exit 81 [ _"a" = _"`$oue_path -d $T1 $T1 |egrep -v '^[b]$'`" ] || exit 81 #d with -v or -s [ _"b c "_ = _"`$oue_path -ds $T1 $T2 |tr -s ' \n' ' '`"_ ] || exit 82 [ _"b c "_ = _"`$oue_path -dls $T2 $T1 |tr -s ' \n' ' '`"_ ] || exit 82 [ _"a" = _"`$oue_path -dv $T1 $T2`" ] || exit 82 [ _"a" = _"`$oue_path -dlv $T1 $T2`" ] || exit 82 #D state save key values in state dbm between runs rm -f $D1 $D2 $oue_path -D $D1 /dev/null [ -f $D1 ] || exit 30 [ 2 -eq `$oue_path -D $D1 $T1 |wc -l` ] || exit 32 [ 2 -eq `$oue_path -D $D2 $T2 |wc -l` ] || exit 32 [ 1 -eq `$oue_path -D $D1 $T1 $T2 |wc -l` ] || exit 33 [ 1 -eq `$oue_path -D $D2 $T1 $T2 |wc -l` ] || exit 33 [ 0 -eq `$oue_path -D $D1 $T1 $T2 |wc -l` ] || exit 33 #c with -D, -I rm -f $D1 $D2 [ 2 -eq "`$oue_path -D $D1 -c $T1 |wc -l`" ] || exit 83 [ 0 -eq "`$oue_path -I $D1 -c $T1 |grep -v '^2' |wc -l`" ] || exit 83 [ 0 -eq "`$oue_path -I $D1 -c $T1 $T1 |grep -v '^3' |wc -l`" ] || exit 83 #d with -D, -I, and -v # t1 has no dups, t2 has "c" in it, t1+t2 has b and c as dups rm -f $D1 $D2 [ 0 -eq "`$oue_path -D $D1 -d $T1 |wc -l`" ] || exit 84 [ _c = _"`$oue_path -D $D1 -d $T2`" ] || exit 84 [ 2 -eq "`$oue_path -I $D1 -d $T1 $T2 |wc -l`" ] || exit 84 [ 1 -eq "`$oue_path -I $D1 -dv $T1 $T2 |wc -l`" ] || exit 84 #d with -c, and -v rm -f $D1 $D2 [ _"2 c" = _"`$oue_path -D $D1 -dc $T2`" ] || exit 85 [ _"1 b" = _"`$oue_path -D $D1 -vdc $T2`" ] || exit 85 [ 2 -eq "`$oue_path -I $D1 -i /dev/null| wc -l`" ] || exit 85 #I prev consult the contents of a previous state dbm first #i include previous values at startup rm -f $D1 $D2 echo z |$oue_path -D $D1 -R '' [ -f $D1 ] || exit 30 # see we don't update prev [ 2 -eq `$oue_path -I $D1 $T1 |wc -l` ] || exit 35 [ 2 -eq `$oue_path -I $D1 $T2 |wc -l` ] || exit 35 [ 1 -eq `$oue_path -I $D1 -i /dev/null |wc -l` ] || exit 35 #x and -B rm -f $D1 $D2 $oue_path -cD $D1 -r "%f:%n:%t" $T2 >/dev/null # 1 b, 2 c [ -z "`$oue_path -iI $D1 -B "%v from %k" /dev/null |egrep -v '^[^:]*:([0-9]*):\1 from [abc]$'`" ] || exit 86 # 1 b + 1 in t1 outputs 2 b, inverse is 1 a [ _"2 b" = _"`$oue_path -dc -I $D1 -x '%[v:3]' $T1`" ] || exit 86 [ _"1 a" = _"`$oue_path -dcv -I $D1 -x '%[v:3]' $T1`" ] || exit 86 #v invert the filter to only include elements from prev # also to see that we consult prev, add $T2 (c and b) to the z in it, count them rm -f $D1 $D2 $oue_path -D $D1 -R '' $T2 [ _'. . '_ = "_`$oue_path -I $D1 -iR. /dev/null| tr -s '\n' ' '`_" ] || exit 36 # only 'a' is unique below (from $T1) 'b', 'c', and 'z' are in $D1 [ 1 -eq `$oue_path -I $D1 $T1 |wc -l` ] || exit 37 # a [ 0 -eq `$oue_path -I $D1 $T2 |wc -l` ] || exit 37 # [ 1 -eq `$oue_path -I $D1 $T1 $T2 |wc -l` ] || exit 37 # a [ 1 -eq `$oue_path -vI $D1 $T1 |wc -l` ] || exit 38 # b [ 2 -eq `$oue_path -vI $D1 $T2 |wc -l` ] || exit 39 # b c [ 2 -eq `$oue_path -vI $D1 $T1 $T2 |wc -l` ] || exit 39 # b c rm -f $D1 $D2 #R report report on key/value pairs in each dbm, word and the empty string [ 0 -eq `$oue_path -R a $T1 |grep plus |wc -l` ] || exit 26 [ 2 -eq `$oue_path -R plus $T1 |grep plus |wc -l` ] || exit 26 [ 0 -eq `$oue_path -R '' $T1 |wc -l` ] || exit 27 #r memory dicer value-map for each key in our state file, both %m and %v # should be the previous memory under -I ... -i $oue_path -D $D1 -r oO -R '' $T2 [ _'oO oO '_ = "_`$oue_path -I $D1 -iR "%m" /dev/null| tr -s '\n' ' '`_" ] || exit 40 [ _'oO oO '_ = "_`$oue_path -I $D1 -iR "%v" /dev/null| tr -s '\n' ' '`_" ] || exit 41 # under -vI we get more action. [ _'oO nN oO nN '_ = "_`$oue_path -vI $D1 -r "nN" -R "%v %m" $D1 $T2| tr -s '\n' ' '`_" ] || exit 42 rm -f $D1 $D2 #z read find-print0 output as input files [ _"thing!", = "_`find $T1 $T2 -print0 |oue -z -2 -R thing |tr '\000' '!'`," ] || exit 50 # #p pad complete short records with this token # %* The element's lines joined with spaces. # %@ The element's lines joined with newlines (viz. '\n'). [ _"$T1 miss!", = "_`find $T1 -print0 |oue -p miss -z -2 -R '%*' |tr '\000' '!'`," ] || exit 50 [ _"$T1 miss!", = "_`find $T1 -print0 |oue -p miss -z -2 -R '%@' |tr '\000' '!'`," ] || exit 51 #%n The line number from that file. [ _'1.c' = _`$oue_path -3 -k "%n.%3" $T2` ] || exit 54 #%$ The last line in the element, as in xapply. [ _'1.c' = _`$oue_path -3 -k '%n.%\$' $T2` ] || exit 55 #%f The file which provided the element. The expander %i represents #the position of that file on the command-line (1, 2, 3, ... N). [ _"$T2,1" = _`$oue_path -3 -k "%f,%i" $T2` ] || exit 56 [ _'1.a 1.b 2.c'_ = _"`$oue_path -2 -k '%n.%1' $T1 $T2`_" ] || exit 57 #%u The count of the unique elements discovered so far. [ _"b,0,c c,1,ksb" = _"`$oue_path -2 -p ksb -k "%1,%u,%2" $T2`" ] || exit 58 # Check counting markup rm -f $D1 $D2 [ _"1.b 2.c " = _"`$oue_path -c -D $D1 -r "%c" -R "%m.%k" $T2 |sort -n |tr -s '\n ' ' '`" ] || exit 58 [ _"1.a 1.b " = _"`$oue_path -c -I $D1 -r "%c" -R "%m.%k" -x "%v" $T1 |sort -n |tr -s '\n ' ' '`" ] || exit 58 [ _"1.a 2.b " = _"`$oue_path -c -I $D1 -r "%t" -R "%m.%k" -x "%v" $T1 |sort -n |tr -s '\n ' ' '`" ] || exit 58 [ _"0.a 1.b " = _"`$oue_path -c -I $D1 -r "%o" -R "%m.%k" -x "%v" $T1 |sort -n |tr -s '\n ' ' '`" ] || exit 58 [ _"0.a 10.b " = _"`$oue_path -c -I $D1 -r "%o" -R "%m.%k" -x "%v0" $T1 |sort -n |tr -s '\n ' ' '`" ] || exit 58 [ _"1.b " = _"`$oue_path -d -I $D1 -r "%o" -R "%m.%k" -x "%[v.1]" $T1 |sort -n |tr -s '\n ' ' '`" ] || exit 58 # under -d we have to cross 2, not jump over it (10+1 != 2) -- ksb [ _"" = _"`$oue_path -d -I $D1 -r "%o" -R "%m.%k" -x "%[v.1]0" $T1 |sort -n |tr -s '\n ' ' '`" ] || exit 58 rm -f $D1 $D2 #e every update #f first update [ _2.c = _"`$oue_path -e "%n" -R "%e.%k" $T2 |grep c`" ] || exit 60 [ _2.c = _"`$oue_path -f "%n" -R "%e.%k" $T2 |grep c`" ] || exit 60 [ _@.c = _"`$oue_path -f "@" -R "%e.%k" $T2 |grep c`" ] || exit 60 [ _!@.c = _"`$oue_path -f "@" -e "!%p" -R "%e.%k" $T2 |grep c`" ] || exit 60 [ _!@.c = _"`echo c |$oue_path -f "@" -e "!%p" -R "%e.%k" - $T2 |grep c`" ] || exit 60 #l last element instance (-c always inplies -l) [ _!!!@.c = _"`echo c |$oue_path -lf "@" -e "!%p" -R "%e.%k" - $T2 |grep c`" ] || exit 61 [ _2.c = _"`$oue_path -d -R '%n.%k' $T2`" ] || exit 61 [ _3.c = _"`$oue_path -ld -R '%n.%k' $T2`" ] || exit 61 [ _-:1.c = _"`echo c |$oue_path -r '%f:%n.%k' -R "%m" - $T2 |grep c`" ] || exit 62 [ _$T2:3.c = _"`echo c |$oue_path -l -r '%f:%n.%k' -R "%m" - $T2 |grep c`" ] || exit 62 [ _-:1.c = _"`echo c |$oue_path -d -r '%f:%n.%k' -R "%m" - $T2`" ] || exit 62 [ _$T2:2.c = _"`echo c |$oue_path -d -r '%f:%n.%k' -R "%m" $T2 -`" ] || exit 62 [ _$T2:3.c = _"`echo c |$oue_path -ld -r '%f:%n.%k' -R "%m" - $T2`" ] || exit 63 [ _-:1.c = _"`echo c |$oue_path -ld -r '%f:%n.%k' -R "%m" $T2 -`" ] || exit 63 [ _3.c = _"`$oue_path -le "%n" -R "%e.%k" $T2 |grep c`" ] || exit 59 [ _2.c = _"`$oue_path -lf "%n" -R "%e.%k" $T2 |grep c`" ] || exit 59 [ _!!@.c = _"`$oue_path -l -f "@" -e "!%p" -R "%e.%k" $T2 |grep c`" ] || exit 59 #s stable order (under -c, -d, -l) [ _"1 a 2 b 2 c " = _"`$oue_path -cs $T1 $T2 |tr -s '\n ' ' '`" ] || exit 18 [ _"b c " = _"`$oue_path -ds $T1 $T2 |tr -s '\n ' ' '`" ] || exit 18 [ _"b c " = _"`echo c |$oue_path -d - $T1 $T2 |tr -s '\n ' ' '`" ] || exit 19 [ _"c b " = _"`echo c |$oue_path -ds - $T1 $T2 |tr -s '\n ' ' '`" ] || exit 19 #b length specify a bigger dicer buffer size (default "10k", try 45k + 1block) # (note that the code rounds up, so you can't get an unaligned or odd length) [ 10240 = `$oue_path -V |sed -n -e 's/.*buffer length \([0-9]*\)$/\1/p'` ] || exit 34 [ 46592 = `$oue_path -b 45k+1b -V |sed -n -e 's/.*buffer length \([0-9]*\)$/\1/p'` ] || exit 34 # not tested (yet or ever) #N never lock either dbm file for updates (I don't know how) # check for the embeded NUL bug in 2.17 [ _zero! = _"`echo 'zero' |oue |tr '\000' '!'`" ] && exit 101 exit 0