//-------------------------------------------------------------------------------------------------- //--- Test Constructors //-------------------------------------------------------------------------------------------------- void constructorTest( String inputString, AString result, bool trim ) { Substring tok= new Substring( inputString ); if ( trim ) tok.Trim(); tok.CopyTo( result ); }
/** **************************************************************************************** * Searches in the values of this variable for the pattern * <c>attrName = result</c> and * sets parameter \p result to the string following this pattern. * * @param attrName The name of the attribute searched. * @param[out] result A substring with the result. * @param attrDelim The delimiter to search for. Defaults to '='. * @return \c true if the attribute was found, \c false otherwise. ******************************************************************************************/ public bool GetAttribute( String attrName, Substring result, char attrDelim= '=' ) { for ( int i= 0; i< Size(); i++ ) { result.Set( GetString(i ) ); if ( result.Consume( attrName, Case.Ignore, Whitespaces.Trim ) && result.Consume( attrDelim, Case.Ignore, Whitespaces.Trim ) ) { result.Trim(); return true; } } return false; }
bool Load( Variable variable, bool searchOnly= false ) { if ( args == null ) return false; int optionLength= variable.Fullname.Length(); Substring actVar= new Substring(); for ( int i= 0; i < args.Length ; i++ ) { // remove whitespaces (if somebody would work with quotation marks...) // and request '-' and allow a second '-' if ( !actVar.Set( args[i] ).Trim().Consume('-') ) continue; actVar.Consume( '-' ); if ( variable.Fullname.CompareTo( args[i], Case.Ignore, actVar.Start, optionLength, 0, optionLength ) == 0) { //again, lets trim before searching the = sign (really almost unnecessary) actVar.Start+= optionLength; if ( actVar.IsEmpty() ) { if ( !searchOnly ) variable.AddString(); return true; } if ( actVar.Consume( '=', Case.Sensitive, Whitespaces.Trim ) ) { if ( !searchOnly ) { actVar.Trim(); StringConverter.LoadFromString( variable, actVar ); } return true; } } } return false; }
void InternalizeValue( Substring src, AString dest ) { src.Trim(); bool inUnquoted= true; bool inQuote= false; bool lastWasSlash= false; while( src.IsNotEmpty() ) { char c= src.Consume(); if( lastWasSlash ) { lastWasSlash= false; char escChr= c == '\\' ? '\\' : c == 'n' ? '\n' : c == 'r' ? '\r' : c == 't' ? '\t' : c == '"' ? '"' : c; dest._(escChr); continue; } if( c== '\\' ) { lastWasSlash= true; continue; } if( c== '"' ) { inQuote= !inQuote; inUnquoted= false; continue; } if( inQuote || inUnquoted ) { dest._(c); continue; } if( CString.IndexOf( CString.DefaultWhitespaces, c) >= 0 ) continue; inUnquoted= true; dest._(c); } }
public void SubstringConstructor() { AString astr= new AString(); AString res= new AString(); constructorTest( "a" , res, false ); UT_EQ( "a", res ); constructorTest( " a" , res, false ); UT_EQ( " a", res ); constructorTest( "a " , res, false ); UT_EQ( "a ", res ); constructorTest( "a b" , res, false ); UT_EQ( "a b", res ); constructorTest( " a b" , res, false ); UT_EQ( " a b", res ); constructorTest( "a b " , res, false ); UT_EQ( "a b ", res ); constructorTest( "a" , res, true ); UT_EQ( "a", res ); constructorTest( " a" , res, true ); UT_EQ( "a", res ); constructorTest( "a " , res, true ); UT_EQ( "a", res ); constructorTest( "a b" , res, true ); UT_EQ( "a b", res ); constructorTest( " a b" , res, true ); UT_EQ( "a b", res ); constructorTest( "a b " , res, true ); UT_EQ( "a b", res ); // changing whitespaces { { astr.Clear()._( "xy xz abc xy" ); Substring subs= new Substring(); subs.Set(astr).Trim("xy ".ToCharArray()).CopyTo( res ); UT_EQ( "z abc", res ); } { Substring subs= new Substring( "xy xz abc xy" ); subs.TrimStart("xy ".ToCharArray()); subs.TrimEnd("xy ".ToCharArray()); subs.CopyTo( res ); UT_EQ( "z abc", res ); } } // test other constructors { astr.Clear()._( " astring "); UT_TRUE ( (new Substring()).IsEmpty() ); UT_TRUE ( (new Substring()).IsNull() ); UT_EQ( "astring", (new Substring( astr)).Trim() .ToString() ); UT_EQ( "str", (new Substring( astr, 2, 3 )).ToString() ); UT_EQ( "", (new Substring( astr, 20, 3 )).ToString() ); UT_TRUE ( (new Substring( astr, 20, 3 )).IsEmpty() ); UT_FALSE( (new Substring( astr, 20, 3 )).IsNull() ); Substring s2= new Substring( astr); UT_EQ( "astring", new Substring( s2.Trim().ToString() ).ToString() ); UT_EQ( "str", (new Substring( (new Substring( astr, 2,3 )))).ToString() ); } }
public void IniFileTest() { // write sample config file //UT_PRINT(""); UT_PRINT( "### Configuration with IniFile ###" ); String iniFileContents= "##########################################################################" +"\n" +"## unit test config file" +"\n" +"##########################################################################" +"\n" +"// this is also a comment" +"\n" +"; and this is as well" +"\n" +"" +"\n" +"HOME= overwritten_by_environment" +"\n" +"HOMEPATH= overwritten_by_environment" +"\n" +"" +"\n" +"concat= start =5, \\" +"\n" +" end =32, \\" +"\n" +" \\#no comment, \\" +"\n" +" \\;nocomment, \\" +"\n" +" ;a comment, \\" +"\n" +" getsLonger, \\" +"\n" +" getsLongerxxx, \\" +"\n" +" getsshorter, \\" +"\n" +" getsLongerxxxxx, \\" +"\n" +" getsLongerxxxxxxxxx, \\" +"\n" +" getsshorterxx, \\" +"\n" +" last" +"\n" +"" +"\n" +"" +"\n" +"CUBA=a country" +"\n" +"# The size " +"\n" +" SIZE= 25 " +"\n" +"" +"\n" +"# doble comment line" +"\n" +"# double, i meant" +"\n" +"2Comments= much talk" +"\n" +"" +"\n" +"# A great section" +"\n" +"[Great Section] " +"\n" +"SectionVar=5" +"\n" +"Double=12.3" +"\n" +"Tricky= backslash\\\\" +"\n" +"# A 2nd section" +"\n" +"[2nd Section] " +"\n" +"SectionVar=6" +"\n" +"" +"\n" +"" +"\n" +"[Great Section] " +"\n" +"SECTION_CONTINUED = yEs" +"\n" +"" +"\n" +"" +"\n" +"[ESC] " +"\n" +"Blanks= \" x \"" +"\n" +"Blanks2= \" x \" \\" +"\n" +" \" y \" " +"\n" +"Tabs=\t\t\\tx\\t" +"\n" +"nrslash= \"\\n\\r//\\\\\"" +"\n" ; String fileName= Environment.CurrentDirectory + "/unittest_testiniFile.cfg"; // write sample config file { StreamWriter file= new StreamWriter( fileName ); file.Write( iniFileContents ); file.Close(); } IniFile iniFile= new IniFile( fileName ); UT_TRUE( (IniFile.Status.OK == iniFile.LastStatus) ); // check some values Variable var= new Variable(); iniFile.Load( var.Define( "", "CUBA") ); UT_EQ( "a country", var.GetString() ); iniFile.Load( var.Define( "", "cUbA") ); UT_EQ( "a country", var.GetString() ); iniFile.Load( var.Define( "", "SIZE") ); UT_EQ( "25", var.GetString() ); iniFile.Load( var.Define( "", "concat", ',') ); UT_EQ( 11 , var.Size()); UT_EQ( "start =5" , var.GetString(0) ); UT_EQ( "end =32" , var.GetString(1) ); UT_EQ( "#no comment" , var.GetString(2) ); UT_EQ( ";nocomment" , var.GetString(3) ); iniFile.Load( var.Define( "ESC", "Blanks" ) ); UT_EQ( " x " , var.GetString() ); iniFile.Load( var.Define( "ESC", "Blanks2" ) ); UT_EQ( " x y " , var.GetString() ); iniFile.Load( var.Define( "ESC", "Tabs" ) ); UT_EQ( "\tx\t" , var.GetString() ); iniFile.Load( var.Define( "ESC", "nrslash" ) ); UT_EQ( "\n\r//\\" , var.GetString() ); iniFile.Load( var.Define( "Great Section", "SectionVar" ) ); UT_EQ( "5" , var.GetString() ); iniFile.Load( var.Define( "2nd Section", "SectionVar" ) ); UT_EQ( "6" , var.GetString() ); iniFile.Load( var.Define( "Great Section", "SECTION_CONTINUED") ); UT_EQ( "yEs", var.GetString() ); iniFile.Load( var.Define( "Great Section", "Tricky" ) ); UT_EQ( "backslash\\", var.GetString() ); // add it to ALIB config ALox.Init(); ALIB.Config.InsertPlugin( iniFile, Configuration.PrioIniFile ); ALIB.Config.Load( var.Define( "", "CUBA" ) ); UT_EQ( "a country" , var.GetString() ); ALIB.Config.Load( var.Define( "", "cUbA" ) ); UT_EQ( "a country" , var.GetString() ); ALIB.Config.Load( var.Define( "", "SIZE" ) ); UT_EQ( "25" , var.GetString() ); ALIB.Config.Load( var.Define( "", "concat" ) ); UT_EQ( 11 , var.Size()); UT_EQ( "start =5" , var.GetString(0) ); UT_EQ( "end =32" , var.GetString(1) ); ALIB.Config.Load( var.Define( "Great Section", "SectionVar" ) ); UT_EQ( "5" , var.GetString() ); ALIB.Config.Load( var.Define( "2nd Section", "SectionVar" ) ); UT_EQ( "6" , var.GetString() ); ALIB.Config.Load( var.Define( "Great Section", "SECTION_CONTINUED" ) ); UT_EQ( "yEs" , var.GetString() ); ALIB.Config.Load( var.Define( "Great Section", "Tricky" ) ); UT_EQ( "backslash\\", var.GetString() ); ALIB.Config.Load( var.Define( "Great Section", "SECTION_CONTINUED" ) ); UT_TRUE( var.IsTrue() ); // check if environment variable "home" overwrites INI file AString vIniFile= new AString(); iniFile.Load( var.Define( "", "hOme" ) ); UT_EQ( "overwritten_by_environment", var.GetString() ); int prio= ALIB.Config.Load( var.Define("", "hOme" )); if (prio != Configuration.PrioEnvironment ) // Windows platform? { prio= ALIB.Config.Load( var.Define("", "hOmePAth") ); iniFile.Load( var.Define( "", "hOmePAth") ); UT_EQ( "overwritten_by_environment", var.GetString() ); } UT_EQ( Configuration.PrioEnvironment, prio ); UT_TRUE( var.GetString().Length() > 0 ); UT_TRUE( !vIniFile.Equals( var.GetString()) ); // change a value and write a new one var.Define( "New Section", "newvar"); var.Priority= Configuration.PrioIniFile; UT_EQ( Configuration.PrioIniFile, ALIB.Config.Store( var, "new" ) ); ALIB.Config.Load ( var.Define("New Section", "newvar") ); UT_EQ( "new", var.GetString() ); var.Define( "", "newvar"); var.Priority= Configuration.PrioIniFile; UT_EQ( Configuration.PrioIniFile, ALIB.Config.Store( var, "aworx") ); ALIB.Config.Load ( var.Define("", "newvar") ); UT_EQ( "aworx", var.GetString() ); var.Define( "", "newvarList", ','); var.AddString("val1=5"); var.AddString("val2=10"); var.AddString("val3=hello"); var.Priority= Configuration.PrioIniFile; UT_EQ( Configuration.PrioIniFile, ALIB.Config.Store(var) ); ALIB.Config.Load ( var.Define( "", "newvarList") ); var.Define( "", "commented", ',', "2lines" ); var.Priority= Configuration.PrioIniFile; UT_EQ( Configuration.PrioIniFile, ALIB.Config.Store( var, "this is c-line 1 \nand this line 2" ) ); // write the file iniFile.FileName._(".writeback.txt"); iniFile.WriteFile(); // load the written file into another config IniFile readBack= new IniFile( iniFile.FileName.ToString() ); Variable varBack= new Variable(); // compare all UT_TRUE( (IniFile.Status.OK == readBack.LastStatus) ); { AString msg= new AString(); Substring orig= new Substring(); Substring back= new Substring(); foreach ( IniFile.Section section in iniFile.Sections ) { foreach ( IniFile.Entry entry in section.Entries ) { msg.Clear()._( "Reading variable " ).Field()._( section.Name )._( '/' )._( entry.Name ); UT_PRINT( msg ); char delim= '\0'; if( entry.Name.Equals("concat") || entry.Name.Equals("newvarList") ) delim= ','; iniFile .Load( var .Define( section.Name, entry.Name, delim) ); readBack.Load( varBack.Define( section.Name, entry.Name, delim) ); UT_EQ( var.Size(), varBack.Size() ); for ( int i= 0; i< var.Size(); i++ ) { int idx= var.GetString(i).IndexOf('='); if( idx < 0 ) { UT_EQ( var.GetString(i), varBack.GetString(i) ); } else { int idxBack= varBack.GetString(i).IndexOf('='); orig.Set( var .GetString(i), 0, idx ); back.Set( varBack.GetString(i), 0, idxBack ); UT_EQ( orig.Trim().ToString(), back.Trim().ToString() ); orig.Set( var .GetString(i), idx +1 ); back.Set( varBack.GetString(i), idxBack +1 ); UT_EQ( orig.Trim().ToString(), back.Trim().ToString() ); } } } } } readBack.Load ( var.Define( "New Section", "newvar" ) ); UT_EQ( "new" , var.GetString() ); readBack.Load ( var.Define( "", "newvar" ) ); UT_EQ( "aworx", var.GetString() ); ALIB.Config.RemovePlugin( iniFile ); ALIB.Config.InsertPlugin( readBack, Configuration.PrioIniFile ); ALIB.Config.Load ( var.Define( "New Section", "newvar") ); UT_EQ( "new" , var.GetString() ); ALIB.Config.Load ( var.Define( "", "newvar") ); UT_EQ( "aworx" , var.GetString() ); ALIB.Config.RemovePlugin( readBack ); }
/** **************************************************************************************** * Implements functionality for configuration variable \c LOXNAME_DUMP_STATE_ON_EXIT. * Is called when a logger is removed. ******************************************************************************************/ protected void dumpStateOnLoggerRemoval() { if( !loggerAddedSinceLastDebugState ) return; loggerAddedSinceLastDebugState= false; Variable variable= new Variable( ALox.DUMP_STATE_ON_EXIT, GetName() ); variable.Load(); String domain= null; Verbosity verbosity= Verbosity.Info; Substring tok= new Substring(); int flags= 0; for( int tokNo= 0; tokNo< variable.Size(); tokNo++ ) { tok.Set( variable.GetString( tokNo ) ); if( tok.IsEmpty() ) continue; // state flags if( tok.Equals( "NONE" , Case.Ignore ) ) { flags= 0; break; } else if( tok.Equals( "Basic" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.Basic ; else if( tok.Equals( "Version" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.Version ; else if( tok.Equals( "Loggers" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.Loggers ; else if( tok.Equals( "Domains" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.Domains ; else if( tok.Equals( "InternalDomains" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.InternalDomains ; else if( tok.Equals( "ScopeDomains" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.ScopeDomains ; else if( tok.Equals( "DSR" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.DSR ; else if( tok.Equals( "PrefixLogables" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.PrefixLogables ; else if( tok.Equals( "Once" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.Once ; else if( tok.Equals( "LogData" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.LogData ; else if( tok.Equals( "ThreadMappings" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.ThreadMappings ; else if( tok.Equals( "SPTR" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.SPTR ; else if( tok.Equals( "All" , Case.Ignore ) ) flags|= (int) Lox.StateInfo.All ; // domain and verbosity else if( tok.Consume( "domain", Case.Ignore, Whitespaces.Trim ) ) { if( tok.Consume( '=', Case.Sensitive, Whitespaces.Trim ) ) domain= tok.Trim().ToString(); } else if( tok.Consume( "verbosity", Case.Ignore, Whitespaces.Trim ) ) { if( tok.Consume( '=', Case.Sensitive, Whitespaces.Trim ) ) verbosity= ALox.ReadVerbosity( tok.Trim() ); } // unknown argument else { logInternal( Verbosity.Error, "VAR", intMsg._() ._( "Unknown argument '" )._(tok) ._( "' in variable " )._(variable.Fullname)._( " = \"")._(variable.GetString())._('\"') ); } } if ( flags != 0 ) { State( domain, verbosity, "Auto dump state on exit requested: ", (Lox.StateInfo) flags ); } }
/** **************************************************************************************** * Implements functionality for configuration variable \c LOXNAME_LOGGERNAME_VERBOSITY. * Is called when a logger is removed. * @param logger The logger to write the verbosity for. ******************************************************************************************/ protected void writeVerbositiesOnLoggerRemoval( Logger logger ) { // When writing back we will use this priority as the maximum to write. This way, if this was // an automatic default value, we will not write back into the user's variable store. // As always, only if the app fetches new variables on termination, this is entry is copied. Variable variable= new Variable( ALox.VERBOSITY, GetName(), logger.GetName() ); variable.Load(); // first token is "writeback" ? if ( variable.Size() == 0 ) return; Substring firstArg= new Substring( variable.GetString() ); if ( !firstArg.Consume( "writeback", Case.Ignore, Whitespaces.Trim ) ) return; // optionally read a destination variable name Substring destVarCategory = new Substring(); Substring destVarName = new Substring(); if( firstArg.Trim().IsNotEmpty() ) { // separate category from variable name int catSeparatorIdx= firstArg.IndexOf( '_' ); if (catSeparatorIdx >= 0 ) { destVarCategory.Set( firstArg, 0 , catSeparatorIdx ); destVarName .Set( firstArg, catSeparatorIdx + 1); } else destVarName.Set( firstArg ); if ( destVarName.IsEmpty() ) { logInternal( Verbosity.Error, "VAR", intMsg._() ._( "Argument 'writeback' in variable " ) ._( variable.Fullname) ._( "\n Error: Wrong destination variable name format\"" ) ._( firstArg )._( "\"" ) ); return; } } // either write directly into LOX_LOGGER_VERBOSITY variable... Variable destVar= null; if( destVarName.IsEmpty() ) { variable.ClearValues( 1 ); destVar= variable; } // ...or into a new given variable else { destVar= new Variable( destVarCategory, destVarName, ALox.VERBOSITY.Delim ); destVar.FormatHints= variable.FormatHints; destVar.FormatAttrAlignment= variable.FormatAttrAlignment; destVar.Comments._("Created at runtime through config option 'writeback' in variable \"")._( variable.Fullname )._("\"."); } // collect verbosities { int loggerNoMainDom= domains .GetLoggerNo( logger ); int loggerNoIntDom= internalDomains.GetLoggerNo( logger ); if ( loggerNoMainDom >= 0 ) verbositySettingToVariable( domains , loggerNoMainDom, destVar ); if ( loggerNoIntDom >= 0 ) verbositySettingToVariable( internalDomains, loggerNoIntDom , destVar ); } // now store using the same plug-in as original variable has destVar.Priority= variable.Priority; destVar.Store(); // internal logging intMsg._()._( "Argument 'writeback' in variable " )._( variable.Fullname ) ._( ":\n Verbosities for logger \"" ) ._( logger.GetName() ) ._( "\" written " ); if( destVarName.IsEmpty() ) intMsg._( "(to source variable)." ); else intMsg._( "to variable \"" ) ._( destVar.Fullname ) ._("\".") ; logInternal( Verbosity.Info, "VAR", intMsg._( destVarName )._( "\"." ) ); // verbose logging of the value written intMsg._()._(" Value:"); for( int i= 0; i< destVar.Size() ; i++ ) intMsg._( "\n " )._( destVar.GetString(i) ); logInternal( Verbosity.Verbose, "VAR", intMsg ); }