<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>dist/domderrien-0.8.6-javadoc.jar</filename>
    </added>
    <added>
      <filename>dist/domderrien-0.8.6-src.jar</filename>
    </added>
    <added>
      <filename>dist/domderrien-0.8.6.ear</filename>
    </added>
    <added>
      <filename>dist/domderrien-0.8.6.jar</filename>
    </added>
    <added>
      <filename>dist/domderrien-0.8.6.war</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -16,7 +16,7 @@
 		description=&quot;Temporary directory location. To reduce effects Eclipse automatic parsing, should be located outside the project structure.&quot;
 		value=&quot;${basedir}${file.separator}bin${file.separator}temp&quot; /&gt;
 
-	&lt;property name=&quot;dd2tu.release&quot; description=&quot;Planned release of this build&quot; value=&quot;0.8.5&quot; /&gt;
+	&lt;property name=&quot;dd2tu.release&quot; description=&quot;Planned release of this build&quot; value=&quot;0.8.6&quot; /&gt;
 
 	&lt;property name=&quot;dd2tu.languageListFilename&quot; value=&quot;domderrien-languages&quot; /&gt;
 
@@ -402,6 +402,13 @@
 		&gt;
 			&lt;classpath refid=&quot;java.compile.classpath&quot; /&gt;
 		&lt;/javac&gt;
+		&lt;copy todir=&quot;${temp.dir}/resources&quot; overwrite=&quot;yes&quot;&gt;
+			&lt;fileset dir=&quot;src/resources&quot;&gt;
+				&lt;include name=&quot;**/*.x*&quot; /&gt;
+				&lt;include name=&quot;**/*.properties&quot; /&gt;
+			&lt;/fileset&gt;
+			&lt;filterchain refid=&quot;genericFilterChain&quot; /&gt;
+		&lt;/copy&gt;
 	&lt;/target&gt;
 
 	&lt;target name=&quot;step-tmx-convert&quot;&gt;
@@ -462,22 +469,21 @@
 
 	&lt;target name=&quot;step-package-jar&quot;&gt;
 		&lt;delete file=&quot;dist/domderrien-${dd2tu.release}.jar&quot; /&gt;
-		&lt;copy todir=&quot;${temp.dir}/resources&quot; overwrite=&quot;yes&quot;&gt;
-			&lt;fileset dir=&quot;src/resources&quot;&gt;
-				&lt;include name=&quot;**/*.x*&quot; /&gt;
-				&lt;include name=&quot;**/*.properties&quot; /&gt;
-			&lt;/fileset&gt;
-			&lt;filterchain refid=&quot;genericFilterChain&quot; /&gt;
-		&lt;/copy&gt;
 		&lt;jar destfile=&quot;dist/domderrien-${dd2tu.release}.jar&quot;&gt;
 			&lt;fileset dir=&quot;bin/classes&quot;&gt;
 				&lt;exclude name=&quot;**/Test*.class&quot; /&gt;
 				&lt;!--exclude name=&quot;**/Mock*.class&quot; /--&gt;
 			&lt;/fileset&gt;
-			&lt;fileset dir=&quot;${temp.dir}/resources&quot; /&gt;
+			&lt;fileset dir=&quot;${temp.dir}/resources&quot;&gt;
+				&lt;include name=&quot;**/*.x*&quot; /&gt;
+				&lt;include name=&quot;**/*.properties&quot; /&gt;
+				&lt;!-- To avoid conflicts with host application own file !--&gt;
+				&lt;exclude name=&quot;**/domderrien-i18n.properties&quot; /&gt;
+			&lt;/fileset&gt;
 			&lt;fileset dir=&quot;src/resources&quot;&gt;
 				&lt;exclude name=&quot;**/*.x*&quot; /&gt;
 				&lt;exclude name=&quot;**/*.properties&quot; /&gt;
+				&lt;!-- TMX file are included as examples --&gt;
 			&lt;/fileset&gt;
 			&lt;manifest&gt;
 				&lt;attribute name=&quot;Implementation-Title&quot; value=&quot;domderrien 2tiers utils ${dd2tu.release}&quot; /&gt;
