source: josm/trunk/test/unit/org/openstreetmap/josm/TestUtils.java@ 10378

Last change on this file since 10378 was 10222, checked in by Don-vip, 8 years ago

findbugs - fix/suppress most of warnings reported in unit tests + enable low confidence warnings for core

  • Property svn:eol-style set to native
File size: 17.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm;
3
4import static org.junit.Assert.fail;
5
6import java.awt.Canvas;
7import java.awt.Color;
8import java.awt.Component;
9import java.awt.Composite;
10import java.awt.Font;
11import java.awt.FontMetrics;
12import java.awt.Graphics;
13import java.awt.Graphics2D;
14import java.awt.GraphicsConfiguration;
15import java.awt.Image;
16import java.awt.Paint;
17import java.awt.Rectangle;
18import java.awt.RenderingHints;
19import java.awt.RenderingHints.Key;
20import java.awt.Shape;
21import java.awt.Stroke;
22import java.awt.font.FontRenderContext;
23import java.awt.font.GlyphVector;
24import java.awt.geom.AffineTransform;
25import java.awt.image.BufferedImage;
26import java.awt.image.BufferedImageOp;
27import java.awt.image.ImageObserver;
28import java.awt.image.RenderedImage;
29import java.awt.image.renderable.RenderableImage;
30import java.io.File;
31import java.io.IOException;
32import java.io.InputStream;
33import java.text.AttributedCharacterIterator;
34import java.util.Arrays;
35import java.util.Comparator;
36import java.util.Map;
37
38import org.openstreetmap.josm.data.osm.Node;
39import org.openstreetmap.josm.data.osm.OsmUtils;
40import org.openstreetmap.josm.data.osm.Relation;
41import org.openstreetmap.josm.data.osm.RelationMember;
42import org.openstreetmap.josm.data.osm.Way;
43import org.openstreetmap.josm.gui.progress.AbstractProgressMonitor;
44import org.openstreetmap.josm.gui.progress.CancelHandler;
45import org.openstreetmap.josm.gui.progress.ProgressMonitor;
46import org.openstreetmap.josm.gui.progress.ProgressTaskId;
47import org.openstreetmap.josm.io.Compression;
48
49import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
50
51/**
52 * Various utils, useful for unit tests.
53 */
54public final class TestUtils {
55
56 private TestUtils() {
57 // Hide constructor for utility classes
58 }
59
60 /**
61 * Returns the path to test data root directory.
62 * @return path to test data root directory
63 */
64 public static String getTestDataRoot() {
65 String testDataRoot = System.getProperty("josm.test.data");
66 if (testDataRoot == null || testDataRoot.isEmpty()) {
67 testDataRoot = "test/data";
68 System.out.println("System property josm.test.data is not set, using '" + testDataRoot + "'");
69 }
70 return testDataRoot.endsWith("/") ? testDataRoot : testDataRoot + "/";
71 }
72
73 /**
74 * Gets path to test data directory for given ticket id.
75 * @param ticketid Ticket numeric identifier
76 * @return path to test data directory for given ticket id
77 */
78 public static String getRegressionDataDir(int ticketid) {
79 return TestUtils.getTestDataRoot() + "/regress/" + ticketid;
80 }
81
82 /**
83 * Gets path to given file in test data directory for given ticket id.
84 * @param ticketid Ticket numeric identifier
85 * @param filename File name
86 * @return path to given file in test data directory for given ticket id
87 */
88 public static String getRegressionDataFile(int ticketid, String filename) {
89 return getRegressionDataDir(ticketid) + '/' + filename;
90 }
91
92 /**
93 * Gets input stream to given file in test data directory for given ticket id.
94 * @param ticketid Ticket numeric identifier
95 * @param filename File name
96 * @return path to given file in test data directory for given ticket id
97 * @throws IOException if any I/O error occurs
98 */
99 public static InputStream getRegressionDataStream(int ticketid, String filename) throws IOException {
100 return Compression.getUncompressedFileInputStream(new File(getRegressionDataDir(ticketid) + '/' + filename));
101 }
102
103 /**
104 * Checks that the given Comparator respects its contract on the given table.
105 * @param <T> type of elements
106 * @param comparator The comparator to test
107 * @param array The array sorted for test purpose
108 */
109 @SuppressFBWarnings(value = "RV_NEGATING_RESULT_OF_COMPARETO")
110 public static <T> void checkComparableContract(Comparator<T> comparator, T[] array) {
111 System.out.println("Validating Comparable contract on array of "+array.length+" elements");
112 // Check each compare possibility
113 for (int i = 0; i < array.length; i++) {
114 T r1 = array[i];
115 for (int j = i; j < array.length; j++) {
116 T r2 = array[j];
117 int a = comparator.compare(r1, r2);
118 int b = comparator.compare(r2, r1);
119 if (i == j || a == b) {
120 if (a != 0 || b != 0) {
121 fail(getFailMessage(r1, r2, a, b));
122 }
123 } else {
124 if (a != -b) {
125 fail(getFailMessage(r1, r2, a, b));
126 }
127 }
128 for (int k = j; k < array.length; k++) {
129 T r3 = array[k];
130 int c = comparator.compare(r1, r3);
131 int d = comparator.compare(r2, r3);
132 if (a > 0 && d > 0) {
133 if (c <= 0) {
134 fail(getFailMessage(r1, r2, r3, a, b, c, d));
135 }
136 } else if (a == 0 && d == 0) {
137 if (c != 0) {
138 fail(getFailMessage(r1, r2, r3, a, b, c, d));
139 }
140 } else if (a < 0 && d < 0) {
141 if (c >= 0) {
142 fail(getFailMessage(r1, r2, r3, a, b, c, d));
143 }
144 }
145 }
146 }
147 }
148 // Sort relation array
149 Arrays.sort(array, comparator);
150 }
151
152 private static <T> String getFailMessage(T o1, T o2, int a, int b) {
153 return new StringBuilder("Compared\no1: ").append(o1).append("\no2: ")
154 .append(o2).append("\ngave: ").append(a).append("/").append(b)
155 .toString();
156 }
157
158 private static <T> String getFailMessage(T o1, T o2, T o3, int a, int b, int c, int d) {
159 return new StringBuilder(getFailMessage(o1, o2, a, b))
160 .append("\nCompared\no1: ").append(o1).append("\no3: ").append(o3).append("\ngave: ").append(c)
161 .append("\nCompared\no2: ").append(o2).append("\no3: ").append(o3).append("\ngave: ").append(d)
162 .toString();
163 }
164
165 /**
166 * Returns the Java version as an int value.
167 * @return the Java version as an int value (7, 8, 9, etc.)
168 */
169 public static int getJavaVersion() {
170 String version = System.getProperty("java.version");
171 if (version.startsWith("1.")) {
172 version = version.substring(2);
173 }
174 // Allow these formats:
175 // 1.7.0_91
176 // 1.8.0_72-ea
177 // 9-ea
178 // 9
179 // 9.0.1
180 int dotPos = version.indexOf('.');
181 int dashPos = version.indexOf('-');
182 return Integer.parseInt(version.substring(0,
183 dotPos > -1 ? dotPos : dashPos > -1 ? dashPos : 1));
184 }
185
186 /**
187 * Returns an instance of {@link AbstractProgressMonitor} which keeps track of the monitor state,
188 * but does not show the progress.
189 * @return a progress monitor
190 */
191 public static ProgressMonitor newTestProgressMonitor() {
192 return new AbstractProgressMonitor(new CancelHandler()) {
193
194 @Override
195 protected void doBeginTask() {
196 }
197
198 @Override
199 protected void doFinishTask() {
200 }
201
202 @Override
203 protected void doSetIntermediate(boolean value) {
204 }
205
206 @Override
207 protected void doSetTitle(String title) {
208 }
209
210 @Override
211 protected void doSetCustomText(String title) {
212 }
213
214 @Override
215 protected void updateProgress(double value) {
216 }
217
218 @Override
219 public void setProgressTaskId(ProgressTaskId taskId) {
220 }
221
222 @Override
223 public ProgressTaskId getProgressTaskId() {
224 return null;
225 }
226
227 @Override
228 public Component getWindowParent() {
229 return null;
230 }
231 };
232 }
233
234 // CHECKSTYLE.OFF: AnonInnerLength
235 // CHECKSTYLE.OFF: MethodLength
236 // CHECKSTYLE.OFF: ParameterNumber
237
238 /**
239 * Returns an instance of {@link Graphics2D}.
240 * @return a mockup graphics instance
241 */
242 public static Graphics2D newGraphics() {
243 return new Graphics2D() {
244
245 @Override
246 public void setXORMode(Color c1) {
247 }
248
249 @Override
250 public void setPaintMode() {
251 }
252
253 @Override
254 public void setFont(Font font) {
255 }
256
257 @Override
258 public void setColor(Color c) {
259 }
260
261 @Override
262 public void setClip(int x, int y, int width, int height) {
263 }
264
265 @Override
266 public void setClip(Shape clip) {
267 }
268
269 @Override
270 public FontMetrics getFontMetrics(Font f) {
271 return new Canvas().getFontMetrics(getFont());
272 }
273
274 @Override
275 public Font getFont() {
276 return new Font(null, 0, 0);
277 }
278
279 @Override
280 public Color getColor() {
281 return null;
282 }
283
284 @Override
285 public Rectangle getClipBounds() {
286 return null;
287 }
288
289 @Override
290 public Shape getClip() {
291 return null;
292 }
293
294 @Override
295 public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
296 }
297
298 @Override
299 public void fillRect(int x, int y, int width, int height) {
300 }
301
302 @Override
303 public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
304 }
305
306 @Override
307 public void fillOval(int x, int y, int width, int height) {
308 }
309
310 @Override
311 public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
312 }
313
314 @Override
315 public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
316 }
317
318 @Override
319 public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
320 }
321
322 @Override
323 public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
324 }
325
326 @Override
327 public void drawOval(int x, int y, int width, int height) {
328 }
329
330 @Override
331 public void drawLine(int x1, int y1, int x2, int y2) {
332 }
333
334 @Override
335 public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
336 Color bgcolor, ImageObserver observer) {
337 return false;
338 }
339
340 @Override
341 public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
342 ImageObserver observer) {
343 return false;
344 }
345
346 @Override
347 public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) {
348 return false;
349 }
350
351 @Override
352 public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) {
353 return false;
354 }
355
356 @Override
357 public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) {
358 return false;
359 }
360
361 @Override
362 public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
363 return false;
364 }
365
366 @Override
367 public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
368 }
369
370 @Override
371 public void dispose() {
372 }
373
374 @Override
375 public Graphics create() {
376 return this;
377 }
378
379 @Override
380 public void copyArea(int x, int y, int width, int height, int dx, int dy) {
381 }
382
383 @Override
384 public void clipRect(int x, int y, int width, int height) {
385 }
386
387 @Override
388 public void clearRect(int x, int y, int width, int height) {
389 }
390
391 @Override
392 public void translate(double tx, double ty) {
393 }
394
395 @Override
396 public void translate(int x, int y) {
397 }
398
399 @Override
400 public void transform(AffineTransform Tx) {
401 }
402
403 @Override
404 public void shear(double shx, double shy) {
405 }
406
407 @Override
408 public void setTransform(AffineTransform Tx) {
409 }
410
411 @Override
412 public void setStroke(Stroke s) {
413 }
414
415 @Override
416 public void setRenderingHints(Map<?, ?> hints) {
417 }
418
419 @Override
420 public void setRenderingHint(Key hintKey, Object hintValue) {
421 }
422
423 @Override
424 public void setPaint(Paint paint) {
425 }
426
427 @Override
428 public void setComposite(Composite comp) {
429 }
430
431 @Override
432 public void setBackground(Color color) {
433 }
434
435 @Override
436 public void scale(double sx, double sy) {
437 }
438
439 @Override
440 public void rotate(double theta, double x, double y) {
441 }
442
443 @Override
444 public void rotate(double theta) {
445 }
446
447 @Override
448 public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
449 return false;
450 }
451
452 @Override
453 public AffineTransform getTransform() {
454 return null;
455 }
456
457 @Override
458 public Stroke getStroke() {
459 return null;
460 }
461
462 @Override
463 public RenderingHints getRenderingHints() {
464 return null;
465 }
466
467 @Override
468 public Object getRenderingHint(Key hintKey) {
469 return null;
470 }
471
472 @Override
473 public Paint getPaint() {
474 return null;
475 }
476
477 @Override
478 public FontRenderContext getFontRenderContext() {
479 return new FontRenderContext(null, false, false);
480 }
481
482 @Override
483 public GraphicsConfiguration getDeviceConfiguration() {
484 return null;
485 }
486
487 @Override
488 public Composite getComposite() {
489 return null;
490 }
491
492 @Override
493 public Color getBackground() {
494 return null;
495 }
496
497 @Override
498 public void fill(Shape s) {
499 }
500
501 @Override
502 public void drawString(AttributedCharacterIterator iterator, float x, float y) {
503 }
504
505 @Override
506 public void drawString(AttributedCharacterIterator iterator, int x, int y) {
507 }
508
509 @Override
510 public void drawString(String str, float x, float y) {
511 }
512
513 @Override
514 public void drawString(String str, int x, int y) {
515 }
516
517 @Override
518 public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
519 }
520
521 @Override
522 public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
523 }
524
525 @Override
526 public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) {
527 }
528
529 @Override
530 public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
531 return false;
532 }
533
534 @Override
535 public void drawGlyphVector(GlyphVector g, float x, float y) {
536 }
537
538 @Override
539 public void draw(Shape s) {
540 }
541
542 @Override
543 public void clip(Shape s) {
544 }
545
546 @Override
547 public void addRenderingHints(Map<?, ?> hints) {
548 }
549 };
550 }
551
552 // CHECKSTYLE.ON: ParameterNumber
553 // CHECKSTYLE.ON: MethodLength
554 // CHECKSTYLE.ON: AnonInnerLength
555
556 /**
557 * Creates a new way with the given tags (see {@link OsmUtils#createPrimitive(java.lang.String)}) and the nodes added
558 *
559 * @param tags the tags to set
560 * @param nodes the nodes to add
561 * @return a new way
562 */
563 public static Way newWay(String tags, Node... nodes) {
564 final Way way = (Way) OsmUtils.createPrimitive("way " + tags);
565 for (Node node : nodes) {
566 way.addNode(node);
567 }
568 return way;
569 }
570
571 /**
572 * Creates a new relation with the given tags (see {@link OsmUtils#createPrimitive(java.lang.String)}) and the members added
573 *
574 * @param tags the tags to set
575 * @param members the members to add
576 * @return a new relation
577 */
578 public static Relation newRelation(String tags, RelationMember... members) {
579 final Relation relation = (Relation) OsmUtils.createPrimitive("relation " + tags);
580 for (RelationMember member : members) {
581 relation.addMember(member);
582 }
583 return relation;
584 }
585}
Note: See TracBrowser for help on using the repository browser.