java -cp ../../zbnfjax/zbnf.jar org.vishia.zcmd.JZcmd testAll.jz.bat -t:testAll.jz.output.txt exit /B ==JZcmd== Class FileSystem = org.vishia.util.FileSystem; ##contains some nice static methods. String const scriptStringEmpty; ##Example for a script level Java instance which is able to found in the given classpath of the JRE: Obj scriptObj = new org.vishia.zcmd.JZcmdUserExample(text); String scriptString = "scriptStringFirst"; String const scriptStringConst = "scriptStringConst"; String scriptStringSet2 = "string2"; set TEST="Env-TEST"; main(){ call TestScriptVarAccess.test(); call testBatch(); <+out>TEST 2<.+n> call testErrorlevel(); <+out>TEST 3<.+n> call testOutputTextIndent(); <+out>TEST 4<.+n> call testDebugErrorMsg(); <+out>TEST 5<.+n> call testErrorToOutput(); <+out>TEST 6<.+n> call TestErrorSub.test(); <+out>TEST 7<.+n> call TestExceptionInException.method(); <+out>TEST 8<.+n> call testDataAccess(); call testMethodInvoke(); <+out>TEST 9<.+n> call testCalctime(); <+out>testCalctime<.+n> call testVariableDatapath(); <+out>testVariableDatapath<.+n> call testText(); <+out>testText<.+n> //call testDebug(); //call TestResult.exec(); //call TestCmdWindows.test(); //call testFile(); //call testStringBuffer(); //call testNumeric(); //call testIf(); //call testJavaNew(); //call testContainer(); //call testEnv(); //call TestChangeDir.exec(); //call TestThread.exec(); //call testIpset(); } class TestScriptVarAccess { sub test() { <+> ==testScriptVarAccess()== A scriptvariable is copied locally, changes are effective only locally. But if jzcmd.scriptVariables().scriptString is set, it is effective in the script: <.+> <+:n>Text in a script variable: scriptString = <&scriptString><.+> scriptString = "new text"; ##this has only an effect inside this subroutine: <+:n>Changed: scriptString = <&scriptString><.+> if(scriptString != "new text"){ <+:n>!!!ERROR TestScriptVarAccess 1 !!! <.+> } call otherMethod(cmp = "scriptStringFirst"); ##to check the scriptvariable jzcmd.scriptVariables().scriptString = "changed on script level"; call otherMethod(cmp = "changed on script level"); ##to check the scriptvariable <+><.+n> } sub otherMethod(String cmp) { <+:n>In other method: scriptString = <&scriptString><.+> if(scriptString != cmp){ <+:n>!!!ERROR TestScriptVarAccess <&cmp>!!!<.+n> } } } sub testBatch(){ <+> ==testBatch()== This example creates an batchfile and executes it then. It works for MS-Windows. The batch 'myBatch.bat' contains a 'dir' cmd which's output is redirected in a newly created text file 'out.txt'. After execution this JZcmd subroutine evaluates the 'out.txt'. It searches in the line containing 'myBatch' in the and shows it. <.+> currdir = <:><&scriptdir>/..<.>; <+> ===Variantes of currdir: === jzcmd.scriptLevel.currdir = <&jzcmd.scriptLevel.currdir> jzcmd.currdir() = <&jzcmd.currdir()> jzcmdsub.currdir = <&jzcmdsub.currdir> jzcmdsub.currdir = <&jzcmdsub.currdir()> <.+> Openfile bat = "myBatch.bat"; ##opens in current directory <+bat> echo off dir >out.txt call otherbatch.bat <.+close> <+:n>executes myBatch.bat, creates out.txt in the current directory ...<.+> cmd cmd.exe /C myBatch.bat; <+:n>evaluates 'out.txt': <.+> Stringjar sdir = FileSystem.readFile(File:out.txt); ##reads the file. if(sdir.seek("myBatch").line().found()){ String line = sdir.getCurrentPart(); <+><&line><.+n> } } sub testErrorlevel() { <+> ==testErrorlevel()== <.+> List testErrorlevels; testErrorlevels += "1"; testErrorlevels += "2"; testErrorlevels += "3"; testErrorlevels += "5"; for(level: testErrorlevels){ ##to procude an errorlevel from a cmd invocation create a batch routine: Openfile bat = "error.bat"; <+bat>exit <&level><.+close> cmd cmd.exe /C error.bat; throw on errorlevel 5; <+>testErrorlevel(): <&jzcmdsub.cmdErrorlevel> < 5 <.+n> if errorlevel 2 { <+>testErrorlevel(): <&jzcmdsub.cmdErrorlevel> >= 2 <.+n> } ## onerror cmd { <+>testErrorlevel(): exeception handling <.+n> } } } sub testOutputTextIndent() { <+> ==testOutputTextIndent()== <.+> <+><: > ## without emtpy line First line left aligned Second line left aligned Third line left aligned forth line 2 spaces, <: > continue of forth line, one space fifth line left aligned. <.+> } sub testCausesError(){ <+>Variable not exists: <&faultyVariable><.+n> } sub testDebugErrorMsg(){ <+> ==testDebugErrorMsg()== <.+> call testCausesError(); <+>This statment is skipped on error<.+n> onerror{ <+>Any error in 'testDebugErrorMsg': <&error><.+n> } } ##It shows how to handle errors while generating text sub testErrorToOutput(){ <+> ==testErrorToOutput()== <.+> errortoOutput; ##with this statement an error text will be written into the output text with ? ... error ??> <+>unknown variable: <&unknown><.+n> errortoOutput off; ##with this statement an exception is thrown on the unknown variable, executes the onerror-block then. <+>unknown variable: <&unknown><.+n> onerror{ <+>there is an error: <&error> The error with stacktrace: <&jzcmdsub.excStacktraceinfo()> <.+n> } <+>test throw...<.+n> throw "text"; <+>further statement skipped!<.+n> onerror{ <+>error throw: <&error><.+n> } } class TestErrorSub { sub causeError(){ String xx = nonexistVariable; //causes error, not caught here. } sub test(){ <+> ==TestErrorSub.test()== <.+> call TestErrorSub.causeError(); onerror{ <+>TestErrorSub - onerror reached: <&error> <.+n> } } } class TestExceptionInException { sub methodinner(){ String xx = nonexistVariable; //causes error, not caught here. onerror{ <+>TestExceptionInException with errorneous: <&unknownVariable><.+n> onerror{ <+>An inner onerror catches the error in an error handling: <&error><.+n> } } String x2 = nonexistVariable; //causes error, not caught here. onerror{ <+>Second error is not catched: <&unknownVariable><.+n> } } sub method() { <+>==TestExceptionInException==<.+n> call methodinner(); onerror{ <+>An onerror block in an outer routine should be correct: <&error><.+n> } } } ##checks the access to a String in a Java user class: sub testDataAccess(){ <+:n>==testDataAccess()==<.+> <+:n>Text in a user Java instance: scriptObj.simpleTestString = <&scriptObj.simpeTestString><.+> scriptObj.simpeTestString = "new text"; ##sets a String in the users class. <+:n>Changed scriptObj.simpeTestString = "new text"; result = <&scriptObj.simpeTestString><.+> if(scriptObj.simpeTestString != "new text"){ <+:n>!!!ERROR testDataAccess !!! <.+> } //create a new variable inside a container in a Java user class. String scriptObj.testVariables.inUserData = "test in users data"; onerror { <+>Access ERROR in script: <&error><.+> } <+><.+n> } ##searches the correct method by arguments. sub testMethodInvoke(){ <+> ==testMethodInvoke()== <.+> Obj obj = new org.vishia.zcmd.JZcmdUserExample(text); //obj.methodTest(5,8); //obj.methodTest(5*Math.PI,8+5); ##Converts to an absolute file with currdir obj.methodTest(File: "myFile"); obj.methodTest(File: path/myFile.ext); ## invokes methodTest(char) obj.methodTest("x", "text"); obj.methodTest('a'); obj.methodTest('b'-1); obj.methodTest(65+32); obj.methodTest(0x61); obj.methodTest("a"); ## invokes methodTest(String) obj.methodTest(<:>content of <&obj><.>); } sub testCalctime(){ <+> ==testCalctime()== <.+> Class Tester = org.vishia.test.TestCalctime_sin; Obj tester = java new org.vishia.test.TestCalctime_sin(); //Obj y = new org.vishia.test.TestCalctime_sin.Double_ab(); <+>Start...<.+n> Num starttime = System.currentTimeMillis(); Num i = 1; do{ tester.fourier(i); i = i + 1; } while(i < 1000); Num endtime = System.currentTimeMillis(); Num timediff = endtime - starttime; <+>Time = <&timediff> ms. <.+n> } sub testVariableDatapath() { <+> ==testVariableDatapath()== <.+> Map map; String map.varA = "valA"; ## example for data tree String map.varB = "valB"; String map.varC = "valC"; String select = "B"; ## any selection input String path = <:>map.var<&select><.>; ##build the path with text expression String result1 = &(path); ##access with variable datapath <+><&result1><.+n> String datafieldname = <:>var<&select><.>; ##build a field name for selection String result2 = &map.&(datafieldname); ##access with variable field name. <+><&result2><.+n> } sub testText() { <+> ==testText()== <.+> String text1 = <:>text1 scriptdir = <:scriptdir><.>; String text2 = "constant text"; }