Index: /applications/editors/josm/plugins/graphview/test/org/openstreetmap/josm/plugins/graphview/core/util/ValueStringParserTest.java
===================================================================
--- /applications/editors/josm/plugins/graphview/test/org/openstreetmap/josm/plugins/graphview/core/util/ValueStringParserTest.java	(revision 20244)
+++ /applications/editors/josm/plugins/graphview/test/org/openstreetmap/josm/plugins/graphview/core/util/ValueStringParserTest.java	(revision 20244)
@@ -0,0 +1,96 @@
+package org.openstreetmap.josm.plugins.graphview.core.util;
+
+import static junit.framework.Assert.assertNull;
+import static org.openstreetmap.josm.plugins.graphview.core.util.ValueStringParser.parseMeasure;
+import static org.openstreetmap.josm.plugins.graphview.core.util.ValueStringParser.parseSpeed;
+import static org.openstreetmap.josm.plugins.graphview.core.util.ValueStringParser.parseWeight;
+
+import org.junit.Test;
+
+public class ValueStringParserTest {
+
+	/* speed */
+
+	@Test
+	public void testParseSpeedDefault() {
+		assertClose(50, parseSpeed("50"));
+	}
+
+	@Test
+	public void testParseSpeedKmh() {
+		assertClose(30, parseSpeed("30 km/h"));
+		assertClose(100, parseSpeed("100km/h"));
+	}
+
+	@Test
+	public void testParseSpeedMph() {
+		assertClose(40.234f, parseSpeed("25mph"));
+		assertClose(40.234f, parseSpeed("25 mph"));
+	}
+
+	@Test
+	public void testParseSpeedInvalid() {
+		assertNull(parseSpeed("lightspeed"));
+	}
+
+	/* measure */
+
+	@Test
+	public void testParseMeasureDefault() {
+		assertClose(3.5f, parseMeasure("3.5"));
+	}
+
+	@Test
+	public void testParseMeasureM() {
+		assertClose(2, parseMeasure("2m"));
+		assertClose(5.5f, parseMeasure("5.5 m"));
+	}
+
+	@Test
+	public void testParseMeasureKm() {
+		assertClose(1000, parseMeasure("1 km"));
+		assertClose(7200, parseMeasure("7.2km"));
+	}
+
+	@Test
+	public void testParseMeasureMi() {
+		assertClose(1609.344f, parseMeasure("1 mi"));
+	}
+
+	@Test
+	public void testParseMeasureFeetInches() {
+		assertClose(3.6576f, parseMeasure("12'0\""));
+		assertClose(1.9812f, parseMeasure("6' 6\""));
+	}
+
+	@Test
+	public void testParseMeasureInvalid() {
+		assertNull(parseMeasure("very long"));
+		assertNull(parseMeasure("6' 16\""));
+	}
+
+	/* weight */
+
+	@Test
+	public void testParseWeightDefault() {
+		assertClose(3.6f, parseWeight("3.6"));
+	}
+
+	@Test
+	public void testParseWeightT() {
+		assertClose(30, parseWeight("30t"));
+		assertClose(3.5f, parseWeight("3.5 t"));
+	}
+
+	@Test
+	public void testParseWeightInvalid() {
+		assertNull(parseWeight("heavy"));
+	}
+
+	private static final void assertClose(float expected, float actual) {
+		if (Math.abs(expected - actual) > 0.001) {
+			throw new AssertionError("expected " + expected + ", was " + actual);
+		}
+	}
+
+}
