[geos-commits] r2344 - in trunk/tests/unit: . algorithm algorithm/CGAlgorithms capi geom geom/Geometry geom/prep index/quadtree io noding operation operation/distance operation/overlay operation/union precision simplify tut util

svn_geos at osgeo.org svn_geos at osgeo.org
Thu Apr 9 17:46:30 EDT 2009


Author: mloskot
Date: 2009-04-09 17:46:30 -0400 (Thu, 09 Apr 2009)
New Revision: 2344

Added:
   trunk/tests/unit/tut/tut.hpp
   trunk/tests/unit/tut/tut_assert.hpp
   trunk/tests/unit/tut/tut_exception.hpp
   trunk/tests/unit/tut/tut_posix.hpp
   trunk/tests/unit/tut/tut_reporter.hpp
   trunk/tests/unit/tut/tut_restartable.hpp
   trunk/tests/unit/tut/tut_result.hpp
   trunk/tests/unit/tut/tut_runner.hpp
Removed:
   trunk/tests/unit/tut/Makefile.am
   trunk/tests/unit/tut/tut.h
   trunk/tests/unit/tut/tut_reporter.h
   trunk/tests/unit/tut/tut_restartable.h
Modified:
   trunk/tests/unit/Makefile.am
   trunk/tests/unit/algorithm/CGAlgorithms/computeOrientationTest.cpp
   trunk/tests/unit/algorithm/CGAlgorithms/isCCWTest.cpp
   trunk/tests/unit/algorithm/CGAlgorithms/isPointInRingTest.cpp
   trunk/tests/unit/algorithm/ConvexHullTest.cpp
   trunk/tests/unit/algorithm/PointLocatorTest.cpp
   trunk/tests/unit/capi/GEOSCoordSeqTest.cpp
   trunk/tests/unit/capi/GEOSGeomFromWKBTest.cpp
   trunk/tests/unit/capi/GEOSGeomToWKTTest.cpp
   trunk/tests/unit/capi/GEOSPolygonizer_getCutEdgesTest.cpp
   trunk/tests/unit/capi/GEOSPreparedGeometryTest.cpp
   trunk/tests/unit/capi/GEOSSimplifyTest.cpp
   trunk/tests/unit/geom/CoordinateArraySequenceFactoryTest.cpp
   trunk/tests/unit/geom/CoordinateArraySequenceTest.cpp
   trunk/tests/unit/geom/CoordinateListTest.cpp
   trunk/tests/unit/geom/CoordinateTest.cpp
   trunk/tests/unit/geom/DimensionTest.cpp
   trunk/tests/unit/geom/EnvelopeTest.cpp
   trunk/tests/unit/geom/Geometry/coversTest.cpp
   trunk/tests/unit/geom/Geometry/isRectangleTest.cpp
   trunk/tests/unit/geom/GeometryFactoryTest.cpp
   trunk/tests/unit/geom/IntersectionMatrixTest.cpp
   trunk/tests/unit/geom/LineSegmentTest.cpp
   trunk/tests/unit/geom/LineStringTest.cpp
   trunk/tests/unit/geom/LinearRingTest.cpp
   trunk/tests/unit/geom/LocationTest.cpp
   trunk/tests/unit/geom/MultiLineStringTest.cpp
   trunk/tests/unit/geom/MultiPointTest.cpp
   trunk/tests/unit/geom/MultiPolygonTest.cpp
   trunk/tests/unit/geom/PointTest.cpp
   trunk/tests/unit/geom/PolygonTest.cpp
   trunk/tests/unit/geom/TriangleTest.cpp
   trunk/tests/unit/geom/prep/PreparedGeometryFactoryTest.cpp
   trunk/tests/unit/geos_unit.cpp
   trunk/tests/unit/index/quadtree/DoubleBitsTest.cpp
   trunk/tests/unit/io/ByteOrderValuesTest.cpp
   trunk/tests/unit/io/WKBReaderTest.cpp
   trunk/tests/unit/noding/BasicSegmentStringTest.cpp
   trunk/tests/unit/noding/NodedSegmentStringTest.cpp
   trunk/tests/unit/noding/SegmentNodeTest.cpp
   trunk/tests/unit/noding/SegmentPointComparatorTest.cpp
   trunk/tests/unit/operation/IsSimpleOpTest.cpp
   trunk/tests/unit/operation/distance/DistanceOpTest.cpp
   trunk/tests/unit/operation/overlay/FuzzyPointLocatorTest.cpp
   trunk/tests/unit/operation/overlay/OffsetPointGeneratorTest.cpp
   trunk/tests/unit/operation/overlay/OverlayResultValidatorTest.cpp
   trunk/tests/unit/operation/union/CascadedPolygonUnionTest.cpp
   trunk/tests/unit/precision/GeometrySnapperTest.cpp
   trunk/tests/unit/precision/LineStringSnapperTest.cpp
   trunk/tests/unit/precision/SimpleGeometryPrecisionReducerTest.cpp
   trunk/tests/unit/simplify/DouglasPeuckerSimplifierTest.cpp
   trunk/tests/unit/simplify/TopologyPreservingSimplifierTest.cpp
   trunk/tests/unit/util/UniqueCoordinateArrayFilterTest.cpp
   trunk/tests/unit/utility.h
Log:
Updated tests/unit package with latest relase of C++ TUT Framework from 2008-11-30.

Modified: trunk/tests/unit/Makefile.am
===================================================================
--- trunk/tests/unit/Makefile.am	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/Makefile.am	2009-04-09 21:46:30 UTC (rev 2344)
@@ -1,4 +1,3 @@
-SUBDIRS = tut
 
 INCLUDES = -I$(top_srcdir)/source/headers -I$(top_srcdir)/tests/unit/tut -I$(top_builddir)/capi
 
@@ -8,7 +7,15 @@
 	capi/brokengrammar \
 	capi/test.expected \
 	capi/test.wkt \
-	capi/testrunner.sh
+	capi/testrunner.sh \
+    tut/tut_assert.hpp \
+    tut/tut_exception.hpp \
+    tut/tut.hpp \
+    tut/tut_posix.hpp \
+    tut/tut_reporter.hpp \
+    tut/tut_restartable.hpp \
+    tut/tut_result.hpp \
+    tut/tut_runner.hpp
 
 
 #noinst_PROGRAMS = geos_unit

Modified: trunk/tests/unit/algorithm/CGAlgorithms/computeOrientationTest.cpp
===================================================================
--- trunk/tests/unit/algorithm/CGAlgorithms/computeOrientationTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/algorithm/CGAlgorithms/computeOrientationTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -3,8 +3,7 @@
 // Test Suite for CGAlgorithms::computeOrientation() function
 // Ported from JTS junit/algorithm/ComputeOrientationTest.java
 
-// tut
-#include <tut.h>
+#include <tut.hpp>
 // geos
 #include <geos/algorithm/CGAlgorithms.h>
 #include <geos/geom/Coordinate.h>

Modified: trunk/tests/unit/algorithm/CGAlgorithms/isCCWTest.cpp
===================================================================
--- trunk/tests/unit/algorithm/CGAlgorithms/isCCWTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/algorithm/CGAlgorithms/isCCWTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -4,7 +4,7 @@
 // Ported from JTS junit/algorithm/IsCCWTest.java
 
 // tut
-#include <tut.h>
+#include <tut.hpp>
 // geos
 #include <geos/algorithm/CGAlgorithms.h>
 #include <geos/geom/Polygon.h>

Modified: trunk/tests/unit/algorithm/CGAlgorithms/isPointInRingTest.cpp
===================================================================
--- trunk/tests/unit/algorithm/CGAlgorithms/isPointInRingTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/algorithm/CGAlgorithms/isPointInRingTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,16 +2,16 @@
 // 
 // Test Suite for CGAlgorithms::isPointInRing() function
 
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/algorithm/CGAlgorithms.h>
 #include <geos/geom/Polygon.h>
 #include <geos/geom/Geometry.h>
 #include <geos/geom/CoordinateSequence.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/io/WKTReader.h>
-// TUT
-#include <tut.h>
-// STL
+// std
 #include <string>
 #include <cassert>
 

Modified: trunk/tests/unit/algorithm/ConvexHullTest.cpp
===================================================================
--- trunk/tests/unit/algorithm/ConvexHullTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/algorithm/ConvexHullTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -3,6 +3,8 @@
 // Test Suite for geos::algorithm::ConvexHull
 // Ported from JTS junit/algorithm/ConvexHullTest.java
 
+#include <tut.hpp>
+#include <utility.h>
 // geos
 #include <geos/algorithm/ConvexHull.h>
 #include <geos/geom/LineString.h>
@@ -17,9 +19,6 @@
 #include <sstream>
 #include <memory>
 #include <cassert>
-// tut
-#include <tut.h>
-#include <utility.h>
 
 namespace geos {
 	namespace geom {

Modified: trunk/tests/unit/algorithm/PointLocatorTest.cpp
===================================================================
--- trunk/tests/unit/algorithm/PointLocatorTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/algorithm/PointLocatorTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -3,16 +3,17 @@
 // Test Suite for geos::algorithm::PointLocator 
 // Ported from JTS junit/algorithm/PointLocator.java
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/io/WKTReader.h>
 #include <geos/algorithm/PointLocator.h>
 #include <geos/geom/PrecisionModel.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Geometry.h> // required for use in auto_ptr
 #include <geos/geom/Coordinate.h>
+// std
 #include <sstream>
+#include <string>
 #include <memory>
 
 namespace geos {

Modified: trunk/tests/unit/capi/GEOSCoordSeqTest.cpp
===================================================================
--- trunk/tests/unit/capi/GEOSCoordSeqTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/capi/GEOSCoordSeqTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,11 +2,10 @@
 // 
 // Test Suite for C-API GEOSCoordSeq
 
-// TUT
-#include <tut.h>
-// GEOS CAPI
+#include <tut.hpp>
+// geos
 #include <geos_c.h>
-// C+
+// std
 #include <cstdarg>
 #include <cstdio>
 #include <cstdlib>

Modified: trunk/tests/unit/capi/GEOSGeomFromWKBTest.cpp
===================================================================
--- trunk/tests/unit/capi/GEOSGeomFromWKBTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/capi/GEOSGeomFromWKBTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,12 +2,11 @@
 // 
 // Test Suite for C-API GEOSGeomFromWKB
 
-// TUT
-#include <tut.h>
+#include <tut.hpp>
 #include <utility.h> // wkb_hex_decoder
-// GEOS CAPI
+// geos
 #include <geos_c.h>
-// C+
+// std
 #include <string>
 #include <cstdarg>
 #include <cstdio>

Modified: trunk/tests/unit/capi/GEOSGeomToWKTTest.cpp
===================================================================
--- trunk/tests/unit/capi/GEOSGeomToWKTTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/capi/GEOSGeomToWKTTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,11 +2,10 @@
 // 
 // Test Suite for C-API GEOSGeomToWKT
 
-// TUT
-#include <tut.h>
-// GEOS CAPI
+#include <tut.hpp>
+// geos
 #include <geos_c.h>
-// C+
+// std
 #include <string>
 #include <cstdarg>
 #include <cstdio>

Modified: trunk/tests/unit/capi/GEOSPolygonizer_getCutEdgesTest.cpp
===================================================================
--- trunk/tests/unit/capi/GEOSPolygonizer_getCutEdgesTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/capi/GEOSPolygonizer_getCutEdgesTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,11 +2,10 @@
 // 
 // Test Suite for C-API GEOSPolygonizeGetCutEdges
 
-// TUT
-#include <tut.h>
-// GEOS CAPI
+#include <tut.hpp>
+// geos
 #include <geos_c.h>
-// C+
+// std
 #include <cstdarg>
 #include <cstdio>
 #include <cstdlib>

Modified: trunk/tests/unit/capi/GEOSPreparedGeometryTest.cpp
===================================================================
--- trunk/tests/unit/capi/GEOSPreparedGeometryTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/capi/GEOSPreparedGeometryTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,11 +2,10 @@
 // 
 // Test Suite for C-API GEOSPreparedGeometry
 
-// TUT
-#include <tut.h>
-// GEOS CAPI
+#include <tut.hpp>
+// geos
 #include <geos_c.h>
-// C+
+// std
 #include <cstdarg>
 #include <cstdio>
 #include <cstdlib>

Modified: trunk/tests/unit/capi/GEOSSimplifyTest.cpp
===================================================================
--- trunk/tests/unit/capi/GEOSSimplifyTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/capi/GEOSSimplifyTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,11 +2,10 @@
 // 
 // Test Suite for C-API GEOSSimplify
 
-// TUT
-#include <tut.h>
-// GEOS CAPI
+#include <tut.hpp>
+// geos
 #include <geos_c.h>
-// C+
+// std
 #include <cstdarg>
 #include <cstdio>
 #include <cstdlib>

Modified: trunk/tests/unit/geom/CoordinateArraySequenceFactoryTest.cpp
===================================================================
--- trunk/tests/unit/geom/CoordinateArraySequenceFactoryTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/CoordinateArraySequenceFactoryTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,14 +2,13 @@
 // 
 // Test Suite for geos::geom::CoordinateArraySequence class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateSequence.h>
 #include <geos/geom/CoordinateArraySequence.h>
 #include <geos/geom/CoordinateArraySequenceFactory.h>
-// STL
+// std
 #include <exception>
 #include <vector>
 
@@ -121,7 +120,7 @@
 			ensure( 0 != sequence);
 			ensure( !sequence->isEmpty() );
 			ensure_equals( sequence->size(), size2 );
-			ensure_not_equals( sequence->getAt(0), sequence->getAt(1) );
+			ensure( sequence->getAt(0) != sequence->getAt(1) );
 
 			// FREE MEMORY
 			delete sequence;

Modified: trunk/tests/unit/geom/CoordinateArraySequenceTest.cpp
===================================================================
--- trunk/tests/unit/geom/CoordinateArraySequenceTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/CoordinateArraySequenceTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,13 +2,12 @@
 // 
 // Test Suite for geos::geom::CoordinateArraySequence class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateArraySequence.h>
 #include <geos/geom/CoordinateArraySequenceFactory.h>
-// STL
+// std
 #include <string>
 #include <vector>
 
@@ -64,7 +63,7 @@
         ensure_equals( sequence.getSize(), size );
 		ensure_equals( sequence.size(), size );
 
-		ensure_not_equals( sequence.toString(), std::string("()") );
+		ensure( sequence.toString() != std::string("()") );
 
 		ensure("Every coodinate in the default sequence should be same.", sequence.hasRepeatedPoints() );
 
@@ -96,7 +95,7 @@
         ensure_equals( sequence.getSize(), size );
 		ensure_equals( sequence.size(), size );
 
-		ensure_not_equals( sequence.toString(), std::string("()") );
+		ensure( sequence.toString() != std::string("()") );
 
 		ensure("Coordinate sequence should contain unique coordinates.", !sequence.hasRepeatedPoints() );
 	}
@@ -142,7 +141,7 @@
 		// Compare non-empty original and copy using equality operators
 		ensure_equals( non_empty_original.getAt(0), non_empty_copy.getAt(0) );
 		ensure_equals( non_empty_original.getAt(1), non_empty_copy.getAt(1) );
-		ensure_not_equals( non_empty_original.getAt(0), non_empty_copy.getAt(1) );	
+		ensure( non_empty_original.getAt(0) != non_empty_copy.getAt(1) );	
 	}
 
     // Test of getX() and getY()
@@ -186,7 +185,7 @@
 		
 		ensure( !sequence.isEmpty() );
 		ensure_equals( sequence.size(), size );
-		ensure_not_equals( sequence.getAt(0), sequence.getAt(1) );
+		ensure( sequence.getAt(0) != sequence.getAt(1) );
 
 		// First version of getAt()
 		ensure_equals( sequence.getAt(0).x, 1 );
@@ -244,7 +243,7 @@
 		ensure( !sequence.hasRepeatedPoints() );
 
 		// Check elements of sequence
-		ensure_not_equals( sequence.getAt(0), sequence.getAt(1) );
+		ensure( sequence.getAt(0) != sequence.getAt(1) );
 		
 		ensure_equals( sequence.getAt(0).x, 1 );
 		ensure_equals( sequence.getAt(0).y, 2 );
@@ -332,9 +331,9 @@
 		ensure( !sequence.isEmpty() );
 		ensure_equals( sequence.size(), sizeTwo );
 		
-		ensure_not_equals( sequence.getAt(0), sequence.getAt(1) );
+		ensure( sequence.getAt(0) != sequence.getAt(1) );
 		ensure_equals( sequence.getAt(0), first );
-		ensure_not_equals( "deleteAt() did not remove coordinate.", sequence.getAt(1), second );
+		ensure( "deleteAt() did not remove coordinate.", sequence.getAt(1) != second );
 		ensure_equals( sequence.getAt(1), third );
 	}
 
@@ -440,8 +439,8 @@
 		// Add a new coordinate to sequence2
 		sequence2.add(c3);
 
-		ensure_not_equals( sequence1, sequence2 );
-		ensure_not_equals( sequence2, sequence1 );
+		ensure( sequence1 != sequence2 );
+		ensure( sequence2 != sequence1 );
 
 		// Add a new coordinate to sequence1
 		sequence1.add(c3);
@@ -453,8 +452,8 @@
 		sequence1.add(c3);
 		sequence2.add(c2);
 
-		ensure_not_equals( sequence1, sequence2 );
-		ensure_not_equals( sequence2, sequence1 );
+		ensure( sequence1 != sequence2 );
+		ensure( sequence2 != sequence1 );
 
 	}
 

Modified: trunk/tests/unit/geom/CoordinateListTest.cpp
===================================================================
--- trunk/tests/unit/geom/CoordinateListTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/CoordinateListTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,13 +2,14 @@
 // 
 // Test Suite for geos::geom::CoordinateList class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateList.h>
 #include <geos/geom/CoordinateArraySequence.h>
-// STL
+// std
+#include <memory>
 #include <string>
 #include <vector>
 

Modified: trunk/tests/unit/geom/CoordinateTest.cpp
===================================================================
--- trunk/tests/unit/geom/CoordinateTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/CoordinateTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,8 @@
 // 
 // Test Suite for geos::geom::Coordinate class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/geom/Coordinate.h>
 
 namespace tut
@@ -96,7 +95,7 @@
         ensure_equals( original, copy );
 
         copy.x += 3.14; // permutation
-        ensure_not_equals( original, copy );
+        ensure( original != copy );
     }
 
     // Test of equals()
@@ -153,7 +152,7 @@
         second.x += 10.0;
         second.y += 10.0;
         second.z += 10.0;
-        ensure_not_equals( first.distance( second ), 0 );
+        ensure( first.distance( second ) != 0 );
         ensure_equals( first.distance( second ), second.distance( first ) );
         // TODO - mloskot - I'm not sure if this will work on every platform.
         // In case of any problems, just remove it.

Modified: trunk/tests/unit/geom/DimensionTest.cpp
===================================================================
--- trunk/tests/unit/geom/DimensionTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/DimensionTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::geom::Location class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/geom/Dimension.h>
 #include <geos/util/IllegalArgumentException.h>
 #include <geos/util.h>

Modified: trunk/tests/unit/geom/EnvelopeTest.cpp
===================================================================
--- trunk/tests/unit/geom/EnvelopeTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/EnvelopeTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::geom::Envelope class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/geom/Envelope.h>
 #include <geos/geom/Coordinate.h>
 

Modified: trunk/tests/unit/geom/Geometry/coversTest.cpp
===================================================================
--- trunk/tests/unit/geom/Geometry/coversTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/Geometry/coversTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,15 +2,16 @@
 // 
 // Test Suite for Geometry's covers() and coveredBy() functions
 
-// TUT
-#include <tut.h>
-// STL
-#include <string>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Geometry.h>
 #include <geos/geom/Polygon.h>
 #include <geos/io/WKTReader.h>
