;_____________________________________________________________________________
;
;                          Word Functions Test
;_____________________________________________________________________________
;
; 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)

Name "Word Functions Test"
OutFile "WordFuncTest.exe"
Caption "$(^Name)"
ShowInstDetails show
XPStyle on

Var FUNCTION
Var OUT

!include "WordFunc.nsh"

!insertmacro WordFind
!insertmacro WordFind2X
!insertmacro WordFind3X
!insertmacro WordReplace
!insertmacro WordAdd
!insertmacro WordInsert
!insertmacro StrFilter
!insertmacro VersionCompare
!insertmacro VersionConvert

!insertmacro un.WordFind
!insertmacro un.WordFind2X
!insertmacro un.WordFind3X
!insertmacro un.WordReplace
!insertmacro un.WordAdd
!insertmacro un.WordInsert
!insertmacro un.StrFilter
!insertmacro un.VersionCompare
!insertmacro un.VersionConvert



;############### INSTALL ###############

!define StackVerificationStart `!insertmacro StackVerificationStart`
!macro StackVerificationStart _FUNCTION
	StrCpy $FUNCTION ${_FUNCTION}
	Call StackVerificationStart
!macroend

!define StackVerificationEnd `!insertmacro StackVerificationEnd`
!macro StackVerificationEnd
	Call StackVerificationEnd
!macroend

Function StackVerificationStart
	StrCpy $0 !0
	StrCpy $1 !1
	StrCpy $2 !2
	StrCpy $3 !3
	StrCpy $4 !4
	StrCpy $5 !5
	StrCpy $6 !6
	StrCpy $7 !7
	StrCpy $8 !8
	StrCpy $9 !9
	StrCpy $R0 !R0
	StrCpy $R1 !R1
	StrCpy $R2 !R2
	StrCpy $R3 !R3
	StrCpy $R4 !R4
	StrCpy $R5 !R5
	StrCpy $R6 !R6
	StrCpy $R7 !R7
	StrCpy $R8 !R8
	StrCpy $R9 !R9
FunctionEnd

Function StackVerificationEnd
	IfErrors +3
	DetailPrint 'PASSED $FUNCTION no errors'
	goto +2
	DetailPrint 'FAILED   $FUNCTION error'

	StrCmp $0 '!0' 0 error
	StrCmp $1 '!1' 0 error
	StrCmp $2 '!2' 0 error
	StrCmp $3 '!3' 0 error
	StrCmp $4 '!4' 0 error
	StrCmp $5 '!5' 0 error
	StrCmp $6 '!6' 0 error
	StrCmp $7 '!7' 0 error
	StrCmp $8 '!8' 0 error
	StrCmp $9 '!9' 0 error
	StrCmp $R0 '!R0' 0 error
	StrCmp $R1 '!R1' 0 error
	StrCmp $R2 '!R2' 0 error
	StrCmp $R3 '!R3' 0 error
	StrCmp $R4 '!R4' 0 error
	StrCmp $R5 '!R5' 0 error
	StrCmp $R6 '!R6' 0 error
	StrCmp $R7 '!R7' 0 error
	StrCmp $R8 '!R8' 0 error
	StrCmp $R9 '!R9' 0 error
	DetailPrint 'PASSED $FUNCTION stack'
	goto end

	error:
	DetailPrint 'FAILED   $FUNCTION stack'
;	MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2
;	quit

	end:
FunctionEnd



