You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2021/09/12 16:21:15 UTC

svn commit: r1893283 - in /pdfbox/trunk/fontbox/src: main/java/org/apache/fontbox/cff/ test/java/org/apache/fontbox/cff/

Author: lehmi
Date: Sun Sep 12 16:21:15 2021
New Revision: 1893283

URL: http://svn.apache.org/viewvc?rev=1893283&view=rev
Log:
PDFBOX-5143: replace class with enum to reduce memory footprint

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java
    pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java?rev=1893283&r1=1893282&r2=1893283&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CharStringCommand.java Sun Sep 12 16:21:15 2021
@@ -16,7 +16,6 @@
  */
 package org.apache.fontbox.cff;
 
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -27,8 +26,8 @@ import java.util.Map;
  */
 public class CharStringCommand
 {
-
-    private final Key commandKey;
+    private final Type1KeyWord type1KeyWord;
+    private final Type2KeyWord type2KeyWord;
 
     /**
      * Constructor with one value.
@@ -37,7 +36,8 @@ public class CharStringCommand
      */
     public CharStringCommand(int b0)
     {
-        commandKey = new Key(b0);
+        type1KeyWord = Type1KeyWord.valueOfKey(b0);
+        type2KeyWord = Type2KeyWord.valueOfKey(b0);
     }
 
     /**
@@ -48,7 +48,8 @@ public class CharStringCommand
      */
     public CharStringCommand(int b0, int b1)
     {
-        commandKey = new Key(b0, b1);
+        type1KeyWord = Type1KeyWord.valueOfKey(b0, b1);
+        type2KeyWord = Type2KeyWord.valueOfKey(b0, b1);
     }
 
     /**
@@ -58,26 +59,31 @@ public class CharStringCommand
      */
     public CharStringCommand(int[] values)
     {
-        commandKey = new Key(values);
-    }
-
-    /**
-     * The key of the CharStringCommand.
-     * @return the key
-     */
-    public Key getKey()
-    {
-        return commandKey;
+        if (values.length == 1)
+        {
+            type1KeyWord = Type1KeyWord.valueOfKey(values[0]);
+            type2KeyWord = Type2KeyWord.valueOfKey(values[0]);
+        }
+        else if (values.length == 2)
+        {
+            type1KeyWord = Type1KeyWord.valueOfKey(values[0], values[1]);
+            type2KeyWord = Type2KeyWord.valueOfKey(values[0], values[1]);
+        }
+        else
+        {
+            type1KeyWord = null;
+            type2KeyWord = null;
+        }
     }
 
     public Type1KeyWord getType1KeyWord()
     {
-        return Type1KeyWord.valueOfKey(commandKey);
+        return type1KeyWord;
     }
 
     public Type2KeyWord getType2KeyWord()
     {
-        return Type2KeyWord.valueOfKey(commandKey);
+        return type2KeyWord;
     }
 
     /**
@@ -87,22 +93,17 @@ public class CharStringCommand
     public String toString()
     {
         String str = null;
-        Type2KeyWord type2KeyWord = getType2KeyWord();
         if (type2KeyWord != null)
         {
             str = type2KeyWord.toString();
         }
-        else
+        else if (type1KeyWord != null)
         {
-            Type1KeyWord type1KeyWord = getType1KeyWord();
-            if (type1KeyWord != null)
-            {
-                str = type1KeyWord.toString();
-            }
+            str = type1KeyWord.toString();
         }
-        if (str == null)
+        else
         {
-            str = getKey().toString();
+            str = "unknown command";
         }
         return str + '|';
     }
@@ -113,7 +114,15 @@ public class CharStringCommand
     @Override
     public int hashCode()
     {
-        return getKey().hashCode();
+        if (type1KeyWord != null)
+        {
+            return type1KeyWord.key.hashCode();
+        }
+        if (type2KeyWord != null)
+        {
+            return type2KeyWord.key.hashCode();
+        }
+        return 0;
     }
 
     /**
@@ -125,182 +134,172 @@ public class CharStringCommand
         if (object instanceof CharStringCommand)
         {
             CharStringCommand that = (CharStringCommand) object;
-            return getKey().equals(that.getKey());
+            if (type1KeyWord != null && type1KeyWord.equals(that.getType1KeyWord()))
+            {
+                return true;
+            }
+            if (type2KeyWord != null && type2KeyWord.equals(that.getType2KeyWord()))
+            {
+                return true;
+            }
+            if (type1KeyWord == null && type2KeyWord == null)
+            {
+                return true;
+            }
         }
         return false;
     }
 
     /**
-     * A static class to hold one or more int values as key. 
+     * Enum of all valid type1 key words
      */
-    public static class Key
+    public static enum Type1KeyWord
     {
+        HSTEM(Key.HSTEM), VSTEM(Key.VSTEM), VMOVETO(Key.VMOVETO), RLINETO(Key.RLINETO), //
+        HLINETO(Key.HLINETO), VLINETO(Key.VLINETO), RRCURVETO(Key.RRCURVETO), //
+        CLOSEPATH(Key.CLOSEPATH), CALLSUBR(Key.CALLSUBR), RET(Key.RET), //
+        ESCAPE(Key.ESCAPE), DOTSECTION(Key.DOTSECTION), //
+        VSTEM3(Key.VSTEM3), HSTEM3(Key.HSTEM3), SEAC(Key.SEAC), SBW(Key.SBW), //
+        DIV(Key.DIV), CALLOTHERSUBR(Key.CALLOTHERSUBR), POP(Key.POP), //
+        SETCURRENTPOINT(Key.SETCURRENTPOINT), HSBW(Key.HSBW), ENDCHAR(Key.ENDCHAR), //
+        RMOVETO(Key.RMOVETO), HMOVETO(Key.HMOVETO), VHCURVETO(Key.VHCURVETO), //
+        HVCURVETO(Key.HVCURVETO);
 
-        private final int[] keyValues;
-
-        /**
-         * Constructor with one value.
-         * 
-         * @param b0 value
-         */
-        public Key(int b0)
-        {
-            keyValues = new int[] { b0 };
-        }
+        final Key key;
 
-        /**
-         * Constructor with two values.
-         * 
-         * @param b0 value1
-         * @param b1 value2
-         */
-        public Key(int b0, int b1)
+        private Type1KeyWord(Key key)
         {
-            keyValues = new int[] { b0, b1 };
+            this.key = key;
         }
 
-        /**
-         * Constructor with an array as values.
-         * 
-         * @param values array of values
-         */
-        public Key(int[] values)
+        private static final Map<Key, Type1KeyWord> BY_KEY = new HashMap<>();
+            
+        static
         {
-            keyValues = values;
+            for (Type1KeyWord e : values())
+            {
+                 BY_KEY.put(e.key, e);
+            }
         }
 
-        /**
-         * Array the with the values.
-         * 
-         * @return array with the values
-         */
-        public int[] getValue()
+        public static Type1KeyWord valueOfKey(int b0)
         {
-            return keyValues;
+            return BY_KEY.get(Key.valueOfKey(b0));
         }
 
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public String toString()
+        public static Type1KeyWord valueOfKey(int b0, int b1)
         {
-            return Arrays.toString(getValue());
+            return BY_KEY.get(Key.valueOfKey(b0, b1));
         }
 
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public int hashCode()
+        public static Type1KeyWord valueOfKey(Key key)
         {
-            if (keyValues[0] == 12 && keyValues.length > 1)
-            {
-                return keyValues[0] ^ keyValues[1];
-            }
-            return keyValues[0];
+            return BY_KEY.get(key);
         }
 
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean equals(Object object)
-        {
-            if (object instanceof Key)
-            {
-                Key that = (Key) object;
-                if (keyValues[0] == 12 && that.keyValues[0] == 12)
-                {
-                    if (keyValues.length > 1 && that.keyValues.length > 1)
-                    {
-                        return keyValues[1] == that.keyValues[1];
-                    }
-                    return keyValues.length == that.keyValues.length;
-                }
-                return keyValues[0] == that.keyValues[0];
-            }
-            return false;
-        }
     }
 
     /**
-     * Enum of all valid type1 key words
+     * Enum of all valid type2 key words
      */
-    public enum Type1KeyWord
+    public static enum Type2KeyWord
     {
-        HSTEM(new Key(1)), VSTEM(new Key(3)), VMOVETO(new Key(4)), RLINETO(new Key(5)), //
-        HLINETO(new Key(6)), VLINETO(new Key(7)), RRCURVETO(new Key(8)), CLOSEPATH(new Key(9)), //
-        CALLSUBR(new Key(10)), RET(new Key(11)), ESCAPE(new Key(12)), DOTSECTION(new Key(12, 0)), //
-        VSTEM3(new Key(12, 1)), HSTEM3(new Key(12, 2)), SEAC(new Key(12, 6)), SBW(new Key(12, 7)), //
-        DIV(new Key(12, 12)), CALLOTHERSUBR(new Key(12, 16)), POP(new Key(12, 17)), //
-        SETCURRENTPOINT(new Key(12, 33)), HSBW(new Key(13)), ENDCHAR(new Key(14)), //
-        RMOVETO(new Key(21)), HMOVETO(new Key(22)), VHCURVETO(new Key(30)), HVCURVETO(new Key(31));
+        HSTEM(Key.HSTEM), VSTEM(Key.VSTEM), VMOVETO(Key.VMOVETO), RLINETO(Key.RLINETO), //
+        HLINETO(Key.HLINETO), VLINETO(Key.VLINETO), RRCURVETO(Key.RRCURVETO), CALLSUBR(Key.CALLSUBR), //
+        RET(Key.RET), ESCAPE(Key.ESCAPE), AND(Key.AND), OR(Key.OR), //
+        NOT(Key.NOT), ABS(Key.ABS), ADD(Key.ADD), SUB(Key.SUB), //
+        DIV(Key.DIV), NEG(Key.NEG), EQ(Key.EQ), DROP(Key.DROP), //
+        PUT(Key.PUT), GET(Key.GET), IFELSE(Key.IFELSE), //
+        RANDOM(Key.RANDOM), MUL(Key.MUL), SQRT(Key.SQRT), DUP(Key.DUP), //
+        EXCH(Key.EXCH), INDEX(Key.INDEX), ROLL(Key.ROLL), //
+        HFLEX(Key.HFLEX), FLEX(Key.FLEX), HFLEX1(Key.HFLEX1), //
+        FLEX1(Key.FLEX1), ENDCHAR(Key.ENDCHAR), HSTEMHM(Key.HSTEMHM), HINTMASK(Key.HINTMASK), //
+        CNTRMASK(Key.CNTRMASK), RMOVETO(Key.RMOVETO), HMOVETO(Key.HMOVETO), VSTEMHM(Key.VSTEMHM), //
+        RCURVELINE(Key.RCURVELINE), RLINECURVE(Key.RLINECURVE), VVCURVETO(Key.VVCURVETO), //
+        HHCURVETO(Key.HHCURVETO), SHORTINT(Key.SHORTINT), CALLGSUBR(Key.CALLGSUBR), //
+        VHCURVETO(Key.VHCURVETO), HVCURVETO(Key.HVCURVETO);
 
         final Key key;
 
-        private Type1KeyWord(Key key)
+        private Type2KeyWord(Key key)
         {
             this.key = key;
         }
 
-        private static final Map<Key, Type1KeyWord> BY_KEY = new HashMap<>();
+        private static final Map<Key, Type2KeyWord> BY_KEY = new HashMap<>();
             
         static
         {
-            for (Type1KeyWord e : values())
+            for (Type2KeyWord e : values())
             {
                  BY_KEY.put(e.key, e);
             }
         }
-        
-        public static Type1KeyWord valueOfKey(Key key)
+
+        public static Type2KeyWord valueOfKey(int b0)
         {
-            return BY_KEY.get(key);
+            return BY_KEY.get(Key.valueOfKey(b0));
         }
 
+        public static Type2KeyWord valueOfKey(int b0, int b1)
+        {
+            return BY_KEY.get(Key.valueOfKey(b0, b1));
+        }
+
+        public static Type2KeyWord valueOfKey(Key key)
+        {
+            return BY_KEY.get(key);
+        }
     }
 
-    /**
-     * Enum of all valid type2 key words
-     */
-    public enum Type2KeyWord
+    public static enum Key
     {
-        HSTEM(new Key(1)), VSTEM(new Key(3)), VMOVETO(new Key(4)), RLINETO(new Key(5)), //
-        HLINETO(new Key(6)), VLINETO(new Key(7)), RRCURVETO(new Key(8)), CALLSUBR(new Key(10)), //
-        RET(new Key(11)), ESCAPE(new Key(12)), AND(new Key(12, 3)), OR(new Key(12, 4)), //
-        NOT(new Key(12, 5)), ABS(new Key(12, 9)), ADD(new Key(12, 10)), SUB(new Key(12, 11)), //
-        DIV(new Key(12, 12)), NEG(new Key(12, 14)), EQ(new Key(12, 15)), DROP(new Key(12, 18)), //
-        PUT(new Key(12, 20)), GET(new Key(12, 21)), IFELSE(new Key(12, 22)), //
-        RANDOM(new Key(12, 23)), MUL(new Key(12, 24)), SQRT(new Key(12, 26)), DUP(new Key(12, 27)), //
-        EXCH(new Key(12, 28)), INDEX(new Key(12, 29)), ROLL(new Key(12, 30)), //
-        HFLEX(new Key(12, 34)), FLEX(new Key(12, 35)), HFLEX1(new Key(12, 36)), //
-        FLEX1(new Key(12, 37)), ENDCHAR(new Key(14)), HSTEMHM(new Key(18)), HINTMASK(new Key(19)), //
-        CNTRMASK(new Key(20)), RMOVETO(new Key(21)), HMOVETO(new Key(22)), VSTEMHM(new Key(23)), //
-        RCURVELINE(new Key(24)), RLINECURVE(new Key(25)), VVCURVETO(new Key(26)), //
-        HHCURVETO(new Key(27)), SHORTINT(new Key(28)), CALLGSUBR(new Key(29)), //
-        VHCURVETO(new Key(30)), HVCURVETO(new Key(31));
+        HSTEM(1), VSTEM(3), VMOVETO(4), RLINETO(5), //
+        HLINETO(6), VLINETO(7), RRCURVETO(8), CLOSEPATH(9), CALLSUBR(10), //
+        RET(11), ESCAPE(12), DOTSECTION(12, 0), VSTEM3(12, 1), HSTEM3(12, 2), //
+        AND(12, 3), OR(12, 4), NOT(12, 5), SEAC(12, 6), SBW(12, 7), //
+        ABS(12, 9), ADD(12, 10), SUB(12, 11), DIV(12, 12), NEG(12, 14), EQ(12, 15), //
+        CALLOTHERSUBR(12, 16), POP(12, 17), DROP(12, 18), //
+        PUT(12, 20), GET(12, 21), IFELSE(12, 22), //
+        RANDOM(12, 23), MUL(12, 24), SQRT(12, 26), DUP(12, 27), //
+        EXCH(12, 28), INDEX(12, 29), ROLL(12, 30), SETCURRENTPOINT(12, 33), //
+        HFLEX(12, 34), FLEX(12, 35), HFLEX1(12, 36), FLEX1(12, 37), //
+        HSBW(13), ENDCHAR(14), HSTEMHM(18), HINTMASK(19), //
+        CNTRMASK(20), RMOVETO(21), HMOVETO(22), VSTEMHM(23), //
+        RCURVELINE(24), RLINECURVE(25), VVCURVETO(26), //
+        HHCURVETO(27), SHORTINT(28), CALLGSUBR(29), //
+        VHCURVETO(30), HVCURVETO(31);
 
-        final Key key;
+        private final int hashValue;
 
-        private Type2KeyWord(Key key)
+        private Key(int b0)
         {
-            this.key = key;
+            hashValue = b0;
         }
 
-        private static final Map<Key, Type2KeyWord> BY_KEY = new HashMap<>();
-            
+        private Key(int b0, int b1)
+        {
+            hashValue = (b0 << 4) + b1;
+        }
+
+        private static final Map<Integer, Key> BY_KEY = new HashMap<>();
+        
         static
         {
-            for (Type2KeyWord e : values())
+            for (Key e : values())
             {
-                 BY_KEY.put(e.key, e);
+                BY_KEY.put(e.hashValue, e);
             }
         }
-        
-        public static Type2KeyWord valueOfKey(Key key)
+
+        public static Key valueOfKey(int b0)
         {
-            return BY_KEY.get(key);
+            return BY_KEY.get(b0);
+        }
+
+        public static Key valueOfKey(int b0, int b1)
+        {
+            return BY_KEY.get((b0 << 4) + b1);
         }
     }
 }

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java?rev=1893283&r1=1893282&r2=1893283&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharString.java Sun Sep 12 16:21:15 2021
@@ -165,8 +165,7 @@ public class Type1CharString
         if (type1KeyWord == null)
         {
             // indicates an invalid charstring
-            LOG.warn("Unknown charstring command: " + command.getKey() + " in glyph " + glyphName
-                    + " of font " + fontName);
+            LOG.warn("Unknown charstring command in glyph " + glyphName + " of font " + fontName);
             return Collections.emptyList();
         }
         switch(type1KeyWord)