+// std
+#include <memory>
+#include <string>
 
 namespace tut {
 

Modified: trunk/tests/unit/geom/Geometry/isRectangleTest.cpp
===================================================================
--- trunk/tests/unit/geom/Geometry/isRectangleTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/Geometry/isRectangleTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,15 +2,15 @@
 // 
 // Test Suite for Geometry::isRectangle() function
 
-// TUT
-#include <tut.h>
-// STL
-#include <string>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Geometry.h>
 #include <geos/geom/Polygon.h>
 #include <geos/io/WKTReader.h>
+// std
+#include <string>
 
 namespace tut
 {

Modified: trunk/tests/unit/geom/GeometryFactoryTest.cpp
===================================================================
--- trunk/tests/unit/geom/GeometryFactoryTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/GeometryFactoryTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,6 +2,9 @@
 // 
 // Test Suite for geos::geom::GeometryFactory class.
 
+// tut
+#include <tut.hpp>
+#include <utility.h>
 // geos
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/GeometryCollection.h>
@@ -23,9 +26,6 @@
 // std
 #include <vector>
 #include <cstring> // std::size_t
-// tut
-#include <tut.h>
-#include <utility.h>
 
 /*!
  * \brief
@@ -701,7 +701,7 @@
 		ensure_equals( exterior->getBoundaryDimension(), geos::geom::Dimension::False );
 		ensure_equals( exterior->getNumPoints(), size );
 		ensure_equals( exterior->getArea(), 0.0 );
-		ensure_not_equals( exterior->getLength(), 0.0 );
+		ensure( exterior->getLength() != 0.0 );
 
 		// Create polygon
 		PolygonPtr poly = factory_.createPolygon(exterior, 0);
@@ -712,8 +712,8 @@
 		ensure_equals( poly->getDimension(), geos::geom::Dimension::A );
 		ensure_equals( poly->getBoundaryDimension(), geos::geom::Dimension::L );
 		ensure_equals( poly->getNumPoints(), size );
-		ensure_not_equals( poly->getArea(), 0.0 );
-		ensure_not_equals( poly->getLength(), 0.0 );
+		ensure( poly->getArea() != 0.0 );
+		ensure( poly->getLength() != 0.0 );
 
 		// FREE MEMORY
 		factory_.destroyGeometry(poly);	
@@ -750,7 +750,7 @@
 		ensure_equals( exterior->getBoundaryDimension(), geos::geom::Dimension::False );
 		ensure_equals( exterior->getNumPoints(), exteriorSize );
 		ensure_equals( exterior->getArea(), 0.0 );
-		ensure_not_equals( exterior->getLength(), 0.0 );
+		ensure( exterior->getLength() != 0.0 );
 
 		// Create collection of holes
 		GeometryPtr geo = reader_.read(("LINEARRING(7 7, 12 7, 12 12, 7 12, 7 7)"));
@@ -773,8 +773,8 @@
 		ensure_equals( poly->getDimension(), geos::geom::Dimension::A );
 		ensure_equals( poly->getBoundaryDimension(), geos::geom::Dimension::L );
 		ensure_equals( poly->getNumPoints(), exteriorSize + interiorSize );
-		ensure_not_equals( poly->getArea(), 0.0 );
-		ensure_not_equals( poly->getLength(), 0.0 );
+		ensure( poly->getArea() != 0.0 );
+		ensure( poly->getLength() != 0.0 );
 
 		ensure_equals( poly->getNumGeometries(), 1u );
 		ensure_equals( poly->getNumInteriorRing(), 1u );

Modified: trunk/tests/unit/geom/IntersectionMatrixTest.cpp
===================================================================
--- trunk/tests/unit/geom/IntersectionMatrixTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/IntersectionMatrixTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,12 +2,11 @@
 // 
 // Test Suite for geos::geom::IntersectionMatrix class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/geom/IntersectionMatrix.h>
 #include <geos/geom/Dimension.h>
-// STL
+// std
 #include <memory> 
 #include <string>
 #include <sstream>
@@ -220,7 +219,7 @@
 		const std::string pattern_expected("FFF012FFF");
 		
 		im_.setAtLeast(pattern_new);
-		ensure_not_equals( im_.toString(), pattern_false_);
+		ensure( im_.toString() != pattern_false_);
 		ensure_equals( im_.toString(), pattern_expected);
 		
 		// 3. Set old pattern, no change expected
@@ -256,7 +255,7 @@
 
 		// 1. No change expected
 		im_.setAtLeast(0, 0, geos::geom::Dimension::A);
-		ensure_not_equals( im_.toString(), pattern_false_);
+		ensure( im_.toString() != pattern_false_);
 		ensure_equals( im_.get(0, 0), geos::geom::Dimension::A);
 	}
 	
@@ -502,13 +501,13 @@
     template<>
 	void object::test<27>()
 	{
-		ensure_not_equals( "0*01T12F2", im_.toString() );
+		ensure( im_.toString() != "0*01T12F2" );
 		ensure_equals( "FFFFFFFFF", im_.toString() );
 
 		std::stringstream ss;
 		ss << im_;
 
-		ensure_not_equals( "0*01T12F2", ss.str() );
+		ensure( ss.str() != "0*01T12F2" );
 		ensure_equals( "FFFFFFFFF", ss.str() );
 	}
 

Modified: trunk/tests/unit/geom/LineSegmentTest.cpp
===================================================================
--- trunk/tests/unit/geom/LineSegmentTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/LineSegmentTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,12 +2,11 @@
 // 
 // Test Suite for geos::geom::LineSegment class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/geom/LineSegment.h>
 #include <geos/geom/Coordinate.h>
-
+// std
 #include <iostream>
 
 namespace tut

Modified: trunk/tests/unit/geom/LineStringTest.cpp
===================================================================
--- trunk/tests/unit/geom/LineStringTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/LineStringTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,6 +2,9 @@
 // 
 // Test Suite for geos::geom::LineString class.
 
+// tut
+#include <tut.hpp>
+#include <utility.h>
 // geos
 #include <geos/geom/LineString.h>
 #include <geos/geom/Coordinate.h>
@@ -13,9 +16,6 @@
 #include <geos/io/WKTReader.h>
 #include <geos/util/GEOSException.h>
 #include <geos/util/IllegalArgumentException.h>
-// tut
-#include <tut.h>
-#include <utility.h>
 // std 
 #include <string>
 #include <cmath>
@@ -131,7 +131,7 @@
 		ensure_equals( ls->getBoundaryDimension(), geos::geom::Dimension::P );
 		ensure_equals( ls->getNumPoints(), size3 );
 		ensure_equals( ls->getArea(), 0.0 );
-		ensure_not_equals( ls->getLength(), 0.0 );
+		ensure( ls->getLength() != 0.0 );
 	}
 
 	// Test of incomplete LineString user's constructor throwing the IllegalArgumentException
@@ -218,7 +218,7 @@
 		ensure_equals( copy->getBoundaryDimension(), geos::geom::Dimension::P );
 		ensure_equals( copy->getNumPoints(), size );
 		ensure_equals( copy->getArea(), 0.0 );
-		ensure_not_equals( copy->getLength(), 0.0 );
+		ensure( copy->getLength() != 0.0 );
 	}
 
     // Test of isClosed() and isRing() for empty linestring
@@ -466,7 +466,7 @@
 		GeometryPtr geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)");
 		ensure( geo != 0 );
 
-		ensure_not_equals( geo->getLength(), 0.0 );
+		ensure( geo->getLength() != 0.0 );
 
 		const double diff = std::fabs(geo->getLength() - expected);
 		ensure( diff <= tolerance );

Modified: trunk/tests/unit/geom/LinearRingTest.cpp
===================================================================
--- trunk/tests/unit/geom/LinearRingTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/LinearRingTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::geom::LinearRing class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/geom/LinearRing.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateArraySequence.h>
@@ -13,8 +13,10 @@
 #include <geos/geom/PrecisionModel.h>
 #include <geos/io/WKTReader.h>
 #include <geos/util/IllegalArgumentException.h>
-// STL
+// std
 #include <cmath>
+#include <memory>
+#include <string>
 
 namespace tut
 {
@@ -354,7 +356,7 @@
     void object::test<26>()
 	{
 		ensure(ring_ != 0);
-		ensure_not_equals( ring_->getLength(), 0.0 );
+		ensure( ring_->getLength() != 0.0 );
 
 		const double tolerance = 0.0001;
 		const double expected = 38.284271247461902;

Modified: trunk/tests/unit/geom/LocationTest.cpp
===================================================================
--- trunk/tests/unit/geom/LocationTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/LocationTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::geom::Location class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/geom/Location.h>
 #include <geos/util/IllegalArgumentException.h>
 

Modified: trunk/tests/unit/geom/MultiLineStringTest.cpp
===================================================================
--- trunk/tests/unit/geom/MultiLineStringTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/MultiLineStringTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,10 +2,9 @@
 // 
 // Test Suite for geos::geom::MultiLineString class.
 
+#include <tut.hpp>
 // geos
 #include <geos/geom/MultiLineString.h>
-// tut
-#include <tut.h>
 
 namespace tut
 {

Modified: trunk/tests/unit/geom/MultiPointTest.cpp
===================================================================
--- trunk/tests/unit/geom/MultiPointTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/MultiPointTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,6 +2,9 @@
 // 
 // Test Suite for geos::geom::MultiPoint class.
 
+// tut
+#include <tut.hpp>
+#include <utility.h>
 // geos
 #include <geos/geom/MultiPoint.h>
 #include <geos/geom/Dimension.h>
@@ -12,9 +15,6 @@
 #include <geos/io/WKTReader.h>
 // std
 #include <cmath>
-// tut
-#include <tut.h>
-#include <utility.h>
 
 namespace tut
 {

Modified: trunk/tests/unit/geom/MultiPolygonTest.cpp
===================================================================
--- trunk/tests/unit/geom/MultiPolygonTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/MultiPolygonTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,8 @@
 // 
 // Test Suite for geos::geom::MultiPolygon class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/geom/MultiPolygon.h>
 
 namespace tut

Modified: trunk/tests/unit/geom/PointTest.cpp
===================================================================
--- trunk/tests/unit/geom/PointTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/PointTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,8 @@
 // 
 // Test Suite for geos::geom::Point class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/geom/Point.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateArraySequence.h>
@@ -14,7 +13,11 @@
 #include <geos/geom/PrecisionModel.h>
 #include <geos/io/WKTReader.h>
 #include <geos/util/IllegalArgumentException.h>
+// std
+#include <memory>
+#include <string>
 
+
 namespace tut
 {
     //

Modified: trunk/tests/unit/geom/PolygonTest.cpp
===================================================================
--- trunk/tests/unit/geom/PolygonTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/PolygonTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,6 +2,8 @@
 // 
 // Test Suite for geos::geom::Polygon class.
 
+#include <tut.hpp>
+#include <utility.h>
 // geos
 #include <geos/geom/Polygon.h>
 #include <geos/geom/Coordinate.h>
@@ -17,10 +19,8 @@
 #include <geos/util/IllegalArgumentException.h>
 // std
 #include <cmath>
+#include <memory>
 #include <string>
-// tut
-#include <tut.h>
-#include <utility.h>
 
 namespace tut
 {
@@ -345,7 +345,7 @@
     void object::test<24>()
 	{
 		ensure( poly_ != 0 );
-		ensure_not_equals( poly_->getLength(), 0.0 );
+		ensure( poly_->getLength() != 0.0 );
 
 		const double tolerance = 0.0001;
 		const double expected = 38.284271247461902;
@@ -359,7 +359,7 @@
     void object::test<25>()
 	{
 		ensure( poly_ != 0 );
-		ensure_not_equals( poly_->getArea(), 0.0 );
+		ensure( poly_->getArea() != 0.0 );
 	}
 	
 	// Test of getCoordinates() for non-empty Polygon

Modified: trunk/tests/unit/geom/TriangleTest.cpp
===================================================================
--- trunk/tests/unit/geom/TriangleTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/TriangleTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::geom::Triangle class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/geom/Triangle.h>
 #include <geos/geom/Coordinate.h>
 
@@ -94,9 +94,9 @@
 		ensure_equals( copy.p0, a );
 		ensure_equals( copy.p1, b );
 		ensure_equals( copy.p2, c );
-		ensure_not_equals( copy.p0, d );
-		ensure_not_equals( copy.p1, e );
-		ensure_not_equals( copy.p2, f );
+		ensure( copy.p0 != d );
+		ensure( copy.p1 != e );
+		ensure( copy.p2 != f );
 	}
 
     // Test of inCenter()

Modified: trunk/tests/unit/geom/prep/PreparedGeometryFactoryTest.cpp
===================================================================
--- trunk/tests/unit/geom/prep/PreparedGeometryFactoryTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geom/prep/PreparedGeometryFactoryTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,6 +2,9 @@
 // 
 // Test Suite for geos::geom::prep::PreparedGeometryFactory class.
 
+// tut
+#include <tut.hpp>
+#include <utility.h>
 // geos
 #include <geos/geom/prep/PreparedGeometryFactory.h>
 #include <geos/geom/prep/PreparedGeometry.h>
@@ -13,9 +16,6 @@
 // std
 #include <vector>
 #include <cstring> // std::size_t
-// tut
-#include <tut.h>
-#include <utility.h>
 
 using namespace geos::geom;
 

Modified: trunk/tests/unit/geos_unit.cpp
===================================================================
--- trunk/tests/unit/geos_unit.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/geos_unit.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -4,15 +4,15 @@
 #endif
 #endif
 
-// TUT
-#include <tut.h>
-#include <tut_reporter.h>
-// STL
-#include <iostream>
-#include <iomanip>
-#include <cstdlib>
-// GEOS
+// tut
+#include <tut.hpp>
+#include <tut_reporter.hpp>
+// geos 
 #include <geos/unload.h>
+// std
+#include <cstdlib>
+#include <iomanip>
+#include <iostream>
 
 namespace tut
 {
@@ -21,32 +21,32 @@
 
 void usage()
 {
-	using std::cout;
-	using std::endl;
+    using std::cout;
+    using std::endl;
 
-	const std::string module("geos_unit");
+    const std::string module("geos_unit");
 
-	//[list] | [ group] [test]
-	cout << "Usage: " << module << " [OPTION] [TARGET]\n"
-		<< endl
-		<< "Targets:\n"
-		<< "  <none>                          run all tests in all groups\n"
-		<< "  <group name>                    run all tests from given group\n"
-		<< "  <group name> <test nr>          run single test with given number from given group\n"
-		<< endl
-		<< "Options:\n"
-		<< "  --list                          list all registered test groups\n"
-		<< "  --verbose                       run unit tests verbosely; displays non-error information\n"
-		<< "  --version                       print version information and exit\n"
-		<< "  --help                          print this message and exit\n"
-		<< endl
-		<< "Examples:\n"
-		<< "  " << module << " -v\n"
-		<< "  " << module << " list\n"
-		<< "  " << module << " geos::geom::Envelope\n"
-		<< "  " << module << " geos::geom::Envelope 2\n"
-		<< endl
-		<< "GEOS homepage: http://geos.refractions.net" << endl;
+    //[list] | [ group] [test]
+    cout << "Usage: " << module << " [OPTION] [TARGET]\n"
+        << endl
+        << "Targets:\n"
+        << "  <none>                          run all tests in all groups\n"
+        << "  <group name>                    run all tests from given group\n"
+        << "  <group name> <test nr>          run single test with given number from given group\n"
+        << endl
+        << "Options:\n"
+        << "  --list                          list all registered test groups\n"
+        << "  --verbose                       run unit tests verbosely; displays non-error information\n"
+        << "  --version                       print version information and exit\n"
+        << "  --help                          print this message and exit\n"
+        << endl
+        << "Examples:\n"
+        << "  " << module << " -v\n"
+        << "  " << module << " list\n"
+        << "  " << module << " geos::geom::Envelope\n"
+        << "  " << module << " geos::geom::Envelope 2\n"
+        << endl
+        << "GEOS homepage: http://geos.refractions.net" << endl;
 }
 
 int main(int argc, const char* argv[])
@@ -60,8 +60,8 @@
     }
 
     std::cout << "===============================\n"
-			  << "  GEOS Test Suite Application\n"
-			  << "===============================\n";
+              << "  GEOS Test Suite Application\n"
+              << "===============================\n";
 
     tut::runner.get().set_callback(&visi);
 
@@ -107,18 +107,7 @@
     // XXX - mloskot - this should be removed in future!
     geos::io::Unload::Release();
 
-	// Check failures number and signal them the World
-	int failures = visi.get_failures_count();
-	if (failures > 0)
-    {
-        // Return number of failures as an error code
-        return failures;
-    }
-    else
-    {
-       return 0;
-    }
-	
-} // main
+    return (visi.all_ok() ? EXIT_SUCCESS : EXIT_FAILURE);
+    
+}
 
-

Modified: trunk/tests/unit/index/quadtree/DoubleBitsTest.cpp
===================================================================
--- trunk/tests/unit/index/quadtree/DoubleBitsTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/index/quadtree/DoubleBitsTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,8 @@
 // 
 // Test Suite for geos::index::quadtree::DoubleBits class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/index/quadtree/DoubleBits.h>
 
 using namespace geos::index::quadtree;

Modified: trunk/tests/unit/io/ByteOrderValuesTest.cpp
===================================================================
--- trunk/tests/unit/io/ByteOrderValuesTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/io/ByteOrderValuesTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,11 +2,12 @@
 // 
 // Test Suite for geos::io::ByteOrderValues 
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/io/ByteOrderValues.h>
 #include <geos/platform.h> // for int64
+// std
 #include <sstream>
 #include <memory>
 

Modified: trunk/tests/unit/io/WKBReaderTest.cpp
===================================================================
--- trunk/tests/unit/io/WKBReaderTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/io/WKBReaderTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -6,9 +6,9 @@
 // Currently only tests 2D geoms of all (7) types.
 // Tests NDR and XDR input and output .
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/io/WKBReader.h>
 #include <geos/io/WKBConstants.h>
 #include <geos/io/WKBWriter.h>
@@ -16,7 +16,9 @@
 #include <geos/geom/PrecisionModel.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Geometry.h>
+// std
 #include <sstream>
+#include <string>
 #include <memory>
 
 namespace tut

Modified: trunk/tests/unit/noding/BasicSegmentStringTest.cpp
===================================================================
--- trunk/tests/unit/noding/BasicSegmentStringTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/noding/BasicSegmentStringTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -1,15 +1,15 @@
-// $Id@
+// $Id$
 // 
 // Test Suite for geos::noding::BasicSegmentString class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/noding/BasicSegmentString.h>
 #include <geos/noding/Octant.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateSequence.h>
 #include <geos/geom/CoordinateArraySequenceFactory.h>
+// std
 #include <memory>
 
 namespace tut

Modified: trunk/tests/unit/noding/NodedSegmentStringTest.cpp
===================================================================
--- trunk/tests/unit/noding/NodedSegmentStringTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/noding/NodedSegmentStringTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,14 +2,14 @@
 // 
 // Test Suite for geos::noding::NodedSegmentString class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/noding/NodedSegmentString.h>
 #include <geos/noding/Octant.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateSequence.h>
 #include <geos/geom/CoordinateArraySequenceFactory.h>
+// std
 #include <memory>
 
 namespace tut
@@ -22,32 +22,32 @@
     struct test_nodedsegmentstring_data
     {
 
-    	typedef std::auto_ptr<geos::geom::CoordinateSequence> \
-		CoordinateSequenceAutoPtr;
+        typedef std::auto_ptr<geos::geom::CoordinateSequence> \
+        CoordinateSequenceAutoPtr;
 
-    	typedef std::auto_ptr<geos::noding::NodedSegmentString> \
-		SegmentStringAutoPtr;
-	
-	const geos::geom::CoordinateSequenceFactory* csFactory;
+        typedef std::auto_ptr<geos::noding::NodedSegmentString> \
+        SegmentStringAutoPtr;
+    
+    const geos::geom::CoordinateSequenceFactory* csFactory;
 
-	SegmentStringAutoPtr
-	makeSegmentString(geos::geom::CoordinateSequence* cs, void *d = 0)
-	{
-		return SegmentStringAutoPtr(
-			new geos::noding::NodedSegmentString(cs, d)
-			);
-	}
+    SegmentStringAutoPtr
+    makeSegmentString(geos::geom::CoordinateSequence* cs, void *d = 0)
+    {
+        return SegmentStringAutoPtr(
+            new geos::noding::NodedSegmentString(cs, d)
+            );
+    }
 
-	test_nodedsegmentstring_data()
-		:
-		csFactory(geos::geom::CoordinateArraySequenceFactory::instance())
-	{
-	}
-	
-	~test_nodedsegmentstring_data()
-	{
-	}
+    test_nodedsegmentstring_data()
+        :
+        csFactory(geos::geom::CoordinateArraySequenceFactory::instance())
+    {
+    }
 
+    ~test_nodedsegmentstring_data()
+    {
+    }
+
     };
 
     typedef test_group<test_nodedsegmentstring_data> group;
@@ -64,44 +64,46 @@
     template<>
     void object::test<1>()
     {
-    	CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
+        CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
 
-	ensure(cs.get());
+        ensure(cs.get());
 
-	geos::geom::Coordinate c0(0, 0);
-	geos::geom::Coordinate c1(0, 0);
+        geos::geom::Coordinate c0(0, 0);
+        geos::geom::Coordinate c1(0, 0);
 
-	cs->add(c0);
-	cs->add(c1);
+        cs->add(c0);
+        cs->add(c1);
 
-	ensure_equals(cs->size(), 2u);
+        ensure_equals(cs->size(), 2u);
 
-	SegmentStringAutoPtr ss(makeSegmentString(cs.get()));
-	ensure(ss.get());
+        SegmentStringAutoPtr ss(makeSegmentString(cs.get()));
+        ensure(ss.get());
 
-	ensure_equals(ss->size(), 2u);
+        ensure_equals(ss->size(), 2u);
 
-	ensure_equals(ss->getData(), (void*)0);
+        ensure_equals(ss->getData(), (void*)0);
 
-	ensure_equals(ss->getCoordinates(), cs.get());
+        ensure_equals(ss->getCoordinates(), cs.get());
 
-	ensure_equals(ss->getCoordinate(0), c0);
+        ensure_equals(ss->getCoordinate(0), c0);
 
-	ensure_equals(ss->getCoordinate(1), c1);
+        ensure_equals(ss->getCoordinate(1), c1);
 
-	ensure_equals(ss->isClosed(), true);
+        ensure_equals(ss->isClosed(), true);
 
-	ensure_equals(ss->getNodeList().size(), 0u);
+        ensure_equals(ss->getNodeList().size(), 0u);
 
-	// this would throw an exception
-	bool octant_failed=false;
-	try {
-		ss->getSegmentOctant(0);
-	} catch (...) {
-		octant_failed=true;
-	}
-	ensure(octant_failed);
-
+        // this would throw an exception
+        bool octant_failed=false;
+        try
+        {
+            ss->getSegmentOctant(0);
+        }
+        catch (...)
+        {
+            octant_failed=true;
+        }
+        ensure(octant_failed);
     }
 
     // test constructor with 2 different points
@@ -109,36 +111,36 @@
     template<>
     void object::test<2>()
     {
-    	CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
+        CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
 
-	ensure(cs.get());
+    ensure(cs.get());
 
-	geos::geom::Coordinate c0(0, 0);
-	geos::geom::Coordinate c1(1, 0);
+    geos::geom::Coordinate c0(0, 0);
+    geos::geom::Coordinate c1(1, 0);
 
-	cs->add(c0);
-	cs->add(c1);
+    cs->add(c0);
+    cs->add(c1);
 
-	ensure_equals(cs->size(), 2u);
+    ensure_equals(cs->size(), 2u);
 
-	SegmentStringAutoPtr ss(makeSegmentString(cs.get()));
-	ensure(ss.get());
+    SegmentStringAutoPtr ss(makeSegmentString(cs.get()));
+    ensure(ss.get());
 
-	ensure_equals(ss->size(), 2u);
+    ensure_equals(ss->size(), 2u);
 
-	ensure_equals(ss->getData(), (void*)0);
+    ensure_equals(ss->getData(), (void*)0);
 
-	ensure_equals(ss->getCoordinates(), cs.get());
+    ensure_equals(ss->getCoordinates(), cs.get());
 
-	ensure_equals(ss->getCoordinate(0), c0);
+    ensure_equals(ss->getCoordinate(0), c0);
 
-	ensure_equals(ss->getCoordinate(1), c1);
+    ensure_equals(ss->getCoordinate(1), c1);
 
-	ensure_equals(ss->isClosed(), false);
+    ensure_equals(ss->isClosed(), false);
 
-	ensure_equals(ss->getSegmentOctant(0), 0);
+    ensure_equals(ss->getSegmentOctant(0), 0);
 
-	ensure_equals(ss->getNodeList().size(), 0u);
+    ensure_equals(ss->getNodeList().size(), 0u);
     }
 
     // test constructor with 4 different points forming a ring
@@ -146,136 +148,136 @@
     template<>
     void object::test<3>()
     {
-    	CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
+        CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
 
-	ensure(cs.get());
+    ensure(cs.get());
 
-	geos::geom::Coordinate c0(0, 0);
-	geos::geom::Coordinate c1(1, 0);
-	geos::geom::Coordinate c2(1, 1);
+    geos::geom::Coordinate c0(0, 0);
+    geos::geom::Coordinate c1(1, 0);
+    geos::geom::Coordinate c2(1, 1);
 
-	cs->add(c0);
-	cs->add(c1);
-	cs->add(c2);
-	cs->add(c0);
+    cs->add(c0);
+    cs->add(c1);
+    cs->add(c2);
+    cs->add(c0);
 
-	ensure_equals(cs->size(), 4u);
+    ensure_equals(cs->size(), 4u);
 
-	SegmentStringAutoPtr ss(makeSegmentString(cs.get()));
-	ensure(ss.get());
+    SegmentStringAutoPtr ss(makeSegmentString(cs.get()));
+    ensure(ss.get());
 
-	ensure_equals(ss->size(), 4u);
+    ensure_equals(ss->size(), 4u);
 
-	ensure_equals(ss->getData(), (void*)0);
+    ensure_equals(ss->getData(), (void*)0);
 
-	ensure_equals(ss->getCoordinates(), cs.get());
+    ensure_equals(ss->getCoordinates(), cs.get());
 
-	ensure_equals(ss->getCoordinate(0), c0);
+    ensure_equals(ss->getCoordinate(0), c0);
 
-	ensure_equals(ss->getCoordinate(1), c1);
+    ensure_equals(ss->getCoordinate(1), c1);
 
-	ensure_equals(ss->getCoordinate(2), c2);
+    ensure_equals(ss->getCoordinate(2), c2);
 
-	ensure_equals(ss->getCoordinate(3), c0);
+    ensure_equals(ss->getCoordinate(3), c0);
 
-	ensure_equals(ss->isClosed(), true);
+    ensure_equals(ss->isClosed(), true);
 
-	ensure_equals(ss->getSegmentOctant(2), 4);
+    ensure_equals(ss->getSegmentOctant(2), 4);
 
-	ensure_equals(ss->getSegmentOctant(1), 1);
+    ensure_equals(ss->getSegmentOctant(1), 1);
 
-	ensure_equals(ss->getSegmentOctant(0), 0);
+    ensure_equals(ss->getSegmentOctant(0), 0);
 
-	ensure_equals(ss->getNodeList().size(), 0u);
+    ensure_equals(ss->getNodeList().size(), 0u);
     }
 
-	// test Octant class
-	template<>
-	template<>
-	void object::test<4>()
-	{
-		geos::geom::Coordinate p0(0, 0);
-		geos::geom::Coordinate p1(5,-5);
-		int octant_rc1 = 0;
-		int octant_rc2 = 0;
-		int testPassed = true;
-		try {
-			octant_rc1 = geos::noding::Octant::octant(p0,p1);
-			octant_rc2 = geos::noding::Octant::octant(&p0,&p1);
-			testPassed = (octant_rc1 == octant_rc2);
-		}
-		catch (...) {
-			testPassed = false;
-		}
-		ensure(testPassed);
-	}
+    // test Octant class
+    template<>
+    template<>
+    void object::test<4>()
+    {
+        geos::geom::Coordinate p0(0, 0);
+        geos::geom::Coordinate p1(5,-5);
+        int octant_rc1 = 0;
+        int octant_rc2 = 0;
+        int testPassed = true;
+        try {
+            octant_rc1 = geos::noding::Octant::octant(p0,p1);
+            octant_rc2 = geos::noding::Octant::octant(&p0,&p1);
+            testPassed = (octant_rc1 == octant_rc2);
+        }
+        catch (...) {
+            testPassed = false;
+        }
+        ensure(testPassed);
+    }
 
-	// test adding intersections
-	template<>
-	template<>
-	void object::test<5>()
-	{
-		geos::geom::Coordinate p0(0, 0);
-		geos::geom::Coordinate p1(10, 0);
+    // test adding intersections
+    template<>
+    template<>
+    void object::test<5>()
+    {
+        geos::geom::Coordinate p0(0, 0);
+        geos::geom::Coordinate p1(10, 0);
 
 
-		CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
-		cs->add(p0);
-		cs->add(p1);
+        CoordinateSequenceAutoPtr cs(csFactory->create(0, 2));
+        cs->add(p0);
+        cs->add(p1);
 
-		SegmentStringAutoPtr ss(makeSegmentString(cs.get()));
+        SegmentStringAutoPtr ss(makeSegmentString(cs.get()));
 
-		ensure_equals(ss->getNodeList().size(), 0u);
+        ensure_equals(ss->getNodeList().size(), 0u);
 
-		// the intersection is invalid, but SegmentString trusts us
-		ss->addIntersection(p0, 0);
-		ensure_equals(ss->getNodeList().size(), 1u);
+        // the intersection is invalid, but SegmentString trusts us
+        ss->addIntersection(p0, 0);
+        ensure_equals(ss->getNodeList().size(), 1u);
 
-		// This node is already present, so shouldn't be
-		// accepted as a new one
-		ss->addIntersection(p0, 0);
-		ensure_equals(ss->getNodeList().size(), 1u);
+        // This node is already present, so shouldn't be
+        // accepted as a new one
+        ss->addIntersection(p0, 0);
+        ensure_equals(ss->getNodeList().size(), 1u);
 
-		ss->addIntersection(p1, 0);
-		ensure_equals(ss->getNodeList().size(), 2u);
+        ss->addIntersection(p1, 0);
+        ensure_equals(ss->getNodeList().size(), 2u);
 
-		ss->addIntersection(p1, 0);
-		ensure_equals(ss->getNodeList().size(), 2u);
+        ss->addIntersection(p1, 0);
+        ensure_equals(ss->getNodeList().size(), 2u);
 
-		ss->addIntersection(p0, 0);
-		ensure_equals(ss->getNodeList().size(), 2u);
+        ss->addIntersection(p0, 0);
+        ensure_equals(ss->getNodeList().size(), 2u);
 
-	}
+    }
 
-	// TODO: test getting noded substrings
-//	template<>
-//	template<>
-//	void object::test<6>()
-//	{
-//		geos::geom::Coordinate cs1p0(0, 0);
-//		geos::geom::Coordinate cs1p1(10, 0);
-//		CoordinateSequenceAutoPtr cs1(csFactory->create(0, 2));
-//		cs1->add(cs1p0);
-//		cs1->add(cs1p1);
+    // TODO: test getting noded substrings
+//  template<>
+//  template<>
+//  void object::test<6>()
+//  {
+//      geos::geom::Coordinate cs1p0(0, 0);
+//      geos::geom::Coordinate cs1p1(10, 0);
+//      CoordinateSequenceAutoPtr cs1(csFactory->create(0, 2));
+//      cs1->add(cs1p0);
+//      cs1->add(cs1p1);
 //
-//		geos::geom::Coordinate cs2p0(5, -5);
-//		geos::geom::Coordinate cs2p1(5, 5);
-//		CoordinateSequenceAutoPtr cs2(csFactory->create(0, 2));
-//		cs2->add(cs2p0);
-//		cs2->add(cs2p1);
+//      geos::geom::Coordinate cs2p0(5, -5);
+//      geos::geom::Coordinate cs2p1(5, 5);
+//      CoordinateSequenceAutoPtr cs2(csFactory->create(0, 2));
+//      cs2->add(cs2p0);
+//      cs2->add(cs2p1);
 //
-//		using geos::noding::SegmentString;
-//		using geos::noding::NodedSegmentString;
+//      using geos::noding::SegmentString;
+//      using geos::noding::NodedSegmentString;
 //
-//		SegmentString::NonConstVect inputStrings;
-//		inputStrings.push_back(makeSegmentString(cs2.get()).get());
+//      SegmentString::NonConstVect inputStrings;
+//      inputStrings.push_back(makeSegmentString(cs2.get()).get());
 //
-//		std::auto_ptr<SegmentString::NonConstVect> nodedStrings(
-//			NodedSegmentString::getNodedSubstrings(inputStrings)
-//		);
+//      std::auto_ptr<SegmentString::NonConstVect> nodedStrings(
+//          NodedSegmentString::getNodedSubstrings(inputStrings)
+//      );
 //
-//		ensure_equals(nodedStrings->size(), 0u);
-//	}
+//      ensure_equals(nodedStrings->size(), 0u);
+//  }
 
 
 

Modified: trunk/tests/unit/noding/SegmentNodeTest.cpp
===================================================================
--- trunk/tests/unit/noding/SegmentNodeTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/noding/SegmentNodeTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,14 +2,14 @@
 // 
 // Test Suite for geos::noding::SegmentNode class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/noding/SegmentNode.h>
 #include <geos/noding/NodedSegmentString.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateSequence.h>
 #include <geos/geom/CoordinateArraySequenceFactory.h>
+// std
 #include <memory>
 
 namespace tut

Modified: trunk/tests/unit/noding/SegmentPointComparatorTest.cpp
===================================================================
--- trunk/tests/unit/noding/SegmentPointComparatorTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/noding/SegmentPointComparatorTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,14 +2,14 @@
 // 
 // Test Suite for geos::noding::SegmentPointComparator class.
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/noding/SegmentNode.h>
 #include <geos/noding/SegmentString.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateSequence.h>
 #include <geos/geom/CoordinateArraySequenceFactory.h>
+// std
 #include <memory>
 
 namespace tut

Modified: trunk/tests/unit/operation/IsSimpleOpTest.cpp
===================================================================
--- trunk/tests/unit/operation/IsSimpleOpTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/operation/IsSimpleOpTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -3,8 +3,7 @@
 // Test Suite for geos::operation::IsSimpleOp class
 // Ported from JTS junit/operation/IsSimpleTest.java
 
-// tut
-#include <tut.h>
+#include <tut.hpp>
 // geos
 #include <geos/operation/IsSimpleOp.h>
 #include <geos/geom/Coordinate.h>

Modified: trunk/tests/unit/operation/distance/DistanceOpTest.cpp
===================================================================
--- trunk/tests/unit/operation/distance/DistanceOpTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/operation/distance/DistanceOpTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::operation::distance::DistanceOp class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/operation/distance/DistanceOp.h>
 #include <geos/platform.h>
 #include <geos/geom/Coordinate.h>
@@ -13,7 +13,9 @@
 #include <geos/algorithm/PointLocator.h>
 #include <geos/io/WKTReader.h>
 #include <geos/geom/CoordinateSequence.h>
+// std
 #include <memory>
+#include <string>
 #include <vector>
 
 namespace tut

Modified: trunk/tests/unit/operation/overlay/FuzzyPointLocatorTest.cpp
===================================================================
--- trunk/tests/unit/operation/overlay/FuzzyPointLocatorTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/operation/overlay/FuzzyPointLocatorTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -3,9 +3,9 @@
 // Test Suite for geos::operation::overlay::FuzzyPointLocator class.
 
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/operation/overlay/FuzzyPointLocator.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Geometry.h>
@@ -13,6 +13,7 @@
 #include <geos/io/WKBReader.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/Location.h>
+// std
 #include <memory>
 #include <sstream>
 

Modified: trunk/tests/unit/operation/overlay/OffsetPointGeneratorTest.cpp
===================================================================
--- trunk/tests/unit/operation/overlay/OffsetPointGeneratorTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/operation/overlay/OffsetPointGeneratorTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::operation::overlay::OffsetPointGenerator class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/operation/overlay/OffsetPointGenerator.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Point.h>
@@ -12,6 +12,7 @@
 #include <geos/algorithm/PointLocator.h>
 #include <geos/io/WKTReader.h>
 #include <geos/geom/Coordinate.h>
+// std
 #include <memory>
 #include <vector>
 

Modified: trunk/tests/unit/operation/overlay/OverlayResultValidatorTest.cpp
===================================================================
--- trunk/tests/unit/operation/overlay/OverlayResultValidatorTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/operation/overlay/OverlayResultValidatorTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::operation::overlay::OverlayResultValidator class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/operation/overlay/OverlayOp.h>
 #include <geos/operation/overlay/OverlayResultValidator.h>
 #include <geos/geom/GeometryFactory.h>
@@ -12,6 +12,7 @@
 #include <geos/algorithm/PointLocator.h>
 #include <geos/io/WKTReader.h>
 #include <geos/geom/Coordinate.h>
+// std
 #include <memory>
 #include <vector>
 

Modified: trunk/tests/unit/operation/union/CascadedPolygonUnionTest.cpp
===================================================================
--- trunk/tests/unit/operation/union/CascadedPolygonUnionTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/operation/union/CascadedPolygonUnionTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,9 +2,9 @@
 // 
 // Test Suite for geos::operation::geounion::CascadedPolygonUnion class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/operation/union/CascadedPolygonUnion.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Geometry.h>
@@ -12,6 +12,10 @@
 #include <geos/geom/Point.h>
 #include <geos/io/WKTReader.h>
 #include <geos/io/WKTWriter.h>
+// std
+#include <memory>
+#include <string>
+#include <vector>
 
 namespace tut
 {
@@ -47,11 +51,14 @@
 
         std::auto_ptr<geos::geom::Geometry> unionAll;
         iterator end = geoms->end();
-        for (iterator i = geoms->begin(); i != end; ++i) {
-            if (!unionAll.get()) {
+        for (iterator i = geoms->begin(); i != end; ++i)
+        {
+            if (!unionAll.get())
+            {
                 unionAll.reset((*i)->clone());
             }
-            else {
+            else
+            {
                 unionAll.reset(unionAll->Union(*i));
             }
         }

Modified: trunk/tests/unit/precision/GeometrySnapperTest.cpp
===================================================================
--- trunk/tests/unit/precision/GeometrySnapperTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/precision/GeometrySnapperTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,15 +2,15 @@
 // 
 // Test Suite for geos::precision::GeometrySnapper class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/precision/GeometrySnapper.h>
 #include <geos/geom/Geometry.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/io/WKTReader.h>
-
-// STL
+// std
+#include <memory>
 #include <string>
 #include <vector>
 

Modified: trunk/tests/unit/precision/LineStringSnapperTest.cpp
===================================================================
--- trunk/tests/unit/precision/LineStringSnapperTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/precision/LineStringSnapperTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,14 +2,14 @@
 // 
 // Test Suite for geos::precision::LineStringSnapper class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/precision/LineStringSnapper.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/CoordinateList.h>
 #include <geos/geom/CoordinateArraySequence.h>
-// STL
+// std
 #include <string>
 #include <vector>
 

Modified: trunk/tests/unit/precision/SimpleGeometryPrecisionReducerTest.cpp
===================================================================
--- trunk/tests/unit/precision/SimpleGeometryPrecisionReducerTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/precision/SimpleGeometryPrecisionReducerTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,16 +2,15 @@
 // 
 // Test Suite for geos::precision::SimpleGeometryPrecisionReducer class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/precision/SimpleGeometryPrecisionReducer.h>
 #include <geos/geom/Geometry.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/PrecisionModel.h>
 #include <geos/io/WKTReader.h>
-
-// STL
+// std
 #include <string>
 #include <vector>
 

Modified: trunk/tests/unit/simplify/DouglasPeuckerSimplifierTest.cpp
===================================================================
--- trunk/tests/unit/simplify/DouglasPeuckerSimplifierTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/simplify/DouglasPeuckerSimplifierTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,15 +2,14 @@
 // 
 // Test Suite for geos::simplify::DouglasPeuckerSimplifierTest
 
-// TUT
-#include <tut.h>
-// GEOS
+#include <tut.hpp>
+// geos
 #include <geos/io/WKTReader.h>
 #include <geos/geom/PrecisionModel.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/Geometry.h>
 #include <geos/simplify/DouglasPeuckerSimplifier.h>
-
+// std
 #include <string>
 #include <memory>
 

Modified: trunk/tests/unit/simplify/TopologyPreservingSimplifierTest.cpp
===================================================================
--- trunk/tests/unit/simplify/TopologyPreservingSimplifierTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/simplify/TopologyPreservingSimplifierTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,6 +2,8 @@
 // 
 // Test Suite for geos::simplify::TopologyPreservingSimplifier
 
+#include <tut.hpp>
+#include <utility.h>
 // geos
 #include <geos/io/WKTReader.h>
 #include <geos/geom/PrecisionModel.h>
@@ -12,9 +14,6 @@
 // std
 #include <string>
 #include <memory>
-// tut
-#include <tut.h>
-#include <utility.h>
 
 namespace tut
 {

Deleted: trunk/tests/unit/tut/Makefile.am
===================================================================
--- trunk/tests/unit/tut/Makefile.am	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/tut/Makefile.am	2009-04-09 21:46:30 UTC (rev 2344)
@@ -1,4 +0,0 @@
-EXTRA_DIST = 			\
-	tut.h			\
-	tut_reporter.h		\
-	tut_restartable.h

Deleted: trunk/tests/unit/tut/tut.h
===================================================================
--- trunk/tests/unit/tut/tut.h	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/tut/tut.h	2009-04-09 21:46:30 UTC (rev 2344)
@@ -1,1059 +0,0 @@
-// $Id: tut.h 1820 2006-09-06 16:54:23Z mloskot $
-// 
-// TUT: C++ Unit Test Framework
-// http://tut-framework.sourceforge.net/
-//
-// NOTE: This file is included to GEOS source tree and may include some
-// changes comparing to the official version of TUT.
-//
-// The TUT License
-//
-// Copyright 2002-2006 Vladimir Dyuzhev.
-// 
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-// 
-// Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
-// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
-// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
-// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-#ifndef TUT_H_GUARD
-#define TUT_H_GUARD
-
-#include <iostream>
-#include <iomanip>
-#include <map>
-#include <vector>
-#include <string>
-#include <sstream>
-#include <stdexcept>
-#include <typeinfo>
-#include <limits>
-#include <cmath>
-
-#if defined(TUT_USE_SEH)
-#include <windows.h>
-#include <winbase.h>
-#endif
-
-/**
- * Template Unit Tests Framework for C++.
- * http://tut.dozen.ru
- *
- * @author dozen, tut at dozen.ru
- */
-namespace tut
-{
-  /**
-   * Exception to be throwed when attempted to execute 
-   * missed test by number.
-   */
-  struct no_such_test : public std::logic_error
-  {
-    no_such_test() : std::logic_error("no such test") {}
-  };
-
-  /**
-   * No such test and passed test number is higher than
-   * any test number in current group. Used in one-by-one
-   * test running when upper bound is not known.
-   */
-  struct beyond_last_test : public no_such_test
-  {
-    beyond_last_test() {}
-  };
-
-  /**
-   * Group not found exception.
-   */
-  struct no_such_group : public std::logic_error
-  {
-    no_such_group(const std::string& grp)
-		: std::logic_error(grp)
-	{}
-  };
-
-  /**
-   * Internal exception to be throwed when 
-   * no more tests left in group or journal.
-   */
-  struct no_more_tests
-  {
-    no_more_tests(){}
-  };
-
-  /**
-   * Internal exception to be throwed when 
-   * test constructor has failed.
-   */
-  struct bad_ctor : public std::logic_error
-  {
-    bad_ctor(const std::string& msg)
-		: std::logic_error(msg)
-	{}
-  };
-
-  /**
-   * Exception to be throwed when ensure() fails or fail() called.
-   */
-  class failure : public std::logic_error
-  {
-    public:
-      failure(const std::string& msg)
-		  : std::logic_error(msg)
-	  {}
-  };
-
-  /**
-   * Exception to be throwed when test desctructor throwed an exception.
-   */
-  class warning : public std::logic_error
-  {
-    public:
-      warning(const std::string& msg)
-		  : std::logic_error(msg)
-	  {}
-  };
-
-  /**
-   * Exception to be throwed when test is going to send non-failure
-   * information message.
-   */
-  class information : public std::logic_error
-  {
-  public:
-	  information(const std::string& msg)
-		  : std::logic_error(msg)
-	  {}
-  };
-
-  /**
-   * Exception to be throwed when test issued SEH (Win32)
-   */
-  class seh : public std::logic_error
-  {
-    public:
-      seh(const std::string& msg)
-		  : std::logic_error(msg)
-	  {}
-  };
-
-  /**
-   * Return type of runned test/test group.
-   *
-   * For test: contains result of test and, possible, message
-   * for failure or exception.
-   */
-  struct test_result
-  {
-    /**
-     * Test group name.
-     */
-    std::string group;
-
-    /**
-     * Test number in group.
-     */
-    int test;
-    
-    /**
-     * ok - test finished successfully
-     * fail - test failed with ensure() or fail() methods
-     * ex - test throwed an exceptions
-     * warn - test finished successfully, but test destructor throwed
-     * term - test forced test application to terminate abnormally
-     */
-    typedef enum { ok, fail, ex, warn, term, ex_ctor, inform } result_type;
-    result_type result;
-
-    /**
-     * Exception message for failed test.
-     */
-    std::string message;
-    std::string exception_typeid;
-
-    /**
-     * Default constructor.
-     */
-    test_result()
-		: test(0), result(ok)
-    {}
-
-    /**
-     * Constructor.
-     */
-    test_result( const std::string& grp,int pos,result_type res)
-      : group(grp), test(pos), result(res)
-    {}
-
-    /**
-     * Constructor with exception.
-     */
-    test_result( const std::string& grp,int pos,
-                 result_type res,
-                 const std::exception& ex)
-      : group(grp), test(pos), result(res),
-        message(ex.what()), exception_typeid(typeid(ex).name())
-    {}
-
-  };
-
-  /**
-   * Interface.
-   * Test group operations.
-   */
-  struct group_base
-  {
-    virtual ~group_base(){};
-
-    // execute tests iteratively
-    virtual void rewind() = 0;
-    virtual test_result run_next() = 0;
-
-    // execute one test
-    virtual test_result run_test(int n) = 0;
-  };
-
-  /**
-   * Test runner callback interface.
-   * Can be implemented by caller to update
-   * tests results in real-time. User can implement 
-   * any of callback methods, and leave unused 
-   * in default implementation.
-   */
-  struct callback
-  {
-    /**
-     * Virtual destructor is a must for subclassed types.
-     */
-    virtual ~callback(){};
-
-    /**
-     * Called when new test run started.
-     */
-    virtual void run_started(){};
-
-    /**
-     * Called when a group started
-     * @param name Name of the group
-     */
-    virtual void group_started(const std::string& /*name*/){};
-
-    /**
-     * Called when a test finished.
-     * @param tr Test results.
-     */
-    virtual void test_completed(const test_result& /*tr*/){};
-
-    /**
-     * Called when a group is completed
-     * @param name Name of the group
-     */
-    virtual void group_completed(const std::string& /*name*/){};
-
-    /**
-     * Called when all tests in run completed.
-     */
-    virtual void run_completed(){};
-  };
-
-  /**
-   * Typedef for runner::list_groups()
-   */
-  typedef std::vector<std::string> groupnames;
-
-  /**
-   * Test runner.
-   */
-  class test_runner
-  {
-    protected:
-      typedef std::map<std::string,group_base*> groups;
-      typedef groups::iterator iterator;
-      typedef groups::const_iterator const_iterator;
-      groups groups_;
-
-      callback  default_callback_;
-      callback* callback_;
-
-    public:
-    /**
-     * Constructor
-     */
-    test_runner() : callback_(&default_callback_)
-    {
-    }
-
-    /**
-     * Stores another group for getting by name.
-     */
-    void register_group(const std::string& name,group_base* gr)
-    {
-      if( gr == 0 )
-      {
-        throw std::invalid_argument("group shall be non-null");
-      }
-
-      groups::iterator found = groups_.find(name);
-      if( found != groups_.end() )
-      {
-        std::string msg("attempt to add already existent group "+name);
-        // this exception terminates application so we use cerr also
-        std::cerr << msg << std::endl;
-        throw std::logic_error(msg);
-      }
-
-      groups_[name] = gr;
-    }
-
-    /**
-     * Stores callback object.
-     */
-    void set_callback(callback* cb)
-    {
-      callback_ = cb==0? &default_callback_:cb;
-    }
-
-    /**
-     * Returns callback object.
-     */
-    callback& get_callback() const
-    {
-      return *callback_;
-    }
-
-    /**
-     * Returns list of known test groups.
-     */
-    const groupnames list_groups() const
-    {
-      groupnames ret;
-      const_iterator i = groups_.begin();
-      const_iterator e = groups_.end();
-      while( i != e )
-      {
-        ret.push_back(i->first);
-        ++i;
-      }
-      return ret;
-    }
-
-    /**
-     * Runs all tests in all groups.
-     * @param callback Callback object if exists; null otherwise
-     */
-    void run_tests() const
-    {
-      callback_->run_started();
-
-      const_iterator i = groups_.begin();
-      const_iterator e = groups_.end();
-      while( i != e )
-      {
-        callback_->group_started(i->first);
-        try
-        {
-          run_all_tests_in_group_(i);
-        }
-        catch( const no_more_tests& )
-        {
-          callback_->group_completed(i->first);
-        }
-
-        ++i;
-      }
-
-      callback_->run_completed();
-    }
-
-    /**
-     * Runs all tests in specified group.
-     */
-    void run_tests(const std::string& group_name) const
-    {
-      callback_->run_started();
-
-      const_iterator i = groups_.find(group_name);
-      if( i == groups_.end() )
-      {
-        callback_->run_completed();
-        throw no_such_group(group_name);
-      }
-
-      callback_->group_started(group_name);
-      try
-      {
-        run_all_tests_in_group_(i);
-      }
-      catch( const no_more_tests& )
-      {
-        // ok
-      }
-
-      callback_->group_completed(group_name);
-      callback_->run_completed();
-    }
-
-    /**
-     * Runs one test in specified group.
-     */
-    test_result run_test(const std::string& group_name,int n) const
-    {
-      callback_->run_started();
-
-      const_iterator i = groups_.find(group_name);
-      if( i == groups_.end() )
-      {
-        callback_->run_completed();
-        throw no_such_group(group_name);
-      }
-
-      callback_->group_started(group_name);
-      try
-      {
-        test_result tr = i->second->run_test(n);
-        callback_->test_completed(tr);
-        callback_->group_completed(group_name);
-        callback_->run_completed();
-        return tr;
-      }
-      catch( const beyond_last_test& )
-      {
-        callback_->group_completed(group_name);
-        callback_->run_completed();
-        throw;
-      }      
-      catch( const no_such_test& )
-      {
-        callback_->group_completed(group_name);
-        callback_->run_completed();
-        throw;
-      }
-    }
-
-    private:
-    void run_all_tests_in_group_(const_iterator i) const
-    {
-      i->second->rewind();
-      for( ;; )
-      {
-        test_result tr = i->second->run_next();
-        callback_->test_completed(tr);
-
-	if( tr.result == test_result::ex_ctor )
-	{
-          throw no_more_tests();
-        }
-      }
-    }
-  };
-
-  /**
-   * Singleton for test_runner implementation.
-   * Instance with name runner_singleton shall be implemented
-   * by user.
-   */
-  class test_runner_singleton
-  {
-    public:
-      static test_runner& get()
-      {
-        static test_runner tr;
-        return tr;
-      }
-  };
-  extern test_runner_singleton runner;
-
-  /**
-   * Test object. Contains data test run upon and default test method 
-   * implementation. Inherited from Data to allow tests to  
-   * access test data as members.
-   */
-  template <class Data>
-  class test_object : public Data
-  {
-    public:
-    /**
-     * Default constructor
-     */
-    test_object(){};
-
-    /**
-     * The flag is set to true by default (dummy) test.
-     * Used to detect usused test numbers and avoid unnecessary
-     * test object creation which may be time-consuming depending
-     * on operations described in Data::Data() and Data::~Data().
-     * TODO: replace with throwing special exception from default test.
-     */
-    bool called_method_was_a_dummy_test_;
-
-    /**
-     * Default do-nothing test.
-     */
-    template <int n>
-    void test()
-    {
-      called_method_was_a_dummy_test_ = true;
-    }
-  };
-
-  namespace 
-  {
-    /**
-     * Tests provided condition.
-     * Throws if false.
-     */
-    void ensure(bool cond)
-    {
-       if( !cond ) throw failure("");
-    }
-
-    /**
-     * Tests provided condition.
-     * Throws if false.
-     */
-    template<typename T>
-    void ensure(const T msg,bool cond)
-    {
-       if( !cond ) throw failure(msg);
-    }
-
-    /**
-     * Tests two objects for being equal.
-     * Throws if false.
-     *
-     * NB: both T and Q must have operator << defined somewhere, or
-     * client code will not compile at all!
-     */
-    template <class T,class Q>
-	void ensure_equals(const char* msg,const Q& actual,const T& expected)
-	{
-		if( !(expected == actual) )
-		{
-			std::stringstream ss;
-			ss << (msg?msg:"") << (msg?": ":"")
-				<< "expected " << expected
-				<< " actual " << actual;
-			throw failure(ss.str().c_str());
-		}
-	}
-
-    // ensure_equals specialization for double
-    template <>
-	void ensure_equals<double, double>(const char* msg, const double& actual,const double& expected)
-	{
-        const double epsilon = std::numeric_limits<double>::epsilon(); 
-        const double diff = actual - expected;
-
-        if ( !((diff <= epsilon) && (diff >= -epsilon )) )
-		{
-			std::stringstream ss;
-			ss << (msg?msg:"") << (msg?": ":"")
-                << std::scientific
-                << std::showpoint
-                << std::setprecision(16)
-				<< "expected " << expected
-				<< " actual " << actual
-                << " with precision " << epsilon;
-			throw failure(ss.str().c_str());
-		}
-	}
-
-    template <class T,class Q>
-    void ensure_equals(const Q& actual,const T& expected)
-    {
-      ensure_equals<>(0,actual,expected);
-    }
-
-	/**
-	 * Tests two objects for being equal.
-	 * Throws if false.
-	 *
-	 * NB: both T and Q must have operator << defined somewhere, or
-	 * client code will not compile at all!
-	 */
-	template <class T,class Q>
-	void ensure_not_equals(const char* msg,const Q& actual,const T& expected)
-	{
-		if( !(expected != actual) )
-		{
-			std::stringstream ss;
-			ss << (msg?msg:"") << (msg?": ":"")
-				<< "expected " << expected
-				<< " actual " << actual;
-			throw failure(ss.str().c_str());
-		}
-	}
-
-	template <class T,class Q>
-	void ensure_not_equals(const Q& actual,const T& expected)
-	{
-		ensure_not_equals<>(0,actual,expected);
-	}
-
-    /**
-     * Tests two objects for being at most in given distance one from another.
-     * Borders are excluded.
-     * Throws if false.
-     *
-     * NB: T must have operator << defined somewhere, or
-     * client code will not compile at all! Also, T shall have
-     * operators + and -, and be comparable.
-     */
-    template <class T>
-    void ensure_distance(const char* msg,const T& actual,
-						 const T& expected,const T& distance)
-    {
-      if( expected-distance >= actual || expected+distance <= actual )
-      {
-        std::stringstream ss;
-        ss << (msg?msg:"") << (msg?": ":"")
-			<< "expected [" << expected-distance
-			<< ";" << expected+distance
-			<< "] actual " << actual;
-        throw failure(ss.str().c_str());
-      }
-    }
-
-    template <class T>
-    void ensure_distance(const T& actual,const T& expected,const T& distance)
-    {
-		ensure_distance<>(0,actual,expected,distance);
-	}
-
-	/**
-	 * Non-conditional information message.
-	 */
-	void inform(const char* msg="")
-	{
-		throw information(msg);
-	}
-
-	/**
-	 * Non-conditonal warning message.
-	 */
-	void warn(const char* msg="")
-	{
-		throw warning(msg);
-	}
-
-    /**
-     * Unconditionally fails with message.
-     */
-    void fail(const char* msg="")
-    {
-      throw failure(msg);
-    }
-  }
-
-  /**
-   * Walks through test tree and stores address of each
-   * test method in group. Instantiation stops at 0.
-   */
-  template <class Test,class Group,int n>
-  struct tests_registerer
-  {
-    static void reg(Group& group)
-    {
-      group.reg(n,&Test::template test<n>);
-      tests_registerer<Test,Group,n-1>::reg(group);
-    }
-  };
-
-  template<class Test,class Group>
-  struct tests_registerer<Test,Group,0>
-  {
-    static void reg(Group&){};
-  };
-
-  /**
-   * Test group; used to recreate test object instance for
-   * each new test since we have to have reinitialized 
-   * Data base class.
-   */
-  template <class Data,int MaxTestsInGroup = 50>
-  class test_group : public group_base
-  {
-    const char* name_;
-
-    typedef void (test_object<Data>::*testmethod)();
-    typedef std::map<int,testmethod> tests;
-    typedef typename tests::iterator tests_iterator;
-    typedef typename tests::const_iterator tests_const_iterator;
-    typedef typename tests::const_reverse_iterator 
-                     tests_const_reverse_iterator;
-    typedef typename tests::size_type size_type;
-
-    tests tests_;
-    tests_iterator current_test_;
-
-    /**
-     * Exception-in-destructor-safe smart-pointer class.
-     */
-    template <class T>
-    class safe_holder
-    {
-      T* p_;
-      bool permit_throw_in_dtor;
-
-      safe_holder(const safe_holder&);
-      safe_holder& operator = (const safe_holder&);
-
-      public:
-      safe_holder() : p_(0),permit_throw_in_dtor(false)
-      { 
-      }
-
-      ~safe_holder()
-      {
-        release();
-      }
-
-      T* operator -> () const { return p_; };
-      T* get() const { return p_; };
-
-      /**
-       * Tell ptr it can throw from destructor. Right way is to
-       * use std::uncaught_exception(), but some compilers lack
-       * correct implementation of the function.
-       */
-      void permit_throw(){ permit_throw_in_dtor = true; }
-
-      /**
-       * Specially treats exceptions in test object destructor; 
-       * if test itself failed, exceptions in destructor
-       * are ignored; if test was successful and destructor failed,
-       * warning exception throwed.
-       */
-      void release()
-      {
-        try
-        {
-          if( delete_obj() == false )
-          {
-            throw warning("destructor of test object raised an SEH exception");
-          }
-        }
-        catch( const std::exception& ex )
-        {
-          if( permit_throw_in_dtor ) 
-          {
-            std::string msg = "destructor of test object raised exception: ";
-            msg += ex.what();
-            throw warning(msg);
-          }
-        }
-        catch( ... )
-        {
-          if( permit_throw_in_dtor )
-          {
-            throw warning("destructor of test object raised an exception");
-          }
-        }
-      }
-
-      /**
-       * Re-init holder to get brand new object.
-       */
-      void reset()
-      {
-        release();
-        permit_throw_in_dtor = false;
-        p_ = new T();
-      }
-
-      bool delete_obj()
-      {
-#if defined(TUT_USE_SEH)
-        __try
-        {
-#endif
-          T* p = p_; 
-          p_ = 0;
-          delete p;
-#if defined(TUT_USE_SEH)
-        }
-        __except(handle_seh_(::GetExceptionCode()))
-        {
-          if( permit_throw_in_dtor )
-          {
-            return false;
-          }
-        }
-#endif
-        return true;
-      }
-    };
-
-    public:
-    typedef test_object<Data> object;    
-
-    /**
-     * Creates and registers test group with specified name.
-     */
-    test_group(const char* name)
-      : name_(name)
-    {
-      // register itself
-      runner.get().register_group(name_,this);
-    
-      // register all tests
-      tests_registerer<object,test_group,MaxTestsInGroup>::reg(*this);
-    };
-
-    /**
-     * This constructor is used in self-test run only.
-     */
-    test_group(const char* name,test_runner& another_runner)
-      : name_(name)
-    {
-      // register itself
-      another_runner.register_group(name_,this); 
-    
-      // register all tests
-      tests_registerer<test_object<Data>,
-                       test_group,MaxTestsInGroup>::reg(*this);
-    };
-
-    /**
-     * Registers test method under given number.
-     */
-    void reg(int n,testmethod tm)
-    {
-      tests_[n] = tm;
-    }
-
-    /**
-     * Reset test position before first test.
-     */
-    void rewind()
-    {
-      current_test_ = tests_.begin();
-    }
-
-    /**
-     * Runs next test.
-     */
-    test_result run_next()
-    {
-      if( current_test_ == tests_.end() )
-      {
-        throw no_more_tests();
-      }
-
-      // find next user-specialized test
-      safe_holder<object> obj;
-      while( current_test_ != tests_.end() )
-      {
-        try
-        {
-          return run_test_(current_test_++,obj);
-        }
-        catch( const no_such_test& )
-        {
-          continue; 
-        }
-      } 
-
-      throw no_more_tests();
-    }
-
-    /**
-     * Runs one test by position.
-     */
-    test_result run_test(int n)
-    {
-      // beyond tests is special case to discover upper limit
-      if( tests_.rbegin() == tests_.rend() ) throw beyond_last_test();
-      if( tests_.rbegin()->first < n ) throw beyond_last_test();
-
-      // withing scope; check if given test exists
-      tests_iterator ti = tests_.find(n);
-      if( ti == tests_.end() ) throw no_such_test();
-
-      safe_holder<object> obj;
-      return run_test_(ti,obj);
-    }
-
-  private:
-    /**
-     * VC allows only one exception handling type per function,
-     * so I have to split the method
-     */
-    test_result run_test_(const tests_iterator& ti,safe_holder<object>& obj)
-    {
-      try
-      {
-        if( run_test_seh_(ti->second,obj) == false )
-          throw seh("seh");
-      }
-      catch(const no_such_test&)
-      {
-        throw;
-      }
-      catch(const warning& ex)
-      {
-        // test ok, but destructor failed
-        test_result tr(name_,ti->first,test_result::warn,ex);
-        return tr;
-      }
-      catch(const failure& ex)
-      {
-        // test failed because of ensure() or similar method
-        test_result tr(name_,ti->first,test_result::fail,ex);
-		return tr;
-	  }
-	  catch(const information& ex)
-	  {
-		  // test not failed and not succeeded, just wants to inform about something
-		  test_result tr(name_,ti->first,test_result::inform,ex);
-		  return tr;
-	  }
-      catch(const seh& ex)
-      {
-        // test failed with sigsegv, divide by zero, etc
-        test_result tr(name_,ti->first,test_result::term,ex);
-        return tr;
-      }
-      catch(const bad_ctor& ex)
-      {
-        // test failed because test ctor failed; stop the whole group
-        test_result tr(name_,ti->first,test_result::ex_ctor,ex);
-        return tr;
-      }
-      catch(const std::exception& ex)
-      {
-        // test failed with std::exception
-        test_result tr(name_,ti->first,test_result::ex,ex);
-        return tr;
-      }
-      catch(...)
-      {
-        // test failed with unknown exception
-        test_result tr(name_,ti->first,test_result::ex);
-        return tr;
-      }
-
-      // test passed
-      test_result tr(name_,ti->first,test_result::ok);
-      return tr;
-    }
-
-    /**
-     * Runs one under SEH if platform supports it.
-     */
-    bool run_test_seh_(testmethod tm,safe_holder<object>& obj)
-    {
-#if defined(TUT_USE_SEH)
-      __try
-      {
-#endif
-        if( obj.get() == 0 ) 
-	{
-          reset_holder_(obj);
-	}
-        obj->called_method_was_a_dummy_test_ = false;
-
-#if defined(TUT_USE_SEH)
-        __try
-        {
-#endif
-          (obj.get()->*tm)();
-#if defined(TUT_USE_SEH)
-        }
-        __except(handle_seh_(::GetExceptionCode()))
-        {
-          // throw seh("SEH");
-          return false;
-        }
-#endif
-
-        if( obj->called_method_was_a_dummy_test_ )
-        {
-          // do not call obj.release(); reuse object
-          throw no_such_test();
-        }
-
-        obj.permit_throw();
-        obj.release();
-#if defined(TUT_USE_SEH)
-      }
-      __except(handle_seh_(::GetExceptionCode()))
-      {
-        return false;
-      }
-#endif
-      return true;
-    }
-
-    void reset_holder_(safe_holder<object>& obj)
-    {
-      try 
-      {
-        obj.reset();
-      }
-      catch(const std::exception& ex)
-      {
-        throw bad_ctor(ex.what());
-      }
-      catch(...)
-      {
-        throw bad_ctor("test constructor has generated an exception; \
-						group execution is terminated");
-      }
-    }
-  };
-
-#if defined(TUT_USE_SEH)
-  /**
-   * Decides should we execute handler or ignore SE.
-   */
-  inline int handle_seh_(DWORD excode)
-  {
-    switch(excode)
-    {
-      case EXCEPTION_ACCESS_VIOLATION:
-      case EXCEPTION_DATATYPE_MISALIGNMENT:
-      case EXCEPTION_BREAKPOINT:
-      case EXCEPTION_SINGLE_STEP:
-      case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
-      case EXCEPTION_FLT_DENORMAL_OPERAND:     
-      case EXCEPTION_FLT_DIVIDE_BY_ZERO:
-      case EXCEPTION_FLT_INEXACT_RESULT:        
-      case EXCEPTION_FLT_INVALID_OPERATION:
-      case EXCEPTION_FLT_OVERFLOW:
-      case EXCEPTION_FLT_STACK_CHECK:
-      case EXCEPTION_FLT_UNDERFLOW:
-      case EXCEPTION_INT_DIVIDE_BY_ZERO:
-      case EXCEPTION_INT_OVERFLOW:
-      case EXCEPTION_PRIV_INSTRUCTION:
-      case EXCEPTION_IN_PAGE_ERROR:
-      case EXCEPTION_ILLEGAL_INSTRUCTION:
-      case EXCEPTION_NONCONTINUABLE_EXCEPTION:
-      case EXCEPTION_STACK_OVERFLOW:
-      case EXCEPTION_INVALID_DISPOSITION:
-      case EXCEPTION_GUARD_PAGE:
-      case EXCEPTION_INVALID_HANDLE:
-        return EXCEPTION_EXECUTE_HANDLER;
-    };    
-
-    return EXCEPTION_CONTINUE_SEARCH;
-  }
-#endif // #if defined(TUT_USE_SEH)
-
-} // namespace tut
-
-#endif // #ifndef TUT_H_GUARD
-

Added: trunk/tests/unit/tut/tut.hpp
===================================================================
--- trunk/tests/unit/tut/tut.hpp	                        (rev 0)
+++ trunk/tests/unit/tut/tut.hpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -0,0 +1,516 @@
+#ifndef TUT_H_GUARD
+#define TUT_H_GUARD
+
+#include <iostream>
+#include <map>
+#include <vector>
+#include <set>
+#include <string>
+#include <sstream>
+#include <iterator>
+#include <algorithm>
+#include <typeinfo>
+
+#include "tut_exception.hpp"
+#include "tut_result.hpp"
+#include "tut_posix.hpp"
+#include "tut_assert.hpp"
+#include "tut_runner.hpp"
+
+#if defined(TUT_USE_SEH)
+#include <windows.h>
+#include <winbase.h>
+#endif
+
+/**
+ * Template Unit Tests Framework for C++.
+ * http://tut.dozen.ru
+ *
+ * @author Vladimir Dyuzhev, Vladimir.Dyuzhev at gmail.com
+ */
+namespace tut
+{
+
+/**
+ * Test object. Contains data test run upon and default test method
+ * implementation. Inherited from Data to allow tests to
+ * access test data as members.
+ */
+template <class Data>
+class test_object : public Data, public test_object_posix
+{
+public:
+
+    /**
+     * Default constructor
+     */
+    test_object()
+    {
+    }
+
+    void set_test_name(const std::string& current_test_name)
+    {
+        current_test_name_ = current_test_name;
+    }
+
+    const std::string& get_test_name() const
+    {
+        return current_test_name_;
+    }
+
+    /**
+     * Default do-nothing test.
+     */
+    template <int n>
+    void test()
+    {
+        called_method_was_a_dummy_test_ = true;
+    }
+
+    /**
+     * The flag is set to true by default (dummy) test.
+     * Used to detect usused test numbers and avoid unnecessary
+     * test object creation which may be time-consuming depending
+     * on operations described in Data::Data() and Data::~Data().
+     * TODO: replace with throwing special exception from default test.
+     */
+    bool called_method_was_a_dummy_test_;
+
+private:
+    std::string     current_test_name_;
+};
+
+
+/**
+ * Walks through test tree and stores address of each
+ * test method in group. Instantiation stops at 0.
+ */
+template <class Test, class Group, int n>
+struct tests_registerer
+{
+    static void reg(Group& group)
+    {
+        group.reg(n, &Test::template test<n>);
+        tests_registerer<Test, Group, n - 1>::reg(group);
+    }
+};
+
+template <class Test, class Group>
+struct tests_registerer<Test, Group, 0>
+{
+    static void reg(Group&)
+    {
+    }
+};
+
+/**
+ * Test group; used to recreate test object instance for
+ * each new test since we have to have reinitialized
+ * Data base class.
+ */
+template <class Data, int MaxTestsInGroup = 50>
+class test_group : public group_base, public test_group_posix
+{
+    const char* name_;
+
+    typedef void (test_object<Data>::*testmethod)();
+    typedef std::map<int, testmethod> tests;
+    typedef typename tests::iterator tests_iterator;
+    typedef typename tests::const_iterator tests_const_iterator;
+    typedef typename tests::const_reverse_iterator
+    tests_const_reverse_iterator;
+    typedef typename tests::size_type size_type;
+
+    tests tests_;
+    tests_iterator current_test_;
+
+    /**
+     * Exception-in-destructor-safe smart-pointer class.
+     */
+    template <class T>
+    class safe_holder
+    {
+        T* p_;
+        bool permit_throw_in_dtor;
+
+        safe_holder(const safe_holder&);
+        safe_holder& operator=(const safe_holder&);
+
+    public:
+        safe_holder()
+            : p_(0),
+              permit_throw_in_dtor(false)
+        {
+        }
+
+        ~safe_holder()
+        {
+            release();
+        }
+
+        T* operator->() const
+        {
+            return p_;
+        }
+
+        T* get() const
+        {
+            return p_;
+        }
+
+        /**
+         * Tell ptr it can throw from destructor. Right way is to
+         * use std::uncaught_exception(), but some compilers lack
+         * correct implementation of the function.
+         */
+        void permit_throw()
+        {
+            permit_throw_in_dtor = true;
+        }
+
+        /**
+         * Specially treats exceptions in test object destructor;
+         * if test itself failed, exceptions in destructor
+         * are ignored; if test was successful and destructor failed,
+         * warning exception throwed.
+         */
+        void release()
+        {
+            try
+            {
+                if (delete_obj() == false)
+                {
+                    throw warning("destructor of test object raised"
+                        " an SEH exception");
+                }
+            }
+            catch (const std::exception& ex)
+            {
+                if (permit_throw_in_dtor)
+                {
+                    std::string msg = "destructor of test object raised"
+                        " exception: ";
+                    msg += ex.what();
+                    throw warning(msg);
+                }
+            }
+            catch( ... )
+            {
+                if (permit_throw_in_dtor)
+                {
+                    throw warning("destructor of test object raised an"
+                        " exception");
+                }
+            }
+        }
+
+        /**
+         * Re-init holder to get brand new object.
+         */
+        void reset()
+        {
+            release();
+            permit_throw_in_dtor = false;
+            p_ = new T();
+        }
+
+        bool delete_obj()
+        {
+#if defined(TUT_USE_SEH)
+            __try
+            {
+#endif
+                T* p = p_;
+                p_ = 0;
+                delete p;
+#if defined(TUT_USE_SEH)
+            }
+            __except(handle_seh_(::GetExceptionCode()))
+            {
+                if (permit_throw_in_dtor)
+                {
+                    return false;
+                }
+            }
+#endif
+            return true;
+        }
+    };
+
+public:
+
+    typedef test_object<Data> object;
+
+    /**
+     * Creates and registers test group with specified name.
+     */
+    test_group(const char* name)
+        : name_(name)
+    {
+        // register itself
+        runner.get().register_group(name_,this);
+
+        // register all tests
+        tests_registerer<object, test_group, MaxTestsInGroup>::reg(*this);
+    }
+
+    /**
+     * This constructor is used in self-test run only.
+     */
+    test_group(const char* name, test_runner& another_runner)
+        : name_(name)
+    {
+        // register itself
+        another_runner.register_group(name_, this);
+
+        // register all tests
+        tests_registerer<test_object<Data>, test_group,
+            MaxTestsInGroup>::reg(*this);
+    };
+
+    /**
+     * Registers test method under given number.
+     */
+    void reg(int n, testmethod tm)
+    {
+        tests_[n] = tm;
+    }
+
+    /**
+     * Reset test position before first test.
+     */
+    void rewind()
+    {
+        current_test_ = tests_.begin();
+    }
+
+    /**
+     * Runs next test.
+     */
+    test_result run_next()
+    {
+        if (current_test_ == tests_.end())
+        {
+            throw no_more_tests();
+        }
+
+        // find next user-specialized test
+        safe_holder<object> obj;
+        while (current_test_ != tests_.end())
+        {
+            try
+            {
+                tests_iterator current_test = current_test_++;
+
+                test_result tr = run_test_(current_test, obj);
+
+                return tr;
+            }
+            catch (const no_such_test&)
+            {
+                continue;
+            }
+        }
+
+        throw no_more_tests();
+    }
+
+    /**
+     * Runs one test by position.
+     */
+    test_result run_test(int n)
+    {
+        // beyond tests is special case to discover upper limit
+        if (tests_.rbegin() == tests_.rend())
+        {
+            throw beyond_last_test();
+        }
+
+        if (tests_.rbegin()->first < n)
+        {
+            throw beyond_last_test();
+        }
+
+        // withing scope; check if given test exists
+        tests_iterator ti = tests_.find(n);
+        if (ti == tests_.end())
+        {
+            throw no_such_test();
+        }
+
+        safe_holder<object> obj;
+        test_result tr = run_test_(ti, obj);
+
+        return tr;
+    }
+
+
+    /**
+     * VC allows only one exception handling type per function,
+     * so I have to split the method.
+     */
+    test_result run_test_(const tests_iterator& ti, safe_holder<object>& obj)
+    {
+        std::string current_test_name;
+
+        test_result tr(name_, ti->first, current_test_name, test_result::ok);
+
+        try
+        {
+            if (run_test_seh_(ti->second, obj, current_test_name) == false)
+            {
+                throw seh("seh");
+            }
+        }
+        catch (const no_such_test&)
+        {
+            throw;
+        }
+        catch (const rethrown& ex)
+        {
+            tr = ex.tr;
+            tr.result = test_result::rethrown;
+        }
+        catch (const tut_error& ex)
+        {
+            tr.result = ex.result();
+            tr.exception_typeid = typeid(ex).name();
+            tr.message = ex.what();
+        }
+        catch (const std::exception& ex)
+        {
+            tr.result = test_result::ex;
+            tr.exception_typeid = typeid(ex).name();
+            tr.message = ex.what();
+        }
+        catch (...)
+        {
+            // test failed with unknown exception
+            tr.result = test_result::ex;
+        }
+
+        if (obj.get())
+        {
+            tr.name = obj->get_test_name();
+
+            // try to report to parent, if exists
+            send_result_(obj.get(), tr);
+        }
+        else
+        {
+            tr.name = current_test_name;
+        }
+
+        return tr;
+    }
+
+    /**
+     * Runs one under SEH if platform supports it.
+     */
+    bool run_test_seh_(testmethod tm, safe_holder<object>& obj,
+        std::string& current_test_name)
+    {
+#if defined(TUT_USE_SEH)
+        __try
+        {
+#endif
+        if (obj.get() == 0)
+        {
+            reset_holder_(obj);
+        }
+
+        obj->called_method_was_a_dummy_test_ = false;
+
+#if defined(TUT_USE_SEH)
+
+            __try
+            {
+#endif
+                (obj.get()->*tm)();
+#if defined(TUT_USE_SEH)
+            }
+            __except(handle_seh_(::GetExceptionCode()))
+            {
+                // throw seh("SEH");
+                current_test_name = obj->get_test_name();
+                return false;
+            }
+#endif
+
+        if (obj->called_method_was_a_dummy_test_)
+        {
+            // do not call obj.release(); reuse object
+            throw no_such_test();
+        }
+
+        current_test_name = obj->get_test_name();
+        obj.permit_throw();
+        obj.release();
+#if defined(TUT_USE_SEH)
+        }
+        __except(handle_seh_(::GetExceptionCode()))
+        {
+            return false;
+        }
+#endif
+        return true;
+    }
+
+    void reset_holder_(safe_holder<object>& obj)
+    {
+        try
+        {
+            obj.reset();
+        }
+        catch (const std::exception& ex)
+        {
+            throw bad_ctor(ex.what());
+        }
+        catch (...)
+        {
+            throw bad_ctor("test constructor has generated an exception;"
+                " group execution is terminated");
+        }
+    }
+};
+
+#if defined(TUT_USE_SEH)
+/**
+ * Decides should we execute handler or ignore SE.
+ */
+inline int handle_seh_(DWORD excode)
+{
+    switch(excode)
+    {
+    case EXCEPTION_ACCESS_VIOLATION:
+    case EXCEPTION_DATATYPE_MISALIGNMENT:
+    case EXCEPTION_BREAKPOINT:
+    case EXCEPTION_SINGLE_STEP:
+    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+    case EXCEPTION_FLT_DENORMAL_OPERAND:
+    case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+    case EXCEPTION_FLT_INEXACT_RESULT:
+    case EXCEPTION_FLT_INVALID_OPERATION:
+    case EXCEPTION_FLT_OVERFLOW:
+    case EXCEPTION_FLT_STACK_CHECK:
+    case EXCEPTION_FLT_UNDERFLOW:
+    case EXCEPTION_INT_DIVIDE_BY_ZERO:
+    case EXCEPTION_INT_OVERFLOW:
+    case EXCEPTION_PRIV_INSTRUCTION:
+    case EXCEPTION_IN_PAGE_ERROR:
+    case EXCEPTION_ILLEGAL_INSTRUCTION:
+    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+    case EXCEPTION_STACK_OVERFLOW:
+    case EXCEPTION_INVALID_DISPOSITION:
+    case EXCEPTION_GUARD_PAGE:
+    case EXCEPTION_INVALID_HANDLE:
+        return EXCEPTION_EXECUTE_HANDLER;
+    };
+
+    return EXCEPTION_CONTINUE_SEARCH;
+}
+#endif
+}
+
+#endif
+

Added: trunk/tests/unit/tut/tut_assert.hpp
===================================================================
--- trunk/tests/unit/tut/tut_assert.hpp	                        (rev 0)
+++ trunk/tests/unit/tut/tut_assert.hpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -0,0 +1,162 @@
+#ifndef TUT_ASSERT_H_GUARD
+#define TUT_ASSERT_H_GUARD
+
+#include "tut_exception.hpp"
+
+#if defined(TUT_USE_POSIX)
+#include <errno.h>
+#include <cstring>
+#endif
+
+namespace tut
+{
+
+namespace
+{
+
+/**
+ * Tests provided condition.
+ * Throws if false.
+ */
+void ensure(bool cond)
+{
+    if (!cond)
+    {
+        // TODO: default ctor?
+        throw failure("");
+    }
+}
+
+/**
+ * Tests provided condition.
+ * Throws if true.
+ */
+void ensure_not(bool cond)
+{
+    ensure(!cond);
+}
+
+/**
+ * Tests provided condition.
+ * Throws if false.
+ */
+template <typename T>
+void ensure(const T msg, bool cond)
+{
+    if (!cond)
+    {
+        throw failure(msg);
+    }
+}
+
+/**
+ * Tests provided condition.
+ * Throws if true.
+ */
+template <typename T>
+void ensure_not(const T msg, bool cond)
+{
+    ensure(msg, !cond);
+}
+
+/**
+ * Tests two objects for being equal.
+ * Throws if false.
+ *
+ * NB: both T and Q must have operator << defined somewhere, or
+ * client code will not compile at all!
+ */
+template <class T, class Q>
+void ensure_equals(const char* msg, const Q& actual, const T& expected)
+{
+    if (expected != actual)
+    {
+        std::stringstream ss;
+        ss << (msg ? msg : "")
+            << (msg ? ":" : "")
+            << " expected '"
+            << expected
+            << "' actual '"
+            << actual
+            << '\'';
+        throw failure(ss.str().c_str());
+    }
+}
+
+template <class T, class Q>
+void ensure_equals(const Q& actual, const T& expected)
+{
+    ensure_equals<>(0, actual, expected);
+}
+
+/**
+ * Tests two objects for being at most in given distance one from another.
+ * Borders are excluded.
+ * Throws if false.
+ *
+ * NB: T must have operator << defined somewhere, or
+ * client code will not compile at all! Also, T shall have
+ * operators + and -, and be comparable.
+ */
+template <class T>
+void ensure_distance(const char* msg, const T& actual, const T& expected,
+    const T& distance)
+{
+    if (expected-distance >= actual || expected+distance <= actual)
+    {
+        std::stringstream ss;
+        ss << (msg ? msg : "")
+            << (msg? ":" : "")
+            << " expected ("
+            << expected-distance
+            << " - "
+            << expected+distance
+            << ") actual '"
+            << actual
+            << '\'';
+        throw failure(ss.str().c_str());
+    }
+}
+
+template <class T>
+void ensure_distance(const T& actual, const T& expected, const T& distance)
+{
+    ensure_distance<>(0, actual, expected, distance);
+}
+
+void ensure_errno(const char *msg, bool cond)
+{
+    if(!cond)
+    {
+#if defined(TUT_USE_POSIX)
+        char e[512];
+        std::stringstream ss;
+        ss << (msg ? msg : "")
+            << (msg? ": " : "")
+            << strerror_r(errno, e, sizeof(e));
+        throw failure(ss.str().c_str());
+#else
+        throw failure(msg);
+#endif
+    }
+}
+
+/**
+ * Unconditionally fails with message.
+ */
+void fail(const char* msg = "")
+{
+    throw failure(msg);
+}
+
+void fail(const std::string &msg)
+{
+    throw failure(msg);
+}
+
+} // end of namespace
+
+}
+
+#endif
+

Added: trunk/tests/unit/tut/tut_exception.hpp
===================================================================
--- trunk/tests/unit/tut/tut_exception.hpp	                        (rev 0)
+++ trunk/tests/unit/tut/tut_exception.hpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -0,0 +1,206 @@
+#ifndef TUT_EXCEPTION_H_GUARD
+#define TUT_EXCEPTION_H_GUARD
+
+#include <stdexcept>
+#include "tut_result.hpp"
+
+namespace tut
+{
+
+/**
+ * The base for all TUT exceptions.
+ */
+struct tut_error : public std::exception
+{
+    tut_error(const std::string& msg)
+        : err_msg(msg)
+    {
+    }
+
+    virtual test_result::result_type result() const
+    {
+        return test_result::ex;
+    }
+
+    const char* what() const throw()
+    {
+        return err_msg.c_str();
+    }
+
+    ~tut_error() throw()
+    {
+    }
+
+private:
+
+    std::string err_msg;
+};
+
+/**
+ * Exception to be throwed when attempted to execute
+ * missed test by number.
+ */
+struct no_such_test : public tut_error
+{
+    no_such_test()
+        : tut_error("no such test")
+    {
+    }
+
+    ~no_such_test() throw()
+    {
+    }
+};
+
+/**
+ * No such test and passed test number is higher than
+ * any test number in current group. Used in one-by-one
+ * test running when upper bound is not known.
+ */
+struct beyond_last_test : public no_such_test
+{
+    beyond_last_test()
+    {
+    }
+
+    ~beyond_last_test() throw()
+    {
+    }
+};
+
+/**
+ * Group not found exception.
+ */
+struct no_such_group : public tut_error
+{
+    no_such_group(const std::string& grp)
+        : tut_error(grp)
+    {
+    }
+
+    ~no_such_group() throw()
+    {
+    }
+};
+
+/**
+ * Internal exception to be throwed when
+ * no more tests left in group or journal.
+ */
+struct no_more_tests
+{
+    no_more_tests()
+    {
+    }
+
+    ~no_more_tests() throw()
+    {
+    }
+};
+
+/**
+ * Internal exception to be throwed when
+ * test constructor has failed.
+ */
+struct bad_ctor : public tut_error
+{
+    bad_ctor(const std::string& msg)
+        : tut_error(msg)
+    {
+    }
+
+    test_result::result_type result() const
+    {
+        return test_result::ex_ctor;
+    }
+
+    ~bad_ctor() throw()
+    {
+    }
+};
+
+/**
+ * Exception to be throwed when ensure() fails or fail() called.
+ */
+struct failure : public tut_error
+{
+    failure(const std::string& msg)
+        : tut_error(msg)
+    {
+    }
+
+    test_result::result_type result() const
+    {
+        return test_result::fail;
+    }
+
+    ~failure() throw()
+    {
+    }
+};
+
+/**
+ * Exception to be throwed when test desctructor throwed an exception.
+ */
+struct warning : public tut_error
+{
+    warning(const std::string& msg)
+        : tut_error(msg)
+    {
+    }
+
+    test_result::result_type result() const
+    {
+        return test_result::warn;
+    }
+
+    ~warning() throw()
+    {
+    }
+};
+
+/**
+ * Exception to be throwed when test issued SEH (Win32)
+ */
+struct seh : public tut_error
+{
+    seh(const std::string& msg)
+        : tut_error(msg)
+    {
+    }
+
+    virtual test_result::result_type result() const
+    {
+        return test_result::term;
+    }
+
+    ~seh() throw()
+    {
+    }
+};
+
+/**
+ * Exception to be throwed when child processes fail.
+ */
+struct rethrown : public failure
+{
+    explicit rethrown(const test_result &result)
+        : failure(result.message), tr(result)
+    {
+    }
+
+    virtual test_result::result_type result() const
+    {
+        return test_result::rethrown;
+    }
+
+    ~rethrown() throw()
+    {
+    }
+
+    const test_result tr;
+};
+
+}
+
+#endif

Added: trunk/tests/unit/tut/tut_posix.hpp
===================================================================
--- trunk/tests/unit/tut/tut_posix.hpp	                        (rev 0)
+++ trunk/tests/unit/tut/tut_posix.hpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -0,0 +1,450 @@
+#ifndef TUT_FORK_H_GUARD
+#define TUT_FORK_H_GUARD
+
+#if defined(TUT_USE_POSIX)
+#include <errno.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include <cstring>
+#include <cstdlib>
+#include <map>
+#include <iterator>
+#include <functional>
+
+#include "tut_result.hpp"
+#include "tut_assert.hpp"
+#include "tut_runner.hpp"
+
+namespace tut
+{
+
+template<typename, int>
+class test_group;
+
+template<typename T>
+class test_object;
+
+class test_group_posix
+{
+private:
+    template<typename, int>
+    friend class test_group;
+
+    template<typename T>
+    void send_result_(const T *obj, const test_result &tr)
+    {
+        if(obj->get_pipe_() == -1)
+        {
+            return;
+        }
+
+        if(tr.result != test_result::ok)
+        {
+            std::stringstream ss;
+            ss << int(tr.result) << "\n"
+                << tr.group << "\n"
+                << tr.test << "\n"
+                << tr.name << "\n"
+                << tr.exception_typeid << "\n";
+            std::copy( tr.message.begin(), tr.message.end(), std::ostreambuf_iterator<char>(ss.rdbuf()) );
+
+            int size = ss.str().length();
+            int w = write(obj->get_pipe_(), ss.str().c_str(), size);
+            ensure_errno("write() failed", w == size);
+        }
+    }
+};
+
+template<typename T>
+struct tut_posix
+{
+    pid_t fork()
+    {
+        test_object<T> *self = dynamic_cast< tut::test_object<T>* >(this);
+        ensure("trying to call 'fork' in ctor of test object", self != NULL);
+
+        return self->fork_();
+    }
+
+    void ensure_child_exit(pid_t pid, int exit_status = 0)
+    {
+        test_object<T> *self = dynamic_cast< tut::test_object<T>* >(this);
+        ensure("trying to call 'ensure_child_exit' in ctor of test object", self != NULL);
+
+        int status;
+        self->waitpid_(pid, &status);
+
+        self->ensure_child_exit_(status, exit_status);
+    }
+
+
+    void ensure_child_signal(pid_t pid, int signal = SIGTERM)
+    {
+        test_object<T> *self = dynamic_cast< tut::test_object<T>* >(this);
+        ensure("trying to call 'ensure_child_signal' in ctor of test object", self != NULL);
+
+        int status;
+        self->waitpid_(pid, &status);
+
+        self->ensure_child_signal_(status, signal);
+    }
+
+    std::set<pid_t> get_pids() const
+    {
+        using namespace std;
+
+        const test_object<T> *self = dynamic_cast< const tut::test_object<T>* >(this);
+        ensure("trying to call 'get_pids' in ctor of test object", self != NULL);
+
+        return self->get_pids_();
+    }
+
+    virtual ~tut_posix()
+    {
+    }
+
+};
+
+class test_object_posix
+{
+public:
+    typedef std::map<pid_t, int> pid_map;
+
+    /**
+     * Default constructor
+     */
+    test_object_posix()
+        : pipe_(-1)
+    {
+    }
+
+
+    virtual ~test_object_posix()
+    {
+        // we have forked
+        if(pipe_ != -1)
+        {
+            // in child, force exit
+            std::exit(0);
+        }
+
+        if(!pids_.empty())
+        {
+            std::stringstream ss;
+
+            // in parent, reap children
+            for(std::map<pid_t, int>::iterator i = pids_.begin(); i != pids_.end(); ++i)
+            {
+                try {
+                    kill_child_(i->first);
+                } catch(const rethrown &ex) {
+                    ss << std::endl << "child " << ex.tr.pid << " has thrown an exception: " << ex.what();
+                } catch(const failure &ex) {
+                    ss << std::endl << ex.what();
+                }
+            }
+
+            if(!ss.str().empty())
+            {
+                fail(ss.str().c_str());
+            }
+        }
+    }
+
+private:
+    template<typename T>
+    friend class tut_posix;
+
+    friend class test_group_posix;
+
+    int get_pipe_() const
+    {
+        return pipe_;
+    }
+
+
+    pid_t fork_()
+    {
+        // create pipe
+        int fds[2];
+        ensure_errno("pipe() failed", ::pipe(fds) == 0);
+
+        pid_t pid = ::fork();
+
+        ensure_errno("fork() failed", pid >= 0);
+
+        if(pid != 0)
+        {
+            // in parent, register pid
+            ensure("duplicated child", pids_.insert( std::make_pair(pid, fds[0]) ).second);
+
+            // close writing side
+            close(fds[1]);
+        }
+        else
+        {
+            // in child, shutdown reporter
+            tut::runner.get().set_callback(NULL);
+
+            // close reading side
+            close(fds[0]);
+            pipe_ = fds[1];
+        }
+
+        return pid;
+    }
+
+    void kill_child_(pid_t pid)
+    {
+        int status;
+
+        if(waitpid_(pid, &status, WNOHANG) == pid)
+        {
+            ensure_child_exit_(status, 0);
+            return;
+        }
+
+        if(::kill(pid, SIGTERM) != 0)
+        {
+            if(errno == ESRCH)
+            {
+                // no such process
+                return;
+            }
+            else
+            {
+                // cannot kill, we are in trouble
+                std::stringstream ss;
+                char e[1024];
+                ss << "child " << pid << " could not be killed with SIGTERM, " << strerror_r(errno, e, sizeof(e)) << std::endl;
+                fail(ss.str());
+            }
+        }
+
+        if(waitpid_(pid, &status, WNOHANG) == pid)
+        {
+            // child killed, check signal
+            ensure_child_signal_(status, SIGTERM);
+
+            ensure_equals("child process exists after SIGTERM", ::kill(pid, 0), -1);
+            return;
+        }
+
+        // child seems to be still exiting, give it some time
+        sleep(2);
+
+        if(waitpid_(pid, &status, WNOHANG) != pid)
+        {
+            // child is still running, kill it
+            if(::kill(pid, SIGKILL) != 0)
+            {
+                if(errno == ESRCH)
+                {
+                    // no such process
+                    return;
+                }
+                else
+            {
+                std::stringstream ss;
+                    char e[1024];
+                    ss << "child " << pid << " could not be killed with SIGKILL, " << strerror_r(errno, e, sizeof(e)) << std::endl;
+                fail(ss.str());
+            }
+        }
+
+            ensure_equals("wait after SIGKILL", waitpid_(pid, &status), pid);
+            ensure_child_signal_(status, SIGKILL);
+
+            ensure_equals("child process exists after SIGKILL", ::kill(pid, 0), -1);
+
+            std::stringstream ss;
+            ss << "child " << pid << " had to be killed with SIGKILL";
+            fail(ss.str());
+        }
+    }
+
+    test_result receive_result_(std::istream &ss, pid_t pid)
+    {
+        test_result tr;
+
+        int type;
+        ss >> type;
+        tr.result = test_result::result_type(type);
+        ss.ignore(1024, '\n');
+
+        std::getline(ss, tr.group);
+        ss >> tr.test;
+        ss.ignore(1024, '\n');
+        std::getline(ss, tr.name);
+        std::getline(ss, tr.exception_typeid);
+        std::copy( std::istreambuf_iterator<char>(ss.rdbuf()),
+                   std::istreambuf_iterator<char>(),
+                   std::back_inserter(tr.message) );
+
+        tr.pid = pid;
+
+        return tr;
+    }
+
+    pid_t waitpid_(pid_t pid, int *status, int flags = 0)
+    {
+        ensure("trying to wait for unknown pid", pids_.count(pid) > 0);
+
+        pid_t p = ::waitpid(pid, status, flags);
+        if( (flags & WNOHANG) && (p != pid) )
+        {
+            return p;
+        }
+
+        // read child result from pipe
+        fd_set fdset;
+        timeval tv;
+        tv.tv_sec = 0;
+        tv.tv_usec = 0;
+
+        FD_ZERO(&fdset);
+
+        int pipe = pids_[pid];
+        FD_SET(pipe, &fdset);
+
+        int result = select(pipe+1, &fdset, NULL, NULL, &tv);
+        ensure_errno("sanity check on select() failed", result >= 0);
+
+        if(result > 0)
+        {
+            ensure("sanity check on FD_ISSET() failed", FD_ISSET(pipe, &fdset) );
+
+            std::stringstream ss;
+
+            //TODO: max failure length
+            char buffer[1024];
+            int r = read(pipe, buffer, sizeof(buffer));
+            ensure_errno("sanity check on read() failed", r >= 0);
+
+            if(r > 0)
+            {
+                ss.write(buffer, r);
+                throw rethrown( receive_result_(ss, pid) );
+            }
+        }
+
+        return pid;
+    }
+
+    void ensure_child_exit_(int status, int exit_status)
+    {
+        if(WIFSIGNALED(status))
+        {
+            std::stringstream ss;
+            ss << "child killed by signal " << WTERMSIG(status)
+                << ": expected exit with code " << exit_status;
+
+            throw failure(ss.str().c_str());
+        }
+
+        if(WIFEXITED(status))
+        {
+            if(WEXITSTATUS(status) != exit_status)
+            {
+                std::stringstream ss;
+                ss << "child exited, expected '"
+                    << exit_status
+                    << "' actual '"
+                    << WEXITSTATUS(status)
+                    << '\'';
+
+                throw failure(ss.str().c_str());
+            }
+        }
+
+        if(WIFSTOPPED(status))
+        {
+            std::stringstream ss;
+            ss << "child stopped by signal " << WTERMSIG(status)
+                << ": expected exit with code " << exit_status;
+            throw failure(ss.str().c_str());
+        }
+    }
+
+    void ensure_child_signal_(int status, int signal)
+    {
+        if(WIFSIGNALED(status))
+        {
+            if(WTERMSIG(status) != signal)
+            {
+                std::stringstream ss;
+                ss << "child killed by signal, expected '"
+                    << signal
+                    << "' actual '"
+                    << WTERMSIG(status)
+                    << '\'';
+                throw failure(ss.str().c_str());
+            }
+        }
+
+        if(WIFEXITED(status))
+        {
+            std::stringstream ss;
+            ss << "child exited with code " << WEXITSTATUS(status)
+                << ": expected signal " << signal;
+
+            throw failure(ss.str().c_str());
+        }
+
+        if(WIFSTOPPED(status))
+        {
+            std::stringstream ss;
+            ss << "child stopped by signal " << WTERMSIG(status)
+                << ": expected kill by signal " << signal;
+
+            throw failure(ss.str().c_str());
+        }
+    }
+
+    std::set<pid_t> get_pids_() const
+    {
+        using namespace std;
+
+        set<pid_t> pids;
+        for(pid_map::const_iterator i = pids_.begin(); i != pids_.end(); ++i)
+        {
+            pids.insert( i->first );
+        }
+
+        return pids;
+    }
+    
+    pid_map         pids_;
+    int             pipe_;
+};
+
+} // namespace tut
+
+#else
+
+namespace tut
+{
+
+struct test_object_posix
+{
+};
+
+struct test_group_posix
+{
+    template<typename T>
+    void send_result_(const T*, const test_result &)
+    {
+    }
+};
+
+} // namespace tut
+
+#endif
+
+
+#endif
+

Deleted: trunk/tests/unit/tut/tut_reporter.h
===================================================================
--- trunk/tests/unit/tut/tut_reporter.h	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/tut/tut_reporter.h	2009-04-09 21:46:30 UTC (rev 2344)
@@ -1,252 +0,0 @@
-// $Id: tut_reporter.h 1820 2006-09-06 16:54:23Z mloskot $
-// 
-// TUT: C++ Unit Test Framework
-// http://tut-framework.sourceforge.net/
-//
-// NOTE: This file is a customized version of the official tut_reporter.h.
-// The TUT's version of tut_reporter.h file is only a sample of
-// how to write TUT visualizer.
-//
-#ifndef TUT_REPORTER
-#define TUT_REPORTER
-
-#include <tut.h>
-
-/**
-* Template Unit Tests Framework for C++.
-* http://tut.dozen.ru
-*
-* @author dozen, tut at dozen.ru
-*/
-namespace
-{
-	std::ostream& operator << (std::ostream& os,const tut::test_result& tr)
-	{
-		switch(tr.result)
-		{
-		case tut::test_result::ok: 
-			os << '.'; 
-			break;
-
-		case tut::test_result::fail: 
-			os << '[' << tr.test << "=F]";
-			break;
-
-		case tut::test_result::ex_ctor: 
-			os << '[' << tr.test << "=C]";
-			break;
-
-		case tut::test_result::ex: 
-			os << '[' << tr.test << "=X]";
-			break;
-
-		case tut::test_result::warn: 
-			os << '[' << tr.test << "=W]";
-			break;
-
-		case tut::test_result::term: 
-			os << '[' << tr.test << "=T]";
-			break;
-		case tut::test_result::inform: 
-			break; // do nothing
-		}
-
-		return os;
-	}
-} // namespace
-
-namespace tut
-{
-	/**
-	* Default TUT callback handler.
-	*/
-	class reporter : public tut::callback
-	{
-		std::string current_group;
-		typedef std::vector<tut::test_result> not_passed_list;
-		not_passed_list not_passed;
-		std::ostream& os;
-
-	public:
-		int ok_count;
-		int ok_group_count;
-		int exceptions_count;
-		int failures_count;
-		int terminations_count;
-		int warnings_count;
-		int informs_count;
-
-		reporter() : os(std::cout)
-		{
-			init();
-		}
-
-		reporter(std::ostream& out) : os(out)
-		{
-			init();
-		}
-
-		void run_started()
-		{
-			init();
-		}
-
-		void test_completed(const tut::test_result& tr)
-		{
-			if( tr.group != current_group )
-			{
-				os << std::endl << tr.group << ": " << std::flush;
-				current_group = tr.group;
-			}
-
-			os << tr << std::flush;
-			
-			// inform result is neutral: not failure naither success
-			if (tr.result == tut::test_result::inform)
-			{
-				informs_count++;
-			}
-
-			// Treat inform test results as passed
-			if( tr.result == tut::test_result::ok
-				|| tr.result == tut::test_result::inform )
-			{
-				ok_group_count++;
-				ok_count++;
-			}
-			else if( tr.result == tut::test_result::ex )
-				exceptions_count++;
-			else if( tr.result == tut::test_result::ex_ctor )
-				exceptions_count++;
-			else if( tr.result == tut::test_result::fail )
-				failures_count++;
-			else if( tr.result == tut::test_result::warn )
-				warnings_count++;
-			else
-				terminations_count++;
-
-			if( tr.result != tut::test_result::ok )
-			{
-				not_passed.push_back(tr);
-			}
-		}
-
-		void group_started(const std::string& name)
-		{
-			ok_group_count = 0;
-		}
-
-		void group_completed(const std::string& name)
-		{
-			os << " " << ok_group_count << std::endl;
-		}
-
-		void run_completed()
-		{
-			os << std::endl;
-
-			if( not_passed.size() > 0 )
-			{
-				not_passed_list::const_iterator i = not_passed.begin();
-				while( i != not_passed.end() )
-				{
-					tut::test_result tr = *i;
-
-					os << std::endl;
-					os << "---> " << "group: " << tr.group
-						<< ", test: test<" << tr.test
-						<< ">" << std::endl;
-					os << "     problem: ";
-
-					switch(tr.result)
-					{
-					case test_result::fail: 
-						os << "assertion failed" << std::endl; 
-						break;
-					case test_result::ex: 
-					case test_result::ex_ctor: 
-						os << "unexpected exception" << std::endl;
-						if( tr.exception_typeid != "" )
-						{ 
-							os << "     exception typeid: " 
-								<< tr.exception_typeid << std::endl;
-						}
-						break;
-					case test_result::term: 
-						os << "would be terminated" << std::endl; 
-						break;
-					case test_result::warn: 
-						os << "test passed, but cleanup code (destructor) \
-								raised an exception" << std::endl;
-						break;
-					case test_result::inform: 
-						os << "test sends neutral information message" << std::endl; 
-						break;
-					default:
-						break;
-					}
-
-					if( tr.message != "" )
-					{
-						if( tr.result == test_result::fail )
-						{
-							os << "     failed assertion: \""
-								<< tr.message << "\"" << std::endl;
-						}
-						else
-						{
-							os << "     message: \""
-								<< tr.message << "\"" << std::endl;
-						}
-					}
-
-					++i;
-				}
-			}
-
-			os << std::endl;
-			os << "Tests summary:" << std::endl;
-			if( terminations_count > 0 )
-				os << " - terminations:" << terminations_count << std::endl;
-			if( exceptions_count > 0 )
-				os << " - exceptions:" << exceptions_count << std::endl;
-			if( failures_count > 0 )
-				os << " - failures:" << failures_count << std::endl;
-			if( warnings_count > 0 )
-				os << " - warnings:" << warnings_count << std::endl;
-			if( informs_count > 0 )
-				os << " - informing:" << informs_count << std::endl;
-			
-			os << " - passed: " << ok_count;
-			os << std::endl;
-		}
-
-		bool all_ok() const
-		{
-			return not_passed.size() == 0;
-		}
-
-		int get_failures_count() const
-		{
-			return failures_count;
-		}
-
-	private:
-		void init()
-		{
-			ok_count = 0;
-			ok_group_count = 0;
-			exceptions_count = 0;  
-			failures_count = 0;
-			terminations_count = 0;
-			warnings_count = 0;
-			informs_count = 0;
-
-			not_passed.clear();
-		}    
-	};
-
-} // namespace tut
-
-#endif // #ifndef TUT_REPORTER
-

Added: trunk/tests/unit/tut/tut_reporter.hpp
===================================================================
--- trunk/tests/unit/tut/tut_reporter.hpp	                        (rev 0)
+++ trunk/tests/unit/tut/tut_reporter.hpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -0,0 +1,243 @@
+#ifndef TUT_REPORTER
+#define TUT_REPORTER
+
+#include <tut/tut.hpp>
+
+/**
+ * Template Unit Tests Framework for C++.
+ * http://tut.dozen.ru
+ *
+ * @author Vladimir Dyuzhev, Vladimir.Dyuzhev at gmail.com
+ */
+namespace
+{
+
+std::ostream& operator<<(std::ostream& os, const tut::test_result& tr)
+{
+    switch(tr.result)
+    {
+    case tut::test_result::ok:
+        os << '.';
+        break;
+    case tut::test_result::fail:
+        os << '[' << tr.test << "=F]";
+        break;
+    case tut::test_result::ex_ctor:
+        os << '[' << tr.test << "=C]";
+        break;
+    case tut::test_result::ex:
+        os << '[' << tr.test << "=X]";
+        break;
+    case tut::test_result::warn:
+        os << '[' << tr.test << "=W]";
+        break;
+    case tut::test_result::term:
+        os << '[' << tr.test << "=T]";
+        break;
+    case tut::test_result::rethrown:
+        os << '[' << tr.test << "=P]";
+        break;
+    }
+
+    return os;
+}
+
+} // end of namespace
+
+namespace tut
+{
+
+/**
+ * Default TUT callback handler.
+ */
+class reporter : public tut::callback
+{
+    std::string current_group;
+    typedef std::vector<tut::test_result> not_passed_list;
+    not_passed_list not_passed;
+    std::ostream& os;
+
+public:
+
+    int ok_count;
+    int exceptions_count;
+    int failures_count;
+    int terminations_count;
+    int warnings_count;
+
+    reporter()
+        : os(std::cout)
+    {
+        init();
+    }
+
+    reporter(std::ostream& out)
+        : os(out)
+    {
+        init();
+    }
+
+    void run_started()
+    {
+        init();
+    }
+
+    void test_completed(const tut::test_result& tr)
+    {
+        if (tr.group != current_group)
+        {
+            os << std::endl << tr.group << ": " << std::flush;
+            current_group = tr.group;
+        }
+
+        os << tr << std::flush;
+        if (tr.result == tut::test_result::ok)
+        {
+            ok_count++;
+        }
+        else if (tr.result == tut::test_result::ex)
+        {
+            exceptions_count++;
+        }
+        else if (tr.result == tut::test_result::ex_ctor)
+        {
+            exceptions_count++;
+        }
+        else if (tr.result == tut::test_result::fail)
+        {
+            failures_count++;
+        }
+        else if (tr.result == tut::test_result::rethrown)
+        {
+            failures_count++;
+        }
+        else if (tr.result == tut::test_result::warn)
+        {
+            warnings_count++;
+        }
+        else
+        {
+            terminations_count++;
+        }
+
+        if (tr.result != tut::test_result::ok)
+        {
+            not_passed.push_back(tr);
+        }
+    }
+
+    void run_completed()
+    {
+        os << std::endl;
+
+        if (not_passed.size() > 0)
+        {
+            not_passed_list::const_iterator i = not_passed.begin();
+            while (i != not_passed.end())
+            {
+                tut::test_result tr = *i;
+
+                os << std::endl;
+
+                os << "---> " << "group: " << tr.group
+                << ", test: test<" << tr.test << ">"
+                << (!tr.name.empty() ? (std::string(" : ") + tr.name) : std::string())
+                << std::endl;
+
+#if defined(TUT_USE_POSIX)
+                if(tr.pid != getpid())
+                {
+                    os << "     child pid: " << tr.pid << std::endl;
+                }
+#endif
+                os << "     problem: ";
+                switch(tr.result)
+                {
+                case test_result::rethrown:
+                    os << "assertion failed in child" << std::endl;
+                    break;
+                case test_result::fail:
+                    os << "assertion failed" << std::endl;
+                    break;
+                case test_result::ex:
+                case test_result::ex_ctor:
+                    os << "unexpected exception" << std::endl;
+                    if( tr.exception_typeid != "" )
+                    {
+                        os << "     exception typeid: "
+                        << tr.exception_typeid << std::endl;
+                    }
+                    break;
+                case test_result::term:
+                    os << "would be terminated" << std::endl;
+                    break;
+                case test_result::warn:
+                    os << "test passed, but cleanup code (destructor) raised"
+                        " an exception" << std::endl;
+                    break;
+                default:
+                    break;
+                }
+
+                if (!tr.message.empty())
+                {
+                    if (tr.result == test_result::fail)
+                    {
+                        os << "     failed assertion: \"" << tr.message << "\""
+                            << std::endl;
+                    }
+                    else
+                    {
+                        os << "     message: \"" << tr.message << "\""
+                            << std::endl;
+                    }
+                }
+
+                ++i;
+            }
+        }
+
+        os << std::endl;
+
+        os << "tests summary:";
+        if (terminations_count > 0)
+        {
+            os << " terminations:" << terminations_count;
+        }
+        if (exceptions_count > 0)
+        {
+            os << " exceptions:" << exceptions_count;
+        }
+        if (failures_count > 0)
+        {
+            os << " failures:" << failures_count;
+        }
+        if (warnings_count > 0)
+        {
+            os << " warnings:" << warnings_count;
+        }
+        os << " ok:" << ok_count;
+        os << std::endl;
+    }
+
+    bool all_ok() const
+    {
+        return not_passed.empty();
+    }
+
+private:
+
+    void init()
+    {
+        ok_count = 0;
+        exceptions_count = 0;
+        failures_count = 0;
+        terminations_count = 0;
+        warnings_count = 0;
+        not_passed.clear();
+    }
+};
+
+}
+
+#endif

Deleted: trunk/tests/unit/tut/tut_restartable.h
===================================================================
--- trunk/tests/unit/tut/tut_restartable.h	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/tut/tut_restartable.h	2009-04-09 21:46:30 UTC (rev 2344)
@@ -1,372 +0,0 @@
-// $Id: tut_restartable.h 1820 2006-09-06 16:54:23Z mloskot $
-// 
-// TUT: C++ Unit Test Framework
-// http://tut-framework.sourceforge.net/
-//
-// NOTE: This file is included to GEOS source tree and may include some
-// changes comparing to the official version of TUT.
-//
-// The TUT License
-//
-// Copyright 2002-2006 Vladimir Dyuzhev.
-// 
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-// 
-// Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-//
-// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
-// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
-// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
-// OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-#ifndef TUT_RESTARTABLE_H_GUARD
-#define TUT_RESTARTABLE_H_GUARD
-
-#include "tut.h"
-#include <fstream>
-#include <iostream>
-
-/**
- * Template Unit Tests Framework for C++.
- * http://tut.dozen.ru
- *
- * Optional restartable wrapper for test_runner.
- * Allows to restart test runs finished due to
- * abnormal test application termination (such as
- * segmentation fault or math error).
- *
- * @author dozen, tut at dozen.ru
- */
-namespace tut
-{
-  namespace util
-  {
-    /**
-     * Escapes non-alphabetical characters in string.
-     */
-    std::string escape(const std::string& orig)
-    {
-      std::string rc;
-      std::string::const_iterator i,e;
-      i = orig.begin();
-      e = orig.end();
-
-      while( i != e )
-      {
-        if( (*i >= 'a' && *i <= 'z') ||
-            (*i >= 'A' && *i <= 'Z') ||
-            (*i >= '0' && *i <= '9') )
-        {
-          rc += *i;
-        }
-        else
-        {
-          rc += '\\';
-          rc += ('a'+(((unsigned int)*i)>>4));
-          rc += ('a'+(((unsigned int)*i)&0xF));
-        }
-
-        ++i;         
-      }
-      return rc;
-    }
-
-    /**
-     * Un-escapes string.
-     */
-    std::string unescape(const std::string& orig)
-    {
-      std::string rc;
-      std::string::const_iterator i,e;
-      i = orig.begin();
-      e = orig.end();
-
-      while( i != e )
-      {
-        if( *i != '\\' )
-        {
-          rc += *i;
-        }
-        else
-        {
-          ++i; if( i == e ) throw std::invalid_argument("unexpected end of string");
-          unsigned int c1 = *i;
-          ++i; if( i == e ) throw std::invalid_argument("unexpected end of string");
-          unsigned int c2 = *i;
-          rc += (((c1-'a')<<4) + (c2-'a'));
-        }
- 
-        ++i;
-      }
-      return rc;         
-    }
-
-    /**
-     * Serialize test_result avoiding interfering with operator <<.
-     */
-    void serialize(std::ostream& os,const tut::test_result& tr)
-    {
-      os << escape(tr.group) << std::endl;
-      os << tr.test << ' ';
-      switch(tr.result)
-      {
-        case test_result::ok: os << 0; break;
-        case test_result::fail: os << 1; break;
-        case test_result::ex: os << 2; break;
-        case test_result::warn: os << 3; break;
-        case test_result::term: os << 4; break;
-        default: throw std::logic_error("operator << : bad result_type");
-      }  
-      os << ' ' << escape(tr.message) << std::endl;
-    }
-
-    /**
-     * deserialization for test_result
-     */
-    void deserialize(std::istream& is,tut::test_result& tr)
-    {
-      std::getline(is,tr.group);
-      if( is.eof() ) throw tut::no_more_tests();
-      tr.group = unescape(tr.group);
-
-      tr.test = -1;
-      is >> tr.test;
-      if( tr.test < 0 ) throw std::logic_error("operator >> : bad test number");
-
-      int n = -1; is >> n;
-      switch(n)
-      {
-        case 0: tr.result = test_result::ok; break;
-        case 1: tr.result = test_result::fail; break;
-        case 2: tr.result = test_result::ex; break;
-        case 3: tr.result = test_result::warn; break;
-        case 4: tr.result = test_result::term; break;
-        default: throw std::logic_error("operator >> : bad result_type");
-      }  
- 
-      is.ignore(1); // space
-      std::getline(is,tr.message);
-      tr.message = unescape(tr.message);
-      if( !is.good() ) throw std::logic_error("malformed test result");
-    }
-  };
-
-  /**
-   * Restartable test runner wrapper.
-   */
-  class restartable_wrapper
-  {
-    test_runner& runner_;
-    callback* callback_;
-
-    std::string dir_;
-    std::string log_; // log file: last test being executed
-    std::string jrn_; // journal file: results of all executed tests
-
-    public:
-    /**
-     * Default constructor.
-     * @param dir Directory where to search/put log and journal files
-     */
-    restartable_wrapper(const std::string& dir = ".") 
-      : runner_(runner.get()), callback_(0), dir_(dir)
-    {
-      // dozen: it works, but it would be better to use system path separator
-      jrn_ = dir_+'/'+"journal.tut";
-      log_ = dir_+'/'+"log.tut";
-    }
-
-    /**
-     * Stores another group for getting by name.
-     */
-    void register_group(const std::string& name,group_base* gr)
-    {
-      runner_.register_group(name,gr);
-    }
-
-    /**
-     * Stores callback object.
-     */
-    void set_callback(callback* cb)
-    {
-      callback_ = cb;
-    }
-
-    /**
-     * Returns callback object.
-     */
-    callback& get_callback() const
-    {
-      return runner_.get_callback();
-    }
-
-    /**
-     * Returns list of known test groups.
-     */
-    groupnames list_groups() const
-    {
-      return runner_.list_groups();
-    }
-
-    /**
-     * Runs all tests in all groups.
-     */
-    void run_tests() const
-    {
-      // where last run was failed
-      std::string fail_group;
-      int fail_test;
-      read_log_(fail_group,fail_test);
-      bool fail_group_reached = (fail_group == "");
-
-      // iterate over groups
-      tut::groupnames gn = list_groups();
-      tut::groupnames::const_iterator gni,gne;
-      gni = gn.begin();
-      gne = gn.end();
-      while( gni != gne )
-      {
-        // skip all groups before one that failed
-        if( !fail_group_reached )
-        {
-          if( *gni != fail_group )
-          {
-            ++gni;
-            continue;
-          }
-          fail_group_reached = true;
-        }
-
-        // first or restarted run
-        int test = (*gni == fail_group && fail_test>=0)? fail_test+1:1;
-        while(true)
-        {
-          // last executed test pos
-          register_execution_(*gni,test);
-
-          try
-          {
-            tut::test_result tr = runner_.run_test(*gni,test);
-            register_test_(tr);
-          }
-          catch( const tut::beyond_last_test& ex )
-          {
-            break;
-          }
-          catch( const tut::no_such_test& ex )
-          {
-            // it's ok
-          }
-
-          ++test;
-        }
-
-        ++gni;      
-      }
-
-      // show final results to user
-      invoke_callback_();
-
-      // truncate files as mark of successful finish
-      truncate_();
-    }
-
-  private:
-    /**
-     * Shows results from journal file.
-     */
-    void invoke_callback_() const
-    {
-      runner_.set_callback(callback_);
-      runner_.get_callback().run_started();
-
-      std::string current_group;
-      std::ifstream ijournal(jrn_.c_str());
-      while( ijournal.good() )
-      {
-        // read next test result
-        try
-        {
-          tut::test_result tr;
-          util::deserialize(ijournal,tr);
-          runner_.get_callback().test_completed(tr);
-        }
-        catch( const no_more_tests& )
-        {
-          break;
-        }
-      }
-
-      runner_.get_callback().run_completed();
-    }
-
-    /**
-     * Register test into journal.
-     */
-    void register_test_(const test_result& tr) const
-    {
-      std::ofstream ojournal(jrn_.c_str(),std::ios::app);
-      util::serialize(ojournal,tr);
-      ojournal << std::flush;
-      if( !ojournal.good() )
-		  throw std::runtime_error("unable to register test result in file "+jrn_);
-    }
-
-    /**
-     * Mark the fact test going to be executed
-     */
-    void register_execution_(const std::string& grp,int test) const
-    {
-      // last executed test pos
-      std::ofstream olog(log_.c_str());
-      olog << util::escape(grp) << std::endl << test << std::endl << std::flush;
-      if( !olog.good() )
-		  throw std::runtime_error("unable to register execution in file "+log_);
-    }
-
-    /**
-     * Truncate tests.
-     */
-    void truncate_() const
-    {
-      std::ofstream olog(log_.c_str());
-      std::ofstream ojournal(jrn_.c_str());
-    }
-
-    /**
-     * Read log file
-     */
-    void read_log_(std::string& fail_group,int& fail_test) const
-    {
-      // read failure point, if any
-      std::ifstream ilog(log_.c_str());
-      std::getline(ilog,fail_group);
-      fail_group = util::unescape(fail_group);
-      ilog >> fail_test;
-      if( !ilog.good() )
-      { 
-        fail_group = ""; fail_test = -1; 
-        truncate_();
-      }
-      else
-      {
-        // test was terminated...
-        tut::test_result tr(fail_group,fail_test,tut::test_result::term);
-        register_test_(tr);
-      }
-    }
-  };
-}
-
-#endif
-

Added: trunk/tests/unit/tut/tut_restartable.hpp
===================================================================
--- trunk/tests/unit/tut/tut_restartable.hpp	                        (rev 0)
+++ trunk/tests/unit/tut/tut_restartable.hpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -0,0 +1,394 @@
+#ifndef TUT_RESTARTABLE_H_GUARD
+#define TUT_RESTARTABLE_H_GUARD
+
+#include <tut/tut.hpp>
+#include <fstream>
+#include <iostream>
+#include <stdexcept>
+
+/**
+ * Template Unit Tests Framework for C++.
+ * http://tut.dozen.ru
+ *
+ * Optional restartable wrapper for test_runner. Allows to restart test runs
+ * finished due to abnormal test application termination (such as segmentation
+ * fault or math error).
+ *
+ * @author Vladimir Dyuzhev, Vladimir.Dyuzhev at gmail.com
+ */
+
+namespace tut
+{
+    
+namespace util
+{
+    
+/**
+ * Escapes non-alphabetical characters in string.
+ */
+std::string escape(const std::string& orig)
+{
+    std::string rc;
+    std::string::const_iterator i,e;
+    i = orig.begin();
+    e = orig.end();
+
+    while (i != e)
+    {
+        if ((*i >= 'a' && *i <= 'z') ||
+                (*i >= 'A' && *i <= 'Z') ||
+                (*i >= '0' && *i <= '9') )
+        {
+            rc += *i;
+        }
+        else
+        {
+            rc += '\\';
+            rc += ('a'+(((unsigned int)*i) >> 4));
+            rc += ('a'+(((unsigned int)*i) & 0xF));
+        }
+
+        ++i;
+    }
+    return rc;
+}
+
+/**
+ * Un-escapes string.
+ */
+std::string unescape(const std::string& orig)
+{
+    std::string rc;
+    std::string::const_iterator i,e;
+    i = orig.begin();
+    e = orig.end();
+
+    while (i != e)
+    {
+        if (*i != '\\')
+        {
+            rc += *i;
+        }
+        else
+        {
+            ++i;
+            if (i == e)
+            {
+                throw std::invalid_argument("unexpected end of string");
+            }
+            unsigned int c1 = *i;
+            ++i;
+            if (i == e)
+            {
+                throw std::invalid_argument("unexpected end of string");
+            }
+            unsigned int c2 = *i;
+            rc += (((c1 - 'a') << 4) + (c2 - 'a'));
+        }
+
+        ++i;
+    }
+    return rc;
+}
+
+/**
+ * Serialize test_result avoiding interfering with operator <<.
+ */
+void serialize(std::ostream& os, const tut::test_result& tr)
+{
+    os << escape(tr.group) << std::endl;
+    os << tr.test << ' ';
+    switch(tr.result)
+    {
+    case test_result::ok:
+        os << 0;
+        break;
+    case test_result::fail:
+        os << 1;
+        break;
+    case test_result::ex:
+        os << 2;
+        break;
+    case test_result::warn:
+        os << 3;
+        break;
+    case test_result::term:
+        os << 4;
+        break;
+    default:
+        throw std::logic_error("operator << : bad result_type");
+    }
+    os << ' ' << escape(tr.message) << std::endl;
+}
+
+/**
+ * deserialization for test_result
+ */
+void deserialize(std::istream& is, tut::test_result& tr)
+{
+    std::getline(is,tr.group);
+    if (is.eof())
+    {
+        throw tut::no_more_tests();
+    }
+    tr.group = unescape(tr.group);
+
+    tr.test = -1;
+    is >> tr.test;
+    if (tr.test < 0)
+    {
+        throw std::logic_error("operator >> : bad test number");
+    }
+
+    int n = -1;
+    is >> n;
+    switch(n)
+    {
+    case 0:
+        tr.result = test_result::ok;
+        break;
+    case 1:
+        tr.result = test_result::fail;
+        break;
+    case 2:
+        tr.result = test_result::ex;
+        break;
+    case 3:
+        tr.result = test_result::warn;
+        break;
+    case 4:
+        tr.result = test_result::term;
+        break;
+    default:
+        throw std::logic_error("operator >> : bad result_type");
+    }
+
+    is.ignore(1); // space
+    std::getline(is,tr.message);
+    tr.message = unescape(tr.message);
+    if (!is.good())
+    {
+        throw std::logic_error("malformed test result");
+    }
+}
+};
+
+/**
+ * Restartable test runner wrapper.
+ */
+class restartable_wrapper
+{
+    test_runner& runner_;
+    callback* callback_;
+
+    std::string dir_;
+    std::string log_; // log file: last test being executed
+    std::string jrn_; // journal file: results of all executed tests
+
+public:
+    /**
+     * Default constructor.
+     * @param dir Directory where to search/put log and journal files
+     */
+    restartable_wrapper(const std::string& dir = ".")
+        : runner_(runner.get()), 
+          callback_(0), 
+          dir_(dir)
+    {
+        // dozen: it works, but it would be better to use system path separator
+        jrn_ = dir_ + '/' + "journal.tut";
+        log_ = dir_ + '/' + "log.tut";
+    }
+
+    /**
+     * Stores another group for getting by name.
+     */
+    void register_group(const std::string& name, group_base* gr)
+    {
+        runner_.register_group(name,gr);
+    }
+
+    /**
+     * Stores callback object.
+     */
+    void set_callback(callback* cb)
+    {
+        callback_ = cb;
+    }
+
+    /**
+     * Returns callback object.
+     */
+    callback& get_callback() const
+    {
+        return runner_.get_callback();
+    }
+
+    /**
+     * Returns list of known test groups.
+     */
+    groupnames list_groups() const
+    {
+        return runner_.list_groups();
+    }
+
+    /**
+     * Runs all tests in all groups.
+     */
+    void run_tests() const
+    {
+        // where last run was failed
+        std::string fail_group;
+        int fail_test;
+        read_log_(fail_group,fail_test);
+        bool fail_group_reached = (fail_group == "");
+
+        // iterate over groups
+        tut::groupnames gn = list_groups();
+        tut::groupnames::const_iterator gni,gne;
+        gni = gn.begin();
+        gne = gn.end();
+        while (gni != gne)
+        {
+            // skip all groups before one that failed
+            if (!fail_group_reached)
+            {
+                if (*gni != fail_group)
+                {
+                    ++gni;
+                    continue;
+                }
+                fail_group_reached = true;
+            }
+
+            // first or restarted run
+            int test = (*gni == fail_group && fail_test >= 0) ? fail_test + 1 : 1;
+            while(true)
+            {
+                // last executed test pos
+                register_execution_(*gni,test);
+
+                try
+                {
+                    tut::test_result tr = runner_.run_test(*gni,test);
+                    register_test_(tr);
+                }
+                catch (const tut::beyond_last_test&)
+                {
+                    break;
+                }
+                catch(const tut::no_such_test&)
+                {
+                    // it's ok
+                }
+
+                ++test;
+            }
+
+            ++gni;
+        }
+
+        // show final results to user
+        invoke_callback_();
+
+        // truncate files as mark of successful finish
+        truncate_();
+    }
+
+private:
+    /**
+     * Shows results from journal file.
+     */
+    void invoke_callback_() const
+    {
+        runner_.set_callback(callback_);
+        runner_.get_callback().run_started();
+
+        std::string current_group;
+        std::ifstream ijournal(jrn_.c_str());
+        while (ijournal.good())
+        {
+            // read next test result
+            try
+            {
+                tut::test_result tr;
+                util::deserialize(ijournal,tr);
+                runner_.get_callback().test_completed(tr);
+            }
+            catch (const no_more_tests&)
+            {
+                break;
+            }
+        }
+
+        runner_.get_callback().run_completed();
+    }
+
+    /**
+     * Register test into journal.
+     */
+    void register_test_(const test_result& tr) const
+    {
+        std::ofstream ojournal(jrn_.c_str(), std::ios::app);
+        util::serialize(ojournal, tr);
+        ojournal << std::flush;
+        if (!ojournal.good())
+        {
+            throw std::runtime_error("unable to register test result in file "
+                + jrn_);
+        }
+    }
+
+    /**
+     * Mark the fact test going to be executed
+     */
+    void register_execution_(const std::string& grp, int test) const
+    {
+        // last executed test pos
+        std::ofstream olog(log_.c_str());
+        olog << util::escape(grp) << std::endl << test << std::endl << std::flush;
+        if (!olog.good())
+        {
+            throw std::runtime_error("unable to register execution in file "
+                + log_);
+        }
+    }
+
+    /**
+     * Truncate tests.
+     */
+    void truncate_() const
+    {
+        std::ofstream olog(log_.c_str());
+        std::ofstream ojournal(jrn_.c_str());
+    }
+
+    /**
+     * Read log file
+     */
+    void read_log_(std::string& fail_group, int& fail_test) const
+    {
+        // read failure point, if any
+        std::ifstream ilog(log_.c_str());
+        std::getline(ilog,fail_group);
+        fail_group = util::unescape(fail_group);
+        ilog >> fail_test;
+        if (!ilog.good())
+        {
+            fail_group = "";
+            fail_test = -1;
+            truncate_();
+        }
+        else
+        {
+            // test was terminated...
+            tut::test_result tr(fail_group, fail_test, "", tut::test_result::term);
+            register_test_(tr);
+        }
+    }
+};
+
+}
+
+#endif
+

Added: trunk/tests/unit/tut/tut_result.hpp
===================================================================
--- trunk/tests/unit/tut/tut_result.hpp	                        (rev 0)
+++ trunk/tests/unit/tut/tut_result.hpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -0,0 +1,128 @@
+#ifndef TUT_RESULT_H_GUARD
+#define TUT_RESULT_H_GUARD
+
+#include <string>
+
+namespace tut
+{
+
+#if defined(TUT_USE_POSIX)
+struct test_result_posix
+{
+    test_result_posix()
+        : pid(getpid())
+    {
+    }
+
+    pid_t pid;
+};
+#else
+struct test_result_posix
+{
+};
+#endif
+
+/**
+ * Return type of runned test/test group.
+ *
+ * For test: contains result of test and, possible, message
+ * for failure or exception.
+ */
+struct test_result : public test_result_posix
+{
+    /**
+     * Test group name.
+     */
+    std::string group;
+
+    /**
+     * Test number in group.
+     */
+    int test;
+
+    /**
+     * Test name (optional)
+     */
+    std::string name;
+
+    /**
+     * ok - test finished successfully
+     * fail - test failed with ensure() or fail() methods
+     * ex - test throwed an exceptions
+     * warn - test finished successfully, but test destructor throwed
+     * term - test forced test application to terminate abnormally
+     */
+    enum result_type
+    {
+        ok,
+        fail,
+        ex,
+        warn,
+        term,
+        ex_ctor,
+        rethrown
+    };
+
+    result_type result;
+
+    /**
+     * Exception message for failed test.
+     */
+    std::string message;
+    std::string exception_typeid;
+
+    /**
+     * Default constructor.
+     */
+    test_result()
+        : test(0),
+          result(ok)
+    {
+    }
+
+    /**
+     * Constructor.
+     */
+    test_result(const std::string& grp, int pos,
+                const std::string& test_name, result_type res)
+        : group(grp),
+          test(pos),
+          name(test_name),
+          result(res)
+    {
+    }
+
+    /**
+     * Constructor with exception.
+     */
+    test_result(const std::string& grp,int pos,
+                const std::string& test_name, result_type res,
+                const std::exception& ex)
+        : group(grp),
+          test(pos),
+          name(test_name),
+          result(res),
+          message(ex.what()),
+          exception_typeid(typeid(ex).name())
+    {
+    }
+
+    /** Constructor with typeid.
+    */
+    test_result(const std::string& grp,int pos,
+                const std::string& test_name, result_type res,
+                const std::string& ex_typeid,
+                const std::string& msg)
+        : group(grp),
+          test(pos),
+          name(test_name),
+          result(res),
+          message(msg),
+          exception_typeid(ex_typeid)
+    {
+    }
+};
+
+}
+
+#endif

Added: trunk/tests/unit/tut/tut_runner.hpp
===================================================================
--- trunk/tests/unit/tut/tut_runner.hpp	                        (rev 0)
+++ trunk/tests/unit/tut/tut_runner.hpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -0,0 +1,302 @@
+#ifndef TUT_RUNNER_H_GUARD
+#define TUT_RUNNER_H_GUARD
+
+#include <string>
+#include <vector>
+#include "tut_exception.hpp"
+
+namespace tut
+{
+
+/**
+ * Interface.
+ * Test group operations.
+ */
+struct group_base
+{
+    virtual ~group_base()
+    {
+    }
+
+    // execute tests iteratively
+    virtual void rewind() = 0;
+    virtual test_result run_next() = 0;
+
+    // execute one test
+    virtual test_result run_test(int n) = 0;
+};
+
+
+/**
+ * Test runner callback interface.
+ * Can be implemented by caller to update
+ * tests results in real-time. User can implement
+ * any of callback methods, and leave unused
+ * in default implementation.
+ */
+struct callback
+{
+    /**
+     * Virtual destructor is a must for subclassed types.
+     */
+    virtual ~callback()
+    {
+    }
+
+    /**
+     * Called when new test run started.
+     */
+    virtual void run_started()
+    {
+    }
+
+    /**
+     * Called when a group started
+     * @param name Name of the group
+     */
+    virtual void group_started(const std::string& /*name*/)
+    {
+    }
+
+    /**
+     * Called when a test finished.
+     * @param tr Test results.
+     */
+    virtual void test_completed(const test_result& /*tr*/)
+    {
+    }
+
+    /**
+     * Called when a group is completed
+     * @param name Name of the group
+     */
+    virtual void group_completed(const std::string& /*name*/)
+    {
+    }
+
+    /**
+     * Called when all tests in run completed.
+     */
+    virtual void run_completed()
+    {
+    }
+};
+
+/**
+ * Typedef for runner::list_groups()
+ */
+typedef std::vector<std::string> groupnames;
+
+/**
+ * Test runner.
+ */
+class test_runner
+{
+
+public:
+
+    /**
+     * Constructor
+     */
+    test_runner()
+        : callback_(&default_callback_)
+    {
+    }
+
+    /**
+     * Stores another group for getting by name.
+     */
+    void register_group(const std::string& name, group_base* gr)
+    {
+        if (gr == 0)
+        {
+            throw tut_error("group shall be non-null");
+        }
+
+        if (groups_.find(name) != groups_.end())
+        {
+            std::string msg("attempt to add already existent group " + name);
+            // this exception terminates application so we use cerr also
+            // TODO: should this message appear in stream?
+            std::cerr << msg << std::endl;
+            throw tut_error(msg);
+        }
+
+        groups_.insert( std::make_pair(name, gr) );
+    }
+
+    /**
+     * Stores callback object.
+     */
+    void set_callback(callback* cb)
+    {
+        callback_ = cb == 0 ? &default_callback_ : cb;
+    }
+
+    /**
+     * Returns callback object.
+     */
+    callback& get_callback() const
+    {
+        return *callback_;
+    }
+
+    /**
+     * Returns list of known test groups.
+     */
+    const groupnames list_groups() const
+    {
+        groupnames ret;
+        const_iterator i = groups_.begin();
+        const_iterator e = groups_.end();
+        while (i != e)
+        {
+            ret.push_back(i->first);
+            ++i;
+        }
+        return ret;
+    }
+
+    /**
+     * Runs all tests in all groups.
+     * @param callback Callback object if exists; null otherwise
+     */
+    void run_tests() const
+    {
+        callback_->run_started();
+
+        const_iterator i = groups_.begin();
+        const_iterator e = groups_.end();
+        while (i != e)
+        {
+            callback_->group_started(i->first);
+            try
+            {
+                run_all_tests_in_group_(i);
+            }
+            catch (const no_more_tests&)
+            {
+                callback_->group_completed(i->first);
+            }
+
+            ++i;
+        }
+
+        callback_->run_completed();
+    }
+
+    /**
+     * Runs all tests in specified group.
+     */
+    void run_tests(const std::string& group_name) const
+    {
+        callback_->run_started();
+
+        const_iterator i = groups_.find(group_name);
+        if (i == groups_.end())
+        {
+            callback_->run_completed();
+            throw no_such_group(group_name);
+        }
+
+        callback_->group_started(group_name);
+        try
+        {
+            run_all_tests_in_group_(i);
+        }
+        catch (const no_more_tests&)
+        {
+            // ok
+        }
+
+        callback_->group_completed(group_name);
+        callback_->run_completed();
+    }
+
+    /**
+     * Runs one test in specified group.
+     */
+    test_result run_test(const std::string& group_name, int n) const
+    {
+        callback_->run_started();
+
+        const_iterator i = groups_.find(group_name);
+        if (i == groups_.end())
+        {
+            callback_->run_completed();
+            throw no_such_group(group_name);
+        }
+
+        callback_->group_started(group_name);
+        try
+        {
+            test_result tr = i->second->run_test(n);
+            callback_->test_completed(tr);
+            callback_->group_completed(group_name);
+            callback_->run_completed();
+            return tr;
+        }
+        catch (const beyond_last_test&)
+        {
+            callback_->group_completed(group_name);
+            callback_->run_completed();
+            throw;
+        }
+        catch (const no_such_test&)
+        {
+            callback_->group_completed(group_name);
+            callback_->run_completed();
+            throw;
+        }
+    }
+
+protected:
+
+    typedef std::map<std::string, group_base*> groups;
+    typedef groups::iterator iterator;
+    typedef groups::const_iterator const_iterator;
+    groups groups_;
+
+    callback  default_callback_;
+    callback* callback_;
+
+
+private:
+
+    void run_all_tests_in_group_(const_iterator i) const
+    {
+        i->second->rewind();
+        for ( ;; )
+        {
+            test_result tr = i->second->run_next();
+            callback_->test_completed(tr);
+
+            if (tr.result == test_result::ex_ctor)
+            {
+                throw no_more_tests();
+            }
+        }
+    }
+};
+
+/**
+ * Singleton for test_runner implementation.
+ * Instance with name runner_singleton shall be implemented
+ * by user.
+ */
+class test_runner_singleton
+{
+public:
+
+    static test_runner& get()
+    {
+        static test_runner tr;
+        return tr;
+    }
+};
+
+extern test_runner_singleton runner;
+
+}
+
+#endif

Modified: trunk/tests/unit/util/UniqueCoordinateArrayFilterTest.cpp
===================================================================
--- trunk/tests/unit/util/UniqueCoordinateArrayFilterTest.cpp	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/util/UniqueCoordinateArrayFilterTest.cpp	2009-04-09 21:46:30 UTC (rev 2344)
@@ -2,17 +2,18 @@
 // 
 // Test Suite for geos::util::UniqueCoordinateArrayFilter class.
 
-// TUT
-#include <tut.h>
-// GEOS
+// tut
+#include <tut.hpp>
+// geos
 #include <geos/util/UniqueCoordinateArrayFilter.h>
 #include <geos/geom/Coordinate.h>
 #include <geos/geom/Geometry.h>
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/PrecisionModel.h>
 #include <geos/io/WKTReader.h>
-// STL
+// std
 #include <memory>
+#include <string>
 
 namespace tut
 {

Modified: trunk/tests/unit/utility.h
===================================================================
--- trunk/tests/unit/utility.h	2009-04-09 19:39:44 UTC (rev 2343)
+++ trunk/tests/unit/utility.h	2009-04-09 21:46:30 UTC (rev 2344)
@@ -5,6 +5,8 @@
 #ifndef GEOS_TUT_UTILITY_H_INCLUDED
 #define GEOS_TUT_UTILITY_H_INCLUDED 
 
+// tut
+#include <tut.hpp>
 // geos
 #include <geos/geom/Geometry.h>
 #include <geos/geom/GeometryCollection.h>
@@ -30,8 +32,6 @@
 #include <cassert>
 #include <string>
 #include <vector>
-// tut
-#include <tut.h>
 
 namespace tut
 {



More information about the geos-commits mailing list