source: josm/trunk/test/unit/org/openstreetmap/josm/testutils/annotations/ResetUniquePrimitiveIdCounters.java@ 18870

Last change on this file since 18870 was 18870, checked in by taylor.smock, 17 months ago

See #16567: Update to JUnit 5

This converts most tests to use @Annotations. There are also some performance
improvements as it relates to tests.

File size: 2.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.testutils.annotations;
3
4import java.lang.annotation.Documented;
5import java.lang.annotation.ElementType;
6import java.lang.annotation.Inherited;
7import java.lang.annotation.Retention;
8import java.lang.annotation.RetentionPolicy;
9import java.lang.annotation.Target;
10import java.lang.reflect.Field;
11import java.util.ArrayList;
12import java.util.Arrays;
13import java.util.List;
14import java.util.concurrent.atomic.AtomicLong;
15
16import org.junit.jupiter.api.extension.BeforeEachCallback;
17import org.junit.jupiter.api.extension.ExtendWith;
18import org.junit.jupiter.api.extension.ExtensionContext;
19import org.junit.platform.commons.function.Try;
20import org.junit.platform.commons.support.ReflectionSupport;
21import org.openstreetmap.josm.data.osm.Node;
22import org.openstreetmap.josm.data.osm.Relation;
23import org.openstreetmap.josm.data.osm.UniqueIdGenerator;
24import org.openstreetmap.josm.data.osm.Way;
25import org.openstreetmap.josm.spi.preferences.Config;
26import org.openstreetmap.josm.spi.preferences.MemoryPreferences;
27
28/**
29 * Reset {@link org.openstreetmap.josm.data.osm.OsmPrimitive} id counters for tests where it makes a difference.
30 * This is most likely an ordering issue with a {@link java.util.Set} collection.
31 */
32@Documented
33@Retention(RetentionPolicy.RUNTIME)
34@Target(ElementType.METHOD)
35@Inherited
36@BasicPreferences
37@ExtendWith(ResetUniquePrimitiveIdCounters.Reset.class)
38public @interface ResetUniquePrimitiveIdCounters {
39 class Reset implements BeforeEachCallback {
40 private static AtomicLong[] ID_COUNTERS;
41
42 @Override
43 public void beforeEach(ExtensionContext extensionContext) throws Exception {
44 if (ID_COUNTERS == null) {
45 ID_COUNTERS = getIdCounters();
46 }
47
48 for (AtomicLong counter : ID_COUNTERS) {
49 counter.set(0);
50 }
51 }
52
53 private static AtomicLong[] getIdCounters() throws ReflectiveOperationException {
54 Config.setPreferencesInstance(new MemoryPreferences());
55 List<AtomicLong> idCounters = new ArrayList<>(3);
56 final Field idCounter = UniqueIdGenerator.class.getDeclaredField("idCounter");
57 for (Try<Object> primitive : Arrays.asList(
58 ReflectionSupport.tryToReadFieldValue(Node.class.getDeclaredField("idGenerator"), null),
59 ReflectionSupport.tryToReadFieldValue(Way.class.getDeclaredField("idGenerator"), null),
60 ReflectionSupport.tryToReadFieldValue(Relation.class.getDeclaredField("idGenerator"), null)
61 )) {
62 primitive.andThen(generator -> ReflectionSupport.tryToReadFieldValue(idCounter, generator))
63 .ifSuccess(counter -> idCounters.add((AtomicLong) counter));
64 }
65 return idCounters.toArray(new AtomicLong[0]);
66 }
67 }
68}
Note: See TracBrowser for help on using the repository browser.