@@ -726,6 +732,7 @@
 		&lt;mkdir dir=&quot;docs/test-reports/jscoverage-html/js&quot; /&gt;
 		&lt;delete dir=&quot;docs/test-reports/jscoverage-html/temp&quot; failonerror=&quot;yes&quot; /&gt;
 		&lt;exec dir=&quot;docs/test-reports/jscoverage-html&quot; executable=&quot;${temp.dir}/jscoverage.exe&quot;&gt;
+			&lt;!-- Check documentation on http://siliconforks.com/jscoverage/manual.html --&gt;
 			&lt;arg value=&quot;--verbose&quot; /&gt;
 			&lt;!-- do not use no-instrument switch from jscoverage because it will always copy the files --&gt;
 			&lt;!--arg value=&quot;- -exclude=dojo/util&quot; /--&gt;</diff>
      <filename>build/build.xml</filename>
    </modified>
    <modified>
      <diff>@@ -621,11 +621,11 @@ public class TMXConverter {
             }
 
             if (saveToJS) {
-                // js.append(&quot;'&quot; + id + &quot;':\&quot;&quot;).append(text.replaceAll(&quot;(\\{[\\d]+\\})&quot;, &quot;%$1&quot;)).append(&quot;\&quot;&quot;); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+                // js.append(&quot;'&quot; + id + &quot;':\&quot;&quot;).append(text.replaceAll(&quot;(\\{[\\d]+\\})&quot;, &quot;\\$$1&quot;)).append(&quot;\&quot;&quot;); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
                 String updatedText = text;
                 if (text.indexOf('{') != -1) {
                     // Use the replacement with regular expression only if needed
-                    updatedText = bracesPattern.matcher(text).replaceAll(&quot;%$1&quot;); //$NON-NLS-1$
+                    updatedText = bracesPattern.matcher(text).replaceAll(&quot;\\$$1&quot;); //$NON-NLS-1$
 
                 }
                 jsOS.write((JS_LINE_START + id + JS_LINE_MIDDLE + updatedText + JS_LINE_END + NL).getBytes()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$</diff>
      <filename>src/Java/domderrien/build/TMXConverter.java</filename>
    </modified>
    <modified>
      <diff>@@ -6,9 +6,22 @@
      */
     var module = dojo.provide(&quot;domderrien.i18n.LabelExtractor&quot;);
 
+    dojo.require(&quot;dojo.string&quot;);
+
     var _dictionnary = null;
 
-    module.init = function(namespace, filename, locale) {
+    /**
+     * Initialize the library for the specified resource bundle
+     *
+     * @param {String} namespace JavaScript path containing a &lt;code&gt;nls&lt;/code&gt;
+     *                 folder with the localized resource bundles
+     * @param {String} filename Base name of the resource bundles, with one
+     *                 JavaScript file in &lt;code&gt;nls\&amp;lt;iso&amp;gt;&lt;/code&gt; folder
+     * @param {String} locale ISO code of the locale, used to load the right
+     *                 resource bundles (dojo implements a fallback mechanism
+     *                 if the corresponding localized bundle cannot be loaded)
+     */
+    module.init = function(/*String*/ namespace, /*String*/ filename, /*String*/ locale) {
         // Dojo uses dash-separated (e.g en-US not en_US) and uses lower case names (e.g en-us not en_US)
         locale = (locale || dojo.locale).replace('_','-').toLowerCase();
 
@@ -17,13 +30,13 @@
             // Notes:
             // - Cannot use the notation &lt;dojo&gt;.&lt;requireLocalization&gt; because dojo parser
             //   will try to load the bundle when this file is interpreted, instead of
-            //   waiting for a call which meaningful &lt;namespace&gt; and &lt;filename&gt; values
+            //   waiting for a call with meaningful &lt;namespace&gt; and &lt;filename&gt; values
             dojo[&quot;requireLocalization&quot;](namespace, filename, locale); // Blocking call getting the file per XHR or &lt;iframe/&gt;
 
             _dictionary = dojo.i18n.getLocalization(namespace, filename, locale);
         }
         catch(ex) {
-            alert(&quot;Deployment issue:&quot; +
+            module._reportError(&quot;Deployment issue:&quot; +
                     &quot;\nCannot get localized bundle &quot; + namespace + &quot;.&quot; + filename + &quot; for the locale &quot; + locale +
                     &quot;\nMessage: &quot; + ex
                 );
@@ -32,15 +45,35 @@
         return module;
     };
 
-    module.get = function(key, args) {
+    /**
+     * Return the message associated to the given identifier.
+     *
+     * @param {String} key  Identifier used to retrieve the localized label.
+     * @param {String} args Array of parameters, each one used to replace a
+     *                 pattern made of a number between curly braces.
+     * @return A localized label associated to the given identifier. If no
+     *         association is found, the message identifier is returned.
+     */
+    module.get = function(/*String*/ key, /*Array*/ args) {
         if (_dictionary == null) {
             return key;
         }
         var message = _dictionary[key] || key;
         if (args != null) {
-            dojo.string.substituteParams(message, args);
+            // dojo.string.substituteParams(message, args);
+            message = dojo.string.substitute(message, args);
         }
         return message;
     };
 
+    // Just provided to be able to control the environment during the unit tests
+    module._resetDictionary = function(message) {
+        _dictionary = null;
+    };
+
+    // Just provided to be able to control the error reporting during the unit tests
+    module._reportError = function(message) {
+        alert(message);
+    };
+
 })(); // End of the function limiting the scope of the private variables</diff>
      <filename>src/WebContent/js/domderrien/i18n/LabelExtractor.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
 ({bundle_language:&quot;English&quot;,
 unit_test_sample:&quot;N/A&quot;,
-x_timeStamp:&quot;20090926.1005&quot;})
+unit_test_sample_with_parameters:&quot;whatever you want ${0}, and even more ${1}&quot;,
+x_timeStamp:&quot;20091006.1732&quot;})</diff>
      <filename>src/WebContent/js/domderrien/i18n/nls/domderrien-labels.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
 ({bundle_language:&quot;English&quot;,
 unit_test_sample:&quot;N/A&quot;,
-x_timeStamp:&quot;20090926.1005&quot;})
+unit_test_sample_with_parameters:&quot;whatever you want ${0}, and even more ${1}&quot;,
+x_timeStamp:&quot;20091006.1732&quot;})</diff>
      <filename>src/WebContent/js/domderrien/i18n/nls/en/domderrien-labels.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
 ({bundle_language:&quot;Fran&#231;ais Canadien&quot;,
 unit_test_sample:&quot;N/A&quot;,
-x_timeStamp:&quot;20090928.1216&quot;})
\ No newline at end of file
+unit_test_sample_with_parameters:&quot;tout ce que vous voulez ${0}, et m&#234;me plus ${1}&quot;,
+x_timeStamp:&quot;20091006.1735&quot;})
\ No newline at end of file</diff>
      <filename>src/WebContent/js/domderrien/i18n/nls/fr-ca/domderrien-labels.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,4 @@
 ({bundle_language:&quot;Fran&#231;ais&quot;,
 unit_test_sample:&quot;N/A&quot;,
-x_timeStamp:&quot;20090926.1005&quot;})
+unit_test_sample_with_parameters:&quot;tout ce que vous voulez ${0}, et m&#234;me plus ${1}&quot;,
+x_timeStamp:&quot;20091006.1733&quot;})</diff>
      <filename>src/WebContent/js/domderrien/i18n/nls/fr/domderrien-labels.js</filename>
    </modified>
    <modified>
      <diff>@@ -19,14 +19,14 @@
         if (typeof character == 'number') {
             return true;
         }
