View Javadoc
1   package org.opentrafficsim.core.network.factory.xml.units;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.fail;
5   
6   import org.djunits.unit.DurationUnit;
7   import org.djunits.unit.LengthUnit;
8   import org.djunits.unit.PositionUnit;
9   import org.djunits.unit.SpeedUnit;
10  import org.djunits.unit.TimeUnit;
11  import org.djunits.value.vdouble.scalar.Duration;
12  import org.djunits.value.vdouble.scalar.Length;
13  import org.djunits.value.vdouble.scalar.Position;
14  import org.djunits.value.vdouble.scalar.Speed;
15  import org.djunits.value.vdouble.scalar.Time;
16  import org.junit.Test;
17  import org.opentrafficsim.core.network.NetworkException;
18  import org.opentrafficsim.core.units.distributions.ContinuousDistDoubleScalar;
19  
20  import nl.tudelft.simulation.jstats.distributions.DistBeta;
21  import nl.tudelft.simulation.jstats.distributions.DistConstant;
22  import nl.tudelft.simulation.jstats.distributions.DistErlang;
23  import nl.tudelft.simulation.jstats.distributions.DistExponential;
24  import nl.tudelft.simulation.jstats.distributions.DistGamma;
25  import nl.tudelft.simulation.jstats.distributions.DistLogNormal;
26  import nl.tudelft.simulation.jstats.distributions.DistNormal;
27  import nl.tudelft.simulation.jstats.distributions.DistPearson5;
28  import nl.tudelft.simulation.jstats.distributions.DistPearson6;
29  import nl.tudelft.simulation.jstats.distributions.DistTriangular;
30  import nl.tudelft.simulation.jstats.distributions.DistUniform;
31  import nl.tudelft.simulation.jstats.distributions.DistWeibull;
32  
33  /**
34   * Test the Distributions parser.
35   * <p>
36   * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
37   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
38   * <p>
39   * @version $Revision$, $LastChangedDate$, by $Author$, initial version Jan 17, 2017 <br>
40   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
41   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
42   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
43   */
44  public class DistributionsTest
45  {
46  
47      /**
48       * Test the Distributions parser.
49       * @throws NetworkException if that happens uncaught; this test has failed
50       */
51      @Test
52      public final void testDistributions() throws NetworkException
53      {
54          // Test the various quantities
55          ContinuousDistDoubleScalar.Rel<Length, LengthUnit> lengthDist = Distributions.parseLengthDist("UNIFORM(1, 3) m");
56          assertEquals("unit is length", LengthUnit.METER, lengthDist.getUnit());
57          assertEquals("distribution is uniform", DistUniform.class, lengthDist.getDistribution().getClass());
58          ContinuousDistDoubleScalar.Abs<Position, PositionUnit, LengthUnit> positionDist =
59                  Distributions.parsePositionDist("UNIFORM(1, 3) m");
60          assertEquals("unit is position", PositionUnit.METER, positionDist.getUnit());
61          assertEquals("distribution is uniform", DistUniform.class, positionDist.getDistribution().getClass());
62          ContinuousDistDoubleScalar.Rel<Duration, DurationUnit> durationDist =
63                  Distributions.parseDurationDist("UNIFORM(1, 3) s");
64          assertEquals("unit is duration", DurationUnit.SI, durationDist.getUnit());
65          assertEquals("distribution is uniform", DistUniform.class, durationDist.getDistribution().getClass());
66          ContinuousDistDoubleScalar.Abs<Time, TimeUnit, DurationUnit> timeDist = Distributions.parseTimeDist("UNIFORM(1, 3) s");
67          assertEquals("unit is time", TimeUnit.BASE, timeDist.getUnit());
68          assertEquals("distribution is uniform", DistUniform.class, positionDist.getDistribution().getClass());
69          ContinuousDistDoubleScalar.Rel<Speed, SpeedUnit> speedDist = Distributions.parseSpeedDist("UNIFORM(1, 3) m/s");
70          assertEquals("unit is speed", SpeedUnit.METER_PER_SECOND, speedDist.getUnit());
71          assertEquals("distribution is uniform", DistUniform.class, speedDist.getDistribution().getClass());
72          // Test the various distributions
73          ContinuousDistDoubleScalar.Rel<Length, LengthUnit> dist = Distributions.parseLengthDist("CONST(123) m");
74          assertEquals("distribution is constant", DistConstant.class, dist.getDistribution().getClass());
75          dist = Distributions.parseLengthDist("CONSTANT(456) km");
76          assertEquals("distribution is constant", DistConstant.class, dist.getDistribution().getClass());
77          assertEquals("Const value in SI", 456000, dist.draw().si, 0);
78          dist = Distributions.parseLengthDist("EXPO(456) km");
79          assertEquals("distribution is exponential", DistExponential.class, dist.getDistribution().getClass());
80          dist = Distributions.parseLengthDist("EXPONENTIAL(456) km");
81          assertEquals("distribution is exponential", DistExponential.class, dist.getDistribution().getClass());
82          dist = Distributions.parseLengthDist("TRIA(1, 3, 4) km");
83          assertEquals("distribution is triangular", DistTriangular.class, dist.getDistribution().getClass());
84          dist = Distributions.parseLengthDist("TRIANGULAR( 1 , 3 , 4) km"); // also play a bit with extra spaces
85          assertEquals("distribution is triangular", DistTriangular.class, dist.getDistribution().getClass());
86          dist = Distributions.parseLengthDist("NORM(1,3) km"); // also play a bit with no spaces
87          assertEquals("distribution is normal", DistNormal.class, dist.getDistribution().getClass());
88          dist = Distributions.parseLengthDist("NORMAL(1,3) km");
89          assertEquals("distribution is normal", DistNormal.class, dist.getDistribution().getClass());
90          dist = Distributions.parseLengthDist("BETA(1,3) km");
91          assertEquals("distribution is Beta", DistBeta.class, dist.getDistribution().getClass());
92          dist = Distributions.parseLengthDist("ERLANG(1,3) km");
93          assertEquals("distribution is Erlang", DistErlang.class, dist.getDistribution().getClass());
94          dist = Distributions.parseLengthDist("GAMMA(1,3) km");
95          assertEquals("distribution is Gamma", DistGamma.class, dist.getDistribution().getClass());
96          dist = Distributions.parseLengthDist("LOGNORMAL(1,3) km");
97          assertEquals("distribution is lognormal", DistLogNormal.class, dist.getDistribution().getClass());
98          dist = Distributions.parseLengthDist("PEARSON5(1,3) km");
99          assertEquals("distribution is Pearson5", DistPearson5.class, dist.getDistribution().getClass());
100         dist = Distributions.parseLengthDist("PEARSON6(1,3, 5) km");
101         assertEquals("distribution is Pearson6", DistPearson6.class, dist.getDistribution().getClass());
102         dist = Distributions.parseLengthDist("WEIB(1,3, 5) km");
103         assertEquals("distribution is Weibull", DistWeibull.class, dist.getDistribution().getClass());
104         dist = Distributions.parseLengthDist("WEIBULL(1,3, 5) km");
105         assertEquals("distribution is Weibull", DistWeibull.class, dist.getDistribution().getClass());
106         // FIXME: non-integer first argument for ERLANG is quietly rounded to nearest integer value
107         // Test the various exceptions
108         try
109         {
110             Distributions.parseLengthDist("UNIFORM(3, 1) km");
111             fail("illegal interval should have thrown an IllegalArgumentException");
112         }
113         catch (IllegalArgumentException iae)
114         {
115             // Ignore expected exception
116         }
117         try
118         {
119             Distributions.parseLengthDist("NONEXISTENTDIST(1,2) km");
120             fail("non existent distribution name should have thrown a NetworkException");
121         }
122         catch (NetworkException ne)
123         {
124             // Ignore expected exception
125         }
126         try
127         {
128             Distributions.parseLengthDist("CONST(2)");
129             fail("distribution with missing unit should have thrown an ArrayIndexOutOfBoundsException");
130         }
131         catch (ArrayIndexOutOfBoundsException aioobe)
132         {
133             // Ignore expected exception
134         }
135     }
136 }