[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