Index: /trunk/test/data/renderer/node-shapes-combined/data.osm
===================================================================
--- /trunk/test/data/renderer/node-shapes-combined/data.osm	(revision 12978)
+++ /trunk/test/data/renderer/node-shapes-combined/data.osm	(revision 12978)
@@ -0,0 +1,13 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='false' generator='JOSM'>
+  <bounds minlat='41.7521709' minlon='-93.6101905' maxlat='41.7537291' maxlon='-93.6057925'/>
+  <node id='-39433' action='modify' lat='41.75296246005' lon='-93.6091762875'>
+    <tag k='test' v='pentagon1' />
+  </node>
+  <node id='-39434' action='modify' lat='41.75295560551' lon='-93.606759304'>
+    <tag k='test' v='pentagon3' />
+  </node>
+  <node id='-39435' action='modify' lat='41.75300054082' lon='-93.60786289815'>
+    <tag k='test' v='pentagon2' />
+  </node>
+</osm>
Index: /trunk/test/data/renderer/node-shapes-combined/style.mapcss
===================================================================
--- /trunk/test/data/renderer/node-shapes-combined/style.mapcss	(revision 12978)
+++ /trunk/test/data/renderer/node-shapes-combined/style.mapcss	(revision 12978)
@@ -0,0 +1,59 @@
+
+/**
+ * 3 Tests: relative symbol-stroke-width, alignment and stacking of stroke & fill for shapes
+ */
+node[test=pentagon1]
+{
+    symbol-shape: pentagon;
+    symbol-size: 50;
+    symbol-stroke-color: gold;
+    symbol-stroke-opacity: 0.9;
+    symbol-stroke-width: 10;
+}
+node[test=pentagon1]::stroke-casing
+{
+    symbol-shape: pentagon;
+    symbol-size: 50;
+    symbol-stroke-color: #ddd;
+    symbol-stroke-opacity: 0.6;
+    symbol-stroke-width: +8;
+    z-index: -10;
+}
+node[test=pentagon1]::fill
+{
+    symbol-shape: pentagon;
+    symbol-size: 50;
+    symbol-fill-color: darkblue;
+    symbol-fill-opacity: 1.0;
+    z-index: -15;
+}
+node[test=pentagon2]
+{
+    symbol-shape: pentagon;
+    symbol-size: 50;
+    symbol-stroke-color: blue;
+    symbol-stroke-opacity: 0.9;
+    symbol-stroke-width: 10;
+}
+node[test=pentagon2]::fill-above
+{
+    symbol-shape: pentagon;
+    symbol-size: 50;
+    symbol-fill-color: white;
+    symbol-fill-opacity: 0.3;
+    z-index: 2;
+}
+node[test=pentagon3]
+{
+    symbol-shape: pentagon;
+    symbol-size: 50;
+    symbol-fill-color: darkgreen;
+}
+node[test=pentagon3]::stroke-above
+{
+    symbol-shape: pentagon;
+    symbol-size: 50;
+    symbol-stroke-color: yellow;
+    symbol-stroke-width: 1.0;
+    z-index: 1;
+}
Index: /trunk/test/data/renderer/node-shapes-default/data.osm
===================================================================
--- /trunk/test/data/renderer/node-shapes-default/data.osm	(revision 12978)
+++ /trunk/test/data/renderer/node-shapes-default/data.osm	(revision 12978)
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='false' generator='JOSM'>
+  <bounds minlat='41.7545168' minlon='-93.61016' maxlat='41.7551668' maxlon='-93.6085557'/>
+  <node id='-39427' action='modify' lat='41.75486163968' lon='-93.60957807591'>
+    <tag k='test' v='circle' />
+  </node>
+</osm>
Index: /trunk/test/data/renderer/node-shapes-default/style.mapcss
===================================================================
--- /trunk/test/data/renderer/node-shapes-default/style.mapcss	(revision 12978)
+++ /trunk/test/data/renderer/node-shapes-default/style.mapcss	(revision 12978)
@@ -0,0 +1,9 @@
+/**
+ * Test default values.
+ * This should display a circle although neither size nor color are specified 
+ */
+node[test=circle]
+{
+    symbol-shape: circle;
+}
+
Index: /trunk/test/data/renderer/node-shapes2/data.osm
===================================================================
--- /trunk/test/data/renderer/node-shapes2/data.osm	(revision 12978)
+++ /trunk/test/data/renderer/node-shapes2/data.osm	(revision 12978)
@@ -0,0 +1,80 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='false' generator='JOSM'>
+  <bounds minlat='41.7560187' minlon='-93.6103883' maxlat='41.7575769' maxlon='-93.604712'/>
+  <node id='-39314' action='modify' lat='41.75638241559' lon='-93.60964855028'>
+    <tag k='test:stroke' v='circle' />
+  </node>
+  <node id='-39315' action='modify' lat='41.7563914204' lon='-93.6091112534'>
+    <tag k='test:stroke' v='square' />
+  </node>
+  <node id='-39316' action='modify' lat='41.75640042521' lon='-93.60857395653'>
+    <tag k='test:stroke' v='triangle' />
+  </node>
+  <node id='-39317' action='modify' lat='41.75640943002' lon='-93.60803665965'>
+    <tag k='test:stroke' v='pentagon' />
+  </node>
+  <node id='-39318' action='modify' lat='41.75641843483' lon='-93.60749936277'>
+    <tag k='test:stroke' v='hexagon' />
+  </node>
+  <node id='-39319' action='modify' lat='41.75642743963' lon='-93.6069620659'>
+    <tag k='test:stroke' v='heptagon' />
+  </node>
+  <node id='-39320' action='modify' lat='41.75643644444' lon='-93.60642476902'>
+    <tag k='test:stroke' v='octagon' />
+  </node>
+  <node id='-39321' action='modify' lat='41.75644544924' lon='-93.60588747214'>
+    <tag k='test:stroke' v='nonagon' />
+  </node>
+  <node id='-39322' action='modify' lat='41.75645445404' lon='-93.60535017527'>
+    <tag k='test:stroke' v='decagon' />
+  </node>
+  <node id='-39323' action='modify' lat='41.75701355701' lon='-93.60971846159'>
+    <tag k='test:fill' v='circle' />
+  </node>
+  <node id='-39324' action='modify' lat='41.75701165895' lon='-93.60916394128'>
+    <tag k='test:fill' v='square' />
+  </node>
+  <node id='-39325' action='modify' lat='41.75700976088' lon='-93.60860942097'>
+    <tag k='test:fill' v='triangle' />
+  </node>
+  <node id='-39326' action='modify' lat='41.75700786282' lon='-93.60805490066'>
+    <tag k='test:fill' v='pentagon' />
+  </node>
+  <node id='-39327' action='modify' lat='41.75700596475' lon='-93.60750038034'>
+    <tag k='test:fill' v='hexagon' />
+  </node>
+  <node id='-39328' action='modify' lat='41.75700406668' lon='-93.60694586003'>
+    <tag k='test:fill' v='heptagon' />
+  </node>
+  <node id='-39329' action='modify' lat='41.75700216862' lon='-93.60639133972'>
+    <tag k='test:fill' v='octagon' />
+  </node>
+  <node id='-39330' action='modify' lat='41.75700027055' lon='-93.6058368194'>
+    <tag k='test:fill' v='nonagon' />
+  </node>
+  <node id='-39331' action='modify' lat='41.75699837248' lon='-93.60528229909'>
+    <tag k='test:fill' v='decagon' />
+  </node>
+  <way id='-39312' action='modify'>
+    <nd ref='-39314' />
+    <nd ref='-39315' />
+    <nd ref='-39316' />
+    <nd ref='-39317' />
+    <nd ref='-39318' />
+    <nd ref='-39319' />
+    <nd ref='-39320' />
+    <nd ref='-39321' />
+    <nd ref='-39322' />
+  </way>
+  <way id='-39313' action='modify'>
+    <nd ref='-39323' />
+    <nd ref='-39324' />
+    <nd ref='-39325' />
+    <nd ref='-39326' />
+    <nd ref='-39327' />
+    <nd ref='-39328' />
+    <nd ref='-39329' />
+    <nd ref='-39330' />
+    <nd ref='-39331' />
+  </way>
+</osm>
Index: /trunk/test/data/renderer/node-shapes2/style.mapcss
===================================================================
--- /trunk/test/data/renderer/node-shapes2/style.mapcss	(revision 12978)
+++ /trunk/test/data/renderer/node-shapes2/style.mapcss	(revision 12978)
@@ -0,0 +1,35 @@
+meta {
+    title: "MapCSS tests: node symbols";
+}
+
+node[ test:fill ]
+{
+    symbol-size: 50;
+    symbol-fill-color: purple;
+}
+node[ test:fill = circle ] { symbol-shape : circle ; } /* whitespace at all possible places */
+node[test:fill=square]{symbol-shape:square;} /* no whitespace at all */
+node[ test:fill = triangle ] { symbol-shape: triangle; }
+node[ test:fill = pentagon ] { symbol-shape: pentagon }
+node[ test:fill = hexagon ] { symbol-shape: hexagon; }
+node[ test:fill = heptagon ] { symbol-shape: heptagon; }
+node[ test:fill = octagon ] { symbol-shape: octagon; }
+node[ test:fill = nonagon ] {symbol-shape: nonagon; }
+node[ test:fill = decagon ] {  symbol-shape: decagon; }
+
+node[ test:stroke ]
+{
+    symbol-size: 50;
+    symbol-stroke-color: purple;
+}
+node[ test:stroke = circle ] { symbol-shape: circle; }
+node[ test:stroke = square ] { symbol-shape: square; }
+node[ test:stroke = triangle ] { symbol-shape: triangle; }
+node[ test:stroke = triangle ] { symbol-shape: triangle; }
+node[ test:stroke = pentagon ] { symbol-shape: pentagon; }
+node[ test:stroke = hexagon ] { symbol-shape: hexagon; }
+node[ test:stroke = heptagon ] { symbol-shape: heptagon; }
+node[ test:stroke = octagon ] { symbol-shape: octagon; }
+node[ test:stroke = nonagon ] { symbol-shape: nonagon; }
+node[ test:stroke = decagon ] { symbol-shape: decagon; }
+
Index: /trunk/test/data/renderer/node-text2/data.osm
===================================================================
--- /trunk/test/data/renderer/node-text2/data.osm	(revision 12978)
+++ /trunk/test/data/renderer/node-text2/data.osm	(revision 12978)
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='false' generator='JOSM'>
+  <bounds minlat='41.7526653' minlon='-93.6021445' maxlat='41.7535976' maxlon='-93.6005355'/>
+  <node id='-39599' action='modify' lat='41.75314999445' lon='-93.60127346601'>
+    <tag k='name' v='Hgmpf' />
+    <tag k='test' v='text-placement' />
+  </node>
+</osm>
Index: /trunk/test/data/renderer/node-text2/style.mapcss
===================================================================
--- /trunk/test/data/renderer/node-text2/style.mapcss	(revision 12978)
+++ /trunk/test/data/renderer/node-text2/style.mapcss	(revision 12978)
@@ -0,0 +1,55 @@
+
+/**
+ * Text placement test
+ */
+node[test=text-placement]::* {
+    font-size: 10;
+    text: auto;
+    symbol-shape: square;
+    symbol-size: 50;
+    symbol-fill-opacity: 0.0;
+}
+node[test=text-placement]::above_center {
+    text-anchor-vertical: above;
+    text-anchor-horizontal: center;
+    text-color: gold;
+}
+node[test=text-placement]::top_left {
+    text-anchor-vertical: top;
+    text-anchor-horizontal: left;
+    text-color: yellow;
+}
+node[test=text-placement]::top_right {
+    text-anchor-vertical: top;
+    text-anchor-horizontal: right;
+    text-color: green;
+}
+node[test=text-placement]::center_center {
+    text-anchor-vertical: center;
+    text-anchor-horizontal: center;
+    text-color: white;
+}
+node[test=text-placement]::center_right {
+    text-anchor-vertical: center;
+    text-anchor-horizontal: right;
+    text-color: magenta;
+}
+node[test=text-placement]::bottom_left {
+    text-anchor-vertical: bottom;
+    text-anchor-horizontal: left;
+    text-color: blue;
+}
+node[test=text-placement]::bottom_right {
+    text-anchor-vertical: bottom;
+    text-anchor-horizontal: right;
+    text-color: lime;
+}
+node[test=text-placement]::below_center {
+    text-anchor-vertical: below;
+    text-anchor-horizontal: center;
+    text-color: red;
+}
+node[test=text-placement] {
+    symbol-fill-color: blue;
+    symbol-fill-opacity: 0.4;
+}
Index: /trunk/test/data/renderer/relation-linkselector/data.osm
===================================================================
--- /trunk/test/data/renderer/relation-linkselector/data.osm	(revision 12978)
+++ /trunk/test/data/renderer/relation-linkselector/data.osm	(revision 12978)
@@ -0,0 +1,73 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='false' generator='JOSM'>
+  <bounds minlat='41.7560187' minlon='-93.6103883' maxlat='41.7575693' maxlon='-93.6072576'/>
+  <node id='-39943' action='modify' lat='41.75635918892' lon='-93.60905658745' />
+  <node id='-39944' action='modify' lat='41.75634450998' lon='-93.60827933401' />
+  <node id='-39945' action='modify' lat='41.75660873045' lon='-93.60777756279' />
+  <node id='-39946' action='modify' lat='41.75677444751' lon='-93.60775757557' />
+  <node id='-39947' action='modify' lat='41.75677019799' lon='-93.60818094749' />
+  <node id='-39948' action='modify' lat='41.75710047122' lon='-93.60873191196' />
+  <node id='-39949' action='modify' lat='41.75704175611' lon='-93.60927303778' />
+  <node id='-39950' action='modify' lat='41.75695368333' lon='-93.60960755192' />
+  <node id='-39951' action='modify' lat='41.75671148257' lon='-93.60939110159' />
+  <node id='-39952' action='modify' lat='41.75686561043' lon='-93.6086040095' />
+  <node id='-39953' action='modify' lat='41.75730597371' lon='-93.60890900768' />
+  <node id='-39954' action='modify' lat='41.75732065244' lon='-93.60947964946' />
+  <node id='-39955' action='modify' lat='41.75709313184' lon='-93.60997158202' />
+  <node id='-39956' action='modify' lat='41.75683386746' lon='-93.61006910765' />
+  <node id='-39957' action='modify' lat='41.7569169863' lon='-93.60787594931' />
+  <node id='-39958' action='modify' lat='41.75704175611' lon='-93.60797433582' />
+  <node id='-39959' action='modify' lat='41.75723258004' lon='-93.60840723647' />
+  <node id='-39960' action='modify' lat='41.75651331763' lon='-93.60989287281' />
+  <node id='-39961' action='modify' lat='41.75637001464' lon='-93.6095653687' />
+  <way id='-39936' action='modify'>
+    <nd ref='-39943' />
+    <nd ref='-39944' />
+    <nd ref='-39945' />
+    <nd ref='-39946' />
+  </way>
+  <way id='-39937' action='modify'>
+    <nd ref='-39947' />
+    <nd ref='-39948' />
+    <nd ref='-39949' />
+  </way>
+  <way id='-39938' action='modify'>
+    <nd ref='-39949' />
+    <nd ref='-39950' />
+    <nd ref='-39951' />
+    <nd ref='-39952' />
+    <nd ref='-39947' />
+  </way>
+  <way id='-39939' action='modify'>
+    <nd ref='-39953' />
+    <nd ref='-39954' />
+    <nd ref='-39955' />
+    <nd ref='-39956' />
+    <tag k='test' v='role1_outer' />
+  </way>
+  <way id='-39940' action='modify'>
+    <nd ref='-39946' />
+    <nd ref='-39957' />
+    <nd ref='-39958' />
+    <nd ref='-39959' />
+    <nd ref='-39953' />
+  </way>
+  <way id='-39942' action='modify'>
+    <nd ref='-39956' />
+    <nd ref='-39960' />
+    <nd ref='-39961' />
+    <nd ref='-39943' />
+    <tag k='test' v='role1_outer' />
+  </way>
+  <relation id='-39941' action='modify'>
+    <member type='way' ref='-39942' role='outer' />
+    <member type='way' ref='-39939' role='' />
+    <member type='way' ref='-39940' role='' />
+    <member type='way' ref='-39936' role='outer' />
+    <member type='way' ref='-39937' role='inner' />
+    <member type='way' ref='-39938' role='inner' />
+    <tag k='landuse' v='meadow' />
+    <tag k='test' v='role1' />
+    <tag k='type' v='multipolygon' />
+  </relation>
+</osm>
Index: /trunk/test/data/renderer/relation-linkselector/style.mapcss
===================================================================
--- /trunk/test/data/renderer/relation-linkselector/style.mapcss	(revision 12978)
+++ /trunk/test/data/renderer/relation-linkselector/style.mapcss	(revision 12978)
@@ -0,0 +1,9 @@
+canvas {
+    default-points: false;
+    default-lines: true;
+}
+
+relation[test=role1] >[outer] way[test=role1_outer] { width: 4; color: navy; }
+
+relation[test=role1] >[role=inner][index=5] way { width: 4; color: lime; }
+
Index: /trunk/test/data/renderer/relation-parentselector/data.osm
===================================================================
--- /trunk/test/data/renderer/relation-parentselector/data.osm	(revision 12978)
+++ /trunk/test/data/renderer/relation-parentselector/data.osm	(revision 12978)
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='false' generator='JOSM'>
+  <bounds minlat='41.7540034' minlon='-93.6103371' maxlat='41.7555465' maxlon='-93.6057618' origin='JOSM' />
+  <node id='-41148' action='modify' lat='41.75449259482' lon='-93.60684960581' />
+  <node id='-41150' action='modify' lat='41.75444121701' lon='-93.60735137702' />
+  <node id='-41152' action='modify' lat='41.75491829511' lon='-93.60713492669' />
+  <node id='-41154' action='modify' lat='41.75430910244' lon='-93.60628880269' />
+  <node id='-41156' action='modify' lat='41.75422836563' lon='-93.60784330958' />
+  <node id='-41158' action='modify' lat='41.75530729464' lon='-93.60710541074' />
+  <node id='-41160' action='modify' lat='41.75449626466' lon='-93.60896491582' />
+  <node id='-41162' action='modify' lat='41.75444488685' lon='-93.60946668703' />
+  <node id='-41164' action='modify' lat='41.75492196493' lon='-93.60925023671' />
+  <node id='-41166' action='modify' lat='41.75431277229' lon='-93.6084041127' />
+  <node id='-41168' action='modify' lat='41.75423203549' lon='-93.60995861959' />
+  <node id='-41170' action='modify' lat='41.75531096443' lon='-93.60922072075' />
+  <way id='-41172' action='modify'>
+    <nd ref='-41152' />
+    <nd ref='-41150' />
+    <nd ref='-41148' />
+    <nd ref='-41152' />
+  </way>
+  <way id='-41174' action='modify'>
+    <nd ref='-41158' />
+    <nd ref='-41156' />
+    <nd ref='-41154' />
+    <nd ref='-41158' />
+    <tag k='barrier' v='fence' />
+  </way>
+  <way id='-41176' action='modify'>
+    <nd ref='-41164' />
+    <nd ref='-41162' />
+    <nd ref='-41160' />
+    <nd ref='-41164' />
+  </way>
+  <way id='-41178' action='modify'>
+    <nd ref='-41170' />
+    <nd ref='-41168' />
+    <nd ref='-41166' />
+    <nd ref='-41170' />
+  </way>
+  <relation id='-41180' action='modify'>
+    <member type='way' ref='-41174' role='outer' />
+    <member type='way' ref='-41172' role='inner' />
+    <tag k='landuse' v='quarry' />
+    <tag k='test' v='parent' />
+    <tag k='type' v='multipolygon' />
+  </relation>
+  <relation id='-41182' action='modify'>
+    <member type='way' ref='-41178' role='outer' />
+    <member type='way' ref='-41176' role='inner' />
+    <tag k='landuse' v='quarry' />
+    <tag k='test' v='parent' />
+    <tag k='type' v='multipolygon' />
+  </relation>
+</osm>
Index: /trunk/test/data/renderer/relation-parentselector/style.mapcss
===================================================================
--- /trunk/test/data/renderer/relation-parentselector/style.mapcss	(revision 12978)
+++ /trunk/test/data/renderer/relation-parentselector/style.mapcss	(revision 12978)
@@ -0,0 +1,11 @@
+canvas {
+    default-points: false;
+    default-lines: true;
+}
+
+area[landuse=quarry][test=parent] { fill-color : #aaa; }
+
+way[barrier=fence] { width: 2; color: #F0F050; }
+
+way[barrier=fence] < area[landuse=quarry][test=parent] { fill-color : #f70; }
+
Index: /trunk/test/data/renderer/way-dashes2/data.osm
===================================================================
--- /trunk/test/data/renderer/way-dashes2/data.osm	(revision 12978)
+++ /trunk/test/data/renderer/way-dashes2/data.osm	(revision 12978)
@@ -0,0 +1,37 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='false' generator='JOSM'>
+  <bounds minlat='41.7559853' minlon='-93.6024805' maxlat='41.7575434' maxlon='-93.5980518'/>
+  <node id='-39470' action='modify' lat='41.75636723733' lon='-93.60203683129' />
+  <node id='-39471' action='modify' lat='41.75650110785' lon='-93.6003818548' />
+  <node id='-39472' action='modify' lat='41.75622182388' lon='-93.60012838418' />
+  <node id='-39473' action='modify' lat='41.75673969417' lon='-93.59863786848' />
+  <node id='-39474' action='modify' lat='41.75663695627' lon='-93.60204416544' />
+  <node id='-39475' action='modify' lat='41.75677082622' lon='-93.60038918895' />
+  <node id='-39476' action='modify' lat='41.75649154343' lon='-93.60013571833' />
+  <node id='-39477' action='modify' lat='41.75700941154' lon='-93.59864520264' />
+  <node id='-39478' action='modify' lat='41.75697509339' lon='-93.60200403126' />
+  <node id='-39479' action='modify' lat='41.75710896264' lon='-93.60034905477' />
+  <node id='-39480' action='modify' lat='41.75682968132' lon='-93.60009558416' />
+  <node id='-39481' action='modify' lat='41.75734754669' lon='-93.59860506846' />
+  <way id='-39467' action='modify'>
+    <nd ref='-39470' />
+    <nd ref='-39471' />
+    <nd ref='-39472' />
+    <nd ref='-39473' />
+    <tag k='test' v='dash3' />
+  </way>
+  <way id='-39468' action='modify'>
+    <nd ref='-39474' />
+    <nd ref='-39475' />
+    <nd ref='-39476' />
+    <nd ref='-39477' />
+    <tag k='test' v='dash2' />
+  </way>
+  <way id='-39469' action='modify'>
+    <nd ref='-39478' />
+    <nd ref='-39479' />
+    <nd ref='-39480' />
+    <nd ref='-39481' />
+    <tag k='test' v='dash1' />
+  </way>
+</osm>
Index: /trunk/test/data/renderer/way-dashes2/style.mapcss
===================================================================
--- /trunk/test/data/renderer/way-dashes2/style.mapcss	(revision 12978)
+++ /trunk/test/data/renderer/way-dashes2/style.mapcss	(revision 12978)
@@ -0,0 +1,34 @@
+
+/**
+ * Dashes Test
+ * 1. Basic test - pattern should not be broken at way nodes
+ * 2. Transparent and with background color. The foreground and background dashes must not overlap.
+ * 3. Dashes offset - cuts off the first dash segment
+ */
+
+canvas {
+    default-points: false;
+    default-lines: false;
+}
+
+way[test=dash1] {
+    width: 10;
+    color: blue;
+    dashes: 30,4,17,14;
+}
+way[test=dash2] {
+    width: 10;
+    color: blue;
+    opacity: 0.3;
+    dashes: 30,4,17,14;
+    dashes-background-color: gold;
+    dashes-background-opacity: 0.3;
+}
+way[test=dash3] {
+    width: 10;
+    color: blue;
+    dashes: 30,4,17,14;
+    dashes-background-color: gold;
+    dashes-offset:30;
+}
+
Index: /trunk/test/functional/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java	(revision 12977)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java	(revision 12978)
@@ -117,5 +117,21 @@
 
                 /** Tests text along a way */
-                new TestConfig("way-text", AREA_DEFAULT)
+                new TestConfig("way-text", AREA_DEFAULT),
+
+                /** Another test for node shapes */
+                new TestConfig("node-shapes2").setImageWidth(600),
+                /** Tests default values for node shapes */
+                new TestConfig("node-shapes-default"),
+                /** Tests node shapes with both fill and stroke combined */
+                new TestConfig("node-shapes-combined"),
+                /** Another test for dashed ways */
+                new TestConfig("way-dashes2"),
+                /** Tests node text placement */
+                new TestConfig("node-text2"),
+                /** Tests relation link selector */
+                new TestConfig("relation-linkselector"),
+                /** Tests parent selector on relation */
+                new TestConfig("relation-parentselector")
+
                 ).map(e -> new Object[] {e, e.testDirectory})
                 .collect(Collectors.toList());
@@ -162,11 +178,11 @@
 
         ProjectionBounds pb = new ProjectionBounds();
-        pb.extend(Main.getProjection().latlon2eastNorth(testConfig.testArea.getMin()));
-        pb.extend(Main.getProjection().latlon2eastNorth(testConfig.testArea.getMax()));
-        double scale = (pb.maxEast - pb.minEast) / IMAGE_SIZE;
+        pb.extend(Main.getProjection().latlon2eastNorth(testConfig.getTestArea().getMin()));
+        pb.extend(Main.getProjection().latlon2eastNorth(testConfig.getTestArea().getMax()));
+        double scale = (pb.maxEast - pb.minEast) / testConfig.imageWidth;
 
         RenderingHelper.StyleData sd = new RenderingHelper.StyleData();
         sd.styleUrl = testConfig.getStyleSourceUrl();
-        RenderingHelper rh = new RenderingHelper(dataSet, testConfig.testArea, scale, Collections.singleton(sd));
+        RenderingHelper rh = new RenderingHelper(dataSet, testConfig.getTestArea(), scale, Collections.singleton(sd));
         rh.setFillBackground(false);
         BufferedImage image = rh.render();
@@ -180,6 +196,6 @@
 
         // now compute differences:
-        assertEquals(IMAGE_SIZE, reference.getWidth());
-        assertEquals(IMAGE_SIZE, reference.getHeight());
+        assertEquals(image.getWidth(), reference.getWidth());
+        assertEquals(image.getHeight(), reference.getHeight());
 
         StringBuilder differences = new StringBuilder();
@@ -246,6 +262,8 @@
     private static class TestConfig {
         private final String testDirectory;
-        private final Bounds testArea;
+        private Bounds testArea;
         private final ArrayList<String> fonts = new ArrayList<>();
+        private DataSet ds;
+        private int imageWidth = IMAGE_SIZE;
 
         TestConfig(String testDirectory, Bounds testArea) {
@@ -254,4 +272,13 @@
         }
 
+        TestConfig(String testDirectory) {
+            this.testDirectory = testDirectory;
+        }
+
+        public TestConfig setImageWidth(int imageWidth) {
+            this.imageWidth = imageWidth;
+            return this;
+        }
+
         public TestConfig usesFont(String string) {
             this.fonts.add(string);
@@ -272,5 +299,15 @@
 
         public DataSet getOsmDataSet() throws FileNotFoundException, IllegalDataException {
-            return OsmReader.parseDataSet(new FileInputStream(getTestDirectory() + "/data.osm"), null);
+            if (ds == null) {
+                ds = OsmReader.parseDataSet(new FileInputStream(getTestDirectory() + "/data.osm"), null);
+            }
+            return ds;
+        }
+
+        public Bounds getTestArea() throws FileNotFoundException, IllegalDataException {
+            if (testArea == null) {
+                testArea = getOsmDataSet().getDataSourceBounds().get(0);
+            }
+            return testArea;
         }
 
