View Javadoc
1   package org.djutils.data;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertNotNull;
5   import static org.junit.Assert.assertNull;
6   import static org.junit.Assert.fail;
7   
8   import org.djunits.unit.DirectionUnit;
9   import org.djunits.unit.DurationUnit;
10  import org.djunits.unit.LengthUnit;
11  import org.djunits.unit.TimeUnit;
12  import org.djunits.value.vdouble.scalar.Length;
13  import org.djunits.value.vdouble.scalar.Time;
14  import org.djunits.value.vfloat.scalar.FloatDirection;
15  import org.djunits.value.vfloat.scalar.FloatDuration;
16  import org.djutils.data.serialization.TextSerializationException;
17  import org.djutils.data.serialization.TextSerializer;
18  import org.junit.Test;
19  
20  /**
21   * TestTextSerializers tests the (de)serialization of the different classes from/into text. <br>
22   * <br>
23   * Copyright (c) 2020-2022 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
24   * for project information <a href="https://djutils.org" target="_blank"> https://djutils.org</a>. The DJUTILS project is
25   * distributed under a three-clause BSD-style license, which can be found at
26   * <a href="https://djutils.org/docs/license.html" target="_blank"> https://djutils.org/docs/license.html</a>. <br>
27   * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
28   * @author <a href="https://www.tudelft.nl/pknoppers">Peter Knoppers</a>
29   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
30   */
31  public class TestTextSerializers
32  {
33      /**
34       * Test the serializers of the primitive types.
35       * @throws TextSerializationException when serializer could not be found
36       */
37      @Test
38      public void testPrimitiveSerializers() throws TextSerializationException
39      {
40          int i = 10;
41          TextSerializer<?> serializer = TextSerializer.resolve(int.class);
42          assertEquals(i, serializer.deserialize(serializer.serialize(i)));
43  
44          double d = 124.5;
45          serializer = TextSerializer.resolve(double.class);
46          assertEquals(d, serializer.deserialize(serializer.serialize(d)));
47  
48          float f = 11.4f;
49          serializer = TextSerializer.resolve(float.class);
50          assertEquals(f, serializer.deserialize(serializer.serialize(f)));
51  
52          long l = 100_456_678L;
53          serializer = TextSerializer.resolve(long.class);
54          assertEquals(l, serializer.deserialize(serializer.serialize(l)));
55  
56          short s = (short) 12.34;
57          serializer = TextSerializer.resolve(short.class);
58          assertEquals(s, serializer.deserialize(serializer.serialize(s)));
59  
60          byte b = (byte) 67;
61          serializer = TextSerializer.resolve(byte.class);
62          assertEquals(b, serializer.deserialize(serializer.serialize(b)));
63  
64          char c = 'a';
65          serializer = TextSerializer.resolve(char.class);
66          assertEquals(c, serializer.deserialize(serializer.serialize(c)));
67  
68          boolean t = true;
69          serializer = TextSerializer.resolve(boolean.class);
70          assertEquals(t, serializer.deserialize(serializer.serialize(t)));
71      }
72  
73      /**
74       * Test the serializers of the Number types, Boolean and Character.
75       * @throws TextSerializationException when serializer could not be found
76       */
77      @Test
78      public void testNumberSerializers() throws TextSerializationException
79      {
80          Integer i = 10;
81          TextSerializer<?> serializer = TextSerializer.resolve(i.getClass());
82          assertEquals(i, serializer.deserialize(serializer.serialize(i)));
83  
84          Double d = 124.5;
85          serializer = TextSerializer.resolve(d.getClass());
86          assertEquals(d, serializer.deserialize(serializer.serialize(d)));
87  
88          Float f = 11.4f;
89          serializer = TextSerializer.resolve(f.getClass());
90          assertEquals(f, serializer.deserialize(serializer.serialize(f)));
91  
92          Long l = 100_456_678L;
93          serializer = TextSerializer.resolve(l.getClass());
94          assertEquals(l, serializer.deserialize(serializer.serialize(l)));
95  
96          Short s = (short) 12.34;
97          serializer = TextSerializer.resolve(s.getClass());
98          assertEquals(s, serializer.deserialize(serializer.serialize(s)));
99  
100         Byte b = (byte) 67;
101         serializer = TextSerializer.resolve(b.getClass());
102         assertEquals(b, serializer.deserialize(serializer.serialize(b)));
103 
104         Character c = 'a';
105         serializer = TextSerializer.resolve(c.getClass());
106         assertEquals(c, serializer.deserialize(serializer.serialize(c)));
107 
108         Boolean t = true;
109         serializer = TextSerializer.resolve(t.getClass());
110         assertEquals(t, serializer.deserialize(serializer.serialize(t)));
111     }
112 
113     /**
114      * Test the serializer of the String type.
115      * @throws TextSerializationException when serializer could not be found
116      */
117     @Test
118     public void testStringSerializer() throws TextSerializationException
119     {
120         String s = "abc, &%#";
121         TextSerializer<?> serializer = TextSerializer.resolve(s.getClass());
122         assertEquals(s, serializer.deserialize(serializer.serialize(s)));
123     }
124 
125     /**
126      * Test the errors for the serializers.
127      * @throws TextSerializationException when serializer could not be found
128      */
129     @Test
130     public void testSerializerErrors() throws TextSerializationException
131     {
132         try
133         {
134             TextSerializer.resolve(Object.class);
135             fail("resolving an unknown serializer should have raised an exception");
136         }
137         catch (TextSerializationException tse)
138         {
139             // ok
140         }
141 
142         try
143         {
144             TextSerializer.resolve(null);
145             fail("null class should have raised an exception");
146         }
147         catch (NullPointerException npe)
148         {
149             // ok
150         }
151 
152         Exception e = new TextSerializationException();
153         assertNull(e.getMessage());
154         assertNull(e.getCause());
155 
156         e = new TextSerializationException("bla");
157         assertEquals("bla", e.getMessage());
158         assertNull(e.getCause());
159 
160         e = new TextSerializationException(new IllegalArgumentException("abc"));
161         assertNotNull(e.getMessage()); // something about the cause is added automatically
162         assertEquals(IllegalArgumentException.class, e.getCause().getClass());
163         assertEquals("abc", e.getCause().getMessage());
164 
165         e = new TextSerializationException("bla", new IllegalArgumentException("abc"));
166         assertEquals("bla", e.getMessage());
167         assertEquals(IllegalArgumentException.class, e.getCause().getClass());
168         assertEquals("abc", e.getCause().getMessage());
169     }
170 
171     /**
172      * Test the serializers of the DoubleScalar and FloatScalar types.
173      * @throws TextSerializationException when serializer could not be found
174      */
175     @Test
176     public void testScalarSerializers() throws TextSerializationException
177     {
178         Length length = new Length(20.0, LengthUnit.KILOMETER);
179         TextSerializer<?> serializer = TextSerializer.resolve(length.getClass());
180         assertEquals(length, serializer.deserialize(serializer.serialize(length)));
181 
182         // repeat to test caching
183         length = new Length(123.456, LengthUnit.MILE);
184         serializer = TextSerializer.resolve(length.getClass());
185         assertEquals(length, serializer.deserialize(serializer.serialize(length)));
186 
187         Time time = new Time(10.0, TimeUnit.BASE_DAY);
188         serializer = TextSerializer.resolve(time.getClass());
189         assertEquals(time, serializer.deserialize(serializer.serialize(time)));
190 
191         FloatDuration duration = new FloatDuration(12.5f, DurationUnit.WEEK);
192         serializer = TextSerializer.resolve(duration.getClass());
193         assertEquals(duration, serializer.deserialize(serializer.serialize(duration)));
194 
195         // repeat to test caching
196         duration = new FloatDuration(876.32f, DurationUnit.MINUTE);
197         serializer = TextSerializer.resolve(duration.getClass());
198         assertEquals(duration, serializer.deserialize(serializer.serialize(duration)));
199 
200         FloatDirection direction = new FloatDirection(80.5, DirectionUnit.EAST_DEGREE);
201         serializer = TextSerializer.resolve(direction.getClass());
202         assertEquals(direction, serializer.deserialize(serializer.serialize(direction)));
203     }
204 }