Replace EXPECT/ASSERT_DEATH with EXPECT_DEATH_IF_SUPPORTED.

This allows us to remove all the WIN32/MSVC ifdefs in the
various tests.

http://code.google.com/p/ceres-solver/issues/detail?id=55

Change-Id: Ida053e44ea84b6915758318403f3db05325f1226
diff --git a/internal/ceres/corrector_test.cc b/internal/ceres/corrector_test.cc
index b2ee9ab..55e7d6b 100644
--- a/internal/ceres/corrector_test.cc
+++ b/internal/ceres/corrector_test.cc
@@ -44,19 +44,15 @@
 // If rho[1] is zero, the Corrector constructor should crash.
 TEST(Corrector, ZeroGradientDeathTest) {
   const double kRho[] = {0.0, 0.0, 0.0};
-#ifndef _WIN32
-  ASSERT_DEATH({Corrector c(1.0, kRho);},
+  EXPECT_DEATH_IF_SUPPORTED({Corrector c(1.0, kRho);},
                ".*");
-#endif  // _WIN32
 }
 
 // If rho[1] is negative, the Corrector constructor should crash.
 TEST(Corrector, NegativeGradientDeathTest) {
   const double kRho[] = {0.0, -0.1, 0.0};
-#ifndef _WIN32
-  ASSERT_DEATH({Corrector c(1.0, kRho);},
+  EXPECT_DEATH_IF_SUPPORTED({Corrector c(1.0, kRho);},
                ".*");
-#endif  // _WIN32
 }
 
 TEST(Corrector, ScalarCorrection) {
diff --git a/internal/ceres/graph_test.cc b/internal/ceres/graph_test.cc
index d4ee22d..85b80bf 100644
--- a/internal/ceres/graph_test.cc
+++ b/internal/ceres/graph_test.cc
@@ -83,22 +83,16 @@
   EXPECT_EQ(graph.EdgeWeight(1, 0), 0.5);
 }
 
-// Death tests don't work on Windows.
-// TODO(keir): Figure out why this test doesn't work on Windows.
-#ifndef _WIN32
-
 TEST(Graph, DieOnNonExistentVertex) {
   Graph<int> graph;
   graph.AddVertex(0, 1.0);
   graph.AddVertex(1, 2.0);
   graph.AddEdge(0, 1, 0.5);
 
-  EXPECT_DEATH(graph.VertexWeight(2), "key not found");
-  EXPECT_DEATH(graph.Neighbors(2), "key not found");
+  EXPECT_DEATH_IF_SUPPORTED(graph.VertexWeight(2), "key not found");
+  EXPECT_DEATH_IF_SUPPORTED(graph.Neighbors(2), "key not found");
 }
 
-#endif  // _WIN32
-
 TEST(Graph, NonExistentEdge) {
   Graph<int> graph;
   graph.AddVertex(0, 1.0);
diff --git a/internal/ceres/local_parameterization_test.cc b/internal/ceres/local_parameterization_test.cc
index 55c765b..9b775b4 100644
--- a/internal/ceres/local_parameterization_test.cc
+++ b/internal/ceres/local_parameterization_test.cc
@@ -62,30 +62,28 @@
   }
 }
 
-// Death tests are not working on Windows yet.
-// TODO(keir): Figure out how to enable these.
-#ifndef _WIN32
-
 TEST(SubsetParameterization, DeathTests) {
   vector<int> constant_parameters;
-  EXPECT_DEATH(SubsetParameterization parameterization(1, constant_parameters),
-               "at least");
+  EXPECT_DEATH_IF_SUPPORTED(
+      SubsetParameterization parameterization(1, constant_parameters),
+      "at least");
 
   constant_parameters.push_back(0);
-  EXPECT_DEATH(SubsetParameterization parameterization(1, constant_parameters),
-               "Number of parameters");
+  EXPECT_DEATH_IF_SUPPORTED(
+      SubsetParameterization parameterization(1, constant_parameters),
+      "Number of parameters");
 
   constant_parameters.push_back(1);
-  EXPECT_DEATH(SubsetParameterization parameterization(2, constant_parameters),
-               "Number of parameters");
+  EXPECT_DEATH_IF_SUPPORTED(
+      SubsetParameterization parameterization(2, constant_parameters),
+      "Number of parameters");
 
   constant_parameters.push_back(1);
-  EXPECT_DEATH(SubsetParameterization parameterization(2, constant_parameters),
-               "duplicates");
+  EXPECT_DEATH_IF_SUPPORTED(
+      SubsetParameterization parameterization(2, constant_parameters),
+      "duplicates");
 }
 
-#endif  // _WIN32
-
 TEST(SubsetParameterization, NormalFunctionTest) {
   double x[4] = {1.0, 2.0, 3.0, 4.0};
   for (int i = 0; i < 4; ++i) {
diff --git a/internal/ceres/parameter_block_test.cc b/internal/ceres/parameter_block_test.cc
index b1d69b0..35998dc 100644
--- a/internal/ceres/parameter_block_test.cc
+++ b/internal/ceres/parameter_block_test.cc
@@ -36,8 +36,6 @@
 namespace ceres {
 namespace internal {
 
-// TODO(keir): Figure out how to enable the death tests on Windows.
-
 TEST(ParameterBlock, SetLocalParameterization) {
   double x[3] = { 1.0, 2.0, 3.0 };
   ParameterBlock parameter_block(x, 3);
@@ -48,13 +46,12 @@
 
   // Can't set the parameterization if the sizes don't match.
   SubsetParameterization subset_wrong_size(4, indices);
-#ifndef _WIN32
-  ASSERT_DEATH(parameter_block.SetParameterization(&subset_wrong_size),
-               "global");
+  EXPECT_DEATH_IF_SUPPORTED(
+      parameter_block.SetParameterization(&subset_wrong_size), "global");
 
   // Can't set parameterization to NULL from NULL.
-  ASSERT_DEATH(parameter_block.SetParameterization(NULL), "NULL");
-#endif  // _WIN32
+  EXPECT_DEATH_IF_SUPPORTED
+      (parameter_block.SetParameterization(NULL), "NULL");
 
   // Now set the parameterization.
   SubsetParameterization subset(3, indices);
@@ -63,15 +60,13 @@
   // Re-setting the parameterization to the same value is supported.
   parameter_block.SetParameterization(&subset);
 
-#ifndef _WIN32
   // Can't set parameterization to NULL from another parameterization.
-  ASSERT_DEATH(parameter_block.SetParameterization(NULL), "NULL");
+  EXPECT_DEATH_IF_SUPPORTED(parameter_block.SetParameterization(NULL), "NULL");
 
   // Can't set the parameterization more than once.
   SubsetParameterization subset_different(3, indices);
-  ASSERT_DEATH(parameter_block.SetParameterization(&subset_different),
-               "re-set");
-#endif  // _WIN32
+  EXPECT_DEATH_IF_SUPPORTED
+      (parameter_block.SetParameterization(&subset_different), "re-set");
 
   // Ensure the local parameterization jacobian result is correctly computed.
   ConstMatrixRef local_parameterization_jacobian(
diff --git a/internal/ceres/problem_test.cc b/internal/ceres/problem_test.cc
index b8dbc74..9b20dca 100644
--- a/internal/ceres/problem_test.cc
+++ b/internal/ceres/problem_test.cc
@@ -106,9 +106,6 @@
   }
 };
 
-// TODO(keir): Figure out how to enable death tests on Windows.
-#ifndef _WIN32
-
 TEST(Problem, AddResidualWithNullCostFunctionDies) {
   double x[3], y[4], z[5];
 
@@ -117,8 +114,8 @@
   problem.AddParameterBlock(y, 4);
   problem.AddParameterBlock(z, 5);
 
-  ASSERT_DEATH(problem.AddResidualBlock(NULL, NULL, x),
-               "'cost_function' Must be non NULL");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddResidualBlock(NULL, NULL, x),
+                            "'cost_function' Must be non NULL");
 }
 
 TEST(Problem, AddResidualWithIncorrectNumberOfParameterBlocksDies) {
@@ -130,7 +127,7 @@
   problem.AddParameterBlock(z, 5);
 
   // UnaryCostFunction takes only one parameter, but two are passed.
-  ASSERT_DEATH(
+  EXPECT_DEATH_IF_SUPPORTED(
       problem.AddResidualBlock(new UnaryCostFunction(2, 3), NULL, x, y),
       "parameter_blocks.size()");
 }
@@ -140,21 +137,23 @@
 
   Problem problem;
   problem.AddResidualBlock(new UnaryCostFunction(2, 3), NULL, x);
-  ASSERT_DEATH(problem.AddResidualBlock(
-      new UnaryCostFunction(2, 4 /* 4 != 3 */), NULL, x),
-               "different block sizes");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddResidualBlock(
+                                new UnaryCostFunction(
+                                    2, 4 /* 4 != 3 */), NULL, x),
+                            "different block sizes");
 }
 
 TEST(Problem, AddResidualWithDuplicateParametersDies) {
   double x[3], z[5];
 
   Problem problem;
-  ASSERT_DEATH(problem.AddResidualBlock(
-      new BinaryCostFunction(2, 3, 3), NULL, x, x),
-               "Duplicate parameter blocks");
-  ASSERT_DEATH(problem.AddResidualBlock(
-      new TernaryCostFunction(1, 5, 3, 5), NULL, z, x, z),
-               "Duplicate parameter blocks");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddResidualBlock(
+                                new BinaryCostFunction(2, 3, 3), NULL, x, x),
+                            "Duplicate parameter blocks");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddResidualBlock(
+                                new TernaryCostFunction(1, 5, 3, 5),
+                                NULL, z, x, z),
+                            "Duplicate parameter blocks");
 }
 
 TEST(Problem, AddResidualWithIncorrectSizesOfParameterBlockDies) {
@@ -167,13 +166,11 @@
 
   // The cost function expects the size of the second parameter, z, to be 4
   // instead of 5 as declared above. This is fatal.
-  ASSERT_DEATH(problem.AddResidualBlock(
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddResidualBlock(
       new BinaryCostFunction(2, 3, 4), NULL, x, z),
                "different block sizes");
 }
 
-#endif  // _WIN32
-
 TEST(Problem, AddResidualAddsDuplicatedParametersOnlyOnce) {
   double x[3], y[4], z[5];
 
@@ -187,8 +184,6 @@
   EXPECT_EQ(12, problem.NumParameters());
 }
 
-#ifndef _WIN32
-
 TEST(Problem, AddParameterWithDifferentSizesOnTheSameVariableDies) {
   double x[3], y[4];
 
@@ -196,7 +191,8 @@
   problem.AddParameterBlock(x, 3);
   problem.AddParameterBlock(y, 4);
 
-  ASSERT_DEATH(problem.AddParameterBlock(x, 4), "different block sizes");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddParameterBlock(x, 4),
+                            "different block sizes");
 }
 
 static double *IntToPtr(int i) {
@@ -218,12 +214,18 @@
   problem.AddParameterBlock(IntToPtr(5),  5);  // x
   problem.AddParameterBlock(IntToPtr(13), 3);  // y
 
-  ASSERT_DEATH(problem.AddParameterBlock(IntToPtr( 4), 2), "Aliasing detected");
-  ASSERT_DEATH(problem.AddParameterBlock(IntToPtr( 4), 3), "Aliasing detected");
-  ASSERT_DEATH(problem.AddParameterBlock(IntToPtr( 4), 9), "Aliasing detected");
-  ASSERT_DEATH(problem.AddParameterBlock(IntToPtr( 8), 3), "Aliasing detected");
-  ASSERT_DEATH(problem.AddParameterBlock(IntToPtr(12), 2), "Aliasing detected");
-  ASSERT_DEATH(problem.AddParameterBlock(IntToPtr(14), 3), "Aliasing detected");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddParameterBlock(IntToPtr( 4), 2),
+                            "Aliasing detected");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddParameterBlock(IntToPtr( 4), 3),
+                            "Aliasing detected");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddParameterBlock(IntToPtr( 4), 9),
+                            "Aliasing detected");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddParameterBlock(IntToPtr( 8), 3),
+                            "Aliasing detected");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddParameterBlock(IntToPtr(12), 2),
+                            "Aliasing detected");
+  EXPECT_DEATH_IF_SUPPORTED(problem.AddParameterBlock(IntToPtr(14), 3),
+                            "Aliasing detected");
 
   // These ones should work.
   problem.AddParameterBlock(IntToPtr( 2), 3);
@@ -233,8 +235,6 @@
   ASSERT_EQ(5, problem.NumParameterBlocks());
 }
 
-#endif  // _WIN32
-
 TEST(Problem, AddParameterIgnoresDuplicateCalls) {
   double x[3], y[4];
 
diff --git a/internal/ceres/triplet_sparse_matrix_test.cc b/internal/ceres/triplet_sparse_matrix_test.cc
index 6bdd2bd..d16682e 100644
--- a/internal/ceres/triplet_sparse_matrix_test.cc
+++ b/internal/ceres/triplet_sparse_matrix_test.cc
@@ -67,9 +67,7 @@
   ASSERT_TRUE(m.AllTripletsWithinBounds());
 
   // We should never be able resize and lose data
-#ifndef _MSC_VER
-  ASSERT_DEATH(m.Reserve(1), "Reallocation will cause data loss");
-#endif
+  EXPECT_DEATH_IF_SUPPORTED(m.Reserve(1), "Reallocation will cause data loss");
 
   // We should be able to resize while preserving data
   m.Reserve(50);