CompositeLayerPainterTest
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/CellLayerPainterTest.xtend b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/CellLayerPainterTest.xtend
index 677ae50..6a81a53 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/CellLayerPainterTest.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/CellLayerPainterTest.xtend
@@ -3,10 +3,10 @@
 import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
 import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext
 import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AxisImpl
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
+import org.mockito.Spy
 import org.mockito.runners.MockitoJUnitRunner
 
 import static org.junit.Assert.*
@@ -18,26 +18,20 @@
 @RunWith(typeof(MockitoJUnitRunner))
 class CellLayerPainterTest {
 	
-	DummyLayer testLayer
-	@Mock GraphicsContext testGC
-	CellLayerPainter layerPainter
-	
-	@Before
-	def void before() {
-		//   100   100   100   100
-		// +-----+-----+-----+-----+
-		// | 0,0 | 1,0 | 2,0 | 3,0 | 20
-		// +-----+-----+-----+-----+
-		// | 0,1 | 1,1 | 2,1 | 3,1 | 20
-		// +-----+-----+-----+-----+
-		// | 0,2 | 1,2 | 2,2 | 3,2 | 20
-		// +-----+-----+-----+-----+
-		testLayer = spy(new DummyLayer(
+	//   100   100   100   100
+	// +-----+-----+-----+-----+
+	// | 0,0 | 1,0 | 2,0 | 3,0 | 20
+	// +-----+-----+-----+-----+
+	// | 0,1 | 1,1 | 2,1 | 3,1 | 20
+	// +-----+-----+-----+-----+
+	// | 0,2 | 1,2 | 2,2 | 3,2 | 20
+	// +-----+-----+-----+-----+
+	@Spy DummyLayer testLayer = new DummyLayer(
 			new AxisImpl(4, 100),
 			new AxisImpl(3, 20)
-		))
-		layerPainter = new CellLayerPainter
-	}
+		)
+	CellLayerPainter layerPainter = new CellLayerPainter
+	@Mock GraphicsContext testGC
 	
 	@Test
 	def void baseline() {
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/GridLineCellLayerPainterTest.xtend b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/GridLineCellLayerPainterTest.xtend
index 079b64f..294716d 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/GridLineCellLayerPainterTest.xtend
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/GridLineCellLayerPainterTest.xtend
@@ -3,7 +3,6 @@
 import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
 import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext
 import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AxisImpl
-import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mock
@@ -17,26 +16,20 @@
 @RunWith(typeof(MockitoJUnitRunner))
 class GridLineCellLayerPainterTest {
 
-	DummyLayer testLayer
-	@Mock GraphicsContext testGC
-	GridLineCellLayerPainter layerPainter
-	
-	@Before
-	def void before() {
-		//   100   100   100   100
-		// +-----+-----+-----+-----+
-		// | 0,0 | 1,0 | 2,0 | 3,0 | 20
-		// +-----+-----+-----+-----+
-		// | 0,1 | 1,1 | 2,1 | 3,1 | 20
-		// +-----+-----+-----+-----+
-		// | 0,2 | 1,2 | 2,2 | 3,2 | 20
-		// +-----+-----+-----+-----+
-		testLayer = spy(new DummyLayer(
+	//   100   100   100   100
+	// +-----+-----+-----+-----+
+	// | 0,0 | 1,0 | 2,0 | 3,0 | 20
+	// +-----+-----+-----+-----+
+	// | 0,1 | 1,1 | 2,1 | 3,1 | 20
+	// +-----+-----+-----+-----+
+	// | 0,2 | 1,2 | 2,2 | 3,2 | 20
+	// +-----+-----+-----+-----+
+	DummyLayer testLayer = new DummyLayer(
 			new AxisImpl(4, 100),
 			new AxisImpl(3, 20)
-		))
-		layerPainter = new GridLineCellLayerPainter
-	}
+		)
+	GridLineCellLayerPainter layerPainter = new GridLineCellLayerPainter
+	@Mock GraphicsContext testGC
 	
 	@Test
 	def void paintEverything() {
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayerPainterTest.xtend b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayerPainterTest.xtend
new file mode 100644
index 0000000..55180a9
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayerPainterTest.xtend
@@ -0,0 +1,84 @@
+package org.eclipse.nebula.widgets.nattable.core.layer.impl.composite
+
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea
+import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext
+import org.eclipse.nebula.widgets.nattable.core.graphics.PainterFactory
+import org.eclipse.nebula.widgets.nattable.core.layer.LayerPainter
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AxisImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.DimensionallyDependentLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.DummyLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.LayerDataAccessorImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.header.ColumnHeaderLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.header.RowHeaderLayer
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.InjectMocks
+import org.mockito.Mock
+import org.mockito.runners.MockitoJUnitRunner
+
+import static org.junit.Assert.*
+import static org.mockito.Mockito.*
+
+import static extension org.eclipse.nebula.widgets.nattable.core.layer.LayerInvariants.*
+
+@RunWith(typeof(MockitoJUnitRunner))
+class CompositeLayerPainterTest {
+
+	//  20  100   100   100   100
+	// +--+-----+-----+-----+-----+
+	// |  |     |     |     |     | 20
+	// +--+-----+-----+-----+-----+
+	// |  | 0,0 | 1,0 | 2,0 | 3,0 | 20
+	// +--+-----+-----+-----+-----+
+	// |  | 0,1 | 1,1 | 2,1 | 3,1 | 20
+	// +--+-----+-----+-----+-----+
+	// |  | 0,2 | 1,2 | 2,2 | 3,2 | 20
+	// +--+-----+-----+-----+-----+
+	DummyLayer bodyLayer = new DummyLayer(
+			new AxisImpl(4, 100),  // Horizontal axis
+			new AxisImpl(3, 20)  // Vertical axis
+		)
+	ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(bodyLayer.horizontalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | columnId ]))
+	RowHeaderLayer rowHeaderLayer = new RowHeaderLayer(bodyLayer.verticalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | rowId ]))
+	DimensionallyDependentLayer cornerLayer = new DimensionallyDependentLayer(rowHeaderLayer.horizontalAxis, columnHeaderLayer.verticalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | "" ]))
+	CompositeLayer compositeLayer = new CompositeLayer => [
+		addRow(cornerLayer, columnHeaderLayer)
+		addRow(rowHeaderLayer, bodyLayer)
+	]
+	
+	@Mock LayerPainter<DummyLayer> bodyLayerPainter
+	@Mock LayerPainter<ColumnHeaderLayer> columnHeaderLayerPainter
+	@Mock LayerPainter<RowHeaderLayer> rowHeaderLayerPainter
+	@Mock LayerPainter<DimensionallyDependentLayer> cornerLayerPainter
+	
+	@Mock PainterFactory painterFactory
+	
+	@InjectMocks CompositeLayerPainter layerPainter = new CompositeLayerPainter
+	@Mock GraphicsContext testGC
+	
+	@Before
+	def void before() {
+		when(painterFactory.getLayerPainter(bodyLayer)).thenReturn(bodyLayerPainter)
+		when(painterFactory.getLayerPainter(columnHeaderLayer)).thenReturn(columnHeaderLayerPainter)
+		when(painterFactory.getLayerPainter(rowHeaderLayer)).thenReturn(rowHeaderLayerPainter)
+		when(painterFactory.getLayerPainter(cornerLayer)).thenReturn(cornerLayerPainter)
+	}
+	
+	@Test
+	def void baseline() {
+		assertEquals(5, compositeLayer.columnCount)
+		assertEquals(4, compositeLayer.rowCount)
+		assertEquals(new PixelArea(420, 80), compositeLayer.pixelArea)
+	}
+	
+	@Test
+	def void childPixelArea() {
+		layerPainter.paintLayer(compositeLayer, compositeLayer.pixelArea, testGC)
+		verify(cornerLayerPainter).paintLayer(cornerLayer, new PixelArea(20, 20), testGC)
+		verify(columnHeaderLayerPainter).paintLayer(columnHeaderLayer, new PixelArea(400, 20), testGC)
+		verify(rowHeaderLayerPainter).paintLayer(rowHeaderLayer, new PixelArea(20, 60), testGC)
+		verify(bodyLayerPainter).paintLayer(bodyLayer, new PixelArea(400, 60), testGC)
+	}
+	
+}
\ No newline at end of file