source: josm/trunk/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java@ 17275

Last change on this file since 17275 was 17275, checked in by Don-vip, 3 years ago

see #16567 - upgrade almost all tests to JUnit 5, except those depending on WiremockRule

See https://github.com/tomakehurst/wiremock/issues/684

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.mappaint.mapcss;
3
4import java.util.concurrent.TimeUnit;
5
6import org.junit.jupiter.api.BeforeAll;
7import org.junit.jupiter.api.Test;
8import org.junit.jupiter.api.Timeout;
9import org.openstreetmap.josm.JOSMFixture;
10import org.openstreetmap.josm.PerformanceTestUtils;
11import org.openstreetmap.josm.PerformanceTestUtils.PerformanceTestTimer;
12import org.openstreetmap.josm.data.osm.OsmDataGenerator;
13import org.openstreetmap.josm.data.osm.OsmDataGenerator.KeyValueDataGenerator;
14import org.openstreetmap.josm.gui.mappaint.MultiCascade;
15
16/**
17 * Tests how fast {@link MapCSSStyleSource} finds the right style candidates for one object.
18 * @author Michael Zangl
19 */
20@Timeout(value = 15*60, unit = TimeUnit.SECONDS)
21class MapCSSStyleSourceFilterTest {
22
23 private static final int TEST_RULE_COUNT = 10000;
24
25 private static class CssGenerator {
26 StringBuilder sb = new StringBuilder();
27 private final KeyValueDataGenerator generator;
28
29 /**
30 * Create a new CSS generator.
31 * @param generator A generator to get the keys from.
32 */
33 CssGenerator(KeyValueDataGenerator generator) {
34 this.generator = generator;
35 }
36
37 private CssGenerator addKeyValueRules(int count) {
38 for (int i = 0; i < count; i++) {
39 String key = generator.randomKey();
40 String value = generator.randomValue();
41 addRule("node[\"" + key + "\"=\"" + value + "\"]");
42 }
43 return this;
44 }
45
46 private CssGenerator addKeyRegexpRules(int count) {
47 for (int i = 0; i < count; i++) {
48 String key = generator.randomKey();
49 String value = generator.randomValue();
50 value = value.substring(i % value.length());
51 addRule("node[\"" + key + "\"=~/.*" + value + ".*/]");
52 }
53 return this;
54 }
55
56 public CssGenerator addHasKeyRules(int count) {
57 for (int i = 0; i < count; i++) {
58 String key = generator.randomKey();
59 addRule("node[\"" + key + "\"]");
60 }
61 return this;
62 }
63
64 public CssGenerator addIsTrueRules(int count) {
65 for (int i = 0; i < count; i++) {
66 String key = generator.randomKey();
67 addRule("node[\"" + key + "\"?]");
68 }
69 return this;
70 }
71
72 private void addRule(String selector) {
73 sb.append(selector + " {}\n");
74 }
75
76 public String getCss() {
77 return sb.toString();
78 }
79 }
80
81 private static final int APPLY_CALLS = 100000;
82
83 /**
84 * Prepare the test.
85 */
86 @BeforeAll
87 public static void createJOSMFixture() {
88 JOSMFixture.createPerformanceTestFixture().init(true);
89 }
90
91 /**
92 * Time how long it takes to evaluate [key=value] rules
93 */
94 @Test
95 void testKeyValueRules() {
96 KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
97 data.generateDataSet();
98 CssGenerator css = new CssGenerator(data).addKeyValueRules(TEST_RULE_COUNT);
99 runTest(data, css, "only key=value rules");
100 }
101
102 /**
103 * Time how long it takes to evaluate [key] rules
104 */
105 @Test
106 void testKeyOnlyRules() {
107 KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
108 data.generateDataSet();
109 CssGenerator css = new CssGenerator(data).addHasKeyRules(TEST_RULE_COUNT);
110 runTest(data, css, "only has key rules");
111 }
112
113 /**
114 * Time how long it takes to evaluate [key=~...] rules
115 */
116 @Test
117 void testRegularExpressionRules() {
118 KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
119 data.generateDataSet();
120 CssGenerator css = new CssGenerator(data).addKeyRegexpRules(TEST_RULE_COUNT);
121 runTest(data, css, "regular expressions");
122 }
123
124 /**
125 * Time how long it takes to evaluate [key?] rules
126 */
127 @Test
128 void testIsTrueRules() {
129 KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
130 data.generateDataSet();
131 CssGenerator css = new CssGenerator(data).addIsTrueRules(TEST_RULE_COUNT);
132 runTest(data, css, "is true");
133 }
134
135 private void runTest(KeyValueDataGenerator data, CssGenerator css, String description) {
136 MapCSSStyleSource source = new MapCSSStyleSource(css.getCss());
137 PerformanceTestTimer timer = PerformanceTestUtils.startTimer("MapCSSStyleSource#loadStyleSource(...) for " + description);
138 source.loadStyleSource();
139 timer.done();
140
141 timer = PerformanceTestUtils.startTimer(APPLY_CALLS + "x MapCSSStyleSource#apply(...) for " + description);
142 for (int i = 0; i < APPLY_CALLS; i++) {
143 MultiCascade mc = new MultiCascade();
144 source.apply(mc, data.randomNode(), 1, false);
145 }
146 timer.done();
147 }
148}
Note: See TracBrowser for help on using the repository browser.