-        if (typeof character != 'string') {
-            return false;
-        }
-        if (1 &lt; character.length) {
-            return false;
+        if (typeof character == 'string' || character instanceof String) {
+            if (1 &lt; character.length) {
+                return false;
+            }
+            var charCode = character.charCodeAt(0);
+            return (48 &lt;= charCode &amp;&amp; charCode &lt;= 57);
         }
-        var charCode = character.charCodeAt(0);
-        return (48 &lt;= charCode &amp;&amp; charCode &lt;= 57);
+        return false;
     };
 
     /** Helper returning &lt;code&gt;true&lt;/code&gt; if the given character is a valid hexadecimal digit, &lt;code&gt;false&lt;/code&gt; otherwise.
@@ -36,11 +36,17 @@
      *  @static
      */
     module.isHexaDigit = function(character) {
-        if (character == null || 1 &lt; character.length) {
+        if (character == null) {
             return false;
         }
-        var charCode = character.charCodeAt(0);
-        return (48 &lt;= charCode &amp;&amp; charCode &lt;= 57) || (65 &lt;= charCode &amp;&amp; charCode &lt;= 70) || (97 &lt;= charCode &amp;&amp; charCode &lt;= 102);
+        if (typeof character == 'string' || character instanceof String) {
+            if (1 &lt; character.length) {
+                return false;
+            }
+            var charCode = character.charCodeAt(0);
+            return (48 &lt;= charCode &amp;&amp; charCode &lt;= 57) || (65 &lt;= charCode &amp;&amp; charCode &lt;= 70) || (97 &lt;= charCode &amp;&amp; charCode &lt;= 102);
+        }
+        return false;
     };
 
     /** Helper returning &lt;code&gt;true&lt;/code&gt; if the given character is a non-alphanumeric character, &lt;code&gt;false&lt;/code&gt; otherwise.
@@ -50,15 +56,21 @@
      *  @static
      */
     module.isNonAlpha = function(character) {
-        if (character == null || 1 &lt; character.length) {
+        if (character == null) {
             return true;
         }
-        var charCode = character.charCodeAt(0);
-        if (charCode &lt; 48) return true; // Before '0'
-        if (122 &lt; charCode) return true; // After 'z'
-        if (57 &lt; charCode &amp;&amp; charCode &lt; 65) return true; // Between '9' and 'A'
-        if (90 &lt; charCode &amp;&amp; charCode &lt; 97) return true; // Between 'Z' and 'a'
-        return false;
+        if (typeof character == 'string' || character instanceof String) {
+            if (1 &lt; character.length) {
+                return true;
+            }
+            var charCode = character.charCodeAt(0);
+            if (charCode &lt; 48) return true; // Before '0'
+            if (122 &lt; charCode) return true; // After 'z'
+            if (57 &lt; charCode &amp;&amp; charCode &lt; 65) return true; // Between '9' and 'A'
+            if (90 &lt; charCode &amp;&amp; charCode &lt; 97) return true; // Between 'Z' and 'a'
+            return false;
+        }
+        return true;
     };
 
     /** Transcript the given number in its hexadecimal string representation</diff>
      <filename>src/WebContent/js/domderrien/utils/StringUtils.js</filename>
    </modified>
    <modified>
      <diff>@@ -72,5 +72,14 @@
 				&lt;seg&gt;N/A&lt;/seg&gt;
 			&lt;/tuv&gt;
 		&lt;/tu&gt;
+
+		&lt;tu tuid=&quot;unit_test_sample_with_parameters&quot; datatype=&quot;Text&quot;&gt;
+			&lt;prop type=&quot;x-tier&quot;&gt;dojotk&lt;/prop&gt;
+			&lt;prop type=&quot;x-tier&quot;&gt;javarb&lt;/prop&gt;
+			&lt;note&gt;test&lt;/note&gt;
+			&lt;tuv xml:lang=&quot;en&quot;&gt;
+				&lt;seg&gt;whatever you want {0}, and even more {1}&lt;/seg&gt;
+			&lt;/tuv&gt;
+		&lt;/tu&gt;
 	&lt;/body&gt;
 &lt;/tmx&gt;
\ No newline at end of file</diff>
      <filename>src/resources/domderrien-labels.tmx</filename>
    </modified>
    <modified>
      <diff>@@ -18,5 +18,13 @@
 				&lt;seg&gt;N/A&lt;/seg&gt;
 			&lt;/tuv&gt;
 		&lt;/tu&gt;
+		&lt;tu tuid=&quot;unit_test_sample_with_parameters&quot; datatype=&quot;Text&quot;&gt;
+			&lt;prop type=&quot;x-tier&quot;&gt;dojotk&lt;/prop&gt;
+			&lt;prop type=&quot;x-tier&quot;&gt;javarb&lt;/prop&gt;
+			&lt;note&gt;test&lt;/note&gt;
+			&lt;tuv xml:lang=&quot;fr&quot;&gt;
+				&lt;seg&gt;tout ce que vous voulez {0}, et m&#234;me plus {1}&lt;/seg&gt;
+			&lt;/tuv&gt;
+		&lt;/tu&gt;
 	&lt;/body&gt;
 &lt;/tmx&gt;
\ No newline at end of file</diff>
      <filename>src/resources/domderrien-labels_fr.tmx</filename>
    </modified>
    <modified>
      <diff>@@ -18,5 +18,13 @@
 				&lt;seg&gt;N/A&lt;/seg&gt;
 			&lt;/tuv&gt;
 		&lt;/tu&gt;
+		&lt;tu tuid=&quot;unit_test_sample_with_parameters&quot; datatype=&quot;Text&quot;&gt;
+			&lt;prop type=&quot;x-tier&quot;&gt;dojotk&lt;/prop&gt;
+			&lt;prop type=&quot;x-tier&quot;&gt;javarb&lt;/prop&gt;
+			&lt;note&gt;test&lt;/note&gt;
+			&lt;tuv xml:lang=&quot;fr&quot;&gt;
+				&lt;seg&gt;tout ce que vous voulez {0}, et m&#234;me plus {1}&lt;/seg&gt;
+			&lt;/tuv&gt;
+		&lt;/tu&gt;
 	&lt;/body&gt;
 &lt;/tmx&gt;
\ No newline at end of file</diff>
      <filename>src/resources/domderrien-labels_fr_CA.tmx</filename>
    </modified>
    <modified>
      <diff>@@ -6,10 +6,15 @@
 //
 function exposeTestFunctionNames() {
     return [
+            &quot;testExtractorInitI&quot;,
             &quot;testExtractorGetI&quot;,
             &quot;testExtractorGetII&quot;,
             &quot;testExtractorGetIII&quot;,
-            &quot;testExtractorGetIV&quot;
+            &quot;testExtractorGetIV&quot;,
+            &quot;testStupidMethodI&quot;,
+            &quot;testGetterI&quot;,
+            &quot;testGetterII&quot;,
+            &quot;testGetterIII&quot;
     ];
 }
 
@@ -23,7 +28,7 @@ function jscoverageRunner() {
 
 // JSUnit framework function
 function setUp() {
-    // NOP
+    domderrien.i18n.LabelExtractor._resetDictionary();
 }
 
 // JSUnit framework function
@@ -32,23 +37,69 @@ function tearDown() {
 }
 ////////////// Required header - end////////////////////////////////
 
+function testExtractorInitI() {
+    var reportedError = null;
+    var initialErrorReporter = domderrien.i18n.LabelExtractor._reportError;
+    domderrien.i18n.LabelExtractor._reportError = function(message) { reportedError = message; };
+
+    domderrien.i18n.LabelExtractor.init(&quot;anywhere&quot;, &quot;anyfile&quot;, &quot;uu_UU&quot;); // Unsupported locale
+
+    assertNotNull(reportedError);
+
+    domderrien.i18n.LabelExtractor._reportError = initialErrorReporter;
+}
+
 function testExtractorGetI() {
     var lblExtr = domderrien.i18n.LabelExtractor.init(&quot;domderrien.i18n&quot;, &quot;domderrien-labels&quot;, &quot;uu_UU&quot;); // Unsupported locale
     assertEquals(&quot;English&quot;, lblExtr.get(&quot;bundle_language&quot;));
     assertEquals(&quot;N/A&quot;, lblExtr.get(&quot;unit_test_sample&quot;));
 }
+
 function testExtractorGetII() {
     var lblExtr = domderrien.i18n.LabelExtractor.init(&quot;domderrien.i18n&quot;, &quot;domderrien-labels&quot;, &quot;fr&quot;); // Supported locale
     assertEquals(&quot;Fran&#231;ais&quot;, lblExtr.get(&quot;bundle_language&quot;));
     assertEquals(&quot;N/A&quot;, lblExtr.get(&quot;unit_test_sample&quot;));
 }
+
 function testExtractorGetIII() {
     var lblExtr = domderrien.i18n.LabelExtractor.init(&quot;domderrien.i18n&quot;, &quot;domderrien-labels&quot;, &quot;fr_CA&quot;); // Supported locale
     assertEquals(&quot;Fran&#231;ais Canadien&quot;, lblExtr.get(&quot;bundle_language&quot;));
     assertEquals(&quot;N/A&quot;, lblExtr.get(&quot;unit_test_sample&quot;));
 }
+
 function testExtractorGetIV() {
     var lblExtr = domderrien.i18n.LabelExtractor.init(&quot;domderrien.i18n&quot;, &quot;domderrien-labels&quot;, &quot;fr_BE&quot;); // Unsupported locale
     assertEquals(&quot;Fran&#231;ais&quot;, lblExtr.get(&quot;bundle_language&quot;));
     assertEquals(&quot;N/A&quot;, lblExtr.get(&quot;unit_test_sample&quot;));
 }
+
+function testStupidMethodI() {
+    var nativeAlert = alert;
+    var reportedError = null;
+    alert = function(message) { reportedError = message; };
+
+    domderrien.i18n.LabelExtractor._reportError(&quot;what?&quot;);
+
+    assertNotNull(reportedError);
+    assertEquals(&quot;what?&quot;, reportedError);
+
+    window.alert = nativeAlert;
+}
+
+function testGetterI() {
+    // No dictionary
+    assertEquals(&quot;key-test&quot;, domderrien.i18n.LabelExtractor.get(&quot;key-test&quot;));
+}
+
+function testGetterII() {
+    // Unknown key
+    domderrien.i18n.LabelExtractor.init(&quot;domderrien.i18n&quot;, &quot;domderrien-labels&quot;, &quot;en&quot;);
+    assertEquals(&quot;key-test&quot;, domderrien.i18n.LabelExtractor.get(&quot;key-test&quot;));
+}
+
+function testGetterIII() {
+    domderrien.i18n.LabelExtractor.init(&quot;domderrien.i18n&quot;, &quot;domderrien-labels&quot;, &quot;en&quot;);
+    var label = domderrien.i18n.LabelExtractor.get(&quot;unit_test_sample_with_parameters&quot;, [&quot;one&quot;, &quot;two&quot;]);
+    assertTrue(label.indexOf(&quot;one&quot;) != -1);
+    assertTrue(label.indexOf(&quot;two&quot;) != -1);
+}</diff>
      <filename>test/WebContent/js/domderrien/i18n/TestLabelExtractor.js</filename>
    </modified>
    <modified>
      <diff>@@ -8,7 +8,26 @@ function exposeTestFunctionNames() {
     return [
         &quot;testIsDigitI&quot;,
         &quot;testIsDigitII&quot;,
-        &quot;testIsDigitIII&quot;
+        &quot;testIsDigitIII&quot;,
+        &quot;testIsDigitIV&quot;,
+        &quot;testIsDigitV&quot;,
+        &quot;testIsHexaDigitI&quot;,
+        &quot;testIsHexaDigitII&quot;,
+        &quot;testIsHexaDigitIII&quot;,
+        &quot;testIsHexaDigitIV&quot;,
+        &quot;testIsNonAlphaI&quot;,
+        &quot;testIsNonAlphaII&quot;,
+        &quot;testIsNonAlphaIII&quot;,
+        &quot;testIsNonAlphaIV&quot;,
+        &quot;testConvertToHexaI&quot;,
+        &quot;testConvertToHexaII&quot;,
+        &quot;testConvertToHexaIII&quot;,
+        &quot;testStartsWithI&quot;,
+        &quot;testStartsWithII&quot;,
+        &quot;testStartsWithIII&quot;,
+        &quot;testStartsWithIV&quot;,
+        &quot;testStartsWithV&quot;,
+        &quot;testStartsWithVI&quot;
     ];
 }
 
@@ -31,6 +50,10 @@ function tearDown() {
 }
 ////////////// Required header - end////////////////////////////////
 function testIsDigitI() {
+    assertFalse(domderrien.utils.StringUtils.isDigit(null));
+}
+
+function testIsDigitII() {
     var samples = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
     var idx = samples.length;
     while (0 &lt; idx) {
@@ -39,7 +62,7 @@ function testIsDigitI() {
     }
 }
 
-function testIsDigitII() {
+function testIsDigitIII() {
     var samples = [&quot;0&quot;, &quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;, &quot;6&quot;, &quot;7&quot;, &quot;8&quot;, &quot;9&quot;];
     var idx = samples.length;
     while (0 &lt; idx) {
@@ -48,7 +71,7 @@ function testIsDigitII() {
     }
 }
 
-function testIsDigitIII() {
+function testIsDigitIV() {
     var samples = [&quot;a&quot;, &quot;Z&quot;, &quot;&#65533;&quot;, &quot;%&quot;, true, [0, 1, 2, 3], {1: 1, 2: 2}];
     var idx = samples.length;
     while (0 &lt; idx) {
@@ -56,3 +79,113 @@ function testIsDigitIII() {
         assertFalse(domderrien.utils.StringUtils.isDigit(samples[idx]));
     }
 }
+
+function testIsDigitV() {
+    assertFalse(domderrien.utils.StringUtils.isDigit(&quot;more than one character&quot;));
+}
+
+function testIsHexaDigitI() {
+    assertFalse(domderrien.utils.StringUtils.isHexaDigit(null));
+}
+
+function testIsHexaDigitII() {
+    assertFalse(domderrien.utils.StringUtils.isHexaDigit(&quot;more that one character&quot;));
+}
+
+function testIsHexaDigitIII() {
+    var samples = [&quot;0&quot;, &quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;, &quot;6&quot;, &quot;7&quot;, &quot;8&quot;, &quot;9&quot;, &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;, &quot;f&quot;, &quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;, &quot;E&quot;, &quot;F&quot;];
+    var idx = samples.length;
+    while (0 &lt; idx) {
+        -- idx;
+        assertTrue(domderrien.utils.StringUtils.isHexaDigit(samples[idx]));
+    }
+}
+
+function testIsHexaDigitIV() {
+    var samples = [&quot;g&quot;, &quot;Z&quot;, &quot;&#65533;&quot;, &quot;%&quot;, true, [0, 1, 2, 3], {1: 1, 2: 2}];
+    var idx = samples.length;
+    while (0 &lt; idx) {
+        -- idx;
+        assertFalse(domderrien.utils.StringUtils.isHexaDigit(samples[idx]));
+    }
+}
+
+function testIsNonAlphaI() {
+    assertTrue(domderrien.utils.StringUtils.isNonAlpha(null));
+}
+
+function testIsNonAlphaII() {
+    assertTrue(domderrien.utils.StringUtils.isNonAlpha(&quot;more that one character&quot;));
+}
+
+function testIsNonAlphaIII() {
+    var samples = [&quot;.&quot;, &quot; &quot;, &quot;&#65533;&quot;, &quot;%&quot;, true, [0, 1, 2, 3], {1: 1, 2: 2}];
+    var idx = samples.length;
+    while (0 &lt; idx) {
+        -- idx;
+        assertTrue(domderrien.utils.StringUtils.isNonAlpha(samples[idx]));
+    }
+}
+
+function testIsNonAlphaIV() {
+    var samples = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;h&quot;, &quot;u&quot;, &quot;z&quot;, &quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;H&quot;, &quot;U&quot;, &quot;Z&quot;];
+    var idx = samples.length;
+    while (0 &lt; idx) {
+        -- idx;
+        assertFalse(domderrien.utils.StringUtils.isNonAlpha(samples[idx]));
+    }
+}
+
+function testConvertToHexaI() {
+    assertEquals(&quot;&quot;, domderrien.utils.StringUtils.convertToHexa(&quot;any string&quot;));
+}
+
+function testConvertToHexaII() {
+    var samples = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+    var expected = [&quot;0&quot;, &quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;, &quot;6&quot;, &quot;7&quot;, &quot;8&quot;, &quot;9&quot;];
+    var idx = samples.length;
+    while (0 &lt; idx) {
+        -- idx;
+        assertEquals(expected[idx], domderrien.utils.StringUtils.convertToHexa(samples[idx]));
+    }
+}
+
+function testConvertToHexaIII() {
+    var samples = [10, 11, 12, 13, 14, 15, 16, 32, 139, 65535];
+    var expected = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;, &quot;f&quot;, &quot;10&quot;, &quot;20&quot;, &quot;8b&quot;, &quot;ffff&quot;];
+    var idx = samples.length;
+    while (0 &lt; idx) {
+        -- idx;
+        assertEquals(expected[idx], domderrien.utils.StringUtils.convertToHexa(samples[idx]));
+    }
+}
+
+function testStartsWithI() {
+    // Nothing to compare
+    assertFalse(domderrien.utils.StringUtils.startsWith(null, null, false));
+}
+
+function testStartsWithII() {
+    // Nothing looked for
+    assertTrue(domderrien.utils.StringUtils.startsWith(&quot;test&quot;, null, false));
+}
+
+function testStartsWithIII() {
+    // Same start, same case
+    assertTrue(domderrien.utils.StringUtils.startsWith(&quot;test&quot;, &quot;te&quot;, false));
+}
+
+function testStartsWithIV() {
+    // Same start, mixed case
+    assertFalse(domderrien.utils.StringUtils.startsWith(&quot;test&quot;, &quot;tE&quot;, false));
+}
+
+function testStartsWithV() {
+    // Same start, mixed case
+    assertTrue(domderrien.utils.StringUtils.startsWith(&quot;test&quot;, &quot;tE&quot;, true));
+}
+
+function testStartsWithVI() {
+    // Longer pattern
+    assertFalse(domderrien.utils.StringUtils.startsWith(&quot;te&quot;, &quot;test&quot;, false));
+}</diff>
      <filename>test/WebContent/js/domderrien/utils/TestStringUtils.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>6f653ffc99a13d4da4bda462e6aaaf8cc1549152</id>
    </parent>
  </parents>
  <author>
    <name>unknown</name>
    <email>dominique.derrien@gmail.com</email>
  </author>
  <url>http://github.com/DomDerrien/two-tiers-utils/commit/67a0770dea9b9c536aee5a99cc269e5c8eeda02f</url>
  <id>67a0770dea9b9c536aee5a99cc269e5c8eeda02f</id>
  <committed-date>2009-10-06T14:39:40-07:00</committed-date>
  <authored-date>2009-10-06T14:39:40-07:00</authored-date>
  <message>add more unit tests JavaScript-side, fix the TMXConverter and the LabelExtractor for dojo.string.substitute()</message>
  <tree>5ef981e14d2eb68daf7927afb315097e42843876</tree>
  <committer>
    <name>unknown</name>
    <email>dominique.derrien@gmail.com</email>
  </committer>
</commit>
