!verbose 2 Name "NSIS LogicLib Example" OutFile "LogicLib.exe" ShowInstDetails show RequestExecutionLevel user !include "LogicLib.nsh" ;!undef LOGICLIB_VERBOSITY ;!define LOGICLIB_VERBOSITY 4 ; For debugging - watch what logiclib does with your code! Page components "" "" ComponentsLeave Page instfiles Section /o "Run tests" TESTS ; kinds of if other than "value1 comparison value2" ClearErrors FindFirst $R1 $R2 "$PROGRAMFILES\*" ${Unless} ${Errors} ${Do} ${Select} $R2 ${Case2} "." ".." ; Do nothing ${CaseElse} DetailPrint "Found $PROGRAMFILES\$R2" ${EndSelect} FindNext $R1 $R2 ${LoopUntil} ${Errors} FindClose $R1 ${EndUnless} ${If} ${FileExists} "${__FILE__}" DetailPrint 'Source file "${__FILE__}" still exists' ${Else} DetailPrint 'Source file "${__FILE__}" has gone' ${EndIf} ; if..endif StrCpy $R1 1 StrCpy $R2 "" ${If} $R1 = 1 StrCpy $R2 $R2A ${EndIf} ${If} $R1 = 2 StrCpy $R2 $R2B ${EndIf} ${If} $R1 < 2 StrCpy $R2 $R2C ${EndIf} ${If} $R1 < -2 StrCpy $R2 $R2D ${EndIf} ${If} $R1 > 2 StrCpy $R2 $R2E ${EndIf} ${If} $R1 > -2 StrCpy $R2 $R2F ${EndIf} ${If} $R1 <> 1 StrCpy $R2 $R2G ${EndIf} ${If} $R1 <> 2 StrCpy $R2 $R2H ${EndIf} ${If} $R1 >= 2 StrCpy $R2 $R2I ${EndIf} ${If} $R1 >= -2 StrCpy $R2 $R2J ${EndIf} ${If} $R1 <= 2 StrCpy $R2 $R2K ${EndIf} ${If} $R1 <= -2 StrCpy $R2 $R2L ${EndIf} ${If} $R2 == "ACFHJK" DetailPrint "PASSED If..EndIf test" ${Else} DetailPrint "FAILED If..EndIf test" ${EndIf} ; if..elseif..else..endif StrCpy $R1 A StrCpy $R2 "" ${If} $R1 == A StrCpy $R2 $R2A ${ElseIf} $R1 == B StrCpy $R2 $R2B ${ElseUnless} $R1 != C StrCpy $R2 $R2C ${Else} StrCpy $R2 $R2D ${EndIf} ${If} $R1 == D StrCpy $R2 $R2D ${ElseIf} $R1 == A StrCpy $R2 $R2A ${ElseUnless} $R1 != B StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2C ${EndIf} ${If} $R1 == C StrCpy $R2 $R2C ${ElseIf} $R1 == D StrCpy $R2 $R2D ${ElseUnless} $R1 != A StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} $R1 == B StrCpy $R2 $R2B ${ElseIf} $R1 == C StrCpy $R2 $R2C ${ElseUnless} $R1 != D StrCpy $R2 $R2D ${Else} StrCpy $R2 $R2A ${EndIf} ${If} $R2 == "$R1$R1$R1$R1" DetailPrint "PASSED If..ElseIf..Else..EndIf test" ${Else} DetailPrint "FAILED If..ElseIf..Else..EndIf test" ${EndIf} ; if..andif..orif..endif StrCpy $R2 "" ${If} 1 = 1 ${AndIf} 2 = 2 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 3 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 2 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 3 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 2 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 2 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 3 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 2 ${OrIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 3 ${OrIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 2 ${OrIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 3 ${OrIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 2 ${OrIf} 3 = 4 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${AndIf} 2 = 3 ${OrIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 2 ${OrIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${AndIf} 2 = 3 ${OrIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 2 ${AndIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 3 ${AndIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 2 ${AndIf} 3 = 3 StrCpy $R2 $R2A ${Else} StrCpy $R2 $R2B ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 3 ${AndIf} 3 = 3 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 2 ${AndIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 1 ${OrIf} 2 = 3 ${AndIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 2 ${AndIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} 1 = 2 ${OrIf} 2 = 3 ${AndIf} 3 = 4 StrCpy $R2 $R2B ${Else} StrCpy $R2 $R2A ${EndIf} ${If} $R2 == "AAAAAAAAAAAAAAAAAAAAAAAA" DetailPrint "PASSED If..AndIf..OrIf..Else..EndIf test" ${Else} DetailPrint "FAILED If..AndIf..OrIf..Else..EndIf test" ${EndIf} ; ifthen..|..| StrCpy $R1 1 StrCpy $R2 "" ${IfThen} $R1 = 1 ${|} StrCpy $R2 $R2A ${|} ${IfThen} $R1 = 2 ${|} StrCpy $R2 $R2B ${|} ${IfNotThen} $R1 = 1 ${|} StrCpy $R2 $R2C ${|} ${IfNotThen} $R1 = 2 ${|} StrCpy $R2 $R2D ${|} ${If} $R2 == "AD" DetailPrint "PASSED IfThen test" ${Else} DetailPrint "FAILED IfThen test" ${EndIf} ; ifcmd..||..| and if/unless cmd StrCpy $R2 "" ${IfCmd} MessageBox MB_YESNO "Please click Yes" IDYES ${||} StrCpy $R2 $R2A ${|} ${Unless} ${Cmd} `MessageBox MB_YESNO|MB_DEFBUTTON2 "Please click No" IDYES` StrCpy $R2 $R2B ${EndUnless} ${If} $R2 == "AB" DetailPrint "PASSED IfCmd/If Cmd test" ${Else} DetailPrint "FAILED IfCmd/If Cmd test" ${EndIf} ; select..case..case2..case3..case4..case5..caseelse..endselect StrCpy $R1 1 StrCpy $R2 "" ${Select} $R1 ${Case} "1" StrCpy $R2 $R2A ${Case} "2" StrCpy $R2 $R2B ${Case2} "3" "4" StrCpy $R2 $R2C ${CaseElse} StrCpy $R2 $R2D ${EndSelect} ${Select} $R1 ${Case} "2" StrCpy $R2 $R2A ${Case} "3" StrCpy $R2 $R2B ${Case2} "4" "5" StrCpy $R2 $R2C ${CaseElse} StrCpy $R2 $R2D ${EndSelect} ${Select} $R1 ${Case} "3" StrCpy $R2 $R2A ${Case} "4" StrCpy $R2 $R2B ${Case2} "5" "1" StrCpy $R2 $R2C ${CaseElse} StrCpy $R2 $R2D ${EndSelect} ${Select} $R1 ${Case} "4" StrCpy $R2 $R2A ${Case} "5" StrCpy $R2 $R2B ${Case2} "1" "2" StrCpy $R2 $R2C ${CaseElse} StrCpy $R2 $R2D ${EndSelect} ${If} $R2 == "ADCC" DetailPrint "PASSED Select..Case*..EndSelect test" ${Else} DetailPrint "FAILED Select..Case*..EndSelect test" ${EndIf} ; switch..case..caseelse..endswitch StrCpy $R2 "" ${For} $R1 1 10 ${Switch} $R1 ${Case} 3 StrCpy $R2 $R2A ${Case} 4 StrCpy $R2 $R2B ${Break} ${Case} 5 StrCpy $R2 $R2C ${EndSwitch} ${Switch} $R1 ${Case} 1 StrCpy $R2 $R2D ${Default} StrCpy $R2 $R2E ${Break} ${Case} 2 StrCpy $R2 $R2F ${EndSwitch} ${Switch} $R1 ${Case} 6 ${Case} 7 StrCpy $R2 $R2G ${If} $R1 = 6 ${Case} 8 StrCpy $R2 $R2H ${Switch} $R1 ${Case} 6 StrCpy $R2 $R2I ${Break} ${Case} 8 StrCpy $R2 $R2J ${EndSwitch} ${EndIf} StrCpy $R2 $R2K ${Break} ${Default} StrCpy $R2 $R2L ${Case} 9 StrCpy $R2 $R2M ${EndSwitch} ${Next} ${If} $R2 == "DELMFLMABELMBELMCELMEGHIKEGKEHJKEMELM" DetailPrint "PASSED Switch..Case*..EndSwitch test" ${Else} DetailPrint "FAILED Switch..Case*..EndSwitch test" ${EndIf} ; for[each]..exitfor..next StrCpy $R2 "" ${For} $R1 1 5 StrCpy $R2 $R2$R1 ${Next} ${ForEach} $R1 10 1 - 1 StrCpy $R2 $R2$R1 ${Next} ${For} $R1 1 0 StrCpy $R2 $R2$R1 ${Next} ${If} $R2 == "1234510987654321" DetailPrint "PASSED For[Each]..Next test" ${Else} DetailPrint "FAILED For[Each]..Next test" ${EndIf} ; do..loop StrCpy $R1 0 Call DoLoop ${If} $R1 == 5 DetailPrint "PASSED Do..Loop test" ${Else} DetailPrint "FAILED Do..Loop test" ${EndIf} ; do..exitdo..loop StrCpy $R1 0 StrCpy $R2 "" ${Do} StrCpy $R2 $R2$R1 IntOp $R1 $R1 + 1 ${If} $R1 > 10 ${ExitDo} ${EndIf} ${Loop} ${If} $R2 == "012345678910" DetailPrint "PASSED Do..ExitDo..Loop test" ${Else} DetailPrint "FAILED Do..ExitDo..Loop test" ${EndIf} ; do..exitdo..loopuntil StrCpy $R1 0 StrCpy $R2 "" ${Do} StrCpy $R2 $R2$R1 IntOp $R1 $R1 + 1 ${LoopUntil} $R1 >= 5 ${If} $R2 == "01234" DetailPrint "PASSED Do..ExitDo..LoopUntil test" ${Else} DetailPrint "FAILED Do..ExitDo..LoopUntil test" ${EndIf} ; dountil..exitdo..loop StrCpy $R1 0 StrCpy $R2 "" ${DoUntil} $R1 >= 5 StrCpy $R2 $R2$R1 IntOp $R1 $R1 + 1 ${Loop} ${If} $R2 == "01234" DetailPrint "PASSED DoUntil..ExitDo..Loop test" ${Else} DetailPrint "FAILED DoUntil..ExitDo..Loop test" ${EndIf} ; nested do test StrCpy $R1 0 StrCpy $R2 0 StrCpy $R3 "" ${Do} StrCpy $R3 $R3$R1$R2 IntOp $R1 $R1 + 1 ${If} $R1 > 5 ${ExitDo} ${EndIf} StrCpy $R2 0 ${Do} StrCpy $R3 $R3$R1$R2 IntOp $R2 $R2 + 1 ${If} $R2 >= 5 ${ExitDo} ${EndIf} ${Loop} ${Loop} ${If} $R3 == "00101112131415202122232425303132333435404142434445505152535455" DetailPrint "PASSED nested Do test" ${Else} DetailPrint "FAILED nested Do test" ${EndIf} ; while..exitwhile..endwhile (exact replica of dowhile..enddo} StrCpy $R1 0 StrCpy $R2 "" ${While} $R1 < 5 StrCpy $R2 $R2$R1 IntOp $R1 $R1 + 1 ${EndWhile} ${If} $R2 == "01234" DetailPrint "PASSED While..ExitWhile..EndWhile test" ${Else} DetailPrint "FAILED While..ExitWhile..EndWhile test" ${EndIf} ; Unsigned integer tests StrCpy $R2 "" ${If} -1 < 1 StrCpy $R2 $R2A ${EndIf} ${If} -1 U< 1 StrCpy $R2 $R2B ${EndIf} ${If} 0xFFFFFFFF > 1 StrCpy $R2 $R2C ${EndIf} ${If} 0xFFFFFFFF U> 1 StrCpy $R2 $R2D ${EndIf} ${If} $R2 == "AD" DetailPrint "PASSED unsigned integer test" ${Else} DetailPrint "FAILED unsigned integer test" ${EndIf} ; 64-bit integer tests (uses System.dll) StrCpy $R2 "" ${If} 0x100000000 L= 4294967296 StrCpy $R2 $R2A ${EndIf} ${If} 0x100000000 L< 0x200000000 StrCpy $R2 $R2B ${EndIf} ${If} 0x500000000 L>= 0x500000000 StrCpy $R2 $R2C ${EndIf} ${If} $R2 == "ABC" DetailPrint "PASSED 64-bit integer test" ${Else} DetailPrint "FAILED 64-bit integer test" ${EndIf} ; Extra string tests (uses System.dll) StrCpy $R2 "" ${If} "A" S< "B" StrCpy $R2 $R2A ${EndIf} ${If} "b" S> "A" StrCpy $R2 $R2B ${EndIf} ${If} "a" S<= "B" StrCpy $R2 $R2C ${EndIf} ${If} "B" S< "B" StrCpy $R2 $R2D ${EndIf} ${If} "A" S== "A" StrCpy $R2 $R2E ${EndIf} ${If} "A" S== "a" StrCpy $R2 $R2F ${EndIf} ${If} "A" S!= "a" StrCpy $R2 $R2G ${EndIf} ${If} $R2 == "ABCEG" DetailPrint "PASSED extra string test" ${Else} DetailPrint "FAILED extra string test" ${EndIf} SectionEnd Function ComponentsLeave ; Section flags tests (requires sections.nsh be included) ${Unless} ${SectionIsSelected} ${TESTS} MessageBox MB_OK "Please select the component" Abort ${EndIf} FunctionEnd Function DoLoop ${Do} IntOp $R1 $R1 + 1 ${If} $R1 == 5 Return ${EndIf} ${Loop} FunctionEnd !verbose 3