@@ -37,7 +37,6 @@ public class EncodeDecodeTest {
3737 new GsonBuilder ().serializeSpecialFloatingPointValues ().create ();
3838
3939 private static final int NUMBER_OF_POINTS = 5000 ;
40- private static final int NUMBER_OF_TASKS = NUMBER_OF_POINTS * Territory .values ().length ;
4140 private static final int LOG_LINE_EVERY = 500 ;
4241
4342 @ Test
@@ -61,12 +60,9 @@ private static void doEncodeDecode(final long seed) throws InterruptedException
6160 final AtomicInteger errors = new AtomicInteger (0 );
6261 final AtomicInteger tasks = new AtomicInteger (0 );
6362
64- final int threads = Runtime .getRuntime ().availableProcessors ();
63+ final int threads = Runtime .getRuntime ().availableProcessors () * 2 ;
6564 LOG .info ("encodeDecodeTest: Starting {} threads..." , threads );
66- final ExecutorService executor = new ThreadPoolExecutor (
67- threads , threads , // Fixed number of threads.
68- 0L , TimeUnit .MILLISECONDS , // No keep-alive.
69- new LinkedBlockingQueue <Runnable >(25000 )); // Reasonable-size blocking queue.
65+ final ExecutorService executor = Executors .newFixedThreadPool (threads );
7066
7167 final Random randomGenerator = new Random (seed );
7268 for (int i = 0 ; i < NUMBER_OF_POINTS ; i ++) {
@@ -85,84 +81,70 @@ private static void doEncodeDecode(final long seed) throws InterruptedException
8581 assertEquals ("encodeToInternational failed, result=" + resultsAll ,
8682 resultsAll .get (resultsAll .size () - 1 ), mapcodeInternational );
8783
88- // Walk through the list in reverse order to get International first.
89- for (final Territory territory : Territory .values ()) {
90- while (true ) {
91- try {
92- executor .execute (new Runnable () {
93-
94- @ Override
95- public void run () {
96- try {
97- final int count = tasks .incrementAndGet ();
98- if ((count % LOG_LINE_EVERY ) == 0 ) {
99- LOG .info ("encodeDecodeTest: #{}/{}" , count , NUMBER_OF_TASKS );
100- }
84+ executor .execute (new Runnable () {
10185
102- final List <Mapcode > resultsLimited = MapcodeCodec .encode (latDeg , lonDeg , territory );
103- for (final Mapcode mapcode : resultsLimited ) {
104-
105- // Check if the territory matches.
106- assertEquals (territory , mapcode .getTerritory ());
107-
108- // Check max distance.
109- final String codePrecision0 = mapcode .getCode (0 );
110- final String codePrecision1 = mapcode .getCode (1 );
111- final String codePrecision2 = mapcode .getCode (2 );
112-
113- final Point decodeLocationPrecision0 = MapcodeCodec .decode (codePrecision0 , territory );
114- final Point decodeLocationPrecision1 = MapcodeCodec .decode (codePrecision1 , territory );
115- final Point decodeLocationPrecision2 = MapcodeCodec .decode (codePrecision2 , territory );
116-
117- final double distancePrecision0Meters = Point .distanceInMeters (encode , decodeLocationPrecision0 );
118- final double distancePrecision1Meters = Point .distanceInMeters (encode , decodeLocationPrecision1 );
119- final double distancePrecision2Meters = Point .distanceInMeters (encode , decodeLocationPrecision2 );
120-
121- if (distancePrecision0Meters >= Mapcode .getSafeMaxOffsetInMeters (0 )) {
122- LOG .error ("encodeDecodeTest: " + mapcode + " distancePrecision0Meters = " + distancePrecision0Meters + " >= " + Mapcode .getSafeMaxOffsetInMeters (0 ));
123- errors .getAndIncrement ();
124- }
125- if (distancePrecision1Meters >= Mapcode .getSafeMaxOffsetInMeters (1 )) {
126- LOG .error ("encodeDecodeTest: " + mapcode + " distancePrecision1Meters = " + distancePrecision1Meters + " >= " + Mapcode .getSafeMaxOffsetInMeters (1 ));
127- errors .getAndIncrement ();
128- }
129- if (distancePrecision2Meters >= Mapcode .getSafeMaxOffsetInMeters (2 )) {
130- LOG .error ("encodeDecodeTest: " + mapcode + " distancePrecision2Meters = " + distancePrecision2Meters + " >= " + Mapcode .getSafeMaxOffsetInMeters (2 ));
131- errors .getAndIncrement ();
132- }
133-
134- // Check conversion from/to alphabets.
135- for (final Alphabet alphabet : Alphabet .values ()) {
136- final String mapcodeAlphabet = mapcode .getCode (alphabet );
137- final String mapcodeAscii = Mapcode .convertStringToPlainAscii (mapcodeAlphabet );
138- if (!codePrecision0 .equals (mapcodeAscii )) {
139- LOG .error ("encodeDecodeTest: " + mapcode + " alphabet=" + alphabet + ", original=" + codePrecision0 +
140- ", mapcodeAlphabet=" + mapcodeAlphabet + ", mapcodeAscii=" + mapcodeAscii );
141- }
142- }
143- }
144- } catch (final Exception e ) {
145- LOG .error ("encodeDecodeTest: Unexpected exception: " , e );
146- errors .getAndIncrement ();
147- }
148- }
149- });
86+ @ Override
87+ public void run () {
88+ final int count = tasks .getAndIncrement ();
89+ if ((count % LOG_LINE_EVERY ) == 0 ) {
90+ LOG .info ("encodeDecodeTest: #{}/{}" , count , NUMBER_OF_POINTS );
91+ }
92+
93+ // Walk through the list in reverse order to get International first.
94+ for (final Territory territory : Territory .values ()) {
95+ try {
96+ final List <Mapcode > resultsLimited = MapcodeCodec .encode (latDeg , lonDeg , territory );
97+ for (final Mapcode mapcode : resultsLimited ) {
98+
99+ // Check if the territory matches.
100+ assertEquals (territory , mapcode .getTerritory ());
150101
151- // Break out of loop and process next value.
152- break ;
102+ // Check max distance.
103+ final String codePrecision0 = mapcode .getCode (0 );
104+ final String codePrecision1 = mapcode .getCode (1 );
105+ final String codePrecision2 = mapcode .getCode (2 );
153106
154- } catch (final RejectedExecutionException ignored ) {
107+ final Point decodeLocationPrecision0 = MapcodeCodec .decode (codePrecision0 , territory );
108+ final Point decodeLocationPrecision1 = MapcodeCodec .decode (codePrecision1 , territory );
109+ final Point decodeLocationPrecision2 = MapcodeCodec .decode (codePrecision2 , territory );
155110
156- // Perfectly fine; buffer is full. Just wait a bit and re-enter while loop.
157- LOG .info ("encodeDecodeTest: buffer full, waiting, executed {} tasks so far" , tasks );
158- Thread .sleep (1000 );
111+ final double distancePrecision0Meters = Point .distanceInMeters (encode , decodeLocationPrecision0 );
112+ final double distancePrecision1Meters = Point .distanceInMeters (encode , decodeLocationPrecision1 );
113+ final double distancePrecision2Meters = Point .distanceInMeters (encode , decodeLocationPrecision2 );
114+
115+ if (distancePrecision0Meters >= Mapcode .getSafeMaxOffsetInMeters (0 )) {
116+ LOG .error ("encodeDecodeTest: " + mapcode + " distancePrecision0Meters = " + distancePrecision0Meters + " >= " + Mapcode .getSafeMaxOffsetInMeters (0 ));
117+ errors .getAndIncrement ();
118+ }
119+ if (distancePrecision1Meters >= Mapcode .getSafeMaxOffsetInMeters (1 )) {
120+ LOG .error ("encodeDecodeTest: " + mapcode + " distancePrecision1Meters = " + distancePrecision1Meters + " >= " + Mapcode .getSafeMaxOffsetInMeters (1 ));
121+ errors .getAndIncrement ();
122+ }
123+ if (distancePrecision2Meters >= Mapcode .getSafeMaxOffsetInMeters (2 )) {
124+ LOG .error ("encodeDecodeTest: " + mapcode + " distancePrecision2Meters = " + distancePrecision2Meters + " >= " + Mapcode .getSafeMaxOffsetInMeters (2 ));
125+ errors .getAndIncrement ();
126+ }
127+
128+ // Check conversion from/to alphabets.
129+ for (final Alphabet alphabet : Alphabet .values ()) {
130+ final String mapcodeAlphabet = mapcode .getCode (alphabet );
131+ final String mapcodeAscii = Mapcode .convertStringToPlainAscii (mapcodeAlphabet );
132+ if (!codePrecision0 .equals (mapcodeAscii )) {
133+ LOG .error ("encodeDecodeTest: " + mapcode + " alphabet=" + alphabet + ", original=" + codePrecision0 +
134+ ", mapcodeAlphabet=" + mapcodeAlphabet + ", mapcodeAscii=" + mapcodeAscii );
135+ }
136+ }
137+ }
138+ } catch (final Exception e ) {
139+ LOG .error ("encodeDecodeTest: Unexpected exception: " , e );
140+ errors .getAndIncrement ();
141+ }
159142 }
160143 }
161- }
144+ });
162145 }
163146 executor .shutdown ();
164147 executor .awaitTermination (60 , TimeUnit .SECONDS );
165148 assertEquals ("Found errors" , 0 , errors .get ());
166- LOG .info ("encodeDecodeTest: executed {} tasks" , tasks );
167149 }
168150}
0 commit comments