@@ -311,8 +310,8 @@ public class Type1CharString
             break;
         case RET:
             // indicates an invalid charstring
-            LOG.warn("Unexpected charstring command: " + command.getKey() + " in glyph " +
-                    glyphName + " of font " + fontName);
+            LOG.warn("Unexpected charstring command: RET in glyph " + glyphName + " of font "
+                    + fontName);
             break;
         default:
             // indicates a PDFBox bug

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java?rev=1893283&r1=1893282&r2=1893283&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/Type1CharStringParser.java Sun Sep 12 16:21:15 2021
@@ -210,7 +210,7 @@ public class Type1CharStringParser
             int b = (Integer) sequence.remove(sequence.size() - 1);
             return b / a;
         }
-        throw new IOException("Unexpected char string command: " + command.getKey());
+        throw new IOException("Unexpected char string command: " + command.getType1KeyWord());
     }
 
     private CharStringCommand readCommand(DataInput input, int b0) throws IOException

Modified: pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java?rev=1893283&r1=1893282&r2=1893283&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java (original)
+++ pdfbox/trunk/fontbox/src/test/java/org/apache/fontbox/cff/CharStringCommandTest.java Sun Sep 12 16:21:15 2021
@@ -34,73 +34,39 @@ class CharStringCommandTest
     @Test
     void testKey()
     {
-        Key key1 = new Key(1);
-        int[] value1 = key1.getValue();
-        assertEquals(1, value1.length);
-        assertEquals(1, value1[0]);
-        assertEquals(1, key1.hashCode());
-        assertEquals(Arrays.toString(new int[] { 1 }), key1.toString());
-
-        Key key12_0 = new Key(12, 0);
-        int[] value12_0 = key12_0.getValue();
-        assertEquals(2, value12_0.length);
-        assertEquals(12, value12_0[0]);
-        assertEquals(0, value12_0[1]);
-        assertEquals(12 ^ 0, key12_0.hashCode());
-        assertEquals(Arrays.toString(new int[] { 12, 0 }), key12_0.toString());
-
-        int[] keyValues12_3 = new int[] { 12, 3 };
-        Key key12_3 = new Key(keyValues12_3);
-        int[] value12_3 = key12_3.getValue();
-        assertEquals(2, value12_3.length);
-        assertEquals(12, value12_3[0]);
-        assertEquals(3, value12_3[1]);
-        assertEquals(12 ^ 3, key12_3.hashCode());
-
-        assertEquals(Type1KeyWord.HSTEM.key, key1);
-        assertNotEquals(key1, key12_0);
-        assertNotEquals(key12_0, key1);
-        assertNotEquals(key12_0, key12_3);
-        assertNotEquals(key12_0, new Key(new int[] { 12, 3, 0 }));
+        assertEquals(Key.HSTEM, Key.valueOfKey(1));
+        assertEquals(Key.ESCAPE, Key.valueOfKey(12));
+        assertEquals(Key.DOTSECTION, Key.valueOfKey(12, 0));
+        assertEquals(Key.AND, Key.valueOfKey(12, 3));
+        assertEquals(Key.HSBW, Key.valueOfKey(13));
     }
 
     @Test
     void testCharStringCommand()
     {
         CharStringCommand charStringCommand1 = new CharStringCommand(1);
-        assertEquals(1, charStringCommand1.getKey().getValue()[0]);
         assertEquals(Type1KeyWord.HSTEM, charStringCommand1.getType1KeyWord());
         assertEquals(Type2KeyWord.HSTEM, charStringCommand1.getType2KeyWord());
-        assertEquals(1, charStringCommand1.hashCode());
         assertEquals("HSTEM|", charStringCommand1.toString());
 
         CharStringCommand charStringCommand12_0 = new CharStringCommand(12, 0);
-        assertEquals(12, charStringCommand12_0.getKey().getValue()[0]);
-        assertEquals(0, charStringCommand12_0.getKey().getValue()[1]);
         assertEquals(Type1KeyWord.DOTSECTION, charStringCommand12_0.getType1KeyWord());
         assertNull(charStringCommand12_0.getType2KeyWord());
-        assertEquals(12 ^ 0, charStringCommand12_0.hashCode());
         assertEquals("DOTSECTION|", charStringCommand12_0.toString());
 
         int[] values12_3 = new int[] { 12, 3 };
         CharStringCommand charStringCommand12_3 = new CharStringCommand(values12_3);
-        assertEquals(12, charStringCommand12_3.getKey().getValue()[0]);
-        assertEquals(3, charStringCommand12_3.getKey().getValue()[1]);
         assertNull(charStringCommand12_3.getType1KeyWord());
         assertEquals(Type2KeyWord.AND, charStringCommand12_3.getType2KeyWord());
-        assertEquals(12 ^ 3, charStringCommand12_3.hashCode());
         assertEquals("AND|", charStringCommand12_3.toString());
 
-        assertNotEquals(charStringCommand1, charStringCommand12_0);
-        assertNotEquals(charStringCommand12_0, charStringCommand12_3);
     }
 
     @Test
     void testUnknownCharStringCommand()
     {
         CharStringCommand charStringCommandUnknown = new CharStringCommand(99);
-        assertEquals(99, charStringCommandUnknown.getKey().getValue()[0]);
-        assertEquals("[99]|", charStringCommandUnknown.toString());
+        assertEquals("unknown command|", charStringCommandUnknown.toString());
     }
 
 }