1 | // License: GPL. For details, see LICENSE file.
|
---|
2 | package org.openstreetmap.josm.gui.mappaint.mapcss;
|
---|
3 |
|
---|
4 | import java.util.concurrent.TimeUnit;
|
---|
5 |
|
---|
6 | import org.junit.jupiter.api.BeforeAll;
|
---|
7 | import org.junit.jupiter.api.Test;
|
---|
8 | import org.junit.jupiter.api.Timeout;
|
---|
9 | import org.openstreetmap.josm.JOSMFixture;
|
---|
10 | import org.openstreetmap.josm.PerformanceTestUtils;
|
---|
11 | import org.openstreetmap.josm.PerformanceTestUtils.PerformanceTestTimer;
|
---|
12 | import org.openstreetmap.josm.data.osm.OsmDataGenerator;
|
---|
13 | import org.openstreetmap.josm.data.osm.OsmDataGenerator.KeyValueDataGenerator;
|
---|
14 | import 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)
|
---|
21 | class 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 | }
|
---|