Section WordFind
	${StackVerificationStart} WordFind

	${WordFind} '||io.sys|||Program Files|||WINDOWS' '||' '-02' $OUT
	StrCmp $OUT '|Program Files' 0 error

	${WordFind} '||io.sys||||Program Files||||WINDOWS' '||' '-2' $OUT
	StrCmp $OUT 'Program Files' 0 error

	${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '-2}' $OUT
	StrCmp $OUT '|logo.sys|||WINDOWS' 0 error

	${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '#' $OUT
	StrCmp $OUT '3' 0 error

	${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '*' $OUT
	StrCmp $OUT '2' 0 error

	${WordFind} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT
	StrCmp $OUT '2' 0 error

	${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2}}' $OUT
	StrCmp $OUT '|||WINDOWS' 0 error

	${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2{}' $OUT
	StrCmp $OUT 'C:\io.sys|||WINDOWS' 0 error

	${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2*}' $OUT
	StrCmp $OUT '|logo.sys|||WINDOWS' 0 error

	${WordFind} 'C:\\Program Files\\NSIS\\NSIS.chm' '\' '-2{*' $OUT
	StrCmp $OUT 'C:\\Program Files\\NSIS' 0 error

	${WordFind} 'C:\io.sys|||Program Files|||WINDOWS|||' '||' '-1' $OUT
	StrCmp $OUT '|' 0 error

	${WordFind} '||C:\io.sys|||logo.sys|||WINDOWS||' '||' '-1}' $OUT
	StrCmp $OUT '' 0 error

	${WordFind} '||C:\io.sys|||logo.sys|||WINDOWS||' '||' '+1{' $OUT
	StrCmp $OUT '' 0 error

	${WordFind} 'C:\io.sys|||logo.sys' '_' 'E+1' $OUT
	IfErrors 0 error
	StrCmp $OUT 1 0 error

	${WordFind} 'C:\io.sys|||logo.sys|||' '\' 'E+3' $OUT
	IfErrors 0 error
	StrCmp $OUT 2 0 error

	${WordFind} 'C:\io.sys|||logo.sys' '\' 'E1' $OUT
	IfErrors 0 error
	StrCmp $OUT 3 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section WordFind2X
	${StackVerificationStart} WordFind2X

	${WordFind2X} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT
	StrCmp $OUT 'logo.sys' 0 error

	${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1' $OUT
	StrCmp $OUT 'logo' 0 error

	${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{{' $OUT
	StrCmp $OUT 'C:\WINDOWS C:\io.sys C:' 0 error

	${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{}' $OUT
	StrCmp $OUT 'C:\WINDOWS C:\io.sys C:sys' 0 error

	${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{*' $OUT
	StrCmp $OUT 'C:\WINDOWS C:\io.sys C:\logo.' 0 error

	${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/logo' $OUT
	StrCmp $OUT '2' 0 error

	${WordFind2X} '||a||b||c' '||' '||' 'E+1' $OUT
	StrCmp $OUT 'a' 0 error

	${WordFind2X} '[io.sys];[C:\logo.sys]' '\' '];' 'E+1' $OUT
	IfErrors 0 error
	StrCmp $OUT 1 0 error

	${WordFind2X} '[io.sys];[C:\logo.sys]' '[' '];' 'E+2' $OUT
	IfErrors 0 error
	StrCmp $OUT 2 0 error

	${WordFind2X} '[io.sys];[C:\logo.sys]' '\' '];' 'E2' $OUT
	IfErrors 0 error
	StrCmp $OUT 3 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section WordFind3X
	${StackVerificationStart} WordFind3X

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT
	StrCmp $OUT '1.AAB' 0 error

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1' $OUT
	StrCmp $OUT '2.BAA' 0 error

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{{' $OUT
	StrCmp $OUT '[1.AAB];' 0 error

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{}' $OUT
	StrCmp $OUT '[1.AAB];[3.BBB];' 0 error

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{*' $OUT
	StrCmp $OUT '[1.AAB];[2.BAA];' 0 error

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT
	StrCmp $OUT '2' 0 error

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'XX' '];' 'E+1' $OUT
	IfErrors 0 error
	StrCmp $OUT '1' 0 error

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E+3' $OUT
	IfErrors 0 error
	StrCmp $OUT '2' 0 error

	${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E3' $OUT
	IfErrors 0 error
	StrCmp $OUT '3' 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section WordReplace
	${StackVerificationStart} WordReplace

	${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT
	StrCmp $OUT 'C:\io.sys C:\logo.bmp C:\WINDOWS' 0 error

	${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' '' '+' $OUT
	StrCmp $OUT 'C:\io. C:\logo. C:\WINDOWS' 0 error

	${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'C:\io.sys' '' '+' $OUT
	StrCmp $OUT ' C:\logo.sys C:\WINDOWS' 0 error

	${WordReplace} 'C:\io.sys      C:\logo.sys   C:\WINDOWS' ' ' ' ' '+1*' $OUT
	StrCmp $OUT 'C:\io.sys C:\logo.sys   C:\WINDOWS' 0 error

	${WordReplace} 'C:\io.sys C:\logo.sysSYSsys C:\WINDOWS' 'sys' 'bmp' '+*' $OUT
	StrCmp $OUT 'C:\io.bmp C:\logo.bmp C:\WINDOWS' 0 error

	${WordReplace} 'sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT
	StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWS|' 0 error

	${WordReplace} 'C:\io.sys C:\logo.sys' '#sys' '|sys|' 'E+1' $OUT
	IfErrors 0 error
	StrCmp $OUT '1' 0 error

	${WordReplace} 'C:\io.sys C:\logo.sys' '.sys' '|sys|' 'E+3' $OUT
	IfErrors 0 error
	StrCmp $OUT '2' 0 error

	${WordReplace} 'C:\io.sys C:\logo.sys' '.sys' '|sys|' 'E3' $OUT
	IfErrors 0 error
	StrCmp $OUT '3' 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section WordAdd
	${StackVerificationStart} WordAdd

	${WordAdd} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT
	StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error

	${WordAdd} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' '-C:\WINDOWS C:\config.sys C:\IO.SYS' $OUT
	StrCmp $OUT 'C:\logo.sys' 0 error

	${WordAdd} 'C:\io.sys' ' ' '+C:\WINDOWS C:\config.sys C:\IO.SYS' $OUT
	StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error

	${WordAdd} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' '-C:\WINDOWS' $OUT
	StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error

	${WordAdd} 'C:\io.sys C:\logo.sys' ' ' '+C:\logo.sys' $OUT
	StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error

	${WordAdd} 'C:\io.sys C:\logo.sys' ' ' 'E-' $OUT
	StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error
	IfErrors error

	${WordAdd} 'C:\io.sys C:\logo.sys' '' 'E-C:\logo.sys' $OUT
	IfErrors 0 error
	StrCmp $OUT '1' 0 error

	${WordAdd} 'C:\io.sys C:\logo.sys' '' 'EC:\logo.sys' $OUT
	IfErrors 0 error
	StrCmp $OUT '3' 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section WordInsert
	${StackVerificationStart} WordInsert

	${WordInsert} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT
	StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error

	${WordInsert} 'C:\io.sys' ' ' 'C:\WINDOWS' '+2' $OUT
	StrCmp $OUT 'C:\io.sys C:\WINDOWS' 0 error

	${WordInsert} '' ' ' 'C:\WINDOWS' '+1' $OUT
	StrCmp $OUT 'C:\WINDOWS ' 0 error

	${WordInsert} 'C:\io.sys C:\logo.sys' '' 'C:\logo.sys' 'E+1' $OUT
	IfErrors 0 error
	StrCmp $OUT '1' 0 error

	${WordInsert} 'C:\io.sys C:\logo.sys' ' ' 'C:\logo.sys' 'E+4' $OUT
	IfErrors 0 error
	StrCmp $OUT '2' 0 error

	${WordInsert} 'C:\io.sys C:\logo.sys' '' 'C:\logo.sys' 'E1' $OUT
	IfErrors 0 error
	StrCmp $OUT '3' 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section StrFilter
	${StackVerificationStart} StrFilter

	${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT
	IfErrors error
	StrCmp $OUT '123ABC 456DEF 7890|%#' 0 error

	${StrFilter} '123abc 456DEF 7890|%#' '-' 'ef' '' $OUT
	IfErrors error
	StrCmp $OUT '123abc 456dEF 7890|%#' 0 error

	${StrFilter} '123abc 456DEF 7890|%#' '2' '|%' '' $OUT
	IfErrors error
	StrCmp $OUT 'abcDEF|%' 0 error

	${StrFilter} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT
	IfErrors error
	StrCmp $OUT '123a 6F 78|%#' 0 error

	${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT
	IfErrors error
	StrCmp $OUT '123AbC4567890' 0 error

	${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT
	IfErrors error
	StrCmp $OUT '123AbC4567890' 0 error

	${StrFilter} '123abc 456DEF 7890|%#' '123' 'b' 'def' $OUT
	IfErrors 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section VersionCompare
	${StackVerificationStart} VersionCompare

	${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT
	StrCmp $OUT '1' 0 error

	${VersionCompare} '1.1.1.1' '1.1.1.10' $OUT
	StrCmp $OUT '2' 0 error

	${VersionCompare} '91.1.1.1' '101.1.1.9' $OUT
	StrCmp $OUT '2' 0 error

	${VersionCompare} '1.1.1.1' '1.1.1.1' $OUT
	StrCmp $OUT '0' 0 error

	${VersionCompare} '1.1.1.9' '1.1.1.10' $OUT
	StrCmp $OUT '2' 0 error

	${VersionCompare} '1.1.1.0' '1.1.1' $OUT
	StrCmp $OUT '0' 0 error

	${VersionCompare} '1.1.0.0' '1.1' $OUT
	StrCmp $OUT '0' 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section VersionConvert
	${StackVerificationStart} VersionConvert

	${VersionConvert} '9.0a' '' $OUT
	StrCmp $OUT '9.0.01' 0 error

	${VersionConvert} '9.0c' '' $OUT
	StrCmp $OUT '9.0.03' 0 error

	${VersionConvert} '0.15c-9m' '' $OUT
	StrCmp $OUT '0.15.03.9.13' 0 error

	${VersionConvert} '0.15c+' 'abcdefghijklmnopqrstuvwxyz+' $OUT
	StrCmp $OUT '0.15.0327' 0 error

	${VersionConvert} '0.0xa12.x.ax|.|.|x|a|.3|a.4.||5.|' '' $OUT
	StrCmp $OUT '0.0.2401.12.24.0124.24.01.3.01.4.5' 0 error

	goto +2
	error:
	SetErrors

	${StackVerificationEnd}
SectionEnd


Section WriteUninstaller
	goto +2
	WriteUninstaller '$EXEDIR\un.WordFuncTest.exe'
SectionEnd



;############### UNINSTALL ###############

Section un.Uninstall
	${un.WordFind} 'C:\io.sys C:\Program Files C:\WINDOWS' ' C:\' '-02' $OUT
	${un.WordFind2X} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT
	${un.WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT
	${un.WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT
	${un.WordAdd} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT
	${un.WordInsert} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT
	${un.StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT
	${un.VersionCompare} '1.1.1.9' '1.1.1.01' $OUT
	${un.VersionConvert} '9.0a' '' $OUT
SectionEnd