[fbl][test] Convert fbl container tests to zxtest

Change-Id: I3cce939789feebf955b5a82d16b2c0019218f324
diff --git a/zircon/system/ulib/fbl/include/fbl/intrusive_wavl_tree_internal.h b/zircon/system/ulib/fbl/include/fbl/intrusive_wavl_tree_internal.h
index 8181ba8..ac8b7ff 100644
--- a/zircon/system/ulib/fbl/include/fbl/intrusive_wavl_tree_internal.h
+++ b/zircon/system/ulib/fbl/include/fbl/intrusive_wavl_tree_internal.h
@@ -39,14 +39,10 @@
   static void RecordEraseDoubleRotation() {}
 
   template <typename TreeType>
-  static bool VerifyRankRule(const TreeType& tree, typename TreeType::RawPtrType node) {
-    return true;
-  }
+  static void VerifyRankRule(const TreeType& tree, typename TreeType::RawPtrType node) {}
 
   template <typename TreeType>
-  static bool VerifyBalance(const TreeType& tree, uint64_t depth) {
-    return true;
-  }
+  static void VerifyBalance(const TreeType& tree, uint64_t depth) {}
 };
 
 }  // namespace intrusive_containers
diff --git a/zircon/system/ulib/fbl/test/BUILD.gn b/zircon/system/ulib/fbl/test/BUILD.gn
index f713ef9..13baec3 100644
--- a/zircon/system/ulib/fbl/test/BUILD.gn
+++ b/zircon/system/ulib/fbl/test/BUILD.gn
@@ -37,12 +37,16 @@
     "unique_fd_tests.cc",
     "vector_tests.cc",
   ]
+
   deps = [
     "$zx/system/ulib/fbl",
-    "$zx/system/ulib/unittest",  # TODO: convert to zxtest.
     "$zx/system/ulib/zxtest",
   ]
 
+  if (!is_fuchsia) {
+    defines = [ "FBL_TEST_ENABLE_WAVL_TREE_BALANCE_TEST=1" ]
+  }
+
   if (is_fuchsia) {
     # These tests won't run on the host. There are two primary reasons for this.
     #
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/associative_container_test_environment.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/associative_container_test_environment.h
index 64c8422..a21875c 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/associative_container_test_environment.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/associative_container_test_environment.h
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_ASSOCIATIVE_CONTAINER_TEST_ENVIRONMENT_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_ASSOCIATIVE_CONTAINER_TEST_ENVIRONMENT_H_
 
-#include <unittest/unittest.h>
 #include <fbl/tests/intrusive_containers/base_test_environments.h>
 #include <fbl/tests/lfsr.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -50,11 +51,9 @@
     return SizeUtils<CType>::size(container);
   }
 
-  bool SetTestObjKeys(const PtrType& test_obj, PopulateMethod method) {
-    BEGIN_TEST;
-
-    ASSERT_NONNULL(test_obj, "");
-    ASSERT_LT(test_obj->value(), OBJ_COUNT, "");
+  void SetTestObjKeys(const PtrType& test_obj, PopulateMethod method) {
+    ASSERT_NOT_NULL(test_obj);
+    ASSERT_LT(test_obj->value(), OBJ_COUNT);
 
     // Assign a key to the object based on the chosen populate method.
     KeyType key = 0;
@@ -88,18 +87,14 @@
     // Set the primary key on the object.  Offset the "other" key by OBJ_COUNT
     test_obj->SetKey(key);
     OtherContainerTraits::SetKey(*test_obj, other_key);
-
-    END_TEST;
   }
 
-  bool Populate(ContainerType& container, PopulateMethod method,
+  void Populate(ContainerType& container, PopulateMethod method,
                 RefAction ref_action = RefAction::HoldSome) {
-    BEGIN_TEST;
-
-    EXPECT_EQ(0U, ObjType::live_obj_count(), "");
+    EXPECT_EQ(0U, ObjType::live_obj_count());
 
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(i, Size(container), "");
+      EXPECT_EQ(i, Size(container));
 
       // Unless explicitly told to do so, don't hold a reference in the
       // test environment for every 4th object created.  Note, this only
@@ -122,10 +117,10 @@
       }
 
       PtrType new_object = this->CreateTrackedObject(i, i, hold_ref);
-      ASSERT_NONNULL(new_object, "");
-      EXPECT_EQ(new_object->raw_ptr(), objects()[i], "");
+      ASSERT_NOT_NULL(new_object);
+      EXPECT_EQ(new_object->raw_ptr(), objects()[i]);
 
-      ASSERT_TRUE(SetTestObjKeys(new_object, method), "");
+      ASSERT_NO_FAILURES(SetTestObjKeys(new_object, method));
 
       KeyType obj_key = KeyTraits::GetKey(*new_object);
       max_key_ = !i ? obj_key : KeyTraits::LessThan(max_key_, obj_key) ? obj_key : max_key_;
@@ -142,52 +137,40 @@
 #else
         container.insert(TestEnvTraits::Transfer(new_object));
 #endif
-        EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object), "");
+        EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object));
       } else {
         container.insert(std::move(new_object));
-        EXPECT_TRUE(TestEnvTraits::WasMoved(new_object), "");
+        EXPECT_TRUE(TestEnvTraits::WasMoved(new_object));
       }
     }
 
-    EXPECT_EQ(OBJ_COUNT, Size(container), "");
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container), "");
-
-    END_TEST;
+    EXPECT_EQ(OBJ_COUNT, Size(container));
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container));
   }
 
-  bool Populate(ContainerType& container, RefAction ref_action = RefAction::HoldSome) override {
+  void Populate(ContainerType& container, RefAction ref_action = RefAction::HoldSome) override {
     return Populate(container, PopulateMethod::AscendingKey, ref_action);
   }
 
-  bool DoInsertByKey(PopulateMethod populate_method) {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(Populate(container(), populate_method), "");
-    ASSERT_TRUE(TestEnvironment<TestEnvTraits>::Reset(), "");
-
-    END_TEST;
+  void DoInsertByKey(PopulateMethod populate_method) {
+    ASSERT_NO_FATAL_FAILURES(Populate(container(), populate_method));
+    ASSERT_NO_FATAL_FAILURES(TestEnvironment<TestEnvTraits>::Reset());
   }
 
-  bool InsertByKey() {
-    BEGIN_TEST;
+  void InsertByKey() {
+    ASSERT_NO_FATAL_FAILURES(DoInsertByKey(PopulateMethod::AscendingKey));
+    ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
 
-    EXPECT_TRUE(DoInsertByKey(PopulateMethod::AscendingKey), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
+    ASSERT_NO_FATAL_FAILURES(DoInsertByKey(PopulateMethod::DescendingKey));
+    ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(2 * OBJ_COUNT));
 
-    EXPECT_TRUE(DoInsertByKey(PopulateMethod::DescendingKey), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(2 * OBJ_COUNT));
-
-    EXPECT_TRUE(DoInsertByKey(PopulateMethod::RandomKey), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(3 * OBJ_COUNT));
-
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(DoInsertByKey(PopulateMethod::RandomKey));
+    ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(3 * OBJ_COUNT));
   }
 
-  bool DoFindByKey(PopulateMethod populate_method) {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(Populate(container(), populate_method), "");
+  void DoFindByKey(PopulateMethod populate_method) {
+    ASSERT_NO_FATAL_FAILURES(Populate(container(), populate_method));
 
     // Lookup the various items which should be in the collection by key.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
@@ -196,43 +179,36 @@
 
       auto iter = const_container().find(key);
 
-      ASSERT_TRUE(iter.IsValid(), "");
-      EXPECT_EQ(key, iter->GetKey(), "");
-      EXPECT_EQ(value, iter->value(), "");
+      ASSERT_TRUE(iter.IsValid());
+      EXPECT_EQ(key, iter->GetKey());
+      EXPECT_EQ(value, iter->value());
     }
 
     // Fail to look up something which should not be in the collection.
     auto iter = const_container().find(kBannedKeyValue);
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_FALSE(iter.IsValid());
 
-    ASSERT_TRUE(TestEnvironment<TestEnvTraits>::Reset(), "");
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(TestEnvironment<TestEnvTraits>::Reset());
   }
 
-  bool FindByKey() {
-    BEGIN_TEST;
+  void FindByKey() {
+    ASSERT_NO_FATAL_FAILURES(DoFindByKey(PopulateMethod::AscendingKey));
+    ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
 
-    EXPECT_TRUE(DoFindByKey(PopulateMethod::AscendingKey), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
+    ASSERT_NO_FATAL_FAILURES(DoFindByKey(PopulateMethod::DescendingKey));
+    ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(2 * OBJ_COUNT));
 
-    EXPECT_TRUE(DoFindByKey(PopulateMethod::DescendingKey), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(2 * OBJ_COUNT));
-
-    EXPECT_TRUE(DoFindByKey(PopulateMethod::RandomKey), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(3 * OBJ_COUNT));
-
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(DoFindByKey(PopulateMethod::RandomKey));
+    ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(3 * OBJ_COUNT));
   }
 
-  bool DoEraseByKey(PopulateMethod populate_method, size_t already_erased) {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(Populate(container(), populate_method), "");
+  void DoEraseByKey(PopulateMethod populate_method, size_t already_erased) {
+    ASSERT_NO_FATAL_FAILURES(Populate(container(), populate_method));
     size_t remaining = OBJ_COUNT;
     size_t erased = 0;
 
     // Fail to erase a key which is not in the container.
-    EXPECT_NULL(container().erase(kBannedKeyValue), "");
+    EXPECT_NULL(container().erase(kBannedKeyValue));
 
     // Erase all of the even members of the collection by key.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
@@ -243,13 +219,15 @@
       if (key & 1)
         continue;
 
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(erased + already_erased));
-      EXPECT_TRUE(TestEnvironment<TestEnvTraits>::DoErase(key, i, remaining), "");
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(++erased + already_erased));
+      ASSERT_NO_FATAL_FAILURES(
+          TestEnvTraits::CheckCustomDeleteInvocations(erased + already_erased));
+      ASSERT_NO_FATAL_FAILURES(TestEnvironment<TestEnvTraits>::DoErase(key, i, remaining));
+      ASSERT_NO_FATAL_FAILURES(
+          TestEnvTraits::CheckCustomDeleteInvocations(++erased + already_erased));
       --remaining;
     }
 
-    EXPECT_EQ(remaining, Size(container()), "");
+    EXPECT_EQ(remaining, Size(container()));
 
     // Erase the remaining odd members.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
@@ -257,40 +235,35 @@
         continue;
 
       KeyType key = objects()[i]->GetKey();
-      EXPECT_TRUE(key & 1, "");
+      EXPECT_TRUE(key & 1);
 
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(erased + already_erased));
-      EXPECT_TRUE(TestEnvironment<TestEnvTraits>::DoErase(key, i, remaining), "");
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(++erased + already_erased));
+      ASSERT_NO_FATAL_FAILURES(
+          TestEnvTraits::CheckCustomDeleteInvocations(erased + already_erased));
+      ASSERT_NO_FATAL_FAILURES(TestEnvironment<TestEnvTraits>::DoErase(key, i, remaining));
+      ASSERT_NO_FATAL_FAILURES(
+          TestEnvTraits::CheckCustomDeleteInvocations(++erased + already_erased));
       --remaining;
     }
 
-    EXPECT_EQ(0u, Size(container()), "");
+    EXPECT_EQ(0u, Size(container()));
 
-    ASSERT_TRUE(TestEnvironment<TestEnvTraits>::Reset(), "");
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(TestEnvironment<TestEnvTraits>::Reset());
   }
 
-  bool EraseByKey() {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(DoEraseByKey(PopulateMethod::AscendingKey, 0), "");
-    EXPECT_TRUE(DoEraseByKey(PopulateMethod::DescendingKey, OBJ_COUNT), "");
-    EXPECT_TRUE(DoEraseByKey(PopulateMethod::RandomKey, 2 * OBJ_COUNT), "");
-
-    END_TEST;
+  void EraseByKey() {
+    ASSERT_NO_FATAL_FAILURES(DoEraseByKey(PopulateMethod::AscendingKey, 0));
+    ASSERT_NO_FATAL_FAILURES(DoEraseByKey(PopulateMethod::DescendingKey, OBJ_COUNT));
+    ASSERT_NO_FATAL_FAILURES(DoEraseByKey(PopulateMethod::RandomKey, 2 * OBJ_COUNT));
   }
 
-  bool DoInsertOrFind(PopulateMethod populate_method, size_t already_destroyed) {
-    BEGIN_TEST;
-
+  void DoInsertOrFind(PopulateMethod populate_method, size_t already_destroyed) {
     for (unsigned int pass_iterator = 0u; pass_iterator < 2u; ++pass_iterator) {
       for (size_t i = 0u; i < OBJ_COUNT; ++i) {
         // Create a new tracked object.
         PtrType new_object = this->CreateTrackedObject(i, i, true);
-        ASSERT_NONNULL(new_object, "");
-        EXPECT_EQ(new_object->raw_ptr(), objects()[i], "");
-        ASSERT_TRUE(SetTestObjKeys(new_object, populate_method), "");
+        ASSERT_NOT_NULL(new_object);
+        EXPECT_EQ(new_object->raw_ptr(), objects()[i]);
+        ASSERT_NO_FAILURES(SetTestObjKeys(new_object, populate_method));
 
         // Insert the object into the container using insert_or_find.  There
         // should be no collision.  Exercise both the move and the copy
@@ -305,32 +278,34 @@
           success = container().insert_or_find(TestEnvTraits::Transfer(new_object),
                                                pass_iterator ? &iter : nullptr);
 #endif
-          EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object), "");
+          EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object));
         } else {
           success =
               container().insert_or_find(std::move(new_object), pass_iterator ? &iter : nullptr);
 
-          EXPECT_TRUE(TestEnvTraits::WasMoved(new_object), "");
+          EXPECT_TRUE(TestEnvTraits::WasMoved(new_object));
         }
 
-        EXPECT_TRUE(success, "");
+        EXPECT_TRUE(success);
 
         // If we passed an iterator to the insert_or_find operation, it
         // should point to the newly inserted object.
         if (pass_iterator) {
-          ASSERT_TRUE(iter.IsValid(), "");
-          EXPECT_EQ(objects()[i], iter->raw_ptr(), "");
+          ASSERT_TRUE(iter.IsValid());
+          EXPECT_EQ(objects()[i], iter->raw_ptr());
         }
       }
 
       // If we have not tested passing a non-null iterator yet, reset the
       // environment and do the test again.
-      if (!pass_iterator)
-        ASSERT_TRUE(TestEnvironment<TestEnvTraits>::Reset(), "");
+      if (!pass_iterator) {
+        ASSERT_NO_FATAL_FAILURES(TestEnvironment<TestEnvTraits>::Reset());
+      }
     }
 
     // The objects from the first test pass should have been deleted.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + OBJ_COUNT));
+    ASSERT_NO_FATAL_FAILURES(
+        TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + OBJ_COUNT));
 
     // Now go over the (populated) container and attempt to insert new
     // objects which have the same keys as existing objects.  Each of these
@@ -338,13 +313,13 @@
     // previously.
     for (unsigned int pass_iterator = 0u; pass_iterator < 2u; ++pass_iterator) {
       for (size_t i = 0u; i < OBJ_COUNT; ++i) {
-        ASSERT_NONNULL(objects()[i], "");
+        ASSERT_NOT_NULL(objects()[i]);
 
         // Create a new non-tracked object; assign it the same key as
         // the existing object.
         PtrType new_object = TestEnvTraits::CreateObject(i);
-        ASSERT_NONNULL(new_object, "");
-        EXPECT_NE(new_object->raw_ptr(), objects()[i], "");
+        ASSERT_NOT_NULL(new_object);
+        EXPECT_NE(new_object->raw_ptr(), objects()[i]);
         new_object->SetKey(KeyTraits::GetKey(*objects()[i]));
 
         // Attempt (but fail) to insert the object into the container
@@ -369,68 +344,62 @@
         // The object should not have been inserted.  If an attempt was
         // made to move the pointer into the collection, it should have
         // failed and we should still own the pointer.
-        EXPECT_FALSE(success, "");
-        ASSERT_NONNULL(new_object, "");
+        EXPECT_FALSE(success);
+        ASSERT_NOT_NULL(new_object);
 
         // If we passed an iterator to the insert_or_find operation, it
         // should point to the object we collided with.
         if (pass_iterator) {
-          EXPECT_TRUE(iter.IsValid(), "");
-          if (iter.IsValid(), "") {
-            EXPECT_EQ(objects()[i], iter->raw_ptr(), "");
-            EXPECT_NE(PtrTraits::GetRaw(new_object), iter->raw_ptr(), "");
+          EXPECT_TRUE(iter.IsValid());
+          if (iter.IsValid()) {
+            EXPECT_EQ(objects()[i], iter->raw_ptr());
+            EXPECT_NE(PtrTraits::GetRaw(new_object), iter->raw_ptr());
             EXPECT_TRUE(
-                KeyTraits::EqualTo(KeyTraits::GetKey(*iter), KeyTraits::GetKey(*new_object)), "");
+                KeyTraits::EqualTo(KeyTraits::GetKey(*iter), KeyTraits::GetKey(*new_object)));
           }
         }
 
         // Release the object we failed to insert.
-        EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + OBJ_COUNT +
-                                                                (OBJ_COUNT * pass_iterator) + i));
+        ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(
+            already_destroyed + OBJ_COUNT + (OBJ_COUNT * pass_iterator) + i));
         TestEnvTraits::ReleaseObject(new_object);
-        EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(
+        ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(
             already_destroyed + OBJ_COUNT + (OBJ_COUNT * pass_iterator) + i + 1));
       }
     }
 
-    ASSERT_TRUE(TestEnvironment<TestEnvTraits>::Reset(), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + (4 * OBJ_COUNT)));
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(TestEnvironment<TestEnvTraits>::Reset());
+    ASSERT_NO_FATAL_FAILURES(
+        TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + (4 * OBJ_COUNT)));
   }
 
-  bool InsertOrFind() {
-    BEGIN_TEST;
-
+  void InsertOrFind() {
     // Each time we run this test, we create and destroy 4 * OBJ_COUNT objects
-    EXPECT_TRUE(DoInsertOrFind(PopulateMethod::AscendingKey, 0), "");
-    EXPECT_TRUE(DoInsertOrFind(PopulateMethod::DescendingKey, 4 * OBJ_COUNT), "");
-    EXPECT_TRUE(DoInsertOrFind(PopulateMethod::RandomKey, 8 * OBJ_COUNT), "");
-
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(DoInsertOrFind(PopulateMethod::AscendingKey, 0));
+    ASSERT_NO_FATAL_FAILURES(DoInsertOrFind(PopulateMethod::DescendingKey, 4 * OBJ_COUNT));
+    ASSERT_NO_FATAL_FAILURES(DoInsertOrFind(PopulateMethod::RandomKey, 8 * OBJ_COUNT));
   }
 
   template <typename CopyOrMoveUtil>
-  bool DoInsertOrReplace(size_t extra_elements, size_t already_destroyed) {
-    BEGIN_TEST;
-
-    ASSERT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_TRUE(Populate(container(), PopulateMethod::AscendingKey), "");
+  void DoInsertOrReplace(size_t extra_elements, size_t already_destroyed) {
+    ASSERT_EQ(0u, ObjType::live_obj_count());
+    ASSERT_NO_FATAL_FAILURES(Populate(container(), PopulateMethod::AscendingKey));
 
     // Attempt to replace every element in the container with one that has
     // the same key.  Then attempt to replace some which were not in the
     // container to start with and verify that they were inserted instead.
     for (size_t i = 0; i < OBJ_COUNT + extra_elements; ++i) {
       PtrType new_obj = TestEnvTraits::CreateObject(i);
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
       new_obj->SetKey(i);
 
       PtrType replaced = container().insert_or_replace(CopyOrMoveUtil::Op(new_obj));
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
       if (i < OBJ_COUNT) {
-        EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count(), "");
-        EXPECT_EQ(OBJ_COUNT, container().size(), "");
-        ASSERT_NONNULL(replaced, "");
+        EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count());
+        EXPECT_EQ(OBJ_COUNT, container().size());
+        ASSERT_NOT_NULL(replaced);
         ASSERT_LT(replaced->value(), OBJ_COUNT);
         EXPECT_TRUE(KeyTraits::EqualTo(KeyTraits::GetKey(*replaced), i));
         EXPECT_TRUE(KeyTraits::EqualTo(KeyTraits::GetKey(*replaced), replaced->value()));
@@ -438,49 +407,45 @@
         ASSERT_EQ(objects()[i], PtrTraits::GetRaw(replaced));
         ReleaseObject(i);
         replaced = nullptr;
-        EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-        EXPECT_EQ(OBJ_COUNT, container().size(), "");
+        EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+        EXPECT_EQ(OBJ_COUNT, container().size());
 
         // The replaced object should be gone now.
-        EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + i + 1));
+        ASSERT_NO_FATAL_FAILURES(
+            TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + i + 1));
       } else {
         EXPECT_EQ(i + 1, ObjType::live_obj_count());
-        EXPECT_EQ(i + 1, container().size(), "");
-        EXPECT_NULL(replaced, "");
+        EXPECT_EQ(i + 1, container().size());
+        EXPECT_NULL(replaced);
 
         // We should have succeeded in inserting this object, so the delete count should not
         // have gone up.
-        EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + OBJ_COUNT));
+        ASSERT_NO_FATAL_FAILURES(
+            TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + OBJ_COUNT));
       }
     }
 
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
     while (!container().is_empty()) {
       PtrType ptr = container().erase(container().begin());
       TestEnvTraits::ReleaseObject(ptr);
     }
 
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(already_destroyed + (2 * OBJ_COUNT) +
-                                                            extra_elements));
-
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(TestEnvTraits::CheckCustomDeleteInvocations(
+        already_destroyed + (2 * OBJ_COUNT) + extra_elements));
   }
 
-  bool InsertOrReplace() {
-    BEGIN_TEST;
-
+  void InsertOrReplace() {
     // Each time we run each version of the tests, we create and destroy 2 *
     // OBJ_COUNT + the number of extra elements we specify;
     constexpr size_t EXTRA_ELEMENTS = 10;
     constexpr size_t TOTAL_OBJS = (2 * OBJ_COUNT) + EXTRA_ELEMENTS;
 
-    EXPECT_TRUE(DoInsertOrReplace<MoveUtil>(EXTRA_ELEMENTS, 0), "");
+    ASSERT_NO_FATAL_FAILURES(DoInsertOrReplace<MoveUtil>(EXTRA_ELEMENTS, 0));
     if (CopyUtil<PtrTraits>::CanCopy) {
-      EXPECT_TRUE(DoInsertOrReplace<CopyUtil<PtrTraits>>(EXTRA_ELEMENTS, TOTAL_OBJS), "");
+      ASSERT_NO_FATAL_FAILURES(DoInsertOrReplace<CopyUtil<PtrTraits>>(EXTRA_ELEMENTS, TOTAL_OBJS));
     }
-
-    END_TEST;
   }
 
  protected:
@@ -563,3 +528,5 @@
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_ASSOCIATIVE_CONTAINER_TEST_ENVIRONMENT_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/base_test_environments.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/base_test_environments.h
index 6fe62e8..d4385d9 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/base_test_environments.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/base_test_environments.h
@@ -2,16 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_BASE_TEST_ENVIRONMENTS_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_BASE_TEST_ENVIRONMENTS_H_
 
-#include <unittest/unittest.h>
+#include <utility>
+
 #include <fbl/ref_counted.h>
 #include <fbl/ref_ptr.h>
 #include <fbl/tests/intrusive_containers/objects.h>
 #include <fbl/tests/intrusive_containers/test_environment_utils.h>
 #include <fbl/unique_ptr.h>
-
-#include <utility>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -227,61 +228,52 @@
   // containers will use an implementation of push_front while associative
   // containers will assign a key to the objects which get created and then
   // use an implementation of insert.
-  virtual bool Populate(ContainerType& container, RefAction ref_action = RefAction::HoldSome) = 0;
+  virtual void Populate(ContainerType& container, RefAction ref_action = RefAction::HoldSome) = 0;
 
-  bool Reset() {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+  void Reset() {
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
     container().clear();
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
     for (size_t i = 0; i < OBJ_COUNT; ++i)
       ReleaseObject(i);
 
-    EXPECT_EQ(0u, refs_held(), "");
+    EXPECT_EQ(0u, refs_held());
     refs_held() = 0;
 
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
+    EXPECT_EQ(0u, ObjType::live_obj_count());
     ObjType::ResetLiveObjCount();
-
-    END_TEST;
   }
 
-  bool Clear() {
-    BEGIN_TEST;
-
+  void Clear() {
     // Start by making some objects.
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Clear the container.  Afterwards, the number of live objects we have
     // should be equal to the number of references being held by the test
     // environment.
     container().clear();
-    EXPECT_EQ(0u, Size(container()), "");
-    EXPECT_EQ(refs_held(), ObjType::live_obj_count(), "");
+    EXPECT_EQ(0u, Size(container()));
+    EXPECT_EQ(refs_held(), ObjType::live_obj_count());
 
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_NONNULL(objects()[i], "");
+      EXPECT_NOT_NULL(objects()[i]);
 
       // If our underlying object it still being kept alive by the test
       // environment, make sure that its internal pointer state has been
       // properly cleared out.
       if (HoldingObject(i)) {
         auto& ns = ContainerType::NodeTraits::node_state(*objects()[i]);
-        EXPECT_FALSE(ns.InContainer(), "");
+        EXPECT_FALSE(ns.InContainer());
       }
     }
 
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
   }
 
-  bool ClearUnsafe() {
-    BEGIN_TEST;
-
+  void ClearUnsafe() {
     // Start by making some objects.
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Perform an unsafe clear of the container.  Afterwards, the number of
     // live objects we have should be equal to the number of elements
@@ -294,215 +286,192 @@
     // (by necessity) always hold references to all internally allocated
     // unmanaged objects.
     container().clear_unsafe();
-    EXPECT_EQ(0u, Size(container()), "");
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+    EXPECT_EQ(0u, Size(container()));
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_NONNULL(objects()[i], "");
+      EXPECT_NOT_NULL(objects()[i]);
 
       // Make sure that the internal pointer states of all of our objects
       // do not know yet that they have been removed from the container.
       // The clear_unsafe operation should not have updated any of the
       // internal object states.
       auto& ns = ContainerType::NodeTraits::node_state(*objects()[i]);
-      EXPECT_TRUE(ns.InContainer(), "");
+      EXPECT_TRUE(ns.InContainer());
     }
-
-    END_TEST;
   }
 
-  bool IsEmpty() {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(container().is_empty(), "");
-    ASSERT_TRUE(Populate(container()), "");
-    EXPECT_FALSE(container().is_empty(), "");
-    EXPECT_TRUE(Reset(), "");
-    EXPECT_TRUE(container().is_empty(), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
-
-    END_TEST;
+  void IsEmpty() {
+    EXPECT_TRUE(container().is_empty());
+    ASSERT_NO_FAILURES(Populate(container()));
+    EXPECT_FALSE(container().is_empty());
+    Reset();
+    EXPECT_TRUE(container().is_empty());
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
   }
 
   template <typename TargetType>
-  bool DoErase(TargetType&& target, size_t ndx, size_t remaining, bool check_ndx = true) {
-    BEGIN_TEST;
-
-    ASSERT_TRUE(ndx < OBJ_COUNT, "");
-    ASSERT_TRUE(remaining <= OBJ_COUNT, "");
-    ASSERT_TRUE(!container().is_empty(), "");
-    ASSERT_TRUE(ValidEraseTarget(target), "");
-    EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
-    EXPECT_EQ(remaining, Size(container()), "");
+  void DoErase(TargetType&& target, size_t ndx, size_t remaining, bool check_ndx = true) {
+    ASSERT_TRUE(ndx < OBJ_COUNT);
+    ASSERT_TRUE(remaining <= OBJ_COUNT);
+    ASSERT_TRUE(!container().is_empty());
+    ASSERT_TRUE(ValidEraseTarget(target));
+    EXPECT_EQ(remaining, ObjType::live_obj_count());
+    EXPECT_EQ(remaining, Size(container()));
     size_t erased_ndx;
 
     {
       // Erase the item and sanity check it against our tracking.
       PtrType tmp = container().erase(target);
-      ASSERT_NONNULL(tmp, "");
+      ASSERT_NOT_NULL(tmp);
       if (check_ndx) {
-        EXPECT_EQ(tmp->value(), ndx, "");
-        EXPECT_EQ(objects()[ndx], tmp->raw_ptr(), "");
+        EXPECT_EQ(tmp->value(), ndx);
+        EXPECT_EQ(objects()[ndx], tmp->raw_ptr());
       }
       erased_ndx = tmp->value();
 
       // Make sure that the intrusive bookkeeping is up-to-date.
       auto& ns = ContainerType::NodeTraits::node_state(*tmp);
-      EXPECT_TRUE(ns.IsValid(), "");
-      EXPECT_FALSE(ns.InContainer(), "");
+      EXPECT_TRUE(ns.IsValid());
+      EXPECT_FALSE(ns.InContainer());
 
       // The container has shrunk, but the object should still be around.
-      EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
-      EXPECT_EQ(remaining - 1, Size(container()), "");
+      EXPECT_EQ(remaining, ObjType::live_obj_count());
+      EXPECT_EQ(remaining - 1, Size(container()));
     }
 
     // If we were not holding onto the object using the test
     // environment's tracking, the live object count should have
     // dropped.  Otherwise, it should remain the same.
     if (!HoldingObject(erased_ndx))
-      EXPECT_EQ(remaining - 1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(remaining - 1, ObjType::live_obj_count());
     else
-      EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
+      EXPECT_EQ(remaining, ObjType::live_obj_count());
 
     // Let go of the object and verify that it has now gone away.
     ReleaseObject(erased_ndx);
-    EXPECT_EQ(remaining - 1, ObjType::live_obj_count(), "");
-
-    END_TEST;
+    EXPECT_EQ(remaining - 1, ObjType::live_obj_count());
   }
 
-  bool IterErase() {
-    BEGIN_TEST;
-
+  void IterErase() {
     // Don't perform index sanity checks for the objects we erase unless
     // this is a sequence container type.
     bool check_ndx = ContainerType::IsSequenced;
     size_t erased = 0;
 
     // Remove all of the elements from the container by erasing from the front.
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(erased));
-      EXPECT_TRUE(DoErase(container().begin(), i, OBJ_COUNT - i, check_ndx), "");
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(++erased));
+      TestEnvTraits::CheckCustomDeleteInvocations(erased);
+      DoErase(container().begin(), i, OBJ_COUNT - i, check_ndx);
+      TestEnvTraits::CheckCustomDeleteInvocations(++erased);
     }
 
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0u, Size(container()));
 
     // Remove all but 2 of the elements from the container by erasing from the middle.
     static_assert(2 < OBJ_COUNT, "OBJ_COUNT too small to run Erase test!");
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
     auto iter = container().begin();
     iter++;
     for (size_t i = 1; i < OBJ_COUNT - 1; ++i) {
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(erased));
-      EXPECT_TRUE(DoErase(iter++, i, OBJ_COUNT - i + 1, check_ndx), "");
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(++erased));
+      TestEnvTraits::CheckCustomDeleteInvocations(erased);
+      DoErase(iter++, i, OBJ_COUNT - i + 1, check_ndx);
+      TestEnvTraits::CheckCustomDeleteInvocations(++erased);
     }
 
     // Attempting to erase end() from a container with more than one element in
     // it should return nullptr.
-    EXPECT_NULL(container().erase(container().end()), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(erased));
-    EXPECT_TRUE(DoErase(container().begin(), 0, 2, check_ndx), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(++erased));
+    EXPECT_NULL(container().erase(container().end()));
+    TestEnvTraits::CheckCustomDeleteInvocations(erased);
+    DoErase(container().begin(), 0, 2, check_ndx);
+    TestEnvTraits::CheckCustomDeleteInvocations(++erased);
 
     // Attempting to erase end() from a container with just one element in
     // it should return nullptr.
-    EXPECT_NULL(container().erase(container().end()), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(erased));
-    EXPECT_TRUE(DoErase(container().begin(), OBJ_COUNT - 1, 1, check_ndx), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(++erased));
+    EXPECT_NULL(container().erase(container().end()));
+    TestEnvTraits::CheckCustomDeleteInvocations(erased);
+    DoErase(container().begin(), OBJ_COUNT - 1, 1, check_ndx);
+    TestEnvTraits::CheckCustomDeleteInvocations(++erased);
 
     // Attempting to erase end() from an empty container should return nullptr.
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, Size(container()), "");
-    EXPECT_NULL(container().erase(container().end()), "");
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0u, Size(container()));
+    EXPECT_NULL(container().erase(container().end()));
     EXPECT_EQ(erased, OBJ_COUNT * 2);
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT * 2));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT * 2);
   }
 
-  bool ReverseIterErase() {
-    BEGIN_TEST;
-
+  void ReverseIterErase() {
     // Don't perform index sanity checks for the objects we erase unless
     // this is a sequence container type.
     bool check_ndx = ContainerType::IsSequenced;
 
     // Remove all of the elements from the container by erasing from the back.
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
     auto iter = container().end();
     iter--;
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_TRUE(DoErase(iter--, OBJ_COUNT - i - 1, OBJ_COUNT - i, check_ndx), "");
+      DoErase(iter--, OBJ_COUNT - i - 1, OBJ_COUNT - i, check_ndx);
     }
 
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, Size(container()), "");
-
-    END_TEST;
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0u, Size(container()));
   }
 
-  bool DirectErase() {
-    BEGIN_TEST;
-
+  void DirectErase() {
     // Remove all of the elements from the container by erasing using direct
     // node pointers which should end up always being at the front of the
     // container.
-    ASSERT_TRUE(Populate(container(), RefAction::HoldAll), "");
+    ASSERT_NO_FAILURES(Populate(container(), RefAction::HoldAll));
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      ASSERT_NONNULL(objects()[i], "");
-      EXPECT_TRUE(DoErase(*objects()[i], i, OBJ_COUNT - i), "");
+      ASSERT_NOT_NULL(objects()[i]);
+      DoErase(*objects()[i], i, OBJ_COUNT - i);
     }
 
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0u, Size(container()));
 
     // Remove all of the elements from the container by erasing using direct
     // node pointers which should end up always being at the back of the
     // container.
-    ASSERT_TRUE(Populate(container(), RefAction::HoldAll), "");
+    ASSERT_NO_FAILURES(Populate(container(), RefAction::HoldAll));
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
       size_t ndx = OBJ_COUNT - i - 1;
-      ASSERT_NONNULL(objects()[ndx], "");
-      EXPECT_TRUE(DoErase(*objects()[ndx], ndx, ndx + 1), "");
+      ASSERT_NOT_NULL(objects()[ndx]);
+      DoErase(*objects()[ndx], ndx, ndx + 1);
     }
 
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0u, Size(container()));
 
     // Remove all of the elements from the container by erasing using direct
     // node pointers which should end up always being somewhere in the
     // middle of the container.
     static_assert(2 < OBJ_COUNT, "OBJ_COUNT too small to run Erase test!");
-    ASSERT_TRUE(Populate(container(), RefAction::HoldAll), "");
+    ASSERT_NO_FAILURES(Populate(container(), RefAction::HoldAll));
     for (size_t i = 1; i < OBJ_COUNT - 1; ++i) {
-      ASSERT_NONNULL(objects()[i], "");
-      EXPECT_TRUE(DoErase(*objects()[i], i, OBJ_COUNT - i + 1), "");
+      ASSERT_NOT_NULL(objects()[i]);
+      DoErase(*objects()[i], i, OBJ_COUNT - i + 1);
     }
-
-    END_TEST;
   }
 
   template <typename IterType>
-  bool DoIterate(const IterType& begin, const IterType& end) {
-    BEGIN_TEST;
+  void DoIterate(const IterType& begin, const IterType& end) {
     IterType iter;
 
     // Iterate using begin/end
     size_t i = 0;
     for (iter = begin; iter != end;) {
       // Exercise both -> and * dereferencing
-      ASSERT_TRUE(iter.IsValid(), "");
+      ASSERT_TRUE(iter.IsValid());
 
-      EXPECT_EQ(0u, iter->visited_count(), "");
+      EXPECT_EQ(0u, iter->visited_count());
       iter->Visit();
-      EXPECT_EQ(1u, (*iter).visited_count(), "");
+      EXPECT_EQ(1u, (*iter).visited_count());
       (*iter).Visit();
-      EXPECT_EQ(2u, (*iter).visited_count(), "");
+      EXPECT_EQ(2u, (*iter).visited_count());
 
       // Exercise both pre and postfix increment
       if ((i++) & 1)
@@ -510,10 +479,10 @@
       else
         ++iter;
     }
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_FALSE(iter.IsValid());
 
     for (i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(2u, objects()[i]->visited_count(), "");
+      EXPECT_EQ(2u, objects()[i]->visited_count());
       objects()[i]->ResetVisitedCount();
     }
 
@@ -521,8 +490,8 @@
     // both pre and post-fix.
     iter = end;
     ++iter;
-    EXPECT_FALSE(iter.IsValid(), "");
-    EXPECT_TRUE(iter == end, "");
+    EXPECT_FALSE(iter.IsValid());
+    EXPECT_TRUE(iter == end);
 
     // We know that the iterator  is already at the end of the container, but
     // perform the explicit assignment in order to check that the assignment
@@ -530,127 +499,120 @@
     // constructor or the explicit rvalue constructor, if supplied)
     iter = end;
     iter++;
-    EXPECT_FALSE(iter.IsValid(), "");
-    EXPECT_TRUE(iter == end, "");
-
-    END_TEST;
+    EXPECT_FALSE(iter.IsValid());
+    EXPECT_TRUE(iter == end);
   }
 
-  bool Iterate() {
-    BEGIN_TEST;
-
+  void Iterate() {
     // Both begin and cbegin should both be invalid, and to end/cend
-    ASSERT_EQ(0u, Size(container()), "");
-    EXPECT_FALSE(container().begin().IsValid(), "");
-    EXPECT_TRUE(container().begin() == container().end(), "");
+    ASSERT_EQ(0u, Size(container()));
+    EXPECT_FALSE(container().begin().IsValid());
+    EXPECT_TRUE(container().begin() == container().end());
 
-    EXPECT_FALSE(container().cbegin().IsValid(), "");
-    EXPECT_TRUE(container().cbegin() == container().cend(), "");
+    EXPECT_FALSE(container().cbegin().IsValid());
+    EXPECT_TRUE(container().cbegin() == container().cend());
 
     // Attempting to increment begin() for an empty container should result
     // in an invalid iterator which is still equal to end().  Check both
     // prefix and postfix decrement operators.
     auto iter = container().begin();
     ++iter;
-    EXPECT_TRUE(container().end() == iter, "");
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_TRUE(container().end() == iter);
+    EXPECT_FALSE(iter.IsValid());
 
     iter = container().begin();
     iter++;
-    EXPECT_TRUE(container().end() == iter, "");
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_TRUE(container().end() == iter);
+    EXPECT_FALSE(iter.IsValid());
 
     // Check const_iterator as well.
     auto const_iter = container().cbegin();
     ++const_iter;
-    EXPECT_TRUE(container().cend() == const_iter, "");
-    EXPECT_FALSE(const_iter.IsValid(), "");
+    EXPECT_TRUE(container().cend() == const_iter);
+    EXPECT_FALSE(const_iter.IsValid());
 
     const_iter = container().cbegin();
     const_iter++;
-    EXPECT_TRUE(container().cend() == const_iter, "");
-    EXPECT_FALSE(const_iter.IsValid(), "");
+    EXPECT_TRUE(container().cend() == const_iter);
+    EXPECT_FALSE(const_iter.IsValid());
 
     // Make some objects.
-    ASSERT_TRUE(Populate(container()), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
 
     // Both begin and cbegin should both be valid, and not equal to end/cend
-    EXPECT_TRUE(container().begin().IsValid(), "");
-    EXPECT_TRUE(container().begin() != container().end(), "");
+    EXPECT_TRUE(container().begin().IsValid());
+    EXPECT_TRUE(container().begin() != container().end());
 
-    EXPECT_TRUE(container().cbegin().IsValid(), "");
-    EXPECT_TRUE(container().cbegin() != container().cend(), "");
+    EXPECT_TRUE(container().cbegin().IsValid());
+    EXPECT_TRUE(container().cbegin() != container().cend());
 
-    EXPECT_TRUE(DoIterate(container().begin(), container().end()), "");    // Test iterator
-    EXPECT_TRUE(DoIterate(container().cbegin(), container().cend()), "");  // Test const_iterator
+    DoIterate(container().begin(), container().end());    // Test iterator
+    DoIterate(container().cbegin(), container().cend());  // Test const_iterator
 
     // Iterate using the range-based for loop syntax
     for (auto& obj : container()) {
-      EXPECT_EQ(0u, obj.visited_count(), "");
+      EXPECT_EQ(0u, obj.visited_count());
       obj.Visit();
-      EXPECT_EQ(1u, obj.visited_count(), "");
+      EXPECT_EQ(1u, obj.visited_count());
     }
 
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(1u, objects()[i]->visited_count(), "");
+      EXPECT_EQ(1u, objects()[i]->visited_count());
       objects()[i]->ResetVisitedCount();
     }
 
     // Iterate using the range-based for loop syntax over const references.
     for (const auto& obj : container()) {
-      EXPECT_EQ(0u, obj.visited_count(), "");
+      EXPECT_EQ(0u, obj.visited_count());
       obj.Visit();
-      EXPECT_EQ(1u, obj.visited_count(), "");
+      EXPECT_EQ(1u, obj.visited_count());
     }
 
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(1u, objects()[i]->visited_count(), "");
+      EXPECT_EQ(1u, objects()[i]->visited_count());
       objects()[i]->ResetVisitedCount();
     }
 
     // None of the objects should have been destroyed during this test.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
   template <typename IterType>
-  bool DoReverseIterate(const IterType& begin, const IterType& end) {
-    BEGIN_TEST;
+  void DoReverseIterate(const IterType& begin, const IterType& end) {
     IterType iter;
 
     // Backing up one from end() should give a valid iterator (either prefix
     // or postfix).
     iter = end;
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_FALSE(iter.IsValid());
     iter--;
-    EXPECT_TRUE(iter.IsValid(), "");
+    EXPECT_TRUE(iter.IsValid());
 
     iter = end;
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_FALSE(iter.IsValid());
     --iter;
-    EXPECT_TRUE(iter.IsValid(), "");
+    EXPECT_TRUE(iter.IsValid());
 
     // Make sure that backing up an iterator by one points always points
     // to the previous object in the container.
     iter = begin;
     size_t prev_ndx = iter->value();
     while (++iter != end) {
-      ASSERT_LT(prev_ndx, OBJ_COUNT, "");
-      ASSERT_NONNULL(objects()[prev_ndx], "");
+      ASSERT_LT(prev_ndx, OBJ_COUNT);
+      ASSERT_NOT_NULL(objects()[prev_ndx]);
 
       auto prev_iter = iter;
       --prev_iter;
-      ASSERT_TRUE(prev_iter.IsValid(), "");
-      EXPECT_FALSE(prev_iter == iter, "");
-      EXPECT_TRUE(*prev_iter == *objects()[prev_ndx], "");
+      ASSERT_TRUE(prev_iter.IsValid());
+      EXPECT_FALSE(prev_iter == iter);
+      EXPECT_TRUE(*prev_iter == *objects()[prev_ndx]);
 
       prev_iter = iter;
       prev_iter--;
-      ASSERT_TRUE(prev_iter.IsValid(), "");
-      EXPECT_FALSE(prev_iter == iter, "");
-      EXPECT_TRUE(*prev_iter == *objects()[prev_ndx], "");
+      ASSERT_TRUE(prev_iter.IsValid());
+      EXPECT_FALSE(prev_iter == iter);
+      EXPECT_TRUE(*prev_iter == *objects()[prev_ndx]);
 
       prev_ndx = iter->value();
     }
@@ -658,160 +620,148 @@
     // Attempting to back up past the beginning should result in an
     // invalid iterator.
     iter = begin;
-    ASSERT_TRUE(iter.IsValid(), "");
+    ASSERT_TRUE(iter.IsValid());
     --iter;
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_FALSE(iter.IsValid());
 
     iter = begin;
-    ASSERT_TRUE(iter.IsValid(), "");
+    ASSERT_TRUE(iter.IsValid());
     iter--;
-    EXPECT_FALSE(iter.IsValid(), "");
-
-    END_TEST;
+    EXPECT_FALSE(iter.IsValid());
   }
 
-  bool ReverseIterate() {
-    BEGIN_TEST;
-
+  void ReverseIterate() {
     // Make sure that backing up from end() for an empty container stays at
     // end.  Check both prefix and postfix decrement operators.
-    ASSERT_EQ(0u, Size(container()), "");
+    ASSERT_EQ(0u, Size(container()));
     auto iter = container().end();
     --iter;
-    EXPECT_TRUE(container().end() == iter, "");
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_TRUE(container().end() == iter);
+    EXPECT_FALSE(iter.IsValid());
 
     iter = container().end();
     iter--;
-    EXPECT_TRUE(container().end() == iter, "");
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_TRUE(container().end() == iter);
+    EXPECT_FALSE(iter.IsValid());
 
     // Check const_iterator as well.
     auto const_iter = container().cend();
     --const_iter;
-    EXPECT_TRUE(container().cend() == const_iter, "");
-    EXPECT_FALSE(const_iter.IsValid(), "");
+    EXPECT_TRUE(container().cend() == const_iter);
+    EXPECT_FALSE(const_iter.IsValid());
 
     const_iter = container().cend();
     const_iter--;
-    EXPECT_TRUE(container().cend() == const_iter, "");
-    EXPECT_FALSE(const_iter.IsValid(), "");
+    EXPECT_TRUE(container().cend() == const_iter);
+    EXPECT_FALSE(const_iter.IsValid());
 
     // Making some objects.
-    ASSERT_TRUE(Populate(container()), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
 
     // Test iterator
-    EXPECT_TRUE(DoReverseIterate(container().begin(), container().end()), "");
+    ASSERT_NO_FATAL_FAILURES(DoReverseIterate(container().begin(), container().end()));
 
     // Test const_iterator
-    EXPECT_TRUE(DoReverseIterate(container().cbegin(), container().cend()), "");
+    ASSERT_NO_FATAL_FAILURES(DoReverseIterate(container().cbegin(), container().cend()));
 
     // None of the objects should have been destroyed during this test.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool MakeIterator() {
-    BEGIN_TEST;
-
+  void MakeIterator() {
     // Populate the container.  Hold internal refs to everything we add to
     // the container.
-    ASSERT_TRUE(Populate(container(), RefAction::HoldAll), "");
+    ASSERT_NO_FAILURES(Populate(container(), RefAction::HoldAll));
 
     // For every member of the container, make an iterator using the
     // internal reference we are holding.  Verify that the iterator is in
     // the position we expect it to be in.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      ASSERT_NONNULL(objects()[i], "");
+      ASSERT_NOT_NULL(objects()[i]);
       auto iter = container().make_iterator(*objects()[i]);
 
-      ASSERT_TRUE(iter != container().end(), "");
-      EXPECT_EQ(objects()[i]->value(), iter->value(), "");
-      EXPECT_EQ(objects()[i], iter->raw_ptr(), "");
+      ASSERT_TRUE(iter != container().end());
+      EXPECT_EQ(objects()[i]->value(), iter->value());
+      EXPECT_EQ(objects()[i], iter->raw_ptr());
 
       if (ContainerType::IsSequenced) {
         auto other_iter = container().begin();
 
         for (size_t j = 0; j < i; ++j) {
-          EXPECT_FALSE(other_iter == iter, "");
+          EXPECT_FALSE(other_iter == iter);
           ++other_iter;
         }
 
-        EXPECT_TRUE(other_iter == iter, "");
+        EXPECT_TRUE(other_iter == iter);
       }
     }
-
-    END_TEST;
   }
 
-  bool Swap() {
-    BEGIN_TEST;
-
+  void Swap() {
     {
-      ContainerType other_container;           // Make an empty container.
-      ASSERT_TRUE(Populate(container()), "");  // Fill the internal container with stuff.
+      ContainerType other_container;              // Make an empty container.
+      ASSERT_NO_FAILURES(Populate(container()));  // Fill the internal container with stuff.
 
       // Sanity check, swap, then check again.
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_FALSE(container().is_empty(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(container()), "");
-      EXPECT_TRUE(other_container.is_empty(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+      EXPECT_FALSE(container().is_empty());
+      EXPECT_EQ(OBJ_COUNT, Size(container()));
+      EXPECT_TRUE(other_container.is_empty());
 
       for (auto& obj : container()) {
-        ASSERT_EQ(0u, obj.visited_count(), "");
+        ASSERT_EQ(0u, obj.visited_count());
         obj.Visit();
       }
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
 
       container().swap(other_container);
 
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_FALSE(other_container.is_empty(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(other_container), "");
-      EXPECT_TRUE(container().is_empty(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+      EXPECT_FALSE(other_container.is_empty());
+      EXPECT_EQ(OBJ_COUNT, Size(other_container));
+      EXPECT_TRUE(container().is_empty());
 
       for (auto& obj : other_container) {
-        EXPECT_EQ(1u, obj.visited_count(), "");
+        EXPECT_EQ(1u, obj.visited_count());
         obj.Visit();
       }
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
 
       // Swap back to check the case where container() was empty, but other_container
       // had elements.
       container().swap(other_container);
 
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_FALSE(container().is_empty(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(container()), "");
-      EXPECT_TRUE(other_container.is_empty(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+      EXPECT_FALSE(container().is_empty());
+      EXPECT_EQ(OBJ_COUNT, Size(container()));
+      EXPECT_TRUE(other_container.is_empty());
 
       for (const auto& obj : container())
-        EXPECT_EQ(2u, obj.visited_count(), "");
+        EXPECT_EQ(2u, obj.visited_count());
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
 
       // Nothing should have been deleted yet.
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
+      TestEnvTraits::CheckCustomDeleteInvocations(0);
 
       // Reset;
-      EXPECT_TRUE(Reset(), "");
+      Reset();
 
       // Now all of the objects should be gone.
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
+      TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
     }
 
     // Make a new other_container, this time with some stuff in it.
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
+    EXPECT_EQ(0u, ObjType::live_obj_count());
     {
-      ContainerType other_container;           // Make an empty container.
-      ASSERT_TRUE(Populate(container()), "");  // Fill the internal container with stuff.
+      ContainerType other_container;              // Make an empty container.
+      ASSERT_NO_FAILURES(Populate(container()));  // Fill the internal container with stuff.
 
       static constexpr size_t OTHER_COUNT = 5;
       static constexpr size_t OTHER_START = 10000;
@@ -824,107 +774,103 @@
       }
 
       // Sanity check
-      EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(container()), "");
-      EXPECT_EQ(OTHER_COUNT, Size(other_container), "");
+      EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count());
+      EXPECT_EQ(OBJ_COUNT, Size(container()));
+      EXPECT_EQ(OTHER_COUNT, Size(other_container));
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
 
       // Visit everything in container() once, and everything in
       // other_container twice.
       for (auto& obj : container()) {
-        ASSERT_EQ(0u, obj.visited_count(), "");
+        ASSERT_EQ(0u, obj.visited_count());
         obj.Visit();
       }
 
       for (const auto& obj : other_container) {
-        ASSERT_EQ(0u, obj.visited_count(), "");
+        ASSERT_EQ(0u, obj.visited_count());
         obj.Visit();
         obj.Visit();
       }
 
       for (auto& obj : container())
-        EXPECT_EQ(1u, obj.visited_count(), "");
+        EXPECT_EQ(1u, obj.visited_count());
       for (auto& obj : other_container)
-        EXPECT_EQ(2u, obj.visited_count(), "");
+        EXPECT_EQ(2u, obj.visited_count());
 
       // Swap and sanity check again
       container().swap(other_container);
 
-      EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(other_container), "");
-      EXPECT_EQ(OTHER_COUNT, Size(container()), "");
+      EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count());
+      EXPECT_EQ(OBJ_COUNT, Size(other_container));
+      EXPECT_EQ(OTHER_COUNT, Size(container()));
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
 
       // Everything in container() should have been visited twice so far,
       // while everything in other_container should have been visited
       // once.
       for (auto& obj : container())
-        EXPECT_EQ(2u, obj.visited_count(), "");
+        EXPECT_EQ(2u, obj.visited_count());
       for (auto& obj : other_container)
-        EXPECT_EQ(1u, obj.visited_count(), "");
+        EXPECT_EQ(1u, obj.visited_count());
 
       // Swap back and sanity check again
       container().swap(other_container);
 
-      EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(container()), "");
-      EXPECT_EQ(OTHER_COUNT, Size(other_container), "");
+      EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count());
+      EXPECT_EQ(OBJ_COUNT, Size(container()));
+      EXPECT_EQ(OTHER_COUNT, Size(other_container));
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
 
       for (auto& obj : container())
-        EXPECT_EQ(1u, obj.visited_count(), "");
+        EXPECT_EQ(1u, obj.visited_count());
       for (auto& obj : other_container)
-        EXPECT_EQ(2u, obj.visited_count(), "");
+        EXPECT_EQ(2u, obj.visited_count());
 
       // No new objects should have been deleted.
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
+      TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
 
       // If we are testing unmanaged pointers clean them up.
-      EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count());
       other_container.clear();
       if (!PtrTraits::IsManaged) {
-        EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count(), "");
+        EXPECT_EQ(OBJ_COUNT + OTHER_COUNT, ObjType::live_obj_count());
         for (size_t i = 0; i < OTHER_COUNT; ++i)
           delete raw_ptrs[i];
       }
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
       // Now, we should have deleted an additional OTHER_COUNT objects
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT + OTHER_COUNT));
+      TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT + OTHER_COUNT);
 
       // Reset the internal state
-      EXPECT_TRUE(Reset(), "");
-      EXPECT_EQ(0u, ObjType::live_obj_count(), "");
+      Reset();
+      EXPECT_EQ(0u, ObjType::live_obj_count());
 
       // Now we should have filled and emptied the test environment twice, and
       // created+destroyed an additional OTHER_COUNT objects..
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations((2 * OBJ_COUNT) + OTHER_COUNT));
+      TestEnvTraits::CheckCustomDeleteInvocations((2 * OBJ_COUNT) + OTHER_COUNT);
     }
-
-    END_TEST;
   }
 
-  bool RvalueOps() {
-    BEGIN_TEST;
-
+  void RvalueOps() {
     // Populate the internal container.
-    ASSERT_TRUE(Populate(container()), "");
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
     for (auto& obj : container()) {
-      ASSERT_GT(OBJ_COUNT, obj.value(), "");
-      EXPECT_EQ(0u, obj.visited_count(), "");
-      EXPECT_EQ(objects()[obj.value()], &obj, "");
+      ASSERT_GT(OBJ_COUNT, obj.value());
+      EXPECT_EQ(0u, obj.visited_count());
+      EXPECT_EQ(objects()[obj.value()], &obj);
       obj.Visit();
     }
 
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
     // Move its contents to a new container by explicitly invoking the Rvalue
     // constructor.
@@ -933,18 +879,18 @@
 #else
     ContainerType other_container(std::move(container()));
 #endif
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(other_container), "");
-    EXPECT_TRUE(container().is_empty(), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(other_container));
+    EXPECT_TRUE(container().is_empty());
     for (const auto& obj : other_container) {
-      ASSERT_GT(OBJ_COUNT, obj.value(), "");
-      EXPECT_EQ(1u, obj.visited_count(), "");
-      EXPECT_EQ(objects()[obj.value()], &obj, "");
+      ASSERT_GT(OBJ_COUNT, obj.value());
+      EXPECT_EQ(1u, obj.visited_count());
+      EXPECT_EQ(objects()[obj.value()], &obj);
       obj.Visit();
     }
 
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
 
     // Move the contents again, this time using move-initialization which implicitly
     // invokes the Rvalue constructor.
@@ -953,19 +899,19 @@
 #else
     ContainerType another_container = std::move(other_container);
 #endif
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(another_container), "");
-    EXPECT_TRUE(other_container.is_empty(), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(another_container));
+    EXPECT_TRUE(other_container.is_empty());
     for (const auto& obj : another_container) {
-      ASSERT_GT(OBJ_COUNT, obj.value(), "");
-      EXPECT_EQ(2u, obj.visited_count(), "");
-      EXPECT_EQ(objects()[obj.value()], &obj, "");
+      ASSERT_GT(OBJ_COUNT, obj.value());
+      EXPECT_EQ(2u, obj.visited_count());
+      EXPECT_EQ(objects()[obj.value()], &obj);
       obj.Visit();
     }
 
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(another_container), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(another_container));
 
     // Move the contents of the final container back to the internal container.  If we
     // are testing managed pointer types, put some objects into the internal
@@ -982,19 +928,19 @@
     }
 
     // Sanity checks before the assignment
-    EXPECT_EQ(OBJ_COUNT + extras_added, ObjType::live_obj_count(), "");
-    EXPECT_EQ(extras_added, Size(container()), "");
+    EXPECT_EQ(OBJ_COUNT + extras_added, ObjType::live_obj_count());
+    EXPECT_EQ(extras_added, Size(container()));
     for (const auto& obj : container()) {
-      ASSERT_GT(EXTRA_COUNT, obj.value(), "");
-      EXPECT_EQ(0u, obj.visited_count(), "");
+      ASSERT_GT(EXTRA_COUNT, obj.value());
+      EXPECT_EQ(0u, obj.visited_count());
     }
 
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(another_container), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(another_container));
 
     // No objects should have been deleted yet.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
 #if TEST_WILL_NOT_COMPILE || 0
     container() = another_container;
 #else
@@ -1002,35 +948,31 @@
 #endif
     // The extra objects we put into container() should have been released
     // when we moved the contents of another_container into container()
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(extras_added));
+    TestEnvTraits::CheckCustomDeleteInvocations(extras_added);
 
     // another_container should now be empty, and we should have returned to our
     // starting, post-populated state.
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
-    EXPECT_TRUE(another_container.is_empty(), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
+    EXPECT_TRUE(another_container.is_empty());
     for (const auto& obj : container()) {
-      ASSERT_GT(OBJ_COUNT, obj.value(), "");
-      EXPECT_EQ(3u, obj.visited_count(), "");
-      EXPECT_EQ(objects()[obj.value()], &obj, "");
+      ASSERT_GT(OBJ_COUNT, obj.value());
+      EXPECT_EQ(3u, obj.visited_count());
+      EXPECT_EQ(objects()[obj.value()], &obj);
     }
 
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(another_container), "");
-
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(another_container));
   }
 
-  bool Scope() {
-    BEGIN_TEST;
-
+  void Scope() {
     // Make sure that both unique_ptrs and RefPtrs handle being moved
     // properly, and that containers of such pointers automatically clean up
     // when the container goes out of scope and destructs.  Note: Don't try
     // this with an unmanaged pointer.  Lists of unmanaged pointers will
     // ZX_ASSERT if they destruct with elements still in them.
-    EXPECT_EQ(0U, ObjType::live_obj_count(), "");
+    EXPECT_EQ(0U, ObjType::live_obj_count());
 
     {  // Begin scope for container
       ContainerType container;
@@ -1038,24 +980,20 @@
       // Put some stuff into the container.  Don't hold any internal
       // references to anything we add.
       Populate(container, RefAction::HoldNone);
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(container), "");
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+      EXPECT_EQ(OBJ_COUNT, Size(container));
+      TestEnvTraits::CheckCustomDeleteInvocations(0);
     }  // Let the container go out of scope and clean itself up..
 
-    EXPECT_EQ(0U, ObjType::live_obj_count(), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
-
-    END_TEST;
+    EXPECT_EQ(0U, ObjType::live_obj_count());
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
   }
 
-  bool TwoContainer() {
-    BEGIN_TEST;
-
+  void TwoContainer() {
     // Start by populating the internal container.  We should end up with
     // OBJ_COUNT objects, but we may not be holding internal references to
     // all of them.
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Create the other type of container that ObjType can exist on and populate
     // it using the default operation for the container type.
@@ -1066,28 +1004,28 @@
 
     // The two containers should be the same length, and nothing should have
     // changed about the live object count.
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
-    EXPECT_EQ(OBJ_COUNT, Size(other_container), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
+    EXPECT_EQ(OBJ_COUNT, Size(other_container));
 
     // Make sure that none of the members of container() or other_container
     // have been visited.  Then visit every member of other_container, and
     // make sure that all of the members of container() have been visited
     // once.
     for (auto& obj : container())
-      ASSERT_EQ(0u, obj.visited_count(), "");
+      ASSERT_EQ(0u, obj.visited_count());
     for (auto& obj : other_container)
-      ASSERT_EQ(0u, obj.visited_count(), "");
+      ASSERT_EQ(0u, obj.visited_count());
 
     for (auto& obj : other_container) {
       obj.Visit();
-      EXPECT_EQ(1u, obj.visited_count(), "");
+      EXPECT_EQ(1u, obj.visited_count());
     }
 
     for (auto& obj : container()) {
-      EXPECT_EQ(1u, obj.visited_count(), "");
+      EXPECT_EQ(1u, obj.visited_count());
       obj.Visit();
-      EXPECT_EQ(2u, obj.visited_count(), "");
+      EXPECT_EQ(2u, obj.visited_count());
     }
 
     // If this is a sequenced container, then other_container should be in
@@ -1095,35 +1033,35 @@
     if (OtherContainerType::IsSequenced) {
       auto other_iter = other_container.begin();
       for (const auto& obj : container()) {
-        ASSERT_FALSE(other_iter == other_container.end(), "");
-        EXPECT_EQ(OBJ_COUNT - obj.value() - 1, other_iter->value(), "");
+        ASSERT_FALSE(other_iter == other_container.end());
+        EXPECT_EQ(OBJ_COUNT - obj.value() - 1, other_iter->value());
         ++other_iter;
       }
-      EXPECT_TRUE(other_iter == other_container.end(), "");
+      EXPECT_TRUE(other_iter == other_container.end());
     }
 
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(other_container), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(other_container));
 
     // Clear the internal container.  No objects should go away and the other
     // container should be un-affected
     container().clear();
 
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, Size(container()), "");
-    EXPECT_EQ(OBJ_COUNT, Size(other_container), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(0u, Size(container()));
+    EXPECT_EQ(OBJ_COUNT, Size(other_container));
 
     for (auto& obj : other_container)
-      EXPECT_EQ(2u, obj.visited_count(), "");
+      EXPECT_EQ(2u, obj.visited_count());
 
     if (OtherContainerType::IsSequenced) {
       auto other_iter = other_container.begin();
       for (size_t i = 0; i < OBJ_COUNT; ++i) {
-        ASSERT_FALSE(other_iter == other_container.end(), "");
-        EXPECT_EQ(OBJ_COUNT - i - 1, other_iter->value(), "");
+        ASSERT_FALSE(other_iter == other_container.end());
+        EXPECT_EQ(OBJ_COUNT - i - 1, other_iter->value());
         ++other_iter;
       }
-      EXPECT_TRUE(other_iter == other_container.end(), "");
+      EXPECT_TRUE(other_iter == other_container.end());
     }
 
     // If we are testing a container of managed pointers, release our internal
@@ -1137,32 +1075,29 @@
       for (size_t i = 0; i < OBJ_COUNT; ++i)
         ReleaseObject(i);
 
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_EQ(0u, refs_held(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(other_container), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+      EXPECT_EQ(0u, refs_held());
+      EXPECT_EQ(OBJ_COUNT, Size(other_container));
     }
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
 
     // Finally, clear() other_container and reset the internal state.  At this
     // point, all objects should have gone away.
     other_container.clear();
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
-    EXPECT_TRUE(Reset(), "");
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
+    Reset();
 
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, refs_held(), "");
-    EXPECT_EQ(0u, Size(container()), "");
-    EXPECT_EQ(0u, Size(other_container), "");
-
-    END_TEST;
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0u, refs_held());
+    EXPECT_EQ(0u, Size(container()));
+    EXPECT_EQ(0u, Size(other_container));
   }
 
-  bool ThreeContainerHelper() {
-    BEGIN_TEST;
+  void ThreeContainerHelper() {
     // Start by populating the internal container.  We should end up with
     // OBJ_COUNT objects, but we may not be holding internal references to
     // all of them.
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Create the other types of containers that ObjType can exist on and populate
     // them using the default operation for the container type.
@@ -1176,42 +1111,42 @@
     }
 
     for (auto& obj : tagged1) {
-      EXPECT_TRUE(InContainer<typename ContainerTraits::Tag1>(obj), "");
-      EXPECT_TRUE(InContainer<typename ContainerTraits::Tag2>(obj), "");
-      EXPECT_TRUE(InContainer<typename ContainerTraits::Tag3>(obj), "");
+      EXPECT_TRUE(InContainer<typename ContainerTraits::Tag1>(obj));
+      EXPECT_TRUE(InContainer<typename ContainerTraits::Tag2>(obj));
+      EXPECT_TRUE(InContainer<typename ContainerTraits::Tag3>(obj));
     }
 
     // The three containers should be the same length, and nothing should have
     // changed about the live object count.
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(tagged1), "");
-    EXPECT_EQ(OBJ_COUNT, Size(tagged2), "");
-    EXPECT_EQ(OBJ_COUNT, Size(tagged3), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(tagged1));
+    EXPECT_EQ(OBJ_COUNT, Size(tagged2));
+    EXPECT_EQ(OBJ_COUNT, Size(tagged3));
 
     // Make sure that none of the members of container() or other_container
     // have been visited.  Then visit every member of the other containers,
     // and make sure that all of the members of container() have been
     // visited once.
     for (auto& obj : tagged1)
-      ASSERT_EQ(0u, obj.visited_count(), "");
+      ASSERT_EQ(0u, obj.visited_count());
     for (auto& obj : tagged2)
-      ASSERT_EQ(0u, obj.visited_count(), "");
+      ASSERT_EQ(0u, obj.visited_count());
     for (auto& obj : tagged3)
-      ASSERT_EQ(0u, obj.visited_count(), "");
+      ASSERT_EQ(0u, obj.visited_count());
 
     for (auto& obj : tagged1) {
       obj.Visit();
-      EXPECT_EQ(1u, obj.visited_count(), "");
+      EXPECT_EQ(1u, obj.visited_count());
     }
 
     for (auto& obj : tagged2) {
       obj.Visit();
-      EXPECT_EQ(2u, obj.visited_count(), "");
+      EXPECT_EQ(2u, obj.visited_count());
     }
 
     for (auto& obj : tagged3) {
       obj.Visit();
-      EXPECT_EQ(3u, obj.visited_count(), "");
+      EXPECT_EQ(3u, obj.visited_count());
     }
 
     // If this is a sequenced container, then the other containers should be in
@@ -1221,51 +1156,51 @@
                   ContainerTraits::TaggedType3::IsSequenced) {
       auto iter1 = tagged1.begin();
       for (const auto& obj : container()) {
-        ASSERT_FALSE(iter1 == tagged1.end(), "");
-        EXPECT_EQ(OBJ_COUNT - obj.value() - 1, iter1->value(), "");
+        ASSERT_FALSE(iter1 == tagged1.end());
+        EXPECT_EQ(OBJ_COUNT - obj.value() - 1, iter1->value());
         ++iter1;
       }
-      EXPECT_TRUE(iter1 == tagged1.end(), "");
+      EXPECT_TRUE(iter1 == tagged1.end());
 
       auto iter2 = tagged2.begin();
       for (const auto& obj : container()) {
-        ASSERT_FALSE(iter2 == tagged2.end(), "");
-        EXPECT_EQ(OBJ_COUNT - obj.value() - 1, iter2->value(), "");
+        ASSERT_FALSE(iter2 == tagged2.end());
+        EXPECT_EQ(OBJ_COUNT - obj.value() - 1, iter2->value());
         ++iter2;
       }
-      EXPECT_TRUE(iter2 == tagged2.end(), "");
+      EXPECT_TRUE(iter2 == tagged2.end());
 
       auto iter3 = tagged3.begin();
       for (const auto& obj : container()) {
-        ASSERT_FALSE(iter3 == tagged3.end(), "");
-        EXPECT_EQ(OBJ_COUNT - obj.value() - 1, iter3->value(), "");
+        ASSERT_FALSE(iter3 == tagged3.end());
+        EXPECT_EQ(OBJ_COUNT - obj.value() - 1, iter3->value());
         ++iter3;
       }
-      EXPECT_TRUE(iter3 == tagged3.end(), "");
+      EXPECT_TRUE(iter3 == tagged3.end());
     }
 
-    EXPECT_TRUE(ContainerChecker::SanityCheck(tagged1), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(tagged2), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(tagged3), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(tagged1));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(tagged2));
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(tagged3));
 
     // Clear the internal container.  No objects should go away and the other
     // containers should be un-affected
     container().clear();
 
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, Size(container()), "");
-    EXPECT_EQ(OBJ_COUNT, Size(tagged1), "");
-    EXPECT_EQ(OBJ_COUNT, Size(tagged2), "");
-    EXPECT_EQ(OBJ_COUNT, Size(tagged3), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(0u, Size(container()));
+    EXPECT_EQ(OBJ_COUNT, Size(tagged1));
+    EXPECT_EQ(OBJ_COUNT, Size(tagged2));
+    EXPECT_EQ(OBJ_COUNT, Size(tagged3));
 
     for (auto& obj : tagged1) {
-      EXPECT_EQ(3u, obj.visited_count(), "");
+      EXPECT_EQ(3u, obj.visited_count());
     }
     for (auto& obj : tagged2) {
-      EXPECT_EQ(3u, obj.visited_count(), "");
+      EXPECT_EQ(3u, obj.visited_count());
     }
     for (auto& obj : tagged3) {
-      EXPECT_EQ(3u, obj.visited_count(), "");
+      EXPECT_EQ(3u, obj.visited_count());
     }
 
     if constexpr (ContainerTraits::TaggedType1::IsSequenced &&
@@ -1273,27 +1208,27 @@
                   ContainerTraits::TaggedType3::IsSequenced) {
       auto iter1 = tagged1.begin();
       for (size_t i = 0; i < OBJ_COUNT; ++i) {
-        ASSERT_FALSE(iter1 == tagged1.end(), "");
-        EXPECT_EQ(OBJ_COUNT - i - 1, iter1->value(), "");
+        ASSERT_FALSE(iter1 == tagged1.end());
+        EXPECT_EQ(OBJ_COUNT - i - 1, iter1->value());
         ++iter1;
       }
-      EXPECT_TRUE(iter1 == tagged1.end(), "");
+      EXPECT_TRUE(iter1 == tagged1.end());
 
       auto iter2 = tagged2.begin();
       for (size_t i = 0; i < OBJ_COUNT; ++i) {
-        ASSERT_FALSE(iter2 == tagged2.end(), "");
-        EXPECT_EQ(OBJ_COUNT - i - 1, iter2->value(), "");
+        ASSERT_FALSE(iter2 == tagged2.end());
+        EXPECT_EQ(OBJ_COUNT - i - 1, iter2->value());
         ++iter2;
       }
-      EXPECT_TRUE(iter2 == tagged2.end(), "");
+      EXPECT_TRUE(iter2 == tagged2.end());
 
       auto iter3 = tagged3.begin();
       for (size_t i = 0; i < OBJ_COUNT; ++i) {
-        ASSERT_FALSE(iter3 == tagged3.end(), "");
-        EXPECT_EQ(OBJ_COUNT - i - 1, iter3->value(), "");
+        ASSERT_FALSE(iter3 == tagged3.end());
+        EXPECT_EQ(OBJ_COUNT - i - 1, iter3->value());
         ++iter3;
       }
-      EXPECT_TRUE(iter3 == tagged3.end(), "");
+      EXPECT_TRUE(iter3 == tagged3.end());
     }
 
     // If we are testing a container of managed pointers, release our internal
@@ -1307,61 +1242,58 @@
       for (size_t i = 0; i < OBJ_COUNT; ++i)
         ReleaseObject(i);
 
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-      EXPECT_EQ(0u, refs_held(), "");
-      EXPECT_EQ(OBJ_COUNT, Size(tagged1), "");
-      EXPECT_EQ(OBJ_COUNT, Size(tagged2), "");
-      EXPECT_EQ(OBJ_COUNT, Size(tagged3), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+      EXPECT_EQ(0u, refs_held());
+      EXPECT_EQ(OBJ_COUNT, Size(tagged1));
+      EXPECT_EQ(OBJ_COUNT, Size(tagged2));
+      EXPECT_EQ(OBJ_COUNT, Size(tagged3));
     }
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
 
     // Finally, clear() the other other_containers and reset the internal state. At this
     // point, all objects should have gone away.
     tagged1.clear();
     tagged2.clear();
     tagged3.clear();
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
-    EXPECT_TRUE(Reset(), "");
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
+    Reset();
 
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0u, refs_held(), "");
-    EXPECT_EQ(0u, Size(container()), "");
-    EXPECT_EQ(0u, Size(tagged1), "");
-    EXPECT_EQ(0u, Size(tagged2), "");
-    EXPECT_EQ(0u, Size(tagged3), "");
-
-    END_TEST;
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0u, refs_held());
+    EXPECT_EQ(0u, Size(container()));
+    EXPECT_EQ(0u, Size(tagged1));
+    EXPECT_EQ(0u, Size(tagged2));
+    EXPECT_EQ(0u, Size(tagged3));
   }
 
-  bool IterCopyPointer() {
-    BEGIN_TEST;
+  void IterCopyPointer() {
     PtrType ptr;
     typename ContainerType::iterator iter;
 
     // A default constructed iterator should give back nullptr when
     // CopyPointer is called.
     ptr = iter.CopyPointer();
-    EXPECT_NULL(ptr, "");
+    EXPECT_NULL(ptr);
 
     // The begining/end of an emptry container should also return nullptr.
     ptr = container().begin().CopyPointer();
-    EXPECT_NULL(ptr, "");
+    EXPECT_NULL(ptr);
 
     ptr = container().end().CopyPointer();
-    EXPECT_NULL(ptr, "");
+    EXPECT_NULL(ptr);
 
     // Populate the container.
-    ASSERT_TRUE(Populate(container(), RefAction::HoldAll), "");
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, refs_held(), "");
+    ASSERT_NO_FAILURES(Populate(container(), RefAction::HoldAll));
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, refs_held());
 
     // end().CopyPointer should still return nullptr.
     ptr = container().end().CopyPointer();
-    EXPECT_NULL(ptr, "");
+    EXPECT_NULL(ptr);
 
     // begin().CopyPointer() should be non-null.
     ptr = container().begin().CopyPointer();
-    EXPECT_NONNULL(ptr, "");
+    EXPECT_NOT_NULL(ptr);
 
     // clear the container and release all internally held references.
     container().clear();
@@ -1370,25 +1302,21 @@
 
     // We should not be holding any references, but we should still have a
     // live object if we are testing a managed pointer type.
-    EXPECT_EQ(0u, refs_held(), "");
+    EXPECT_EQ(0u, refs_held());
     if (PtrTraits::IsManaged)
-      EXPECT_EQ(1u, ObjType::live_obj_count(), "");
+      EXPECT_EQ(1u, ObjType::live_obj_count());
     else
-      EXPECT_EQ(0u, ObjType::live_obj_count(), "");
+      EXPECT_EQ(0u, ObjType::live_obj_count());
 
     // null out our pointer.  No matter what, our live_obj_count should now
     // be zero.
     ptr = nullptr;
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-
-    END_TEST;
+    EXPECT_EQ(0u, ObjType::live_obj_count());
   }
 
-  bool EraseIf() {
-    BEGIN_TEST;
-
+  void EraseIf() {
     // Populate our container.
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Erase all of the even members
     size_t even_erased = 0;
@@ -1399,11 +1327,11 @@
       even_erased++;
     }
 
-    EXPECT_EQ(EVEN_OBJ_COUNT, even_erased, "");
-    EXPECT_EQ(OBJ_COUNT, even_erased + Size(container()), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(even_erased));
+    EXPECT_EQ(EVEN_OBJ_COUNT, even_erased);
+    EXPECT_EQ(OBJ_COUNT, even_erased + Size(container()));
+    TestEnvTraits::CheckCustomDeleteInvocations(even_erased);
     for (const auto& obj : container())
-      EXPECT_TRUE(obj.value() & 1, "");
+      EXPECT_TRUE(obj.value() & 1);
 
     // Erase all of the odd members
     size_t odd_erased = 0;
@@ -1414,33 +1342,29 @@
       odd_erased++;
     }
 
-    EXPECT_EQ(ODD_OBJ_COUNT, odd_erased, "");
-    EXPECT_EQ(OBJ_COUNT, even_erased + odd_erased, "");
-    EXPECT_TRUE(container().is_empty(), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
-
-    END_TEST;
+    EXPECT_EQ(ODD_OBJ_COUNT, odd_erased);
+    EXPECT_EQ(OBJ_COUNT, even_erased + odd_erased);
+    EXPECT_TRUE(container().is_empty());
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
   }
 
-  bool FindIf() {
-    BEGIN_TEST;
-
+  void FindIf() {
     // Populate our container.
-    ASSERT_TRUE(Populate(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Find all of the members which should be in the container.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
       auto iter =
           const_container().find_if([i](const ObjType& obj) -> bool { return (obj.value() == i); });
 
-      ASSERT_TRUE(iter.IsValid(), "");
-      EXPECT_EQ(0u, iter->visited_count(), "");
+      ASSERT_TRUE(iter.IsValid());
+      EXPECT_EQ(0u, iter->visited_count());
       iter->Visit();
     }
 
     // Every member should have been visited once.
     for (auto& obj : container()) {
-      EXPECT_EQ(1u, obj.visited_count(), "");
+      EXPECT_EQ(1u, obj.visited_count());
       obj.ResetVisitedCount();
     }
 
@@ -1456,22 +1380,20 @@
       ++total_found;
       iter->Visit();
     }
-    EXPECT_EQ(ODD_OBJ_COUNT, total_found, "");
+    EXPECT_EQ(ODD_OBJ_COUNT, total_found);
 
     // All of the odd members should have been visited once, while all of
     // the even members should not have been visited.
     for (const auto& obj : container())
-      EXPECT_EQ(obj.value() & 1, obj.visited_count(), "");
+      EXPECT_EQ(obj.value() & 1, obj.visited_count());
 
     // Fail to find a member which should not be in the container.
     auto iter = const_container().find_if(
         [](const ObjType& obj) -> bool { return (obj.value() == OBJ_COUNT); });
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_FALSE(iter.IsValid());
 
     // We should not have destroyed any objects in this test.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
   static PtrType TakePtr(PtrType& ptr) {
@@ -1505,3 +1427,5 @@
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_BASE_TEST_ENVIRONMENTS_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_doubly_linked_list_checker.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_doubly_linked_list_checker.h
index 50d99ac..1425adc 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_doubly_linked_list_checker.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_doubly_linked_list_checker.h
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_DOUBLY_LINKED_LIST_CHECKER_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_DOUBLY_LINKED_LIST_CHECKER_H_
 
-#include <unittest/unittest.h>
 #include <fbl/intrusive_hash_table.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -20,17 +21,15 @@
 class DoublyLinkedListChecker {
  public:
   template <typename ContainerType>
-  static bool SanityCheck(const ContainerType& container) {
+  static void SanityCheck(const ContainerType& container) {
     using NodeTraits = typename ContainerType::NodeTraits;
     using PtrTraits = typename ContainerType::PtrTraits;
-    BEGIN_TEST;
-
     typename PtrTraits::RawPtrType tmp = container.head_;
     while (true) {
-      ASSERT_NONNULL(tmp, "");
+      ASSERT_NOT_NULL(tmp);
 
       if (is_sentinel_ptr(tmp)) {
-        ASSERT_EQ(container.sentinel(), tmp, "");
+        ASSERT_EQ(container.sentinel(), tmp);
         break;
       }
 
@@ -39,15 +38,15 @@
 
     tmp = container.tail();
     if (!is_sentinel_ptr(container.head_)) {
-      ASSERT_NONNULL(tmp, "");
+      ASSERT_NOT_NULL(tmp);
       tmp = NodeTraits::node_state(*tmp).next_;
     }
-    ASSERT_EQ(container.sentinel(), tmp, "");
-
-    END_TEST;
+    ASSERT_EQ(container.sentinel(), tmp);
   }
 };
 
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_DOUBLY_LINKED_LIST_CHECKER_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_hash_table_checker.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_hash_table_checker.h
index a429654..bdfacf8 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_hash_table_checker.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_hash_table_checker.h
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_HASH_TABLE_CHECKER_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_HASH_TABLE_CHECKER_H_
 
-#include <unittest/unittest.h>
 #include <fbl/intrusive_hash_table.h>
 #include <fbl/tests/intrusive_containers/intrusive_doubly_linked_list_checker.h>
 #include <fbl/tests/intrusive_containers/intrusive_singly_linked_list_checker.h>
 #include <fbl/tests/intrusive_containers/test_environment_utils.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -19,35 +20,33 @@
 class HashTableChecker {
  public:
   template <typename ContainerType>
-  static bool SanityCheck(const ContainerType& container) {
+  static void SanityCheck(const ContainerType& container) {
     using BucketType = typename ContainerType::BucketType;
     using BucketChecker = typename BucketType::CheckerType;
     using HashType = typename ContainerType::HashType;
     using HashTraits = typename ContainerType::HashTraits;
     using KeyTraits = typename ContainerType::KeyTraits;
 
-    BEGIN_TEST;
-
     // Demand that every bucket pass its sanity check.  Keep a running total
     // of the total size of the HashTable in the process.
     size_t total_size = 0;
     for (size_t i = 0; i < ContainerType::kNumBuckets; ++i) {
-      ASSERT_TRUE(BucketChecker::SanityCheck(container.buckets_[i]), "");
+      ASSERT_NO_FATAL_FAILURES(BucketChecker::SanityCheck(container.buckets_[i]));
       total_size += SizeUtils<BucketType>::size(container.buckets_[i]);
 
       // For every element in the bucket, make sure that the bucket index
       // matches the hash of the element.
       for (const auto& obj : container.buckets_[i]) {
-        ASSERT_EQ(HashTraits::GetHash(KeyTraits::GetKey(obj)), static_cast<HashType>(i), "");
+        ASSERT_EQ(HashTraits::GetHash(KeyTraits::GetKey(obj)), static_cast<HashType>(i));
       }
     }
 
-    EXPECT_EQ(container.size(), total_size, "");
-
-    END_TEST;
+    EXPECT_EQ(container.size(), total_size);
   }
 };
 
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_HASH_TABLE_CHECKER_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_singly_linked_list_checker.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_singly_linked_list_checker.h
index c64f26c..68e3cca 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_singly_linked_list_checker.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_singly_linked_list_checker.h
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_SINGLY_LINKED_LIST_CHECKER_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_SINGLY_LINKED_LIST_CHECKER_H_
 
-#include <unittest/unittest.h>
 #include <fbl/intrusive_hash_table.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -20,27 +21,26 @@
 class SinglyLinkedListChecker {
  public:
   template <typename ContainerType>
-  static bool SanityCheck(const ContainerType& container) {
+  static void SanityCheck(const ContainerType& container) {
     using NodeTraits = typename ContainerType::NodeTraits;
     using PtrTraits = typename ContainerType::PtrTraits;
-    BEGIN_TEST;
 
     typename PtrTraits::RawPtrType tmp = container.head_;
     while (true) {
-      ASSERT_NONNULL(tmp, "");
+      ASSERT_NOT_NULL(tmp);
 
       if (is_sentinel_ptr(tmp)) {
-        ASSERT_EQ(container.sentinel(), tmp, "");
+        ASSERT_EQ(container.sentinel(), tmp);
         break;
       }
 
       tmp = NodeTraits::node_state(*tmp).next_;
     }
-
-    END_TEST;
   }
 };
 
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_SINGLY_LINKED_LIST_CHECKER_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_wavl_tree_checker.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_wavl_tree_checker.h
index 90bd4df..2f1663b 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_wavl_tree_checker.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/intrusive_wavl_tree_checker.h
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_WAVL_TREE_CHECKER_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_WAVL_TREE_CHECKER_H_
 
-#include <unittest/unittest.h>
 #include <fbl/intrusive_wavl_tree.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -17,11 +18,10 @@
 class WAVLTreeChecker {
  public:
   template <typename TreeType>
-  static bool VerifyParentBackLinks(const TreeType& tree, typename TreeType::RawPtrType node) {
-    BEGIN_TEST;
+  static void VerifyParentBackLinks(const TreeType& tree, typename TreeType::RawPtrType node) {
     using NodeTraits = typename TreeType::NodeTraits;
 
-    ASSERT_TRUE(valid_sentinel_ptr(node), "");
+    ASSERT_TRUE(valid_sentinel_ptr(node));
     const auto& ns = NodeTraits::node_state(*node);
 
     if (valid_sentinel_ptr(ns.left_)) {
@@ -33,13 +33,10 @@
       EXPECT_EQ(node, NodeTraits::node_state(*ns.right_).parent_,
                 "Corrupt right-side parent back-link!");
     }
-
-    END_TEST;
   }
 
   template <typename TreeType>
-  static bool SanityCheck(const TreeType& tree) {
-    BEGIN_TEST;
+  static void SanityCheck(const TreeType& tree) {
     using NodeTraits = typename TreeType::NodeTraits;
     using RawPtrType = typename TreeType::RawPtrType;
     using Observer = typename TreeType::Observer;
@@ -48,26 +45,26 @@
     if (tree.is_empty()) {
       // If the tree is empty, then the root should be null, and the
       // left/right-most members should be set to the sentinel value.
-      ASSERT_NULL(tree.root_, "");
-      ASSERT_EQ(tree.sentinel(), tree.left_most_, "");
-      ASSERT_EQ(tree.sentinel(), tree.right_most_, "");
-      EXPECT_EQ(0u, tree.size(), "");
+      ASSERT_NULL(tree.root_);
+      ASSERT_EQ(tree.sentinel(), tree.left_most_);
+      ASSERT_EQ(tree.sentinel(), tree.right_most_);
+      EXPECT_EQ(0u, tree.size());
     } else {
       // If the tree is non-empty, then the root, left-most and
       // right-most pointers should all be valid.  The LR-child of the
       // LR-most element should be the sentinel value.
-      ASSERT_NONNULL(tree.root_, "");
-      ASSERT_FALSE(is_sentinel_ptr(tree.root_), "");
+      ASSERT_NOT_NULL(tree.root_);
+      ASSERT_FALSE(is_sentinel_ptr(tree.root_));
 
-      ASSERT_NONNULL(tree.left_most_, "");
-      ASSERT_FALSE(is_sentinel_ptr(tree.left_most_), "");
-      ASSERT_EQ(tree.sentinel(), NodeTraits::node_state(*tree.left_most_).left_, "");
+      ASSERT_NOT_NULL(tree.left_most_);
+      ASSERT_FALSE(is_sentinel_ptr(tree.left_most_));
+      ASSERT_EQ(tree.sentinel(), NodeTraits::node_state(*tree.left_most_).left_);
 
-      ASSERT_NONNULL(tree.right_most_, "");
-      ASSERT_FALSE(is_sentinel_ptr(tree.right_most_), "");
-      ASSERT_EQ(tree.sentinel(), NodeTraits::node_state(*tree.right_most_).right_, "");
+      ASSERT_NOT_NULL(tree.right_most_);
+      ASSERT_FALSE(is_sentinel_ptr(tree.right_most_));
+      ASSERT_EQ(tree.sentinel(), NodeTraits::node_state(*tree.right_most_).right_);
 
-      EXPECT_LT(0u, tree.size(), "");
+      EXPECT_LT(0u, tree.size());
     }
 
     // Compute the size and depth of the tree, verifying the parent
@@ -83,7 +80,7 @@
     // Start by going left until we have determined the depth of the
     // left most node of the tree.
     while (valid_sentinel_ptr(node)) {
-      ASSERT_TRUE(VerifyParentBackLinks(tree, node), "");
+      ASSERT_NO_FAILURES(VerifyParentBackLinks(tree, node));
 
       auto& ns = NodeTraits::node_state(*node);
       ++cur_depth;
@@ -111,22 +108,22 @@
         depth = cur_depth;
       ++size;
 
-      ASSERT_TRUE(VerifyParentBackLinks(tree, node), "");
+      ASSERT_NO_FAILURES(VerifyParentBackLinks(tree, node));
 
       // Verify the rank rule using the tree's observer's implementation.
       // If this sanity check is being run as part of the balance test, it
       // will use the implementation above.  For all other tests, only the
       // rank parity is stored in the node, so we cannot rigorously verify
       // the rule.  The default VerifyRankRule implementation will be used
-      // instead (which just returns true).
-      ASSERT_TRUE(Observer::VerifyRankRule(tree, node), "");
+      // instead.
+      ASSERT_NO_FAILURES(Observer::VerifyRankRule(tree, node));
 
       // #2: Can we go right?
       const auto& ns = NodeTraits::node_state(*node);
       if (valid_sentinel_ptr(ns.right_)) {
         cur_depth++;
         node = ns.right_;
-        ASSERT_TRUE(VerifyParentBackLinks(tree, node), "");
+        ASSERT_NO_FAILURES(VerifyParentBackLinks(tree, node));
 
         // Now go as far left as we can.
         while (true) {
@@ -137,7 +134,7 @@
 
           ++cur_depth;
           node = ns.left_;
-          ASSERT_TRUE(VerifyParentBackLinks(tree, node), "");
+          ASSERT_NO_FAILURES(VerifyParentBackLinks(tree, node));
         }
 
         // Loop and visit the next node.
@@ -152,8 +149,8 @@
         bool is_left = (parent_ns.left_ == node);
         bool is_right = (parent_ns.right_ == node);
 
-        ASSERT_TRUE(is_left != is_right, "");
-        ASSERT_TRUE(is_left || is_right, "");
+        ASSERT_TRUE(is_left != is_right);
+        ASSERT_TRUE(is_left || is_right);
 
         node = parent;
         --cur_depth;
@@ -170,16 +167,16 @@
     }
 
     // We should have visited all of the nodes by now.
-    ASSERT_EQ(tree.size(), size, "");
+    ASSERT_EQ(tree.size(), size);
 
     // If this is being called from the balance tests, check the balance
     // bounds, and computational complexity bounds.
-    ASSERT_TRUE(Observer::VerifyBalance(tree, depth), "");
-
-    END_TEST;
+    ASSERT_NO_FAILURES(Observer::VerifyBalance(tree, depth));
   }
 };
 
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_INTRUSIVE_WAVL_TREE_CHECKER_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/objects.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/objects.h
index 8bee00c..c2306bd 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/objects.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/objects.h
@@ -2,17 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_OBJECTS_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_OBJECTS_H_
+
+#include <atomic>
+#include <memory>
+#include <utility>
 
 #include <fbl/alloc_checker.h>
 #include <fbl/ref_counted.h>
 #include <fbl/ref_ptr.h>
 #include <fbl/unique_ptr.h>
-#include <unittest/unittest.h>
-
-#include <atomic>
-#include <memory>
-#include <utility>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -206,7 +207,7 @@
     ptr = nullptr;
   }
 
-  static bool CheckCustomDeleteInvocations(size_t expected) { return true; }
+  static void CheckCustomDeleteInvocations(size_t expected) {}
   static void ResetCustomDeleter() {}
 
   // Unmanaged pointers never get cleared when being moved or transferred.
@@ -230,7 +231,7 @@
 
   static void ReleaseObject(PtrType& ptr) { ptr = nullptr; }
 
-  static bool CheckCustomDeleteInvocations(size_t expected) { return true; }
+  static void CheckCustomDeleteInvocations(size_t expected) {}
   static void ResetCustomDeleter() {}
 
   // Unique pointers always get cleared when being moved or transferred.
@@ -254,7 +255,7 @@
 
   static void ReleaseObject(PtrType& ptr) { ptr = nullptr; }
 
-  static bool CheckCustomDeleteInvocations(size_t expected) { return true; }
+  static void CheckCustomDeleteInvocations(size_t expected) {}
   static void ResetCustomDeleter() {}
 
   // Unique pointers always get cleared when being moved or transferred.
@@ -278,10 +279,8 @@
 
   static void ReleaseObject(PtrType& ptr) { ptr = nullptr; }
 
-  static bool CheckCustomDeleteInvocations(size_t expected) {
-    BEGIN_HELPER;
+  static void CheckCustomDeleteInvocations(size_t expected) {
     EXPECT_EQ(expected, TestCustomDeleter<_ObjType>::delete_count());
-    END_HELPER;
   }
 
   static void ResetCustomDeleter() { TestCustomDeleter<_ObjType>::reset_delete_count(); }
@@ -307,7 +306,7 @@
 
   static void ReleaseObject(PtrType& ptr) { ptr = nullptr; }
 
-  static bool CheckCustomDeleteInvocations(size_t expected) { return true; }
+  static void CheckCustomDeleteInvocations(size_t expected) {}
   static void ResetCustomDeleter() {}
 
   // RefCounted pointers do not get cleared when being transferred, but do get
@@ -320,3 +319,5 @@
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_OBJECTS_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/ordered_associative_container_test_environment.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/ordered_associative_container_test_environment.h
index 240ec36..fcedb35c 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/ordered_associative_container_test_environment.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/ordered_associative_container_test_environment.h
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_ORDERED_ASSOCIATIVE_CONTAINER_TEST_ENVIRONMENT_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_ORDERED_ASSOCIATIVE_CONTAINER_TEST_ENVIRONMENT_H_
 
-#include <unittest/unittest.h>
 #include <fbl/algorithm.h>
 #include <fbl/tests/intrusive_containers/associative_container_test_environment.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -62,99 +63,83 @@
     }
   };
 
-  bool DoOrderedIter(PopulateMethod populate_method) {
-    BEGIN_TEST;
-
-    ASSERT_TRUE(ACTE::Populate(container(), populate_method), "");
+  void DoOrderedIter(PopulateMethod populate_method) {
+    ASSERT_NO_FAILURES(ACTE::Populate(container(), populate_method));
 
     auto iter = container().begin();
-    EXPECT_TRUE(iter.IsValid(), "");
+    EXPECT_TRUE(iter.IsValid());
 
     for (auto prev = iter++; iter.IsValid(); prev = iter++) {
       // None of the associative containers currently support storing
       // mutliple nodes with the same key, therefor the iteration ordering
       // of the keys should be strictly monotonically increasing.
-      ASSERT_TRUE(prev.IsValid(), "");
+      ASSERT_TRUE(prev.IsValid());
 
       auto iter_key = KeyTraits::GetKey(*iter);
       auto prev_key = KeyTraits::GetKey(*prev);
 
-      EXPECT_TRUE(KeyTraits::LessThan(prev_key, iter_key), "");
-      EXPECT_FALSE(KeyTraits::LessThan(iter_key, prev_key), "");
-      EXPECT_FALSE(KeyTraits::EqualTo(prev_key, iter_key), "");
-      EXPECT_FALSE(KeyTraits::EqualTo(iter_key, prev_key), "");
+      EXPECT_TRUE(KeyTraits::LessThan(prev_key, iter_key));
+      EXPECT_FALSE(KeyTraits::LessThan(iter_key, prev_key));
+      EXPECT_FALSE(KeyTraits::EqualTo(prev_key, iter_key));
+      EXPECT_FALSE(KeyTraits::EqualTo(iter_key, prev_key));
     }
 
-    ASSERT_TRUE(TestEnvironment<TestEnvTraits>::Reset(), "");
-    END_TEST;
+    ASSERT_NO_FAILURES(TestEnvironment<TestEnvTraits>::Reset());
   }
 
-  bool OrderedIter() {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(DoOrderedIter(PopulateMethod::AscendingKey), "");
-    EXPECT_TRUE(DoOrderedIter(PopulateMethod::DescendingKey), "");
-    EXPECT_TRUE(DoOrderedIter(PopulateMethod::RandomKey), "");
-
-    END_TEST;
+  void OrderedIter() {
+    ASSERT_NO_FATAL_FAILURES(DoOrderedIter(PopulateMethod::AscendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoOrderedIter(PopulateMethod::DescendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoOrderedIter(PopulateMethod::RandomKey));
   }
 
-  bool DoOrderedReverseIter(PopulateMethod populate_method) {
-    BEGIN_TEST;
-
-    ASSERT_TRUE(ACTE::Populate(container(), populate_method), "");
+  void DoOrderedReverseIter(PopulateMethod populate_method) {
+    ASSERT_NO_FAILURES(ACTE::Populate(container(), populate_method));
 
     auto iter = container().end();
-    EXPECT_FALSE(iter.IsValid(), "");
+    EXPECT_FALSE(iter.IsValid());
     --iter;
-    EXPECT_TRUE(iter.IsValid(), "");
+    EXPECT_TRUE(iter.IsValid());
 
     for (auto prev = iter--; iter.IsValid(); prev = iter--) {
       // None of the associative containers currently support storing
       // mutliple nodes with the same key, therefor the reverse iteration
       // ordering of the keys should be strictly monotonically decreasing.
-      ASSERT_TRUE(prev.IsValid(), "");
+      ASSERT_TRUE(prev.IsValid());
 
       auto iter_key = KeyTraits::GetKey(*iter);
       auto prev_key = KeyTraits::GetKey(*prev);
 
-      EXPECT_TRUE(KeyTraits::LessThan(iter_key, prev_key), "");
-      EXPECT_FALSE(KeyTraits::LessThan(prev_key, iter_key), "");
-      EXPECT_FALSE(KeyTraits::EqualTo(prev_key, iter_key), "");
-      EXPECT_FALSE(KeyTraits::EqualTo(iter_key, prev_key), "");
+      EXPECT_TRUE(KeyTraits::LessThan(iter_key, prev_key));
+      EXPECT_FALSE(KeyTraits::LessThan(prev_key, iter_key));
+      EXPECT_FALSE(KeyTraits::EqualTo(prev_key, iter_key));
+      EXPECT_FALSE(KeyTraits::EqualTo(iter_key, prev_key));
     }
 
-    ASSERT_TRUE(TestEnvironment<TestEnvTraits>::Reset(), "");
-    END_TEST;
+    ASSERT_NO_FAILURES(TestEnvironment<TestEnvTraits>::Reset());
   }
 
-  bool OrderedReverseIter() {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(DoOrderedReverseIter(PopulateMethod::AscendingKey), "");
-    EXPECT_TRUE(DoOrderedReverseIter(PopulateMethod::DescendingKey), "");
-    EXPECT_TRUE(DoOrderedReverseIter(PopulateMethod::RandomKey), "");
-
-    END_TEST;
+  void OrderedReverseIter() {
+    ASSERT_NO_FATAL_FAILURES(DoOrderedReverseIter(PopulateMethod::AscendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoOrderedReverseIter(PopulateMethod::DescendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoOrderedReverseIter(PopulateMethod::RandomKey));
   }
 
   template <typename BoundTraits>
-  bool DoBoundTest(PopulateMethod populate_method) {
-    BEGIN_TEST;
-
+  void DoBoundTest(PopulateMethod populate_method) {
     // Searching for a value while the tree is empty should always fail.
     auto found = BoundTraits::Search(container(), 0u);
-    EXPECT_FALSE(found.IsValid(), "");
+    EXPECT_FALSE(found.IsValid());
 
     // Populate the container.
-    ASSERT_TRUE(ACTE::Populate(container(), populate_method), "");
+    ASSERT_NO_FAILURES(ACTE::Populate(container(), populate_method));
 
     // For every object we just put into the container compute the bound of
     // obj.key, (obj.key - 1) and (obj.key + 1) using brute force as well as
     // by using (upper|lower)_bound.  Make sure that the result agree.
     for (size_t i = 0; i < ACTE::OBJ_COUNT; ++i) {
       auto ptr = ACTE::objects()[i];
-      ASSERT_NONNULL(ptr, "");
+      ASSERT_NOT_NULL(ptr);
 
       struct {
         KeyType key;
@@ -170,7 +155,7 @@
       // bound this/prev/next.
       for (size_t j = 0; j < ACTE::OBJ_COUNT; ++j) {
         auto tmp = ACTE::objects()[j];
-        ASSERT_NONNULL(tmp, "");
+        ASSERT_NOT_NULL(tmp);
         KeyType tmp_key = KeyTraits::GetKey(*tmp);
 
         for (size_t k = 0; k < fbl::count_of(tests); ++k) {
@@ -192,48 +177,39 @@
         // force.  If we did find a bound, it should be the same bound
         // we found using brute force.
         if (test.bound != nullptr) {
-          ASSERT_TRUE(iter.IsValid(), "");
-          EXPECT_EQ(test.bound, iter->raw_ptr(), "");
+          ASSERT_TRUE(iter.IsValid());
+          EXPECT_EQ(test.bound, iter->raw_ptr());
         } else {
-          EXPECT_FALSE(iter.IsValid(), "");
+          EXPECT_FALSE(iter.IsValid());
         }
       }
     }
 
-    ASSERT_TRUE(TestEnvironment<TestEnvTraits>::Reset(), "");
-    END_TEST;
+    ASSERT_NO_FAILURES(TestEnvironment<TestEnvTraits>::Reset());
   }
 
-  bool UpperBound() {
-    BEGIN_TEST;
-
+  void UpperBound() {
     using NonConstBoundTraits = UpperBoundTraits<NonConstTraits>;
-    EXPECT_TRUE(DoBoundTest<NonConstBoundTraits>(PopulateMethod::AscendingKey), "");
-    EXPECT_TRUE(DoBoundTest<NonConstBoundTraits>(PopulateMethod::DescendingKey), "");
-    EXPECT_TRUE(DoBoundTest<NonConstBoundTraits>(PopulateMethod::RandomKey), "");
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<NonConstBoundTraits>(PopulateMethod::AscendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<NonConstBoundTraits>(PopulateMethod::DescendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<NonConstBoundTraits>(PopulateMethod::RandomKey));
 
     using ConstBoundTraits = UpperBoundTraits<ConstTraits>;
-    EXPECT_TRUE(DoBoundTest<ConstBoundTraits>(PopulateMethod::AscendingKey), "");
-    EXPECT_TRUE(DoBoundTest<ConstBoundTraits>(PopulateMethod::DescendingKey), "");
-    EXPECT_TRUE(DoBoundTest<ConstBoundTraits>(PopulateMethod::RandomKey), "");
-
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<ConstBoundTraits>(PopulateMethod::AscendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<ConstBoundTraits>(PopulateMethod::DescendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<ConstBoundTraits>(PopulateMethod::RandomKey));
   }
 
-  bool LowerBound() {
-    BEGIN_TEST;
-
+  void LowerBound() {
     using NonConstBoundTraits = LowerBoundTraits<NonConstTraits>;
-    EXPECT_TRUE(DoBoundTest<NonConstBoundTraits>(PopulateMethod::AscendingKey), "");
-    EXPECT_TRUE(DoBoundTest<NonConstBoundTraits>(PopulateMethod::DescendingKey), "");
-    EXPECT_TRUE(DoBoundTest<NonConstBoundTraits>(PopulateMethod::RandomKey), "");
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<NonConstBoundTraits>(PopulateMethod::AscendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<NonConstBoundTraits>(PopulateMethod::DescendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<NonConstBoundTraits>(PopulateMethod::RandomKey));
 
     using ConstBoundTraits = LowerBoundTraits<ConstTraits>;
-    EXPECT_TRUE(DoBoundTest<ConstBoundTraits>(PopulateMethod::AscendingKey), "");
-    EXPECT_TRUE(DoBoundTest<ConstBoundTraits>(PopulateMethod::DescendingKey), "");
-    EXPECT_TRUE(DoBoundTest<ConstBoundTraits>(PopulateMethod::RandomKey), "");
-
-    END_TEST;
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<ConstBoundTraits>(PopulateMethod::AscendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<ConstBoundTraits>(PopulateMethod::DescendingKey));
+    ASSERT_NO_FATAL_FAILURES(DoBoundTest<ConstBoundTraits>(PopulateMethod::RandomKey));
   }
 
  private:
@@ -244,3 +220,5 @@
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_ORDERED_ASSOCIATIVE_CONTAINER_TEST_ENVIRONMENT_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/sequence_container_test_environment.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/sequence_container_test_environment.h
index c7ade58..e515199 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/sequence_container_test_environment.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/sequence_container_test_environment.h
@@ -2,14 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
-
-#include <unittest/unittest.h>
-#include <fbl/algorithm.h>
-#include <fbl/tests/intrusive_containers/base_test_environments.h>
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_SEQUENCE_CONTAINER_TEST_ENVIRONMENT_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_SEQUENCE_CONTAINER_TEST_ENVIRONMENT_H_
 
 #include <utility>
 
+#include <fbl/algorithm.h>
+#include <fbl/tests/intrusive_containers/base_test_environments.h>
+#include <zxtest/zxtest.h>
+
 namespace fbl {
 namespace tests {
 namespace intrusive_containers {
@@ -39,14 +40,12 @@
     return SizeUtils<CType>::size(container);
   }
 
-  bool Populate(ContainerType& container, RefAction ref_action = RefAction::HoldSome) override {
-    BEGIN_TEST;
-
-    EXPECT_EQ(0U, ObjType::live_obj_count(), "");
+  void Populate(ContainerType& container, RefAction ref_action = RefAction::HoldSome) override {
+    EXPECT_EQ(0U, ObjType::live_obj_count());
 
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
       size_t ndx = OBJ_COUNT - i - 1;
-      EXPECT_EQ(i, Size(container), "");
+      EXPECT_EQ(i, Size(container));
 
       // Unless explicitly told to do so, don't hold a reference in the
       // test environment for every 4th object created.  Note, this only
@@ -69,8 +68,8 @@
       }
 
       PtrType new_object = this->CreateTrackedObject(ndx, ndx, hold_ref);
-      ASSERT_NONNULL(new_object, "");
-      EXPECT_EQ(new_object->raw_ptr(), objects()[ndx], "");
+      ASSERT_NOT_NULL(new_object);
+      EXPECT_EQ(new_object->raw_ptr(), objects()[ndx]);
 
       // Alternate whether or not we move the pointer, or "transfer" it.
       // Transferring means different things for different pointer types.
@@ -84,38 +83,32 @@
 #else
         container.push_front(TestEnvTraits::Transfer(new_object));
 #endif
-        EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object), "");
+        EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object));
       } else {
         container.push_front(std::move(new_object));
-        EXPECT_TRUE(TestEnvTraits::WasMoved(new_object), "");
+        EXPECT_TRUE(TestEnvTraits::WasMoved(new_object));
       }
     }
 
-    EXPECT_EQ(OBJ_COUNT, Size(container), "");
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container), "");
-
-    END_TEST;
+    EXPECT_EQ(OBJ_COUNT, Size(container));
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container));
   }
 
-  bool PushFront() {
-    BEGIN_TEST;
-    EXPECT_TRUE(Populate(container()), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-    END_TEST;
+  void PushFront() {
+    ASSERT_NO_FAILURES(Populate(container()));
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool PushBack() {
-    BEGIN_TEST;
-
-    EXPECT_EQ(0U, ObjType::live_obj_count(), "");
+  void PushBack() {
+    EXPECT_EQ(0U, ObjType::live_obj_count());
 
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(i, Size(container()), "");
+      EXPECT_EQ(i, Size(container()));
 
       PtrType new_object = this->CreateTrackedObject(i, i);
-      ASSERT_NONNULL(new_object, "");
-      EXPECT_EQ(new_object->raw_ptr(), objects()[i], "");
+      ASSERT_NOT_NULL(new_object);
+      EXPECT_EQ(new_object->raw_ptr(), objects()[i]);
 
       // Alternate whether or not we move the pointer, or "transfer" it.
       if (i & 1) {
@@ -124,87 +117,79 @@
 #else
         container().push_back(TestEnvTraits::Transfer(new_object));
 #endif
-        EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object), "");
+        EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object));
       } else {
         container().push_back(std::move(new_object));
-        EXPECT_TRUE(TestEnvTraits::WasMoved(new_object), "");
+        EXPECT_TRUE(TestEnvTraits::WasMoved(new_object));
       }
     }
 
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
     size_t i = 0;
     for (const auto& obj : container()) {
-      ASSERT_LT(i, OBJ_COUNT, "");
-      EXPECT_EQ(objects()[i]->value(), obj.value(), "");
-      EXPECT_EQ(objects()[i], obj.raw_ptr(), "");
+      ASSERT_LT(i, OBJ_COUNT);
+      EXPECT_EQ(objects()[i]->value(), obj.value());
+      EXPECT_EQ(objects()[i], obj.raw_ptr());
       i++;
     }
 
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool PopFront() {
-    BEGIN_TEST;
-
-    ASSERT_TRUE(Populate(container()), "");
+  void PopFront() {
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Remove elements using pop_front.  List should shrink each time we
     // remove an element, but the number of live objects should only shrink
     // when we let the last reference go out of scope.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
       size_t remaining = OBJ_COUNT - i;
-      ASSERT_TRUE(!container().is_empty(), "");
-      EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
-      EXPECT_EQ(remaining, Size(container()), "");
+      ASSERT_TRUE(!container().is_empty());
+      EXPECT_EQ(remaining, ObjType::live_obj_count());
+      EXPECT_EQ(remaining, Size(container()));
 
       {
         // Pop the item and sanity check it against our tracking.
         PtrType tmp = container().pop_front();
-        EXPECT_NONNULL(tmp, "");
-        EXPECT_EQ(tmp->value(), i, "");
-        EXPECT_EQ(objects()[i], tmp->raw_ptr(), "");
+        EXPECT_NOT_NULL(tmp);
+        EXPECT_EQ(tmp->value(), i);
+        EXPECT_EQ(objects()[i], tmp->raw_ptr());
 
         // Make sure that the intrusive bookkeeping is up-to-date.
         auto& ns = ContainerType::NodeTraits::node_state(*tmp);
-        EXPECT_NULL(ns.next_, "");
+        EXPECT_NULL(ns.next_);
 
         // The container has shrunk, but the object should still be around.
-        EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
-        EXPECT_EQ(remaining - 1, Size(container()), "");
+        EXPECT_EQ(remaining, ObjType::live_obj_count());
+        EXPECT_EQ(remaining - 1, Size(container()));
       }
 
       // If we were not holding onto the object using the test
       // environment's tracking, the live object count should have
       // dropped.  Otherwise, it should remain the same.
       if (!HoldingObject(i))
-        EXPECT_EQ(remaining - 1, ObjType::live_obj_count(), "");
+        EXPECT_EQ(remaining - 1, ObjType::live_obj_count());
       else
-        EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
+        EXPECT_EQ(remaining, ObjType::live_obj_count());
 
       // Let go of the object and verify that it has now gone away.
       ReleaseObject(i);
-      EXPECT_EQ(remaining - 1, ObjType::live_obj_count(), "");
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(i + 1));
+      EXPECT_EQ(remaining - 1, ObjType::live_obj_count());
+      TestEnvTraits::CheckCustomDeleteInvocations(i + 1);
     }
 
     // List should be empty now.  Popping anything else should result in a
     // null pointer.
-    EXPECT_TRUE(container().is_empty(), "");
+    EXPECT_TRUE(container().is_empty());
     PtrType should_be_null = container().pop_front();
-    EXPECT_NULL(should_be_null, "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
-
-    END_TEST;
+    EXPECT_NULL(should_be_null);
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
   }
 
-  bool PopBack() {
-    BEGIN_TEST;
-
-    ASSERT_TRUE(Populate(container()), "");
+  void PopBack() {
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Remove elements using pop_back.  List should shrink each time we
     // remove an element, but the number of live objects should only shrink
@@ -212,129 +197,122 @@
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
       size_t remaining = OBJ_COUNT - i;
       size_t obj_ndx = OBJ_COUNT - i - 1;
-      ASSERT_TRUE(!container().is_empty(), "");
-      EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
-      EXPECT_EQ(remaining, Size(container()), "");
+      ASSERT_TRUE(!container().is_empty());
+      EXPECT_EQ(remaining, ObjType::live_obj_count());
+      EXPECT_EQ(remaining, Size(container()));
 
       {
         // Pop the item and sanity check it against our tracking.
         PtrType tmp = container().pop_back();
-        EXPECT_NONNULL(tmp, "");
-        EXPECT_EQ(tmp->value(), obj_ndx, "");
-        EXPECT_EQ(objects()[obj_ndx], tmp->raw_ptr(), "");
+        EXPECT_NOT_NULL(tmp);
+        EXPECT_EQ(tmp->value(), obj_ndx);
+        EXPECT_EQ(objects()[obj_ndx], tmp->raw_ptr());
 
         // Make sure that the intrusive bookkeeping is up-to-date.
         auto& ns = ContainerType::NodeTraits::node_state(*tmp);
-        EXPECT_NULL(ns.next_, "");
+        EXPECT_NULL(ns.next_);
 
         // The container has shrunk, but the object should still be around.
-        EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
-        EXPECT_EQ(remaining - 1, Size(container()), "");
+        EXPECT_EQ(remaining, ObjType::live_obj_count());
+        EXPECT_EQ(remaining - 1, Size(container()));
       }
 
       // If we were not holding onto the object using the test
       // environment's tracking, the live object count should have
       // dropped.  Otherwise, it should remain the same.
-      if (!HoldingObject(obj_ndx))
-        EXPECT_EQ(remaining - 1, ObjType::live_obj_count(), "");
-      else
-        EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
+      if (!HoldingObject(obj_ndx)) {
+        EXPECT_EQ(remaining - 1, ObjType::live_obj_count());
+      } else {
+        EXPECT_EQ(remaining, ObjType::live_obj_count());
+      }
 
       // Let go of the object and verify that it has now gone away.
       ReleaseObject(obj_ndx);
-      EXPECT_EQ(remaining - 1, ObjType::live_obj_count(), "");
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(i + 1));
+      EXPECT_EQ(remaining - 1, ObjType::live_obj_count());
+      TestEnvTraits::CheckCustomDeleteInvocations(i + 1);
     }
 
     // List should be empty now.  Popping anything else should result in a
     // null pointer.
-    EXPECT_TRUE(container().is_empty(), "");
+    EXPECT_TRUE(container().is_empty());
     PtrType should_be_null = container().pop_back();
-    EXPECT_NULL(should_be_null, "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
-
-    END_TEST;
+    EXPECT_NULL(should_be_null);
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
   }
 
-  bool EraseNext() {
-    BEGIN_TEST;
-
-    ASSERT_TRUE(Populate(container()), "");
+  void EraseNext() {
+    ASSERT_NO_FAILURES(Populate(container()));
 
     // Remove as many elements as we can using erase_next.
     auto iter = container().begin();
     for (size_t i = 1; i < OBJ_COUNT; ++i) {
       size_t remaining = OBJ_COUNT - i + 1;
-      ASSERT_TRUE(!container().is_empty(), "");
-      ASSERT_TRUE(iter != container().end(), "");
-      EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
-      EXPECT_EQ(remaining, Size(container()), "");
+      ASSERT_TRUE(!container().is_empty());
+      ASSERT_TRUE(iter != container().end());
+      EXPECT_EQ(remaining, ObjType::live_obj_count());
+      EXPECT_EQ(remaining, Size(container()));
 
       {
         // Erase the item and sanity check it against our tracking.
         PtrType tmp = container().erase_next(iter);
-        EXPECT_NONNULL(tmp, "");
-        EXPECT_EQ(tmp->value(), i, "");
-        EXPECT_EQ(objects()[i], tmp->raw_ptr(), "");
+        EXPECT_NOT_NULL(tmp);
+        EXPECT_EQ(tmp->value(), i);
+        EXPECT_EQ(objects()[i], tmp->raw_ptr());
 
         // Make sure that the intrusive bookkeeping is up-to-date.
         auto& ns = ContainerType::NodeTraits::node_state(*tmp);
-        EXPECT_TRUE(ns.IsValid(), "");
-        EXPECT_FALSE(ns.InContainer(), "");
+        EXPECT_TRUE(ns.IsValid());
+        EXPECT_FALSE(ns.InContainer());
 
         // The container has shrunk, but the object should still be around.
-        EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
-        EXPECT_EQ(remaining - 1, Size(container()), "");
+        EXPECT_EQ(remaining, ObjType::live_obj_count());
+        EXPECT_EQ(remaining - 1, Size(container()));
       }
 
       // If we were not holding onto the object using the test
       // environment's tracking, the live object count should have
       // dropped.  Otherwise, it should remain the same.
       if (!HoldingObject(i))
-        EXPECT_EQ(remaining - 1, ObjType::live_obj_count(), "");
+        EXPECT_EQ(remaining - 1, ObjType::live_obj_count());
       else
-        EXPECT_EQ(remaining, ObjType::live_obj_count(), "");
+        EXPECT_EQ(remaining, ObjType::live_obj_count());
 
       // Let go of the object and verify that it has now gone away.
       ReleaseObject(i);
-      EXPECT_EQ(remaining - 1, ObjType::live_obj_count(), "");
-      EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(i));
+      EXPECT_EQ(remaining - 1, ObjType::live_obj_count());
+      TestEnvTraits::CheckCustomDeleteInvocations(i);
     }
 
     // Iterator should now be one away from the end, and there should be one
     // object left
-    EXPECT_EQ(1u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(1u, Size(container()), "");
-    EXPECT_TRUE(iter != container().end(), "");
+    EXPECT_EQ(1u, ObjType::live_obj_count());
+    EXPECT_EQ(1u, Size(container()));
+    EXPECT_TRUE(iter != container().end());
     iter++;
-    EXPECT_TRUE(iter == container().end(), "");
+    EXPECT_TRUE(iter == container().end());
 
     // Attempt to erase the element after the final element.  This should
     // fail, and indicate that it has failed by returning null.
     iter = container().begin();
     PtrType tmp = container().erase_next(iter);
-    EXPECT_NULL(tmp, "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT - 1));
-
-    END_TEST;
+    EXPECT_NULL(tmp);
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT - 1);
   }
 
   template <typename IterType>
-  bool DoInsertAfter(IterType&& iter, size_t pos) {
-    BEGIN_TEST;
-
-    EXPECT_EQ(ObjType::live_obj_count(), Size(container()), "");
-    EXPECT_TRUE(iter != container().end(), "");
+  void DoInsertAfter(IterType&& iter, size_t pos) {
+    EXPECT_EQ(ObjType::live_obj_count(), Size(container()));
+    EXPECT_TRUE(iter != container().end());
 
     size_t orig_container_len = ObjType::live_obj_count();
     size_t orig_iter_pos = iter->value();
 
-    ASSERT_LT(orig_iter_pos, OBJ_COUNT, "");
-    EXPECT_EQ(objects()[orig_iter_pos], iter->raw_ptr(), "");
+    ASSERT_LT(orig_iter_pos, OBJ_COUNT);
+    EXPECT_EQ(objects()[orig_iter_pos], iter->raw_ptr());
 
     PtrType new_object = this->CreateTrackedObject(pos, pos, true);
-    ASSERT_NONNULL(new_object, "");
-    EXPECT_EQ(new_object->raw_ptr(), objects()[pos], "");
+    ASSERT_NOT_NULL(new_object);
+    EXPECT_EQ(new_object->raw_ptr(), objects()[pos]);
 
     if (pos & 1) {
 #if TEST_WILL_NOT_COMPILE || 0
@@ -342,35 +320,31 @@
 #else
       container().insert_after(iter, TestEnvTraits::Transfer(new_object));
 #endif
-      EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object), "");
+      EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object));
     } else {
       container().insert_after(iter, std::move(new_object));
-      EXPECT_TRUE(TestEnvTraits::WasMoved(new_object), "");
+      EXPECT_TRUE(TestEnvTraits::WasMoved(new_object));
     }
 
     // List and number of live object should have grown.
-    EXPECT_EQ(orig_container_len + 1, ObjType::live_obj_count(), "");
-    EXPECT_EQ(orig_container_len + 1, Size(container()), "");
+    EXPECT_EQ(orig_container_len + 1, ObjType::live_obj_count());
+    EXPECT_EQ(orig_container_len + 1, Size(container()));
 
     // The iterator should not have moved yet.
-    EXPECT_TRUE(iter != container().end(), "");
-    EXPECT_EQ(objects()[orig_iter_pos], iter->raw_ptr(), "");
-    EXPECT_EQ(orig_iter_pos, iter->value(), "");
+    EXPECT_TRUE(iter != container().end());
+    EXPECT_EQ(objects()[orig_iter_pos], iter->raw_ptr());
+    EXPECT_EQ(orig_iter_pos, iter->value());
 
     // This test should delete no objects
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool InsertAfter() {
-    BEGIN_TEST;
-
+  void InsertAfter() {
     // In order to insert_after, we need at least one object already in the
     // container.  Use push_front to make one.
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0U, Size(container()), "");
-    EXPECT_TRUE(container().is_empty(), "");
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0U, Size(container()));
+    EXPECT_TRUE(container().is_empty());
     container().push_front(std::move(this->CreateTrackedObject(0, 0, true)));
 
     // Insert some elements after the last element container.
@@ -379,23 +353,23 @@
 
     auto iter = container().begin();
     for (size_t i = (OBJ_COUNT - END_INSERT_COUNT); i < OBJ_COUNT; ++i) {
-      ASSERT_TRUE(DoInsertAfter(iter, i), "");
+      ASSERT_NO_FAILURES(DoInsertAfter(iter, i));
 
       // Now that we have inserted after, we should be able to advance the
       // iterator to what we just inserted.
       iter++;
 
-      ASSERT_TRUE(iter != container().end(), "");
-      EXPECT_EQ(objects()[i], iter->raw_ptr(), "");
-      EXPECT_EQ(objects()[i], (*iter).raw_ptr(), "");
-      EXPECT_EQ(i, iter->value(), "");
-      EXPECT_EQ(i, (*iter).value(), "");
+      ASSERT_TRUE(iter != container().end());
+      EXPECT_EQ(objects()[i], iter->raw_ptr());
+      EXPECT_EQ(objects()[i], (*iter).raw_ptr());
+      EXPECT_EQ(i, iter->value());
+      EXPECT_EQ(i, (*iter).value());
     }
 
     // Advancing iter at this point should bring it to the end.
-    EXPECT_TRUE(iter != container().end(), "");
+    EXPECT_TRUE(iter != container().end());
     iter++;
-    EXPECT_TRUE(iter == container().end(), "");
+    EXPECT_TRUE(iter == container().end());
 
     // Reset the iterator to the first element in the container, and test
     // inserting between elements instead of at the end.  To keep the
@@ -403,39 +377,35 @@
     // advance the iterator in the process.
     iter = container().begin();
     for (size_t i = (OBJ_COUNT - END_INSERT_COUNT - 1); i > 0; --i) {
-      ASSERT_TRUE(DoInsertAfter(iter, i), "");
+      ASSERT_NO_FAILURES(DoInsertAfter(iter, i));
     }
-    EXPECT_TRUE(iter != container().end(), "");
+    EXPECT_TRUE(iter != container().end());
 
     // Check to make sure the container has the expected number of elements, and
     // that they are in the proper order.
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
 
     size_t i = 0;
     for (const auto& obj : container()) {
-      EXPECT_EQ(objects()[i], &obj, "");
-      EXPECT_EQ(objects()[i], obj.raw_ptr(), "");
-      EXPECT_EQ(i, obj.value(), "");
+      EXPECT_EQ(objects()[i], &obj);
+      EXPECT_EQ(objects()[i], obj.raw_ptr());
+      EXPECT_EQ(i, obj.value());
       i++;
     }
 
     // This test should delete no objects
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
   template <typename TargetType>
-  bool DoInsert(TargetType&& target, size_t pos) {
-    BEGIN_TEST;
-
-    EXPECT_EQ(ObjType::live_obj_count(), Size(container()), "");
+  void DoInsert(TargetType&& target, size_t pos) {
+    EXPECT_EQ(ObjType::live_obj_count(), Size(container()));
     size_t orig_container_len = ObjType::live_obj_count();
 
     PtrType new_object = this->CreateTrackedObject(pos, pos, true);
-    ASSERT_NONNULL(new_object, "");
-    EXPECT_EQ(new_object->raw_ptr(), objects()[pos], "");
+    ASSERT_NOT_NULL(new_object);
+    EXPECT_EQ(new_object->raw_ptr(), objects()[pos]);
 
     if (pos & 1) {
 #if TEST_WILL_NOT_COMPILE || 0
@@ -443,24 +413,20 @@
 #else
       container().insert(target, TestEnvTraits::Transfer(new_object));
 #endif
-      EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object), "");
+      EXPECT_TRUE(TestEnvTraits::WasTransferred(new_object));
     } else {
       container().insert(target, std::move(new_object));
-      EXPECT_TRUE(TestEnvTraits::WasMoved(new_object), "");
+      EXPECT_TRUE(TestEnvTraits::WasMoved(new_object));
     }
 
     // List and number of live object should have grown.
-    EXPECT_EQ(orig_container_len + 1, ObjType::live_obj_count(), "");
-    EXPECT_EQ(orig_container_len + 1, Size(container()), "");
-
-    END_TEST;
+    EXPECT_EQ(orig_container_len + 1, ObjType::live_obj_count());
+    EXPECT_EQ(orig_container_len + 1, Size(container()));
   }
 
-  bool Insert() {
-    BEGIN_TEST;
-
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0U, Size(container()), "");
+  void Insert() {
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0U, Size(container()));
 
     static constexpr size_t END_INSERT_COUNT = 3;
     static constexpr size_t START_INSERT_COUNT = 3;
@@ -473,13 +439,13 @@
     // Insert some elements at the end of an initially empty container using the
     // end() iterator accessor.
     for (size_t i = (OBJ_COUNT - END_INSERT_COUNT); i < OBJ_COUNT; ++i)
-      ASSERT_TRUE(DoInsert(container().end(), i), "");
+      ASSERT_NO_FAILURES(DoInsert(container().end(), i));
 
     // Insert some elements at the start of a non-empty container using the
     // begin() iterator accessor.
     for (size_t i = 0; i < START_INSERT_COUNT; ++i) {
       size_t ndx = START_INSERT_COUNT - i - 1;
-      ASSERT_TRUE(DoInsert(container().begin(), ndx), "");
+      ASSERT_NO_FAILURES(DoInsert(container().begin(), ndx));
     }
 
     // Insert some elements in the middle non-empty container using an iterator
@@ -490,42 +456,38 @@
 
     for (size_t i = 0; i < MID_INSERT_COUNT; ++i) {
       size_t ndx = START_INSERT_COUNT + i;
-      ASSERT_TRUE(DoInsert(iter, ndx), "");
+      ASSERT_NO_FAILURES(DoInsert(iter, ndx));
     }
 
     // iter should be END_INSERT_COUNT from the end of the
     // container.
     for (size_t i = 0; i < END_INSERT_COUNT; ++i) {
-      EXPECT_TRUE(iter != container().end(), "");
+      EXPECT_TRUE(iter != container().end());
       ++iter;
     }
-    EXPECT_TRUE(++iter == container().end(), "");
+    EXPECT_TRUE(++iter == container().end());
 
     // Check to make sure the container has the expected number of elements, and
     // that they are in the proper order.
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
 
     size_t i = 0;
     for (const auto& obj : container()) {
-      ASSERT_LT(i, OBJ_COUNT, "");
-      EXPECT_EQ(objects()[i], &obj, "");
-      EXPECT_EQ(objects()[i], obj.raw_ptr(), "");
-      EXPECT_EQ(i, obj.value(), "");
+      ASSERT_LT(i, OBJ_COUNT);
+      EXPECT_EQ(objects()[i], &obj);
+      EXPECT_EQ(objects()[i], obj.raw_ptr());
+      EXPECT_EQ(i, obj.value());
       i++;
     }
 
     // This test should delete no objects
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool DirectInsert() {
-    BEGIN_TEST;
-
-    EXPECT_EQ(0u, ObjType::live_obj_count(), "");
-    EXPECT_EQ(0U, Size(container()), "");
+  void DirectInsert() {
+    EXPECT_EQ(0u, ObjType::live_obj_count());
+    EXPECT_EQ(0U, Size(container()));
 
     static constexpr size_t END_INSERT_COUNT = 3;
     static constexpr size_t START_INSERT_COUNT = 3;
@@ -537,16 +499,17 @@
 
     // Insert some elements at the end of an initially empty container using
     // the end() iterator as the target.
-    for (size_t i = (OBJ_COUNT - END_INSERT_COUNT); i < OBJ_COUNT; ++i)
-      ASSERT_TRUE(DoInsert(container().end(), i), "");
+    for (size_t i = (OBJ_COUNT - END_INSERT_COUNT); i < OBJ_COUNT; ++i) {
+      ASSERT_NO_FAILURES(DoInsert(container().end(), i));
+    }
 
     // Insert some elements at the start of a non-empty container node
     // pointers which are always at the start of the container.
     size_t insert_before_ndx = (OBJ_COUNT - END_INSERT_COUNT);
     for (size_t i = 0; i < START_INSERT_COUNT; ++i) {
       size_t ndx = START_INSERT_COUNT - i - 1;
-      ASSERT_NONNULL(objects()[insert_before_ndx], "");
-      ASSERT_TRUE(DoInsert(*objects()[insert_before_ndx], ndx), "");
+      ASSERT_NOT_NULL(objects()[insert_before_ndx]);
+      ASSERT_NO_FAILURES(DoInsert(*objects()[insert_before_ndx], ndx));
       insert_before_ndx = ndx;
     }
 
@@ -554,57 +517,49 @@
     insert_before_ndx = (OBJ_COUNT - END_INSERT_COUNT);
     for (size_t i = 0; i < MID_INSERT_COUNT; ++i) {
       size_t ndx = START_INSERT_COUNT + i;
-      ASSERT_NONNULL(objects()[insert_before_ndx], "");
-      ASSERT_TRUE(DoInsert(*objects()[insert_before_ndx], ndx), "");
+      ASSERT_NOT_NULL(objects()[insert_before_ndx]);
+      ASSERT_NO_FAILURES(DoInsert(*objects()[insert_before_ndx], ndx));
     }
 
     // Check to make sure the container has the expected number of elements,
     // and that they are in the proper order.
-    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
+    EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
 
     size_t i = 0;
     for (const auto& obj : container()) {
-      ASSERT_LT(i, OBJ_COUNT, "");
-      EXPECT_EQ(objects()[i], &obj, "");
-      EXPECT_EQ(objects()[i], obj.raw_ptr(), "");
-      EXPECT_EQ(i, obj.value(), "");
+      ASSERT_LT(i, OBJ_COUNT);
+      EXPECT_EQ(objects()[i], &obj);
+      EXPECT_EQ(objects()[i], obj.raw_ptr());
+      EXPECT_EQ(i, obj.value());
       i++;
     }
 
     // This test should delete no objects
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool FillN(size_t begin, size_t end) {
-    BEGIN_TEST;
-
+  void FillN(size_t begin, size_t end) {
     for (size_t i = begin; i < end; ++i) {
       PtrType new_object = this->CreateTrackedObject(i, i);
-      ASSERT_NONNULL(new_object, "");
+      ASSERT_NOT_NULL(new_object);
       container().push_back(std::move(new_object));
-      EXPECT_TRUE(TestEnvTraits::WasMoved(new_object), "");
+      EXPECT_TRUE(TestEnvTraits::WasMoved(new_object));
     }
-
-    END_TEST;
   }
 
-  bool BidirectionalEquals(const ContainerType& sequence, const size_t* values, size_t size) {
-    BEGIN_TEST;
-
+  void BidirectionalEquals(const ContainerType& sequence, const size_t* values, size_t size) {
     // We use SupportsConstantOrderErase as a way to discriminate a singly-
     // linked list from a doubly-linked list.
     static_assert(ContainerType::IsSequenced && ContainerType::SupportsConstantOrderErase,
                   "BidirectionalEquals must be used with a bi-directional sequence");
 
-    ASSERT_EQ(size, Size(sequence), "");
+    ASSERT_EQ(size, Size(sequence));
 
     // Iterate forwards and verify values.
     const size_t* val_iter = values;
     for (const auto& node : sequence) {
-      EXPECT_EQ(node.value(), *val_iter, "");
+      EXPECT_EQ(node.value(), *val_iter);
       ++val_iter;
     }
 
@@ -612,107 +567,100 @@
     for (auto begin = sequence.begin(), end = sequence.end(); begin != end;) {
       --val_iter;
       --end;
-      EXPECT_EQ(end->value(), *val_iter, "");
+      EXPECT_EQ(end->value(), *val_iter);
     }
 
     // This test should delete no objects
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool Splice() {
-    BEGIN_TEST;
-
+  void Splice() {
     constexpr size_t LIST_COUNT = 2;
     static_assert(LIST_COUNT * 4 < OBJ_COUNT, "OBJ_COUNT too small to run Splice test!");
 
-    EXPECT_EQ(0U, Size(container()), "");
+    EXPECT_EQ(0U, Size(container()));
     ContainerType target;
-    EXPECT_EQ(0U, Size(target), "");
+    EXPECT_EQ(0U, Size(target));
 
     // Splice empty source into end of empty target list.
     target.splice(target.end(), container());
-    EXPECT_EQ(0U, Size(target), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    EXPECT_EQ(0U, Size(target));
+    EXPECT_EQ(0u, Size(container()));
 
     // Populate the source list.
-    ASSERT_TRUE(FillN(0, LIST_COUNT), "");
-    EXPECT_EQ(LIST_COUNT, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(FillN(0, LIST_COUNT));
+    EXPECT_EQ(LIST_COUNT, Size(container()));
 
     // Splice into end of empty target list.
     target.splice(target.end(), container());
     static const size_t expected_1[] = {0, 1};
-    EXPECT_TRUE(BidirectionalEquals(target, expected_1, fbl::count_of(expected_1)), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(BidirectionalEquals(target, expected_1, fbl::count_of(expected_1)));
+    EXPECT_EQ(0u, Size(container()));
 
     // Populate the source list again.
-    ASSERT_TRUE(FillN(LIST_COUNT, LIST_COUNT * 2), "");
-    EXPECT_EQ(LIST_COUNT, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(FillN(LIST_COUNT, LIST_COUNT * 2));
+    EXPECT_EQ(LIST_COUNT, Size(container()));
 
     // Splice into end of non-empty target list.
     target.splice(target.end(), container());
     static const size_t expected_2[] = {0, 1, 2, 3};
-    EXPECT_TRUE(BidirectionalEquals(target, expected_2, fbl::count_of(expected_2)), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(BidirectionalEquals(target, expected_2, fbl::count_of(expected_2)));
+    EXPECT_EQ(0u, Size(container()));
 
     // Populate the source list again.
-    ASSERT_TRUE(FillN(LIST_COUNT * 2, LIST_COUNT * 3), "");
-    EXPECT_EQ(LIST_COUNT, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(FillN(LIST_COUNT * 2, LIST_COUNT * 3));
+    EXPECT_EQ(LIST_COUNT, Size(container()));
 
     // Splice into start of non-empty target list.
     target.splice(target.begin(), container());
     static const size_t expected_3[] = {4, 5, 0, 1, 2, 3};
-    EXPECT_TRUE(BidirectionalEquals(target, expected_3, fbl::count_of(expected_3)), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(BidirectionalEquals(target, expected_3, fbl::count_of(expected_3)));
+    EXPECT_EQ(0u, Size(container()));
 
     // Populate the source list again.
-    ASSERT_TRUE(FillN(LIST_COUNT * 3, LIST_COUNT * 4), "");
-    EXPECT_EQ(LIST_COUNT, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(FillN(LIST_COUNT * 3, LIST_COUNT * 4));
+    EXPECT_EQ(LIST_COUNT, Size(container()));
 
     // Splice into second element of non-empty target list.
     target.splice(++target.begin(), container());
     static const size_t expected_4[] = {4, 6, 7, 5, 0, 1, 2, 3};
-    EXPECT_TRUE(BidirectionalEquals(target, expected_4, fbl::count_of(expected_4)), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(BidirectionalEquals(target, expected_4, fbl::count_of(expected_4)));
+    EXPECT_EQ(0u, Size(container()));
 
     // Splice empty source into end of non-empty target list.
     target.splice(target.end(), container());
-    EXPECT_TRUE(BidirectionalEquals(target, expected_4, fbl::count_of(expected_4)), "");
-    EXPECT_EQ(0u, Size(container()), "");
+    ASSERT_NO_FATAL_FAILURES(BidirectionalEquals(target, expected_4, fbl::count_of(expected_4)));
+    EXPECT_EQ(0u, Size(container()));
 
     // No objects should have been deleted yet.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
 
     // Finally clear the target.
     target.clear();
-    EXPECT_EQ(0u, Size(target), "");
+    EXPECT_EQ(0u, Size(target));
 
     // By now, we should have created LIST_COUNT * 4 objects.  They should all be gone now.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(LIST_COUNT * 4));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(LIST_COUNT * 4);
   }
 
   template <typename IterType>
-  bool DoSeqIterate(const IterType& begin, const IterType& end) {
-    BEGIN_TEST;
+  void DoSeqIterate(const IterType& begin, const IterType& end) {
     IterType iter;
 
     // begin() should point to the front of the sequence.
     iter = begin;
-    ASSERT_TRUE(iter.IsValid(), "");
-    EXPECT_TRUE(container().front() == *iter, "");
+    ASSERT_TRUE(iter.IsValid());
+    EXPECT_TRUE(container().front() == *iter);
 
     // Iterate using begin/end
     size_t i = 0;
     for (iter = begin; iter != end;) {
       // Exercise both -> and * dereferencing
-      ASSERT_TRUE(iter.IsValid(), "");
-      EXPECT_EQ(objects()[i], iter->raw_ptr(), "");
-      EXPECT_EQ(objects()[i], (*iter).raw_ptr(), "");
-      EXPECT_EQ(i, iter->value(), "");
-      EXPECT_EQ(i, (*iter).value(), "");
+      ASSERT_TRUE(iter.IsValid());
+      EXPECT_EQ(objects()[i], iter->raw_ptr());
+      EXPECT_EQ(objects()[i], (*iter).raw_ptr());
+      EXPECT_EQ(i, iter->value());
+      EXPECT_EQ(i, (*iter).value());
 
       // Exercise both pre and postfix increment
       if ((i++) & 1)
@@ -720,258 +668,239 @@
       else
         ++iter;
     }
-    EXPECT_FALSE(iter.IsValid(), "");
-
-    END_TEST;
+    EXPECT_FALSE(iter.IsValid());
   }
 
-  bool SeqIterate() {
-    BEGIN_TEST;
-
+  void SeqIterate() {
     // Start by making some objects.
-    ASSERT_TRUE(Populate(container()), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
 
     // Test iterator
-    EXPECT_TRUE(DoSeqIterate(container().begin(), container().end()), "");
+    ASSERT_NO_FATAL_FAILURES(DoSeqIterate(container().begin(), container().end()));
 
     // Test const_iterator
-    EXPECT_TRUE(DoSeqIterate(container().cbegin(), container().cend()), "");
+    ASSERT_NO_FATAL_FAILURES(DoSeqIterate(container().cbegin(), container().cend()));
 
     // Iterate using the range-based for loop syntax
     size_t i = 0;
     for (auto& obj : container()) {
-      EXPECT_EQ(objects()[i], &obj, "");
-      EXPECT_EQ(objects()[i], obj.raw_ptr(), "");
-      EXPECT_EQ(i, obj.value(), "");
+      EXPECT_EQ(objects()[i], &obj);
+      EXPECT_EQ(objects()[i], obj.raw_ptr());
+      EXPECT_EQ(i, obj.value());
       i++;
     }
 
     // Iterate using the range-based for loop syntax over const references.
     i = 0;
     for (const auto& obj : container()) {
-      EXPECT_EQ(objects()[i], &obj, "");
-      EXPECT_EQ(objects()[i], obj.raw_ptr(), "");
-      EXPECT_EQ(i, obj.value(), "");
+      EXPECT_EQ(objects()[i], &obj);
+      EXPECT_EQ(objects()[i], obj.raw_ptr());
+      EXPECT_EQ(i, obj.value());
       i++;
     }
 
     // This test should delete no objects
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
   template <typename IterType>
-  bool DoSeqReverseIterate(const IterType& begin, const IterType& end) {
-    BEGIN_TEST;
+  void DoSeqReverseIterate(const IterType& begin, const IterType& end) {
     IterType iter;
 
     // Backing up one from end() should give us back().  Check both pre
     // and post-fix behavior.
     iter = end;
     --iter;
-    ASSERT_TRUE(iter.IsValid(), "");
-    ASSERT_TRUE(iter != end, "");
-    EXPECT_TRUE(container().back() == *iter, "");
+    ASSERT_TRUE(iter.IsValid());
+    ASSERT_TRUE(iter != end);
+    EXPECT_TRUE(container().back() == *iter);
 
     iter = end;
     iter--;
-    ASSERT_TRUE(iter.IsValid(), "");
-    ASSERT_TRUE(iter != end, "");
-    EXPECT_TRUE(container().back() == *iter, "");
+    ASSERT_TRUE(iter.IsValid());
+    ASSERT_TRUE(iter != end);
+    EXPECT_TRUE(container().back() == *iter);
 
     // Make sure that backing up an iterator by one points always points
     // to the previous object in the container.
     iter = begin;
     while (++iter != end) {
       size_t prev_ndx = iter->value() - 1;
-      ASSERT_LT(prev_ndx, OBJ_COUNT, "");
-      ASSERT_NONNULL(objects()[prev_ndx], "");
+      ASSERT_LT(prev_ndx, OBJ_COUNT);
+      ASSERT_NOT_NULL(objects()[prev_ndx]);
 
       auto prev_iter = iter;
       --prev_iter;
-      ASSERT_TRUE(prev_iter.IsValid(), "");
-      EXPECT_FALSE(prev_iter == iter, "");
-      EXPECT_TRUE(*prev_iter == *objects()[prev_ndx], "");
+      ASSERT_TRUE(prev_iter.IsValid());
+      EXPECT_FALSE(prev_iter == iter);
+      EXPECT_TRUE(*prev_iter == *objects()[prev_ndx]);
 
       prev_iter = iter;
       prev_iter--;
-      ASSERT_TRUE(prev_iter.IsValid(), "");
-      EXPECT_FALSE(prev_iter == iter, "");
-      EXPECT_TRUE(*prev_iter == *objects()[prev_ndx], "");
+      ASSERT_TRUE(prev_iter.IsValid());
+      EXPECT_FALSE(prev_iter == iter);
+      EXPECT_TRUE(*prev_iter == *objects()[prev_ndx]);
     }
 
     // This test should delete no objects
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool SeqReverseIterate() {
-    BEGIN_TEST;
-
+  void SeqReverseIterate() {
     // Start by making some objects.
-    ASSERT_TRUE(Populate(container()), "");
-    EXPECT_EQ(OBJ_COUNT, Size(container()), "");
+    ASSERT_NO_FAILURES(Populate(container()));
+    EXPECT_EQ(OBJ_COUNT, Size(container()));
 
     // Test iterator
-    EXPECT_TRUE(DoSeqReverseIterate(container().begin(), container().end()), "");
+    ASSERT_NO_FATAL_FAILURES(DoSeqReverseIterate(container().begin(), container().end()));
 
     // Test const_iterator
-    EXPECT_TRUE(DoSeqReverseIterate(container().cbegin(), container().cend()), "");
+    ASSERT_NO_FATAL_FAILURES(DoSeqReverseIterate(container().cbegin(), container().cend()));
 
     // This test should delete no objects
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(0));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations(0);
   }
 
-  bool ReplaceIfCopy() {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+  void ReplaceIfCopy() {
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
     // Try (and fail) to replace an element in an empty container.
     {
       PtrType new_obj = TestEnvTraits::CreateObject(0);
       auto raw_obj = PtrTraits::GetRaw(new_obj);
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
       EXPECT_EQ(0, Size(container()));
-      EXPECT_EQ(1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(1, ObjType::live_obj_count());
 
       PtrType replaced =
           container().replace_if([](const ObjType& obj) -> bool { return true; }, new_obj);
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      ASSERT_NONNULL(new_obj, "");
-      EXPECT_NULL(replaced, "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NOT_NULL(new_obj);
+      EXPECT_NULL(replaced);
       EXPECT_EQ(raw_obj, PtrTraits::GetRaw(new_obj));
       EXPECT_EQ(0, Size(container()));
-      EXPECT_EQ(1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(1, ObjType::live_obj_count());
 
       TestEnvTraits::ReleaseObject(new_obj);
       EXPECT_EQ(0, Size(container()));
-      EXPECT_EQ(0, ObjType::live_obj_count(), "");
+      EXPECT_EQ(0, ObjType::live_obj_count());
     }
 
     // The object which we create in an attempt to replace an object in an
     // empty container should be gone now.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(1));
+    TestEnvTraits::CheckCustomDeleteInvocations(1);
 
     // Populate our container.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(i, ObjType::live_obj_count(), "");
+      EXPECT_EQ(i, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT - i - 1);
-      ASSERT_NONNULL(new_obj, "");
-      EXPECT_EQ(i + 1, ObjType::live_obj_count(), "");
+      ASSERT_NOT_NULL(new_obj);
+      EXPECT_EQ(i + 1, ObjType::live_obj_count());
 
       container().push_front(std::move(new_obj));
     }
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
     // Replace all of the members of the contianer with new members which
     // have a value never created during the populate phase.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT + i);
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
 
       PtrType replaced = container().replace_if(
           [i](const ObjType& obj) -> bool { return (obj.value() == i); }, new_obj);
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      ASSERT_NONNULL(replaced, "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NOT_NULL(replaced);
       EXPECT_TRUE(new_obj->ContainerTraits::ContainableBaseClass::InContainer());
       EXPECT_FALSE(replaced->ContainerTraits::ContainableBaseClass::InContainer());
       EXPECT_EQ(i, replaced->value());
-      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count());
 
       TestEnvTraits::ReleaseObject(replaced);
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
     }
 
     // All of the replaced objects should have gone away now too.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT + 1));
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT + 1);
 
     // Try again, but this time fail each time (since all of the original
     // element values have already been replaced).
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT + (2 * i));
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
 
       PtrType replaced = container().replace_if(
           [i](const ObjType& obj) -> bool { return (obj.value() == i); }, new_obj);
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
-      ASSERT_NULL(replaced, "");
+      ASSERT_NULL(replaced);
       EXPECT_FALSE(new_obj->ContainerTraits::ContainableBaseClass::InContainer());
-      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count());
 
       TestEnvTraits::ReleaseObject(new_obj);
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
     }
 
     // The new objects we created (but failed to replace in the container) should now be gone.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations((2 * OBJ_COUNT) + 1));
+    TestEnvTraits::CheckCustomDeleteInvocations((2 * OBJ_COUNT) + 1);
 
     // Make sure that the object are in order and have the values we expect.
     size_t i = 0;
     while (!container().is_empty()) {
       PtrType ptr = container().pop_front();
-      EXPECT_EQ(OBJ_COUNT + i, ptr->value(), "");
+      EXPECT_EQ(OBJ_COUNT + i, ptr->value());
       TestEnvTraits::ReleaseObject(ptr);
       ++i;
     }
-    EXPECT_EQ(0, ObjType::live_obj_count(), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+    EXPECT_EQ(0, ObjType::live_obj_count());
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
     // Now all of the objects we created during the test should be gone.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations((3 * OBJ_COUNT) + 1));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations((3 * OBJ_COUNT) + 1);
   }
 
-  bool ReplaceIfMove() {
-    BEGIN_TEST;
-
+  void ReplaceIfMove() {
     // Try (and fail) to replace an element in an empty container.
     {
       PtrType new_obj = TestEnvTraits::CreateObject(0);
       auto raw_obj = PtrTraits::GetRaw(new_obj);
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
       EXPECT_EQ(0, Size(container()));
-      EXPECT_EQ(1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(1, ObjType::live_obj_count());
 
       PtrType replaced =
           container().replace_if([](const ObjType& obj) -> bool { return true; }, TakePtr(new_obj));
 
-      EXPECT_NULL(new_obj, "");
-      ASSERT_NONNULL(replaced, "");
+      EXPECT_NULL(new_obj);
+      ASSERT_NOT_NULL(replaced);
       EXPECT_EQ(raw_obj, PtrTraits::GetRaw(replaced));
       EXPECT_EQ(0, Size(container()));
-      EXPECT_EQ(1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(1, ObjType::live_obj_count());
 
       TestEnvTraits::ReleaseObject(replaced);
       EXPECT_EQ(0, Size(container()));
-      EXPECT_EQ(0, ObjType::live_obj_count(), "");
+      EXPECT_EQ(0, ObjType::live_obj_count());
     }
 
     // The object which we create in an attempt to replace an object in an
     // empty container should be gone now.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(1));
+    TestEnvTraits::CheckCustomDeleteInvocations(1);
 
     // Populate our container.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(i, ObjType::live_obj_count(), "");
+      EXPECT_EQ(i, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT - i - 1);
-      ASSERT_NONNULL(new_obj, "");
-      EXPECT_EQ(i + 1, ObjType::live_obj_count(), "");
+      ASSERT_NOT_NULL(new_obj);
+      EXPECT_EQ(i + 1, ObjType::live_obj_count());
 
       container().push_front(std::move(new_obj));
     }
@@ -979,140 +908,132 @@
     // Replace all of the members of the contianer with new members which
     // have a value never created during Populate().
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT + i);
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
 
       PtrType replaced = container().replace_if(
           [i](const ObjType& obj) -> bool { return (obj.value() == i); }, TakePtr(new_obj));
 
-      EXPECT_NULL(new_obj, "");
-      ASSERT_NONNULL(replaced, "");
+      EXPECT_NULL(new_obj);
+      ASSERT_NOT_NULL(replaced);
       EXPECT_FALSE(replaced->ContainerTraits::ContainableBaseClass::InContainer());
       EXPECT_EQ(i, replaced->value());
-      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count());
 
       TestEnvTraits::ReleaseObject(replaced);
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
     }
 
     // All of the replaced objects should have gone away now too.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT + 1));
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT + 1);
 
     // Try again, but this time fail each time (since all of the original
     // element values have already been replaced).
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT + (2 * i));
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
 
       auto orig_raw = PtrTraits::GetRaw(new_obj);
       PtrType replaced = container().replace_if(
           [i](const ObjType& obj) -> bool { return (obj.value() == i); }, TakePtr(new_obj));
 
-      EXPECT_NULL(new_obj, "");
-      ASSERT_NONNULL(replaced, "");
-      EXPECT_EQ(PtrTraits::GetRaw(replaced), orig_raw, "");
+      EXPECT_NULL(new_obj);
+      ASSERT_NOT_NULL(replaced);
+      EXPECT_EQ(PtrTraits::GetRaw(replaced), orig_raw);
       EXPECT_FALSE(replaced->ContainerTraits::ContainableBaseClass::InContainer());
       EXPECT_EQ(OBJ_COUNT + (2 * i), replaced->value());
-      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count());
 
       TestEnvTraits::ReleaseObject(replaced);
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
     }
 
     // The new objects we created (but failed to replace in the container) should now be gone.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations((2 * OBJ_COUNT) + 1));
+    TestEnvTraits::CheckCustomDeleteInvocations((2 * OBJ_COUNT) + 1);
 
     // Make sure that the object are in order and have the values we expect.
     size_t i = 0;
     while (!container().is_empty()) {
       PtrType ptr = container().pop_front();
-      EXPECT_EQ(OBJ_COUNT + i, ptr->value(), "");
+      EXPECT_EQ(OBJ_COUNT + i, ptr->value());
       TestEnvTraits::ReleaseObject(ptr);
       ++i;
     }
-    EXPECT_EQ(0, ObjType::live_obj_count(), "");
+    EXPECT_EQ(0, ObjType::live_obj_count());
 
     // Now all of the objects we created during the test should be gone.
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations((3 * OBJ_COUNT) + 1));
-
-    END_TEST;
+    TestEnvTraits::CheckCustomDeleteInvocations((3 * OBJ_COUNT) + 1);
   }
 
-  bool ReplaceCopy() {
-    BEGIN_TEST;
-
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+  void ReplaceCopy() {
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
     // Populate our container.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(i, ObjType::live_obj_count(), "");
+      EXPECT_EQ(i, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT - i - 1);
-      ASSERT_NONNULL(new_obj, "");
-      EXPECT_EQ(i + 1, ObjType::live_obj_count(), "");
+      ASSERT_NOT_NULL(new_obj);
+      EXPECT_EQ(i + 1, ObjType::live_obj_count());
 
       container().push_front(std::move(new_obj));
     }
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
 
     // Replace all of the members of the contianer with new members which
     // have a value never created during the populate phase.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT + i);
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
 
       auto iter =
           container().find_if([i](const ObjType& obj) -> bool { return (obj.value() == i); });
 
-      ASSERT_TRUE(iter.IsValid(), "");
-      EXPECT_EQ(i, iter->value(), "");
+      ASSERT_TRUE(iter.IsValid());
+      EXPECT_EQ(i, iter->value());
 
       PtrType replaced = container().replace(*iter, new_obj);
 
-      EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-      ASSERT_NONNULL(replaced, "");
+      ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+      ASSERT_NOT_NULL(replaced);
       EXPECT_TRUE(new_obj->ContainerTraits::ContainableBaseClass::InContainer());
       EXPECT_FALSE(replaced->ContainerTraits::ContainableBaseClass::InContainer());
       EXPECT_EQ(i, replaced->value());
-      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count());
 
       TestEnvTraits::ReleaseObject(replaced);
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
     }
 
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
 
     // Make sure that the object are in order and have the values we expect.
     size_t i = 0;
     while (!container().is_empty()) {
       PtrType ptr = container().pop_front();
-      EXPECT_EQ(OBJ_COUNT + i, ptr->value(), "");
+      EXPECT_EQ(OBJ_COUNT + i, ptr->value());
       TestEnvTraits::ReleaseObject(ptr);
       ++i;
     }
-    EXPECT_EQ(0, ObjType::live_obj_count(), "");
-    EXPECT_TRUE(ContainerChecker::SanityCheck(container()), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(2 * OBJ_COUNT));
-
-    END_TEST;
+    EXPECT_EQ(0, ObjType::live_obj_count());
+    ASSERT_NO_FATAL_FAILURES(ContainerChecker::SanityCheck(container()));
+    TestEnvTraits::CheckCustomDeleteInvocations(2 * OBJ_COUNT);
   }
 
-  bool ReplaceMove() {
-    BEGIN_TEST;
-
+  void ReplaceMove() {
     // Populate our container.
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(i, ObjType::live_obj_count(), "");
+      EXPECT_EQ(i, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT - i - 1);
-      ASSERT_NONNULL(new_obj, "");
-      EXPECT_EQ(i + 1, ObjType::live_obj_count(), "");
+      ASSERT_NOT_NULL(new_obj);
+      EXPECT_EQ(i + 1, ObjType::live_obj_count());
 
       container().push_front(std::move(new_obj));
     }
@@ -1120,42 +1041,40 @@
     // Replace all of the members of the contianer with new members which
     // have a value never created during Populate().
     for (size_t i = 0; i < OBJ_COUNT; ++i) {
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
 
       PtrType new_obj = TestEnvTraits::CreateObject(OBJ_COUNT + i);
-      ASSERT_NONNULL(new_obj, "");
+      ASSERT_NOT_NULL(new_obj);
 
       auto iter =
           container().find_if([i](const ObjType& obj) -> bool { return (obj.value() == i); });
 
-      ASSERT_TRUE(iter.IsValid(), "");
-      EXPECT_EQ(i, iter->value(), "");
+      ASSERT_TRUE(iter.IsValid());
+      EXPECT_EQ(i, iter->value());
 
       PtrType replaced = container().replace(*iter, TakePtr(new_obj));
 
-      EXPECT_NULL(new_obj, "");
-      ASSERT_NONNULL(replaced, "");
+      EXPECT_NULL(new_obj);
+      ASSERT_NOT_NULL(replaced);
       EXPECT_FALSE(replaced->ContainerTraits::ContainableBaseClass::InContainer());
       EXPECT_EQ(i, replaced->value());
-      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT + 1, ObjType::live_obj_count());
 
       TestEnvTraits::ReleaseObject(replaced);
-      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count(), "");
+      EXPECT_EQ(OBJ_COUNT, ObjType::live_obj_count());
     }
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT));
+    TestEnvTraits::CheckCustomDeleteInvocations(OBJ_COUNT);
 
     // Make sure that the object are in order and have the values we expect.
     size_t i = 0;
     while (!container().is_empty()) {
       PtrType ptr = container().pop_front();
-      EXPECT_EQ(OBJ_COUNT + i, ptr->value(), "");
+      EXPECT_EQ(OBJ_COUNT + i, ptr->value());
       TestEnvTraits::ReleaseObject(ptr);
       ++i;
     }
-    EXPECT_EQ(0, ObjType::live_obj_count(), "");
-    EXPECT_TRUE(TestEnvTraits::CheckCustomDeleteInvocations(2 * OBJ_COUNT));
-
-    END_TEST;
+    EXPECT_EQ(0, ObjType::live_obj_count());
+    TestEnvTraits::CheckCustomDeleteInvocations(2 * OBJ_COUNT);
   }
 
  private:
@@ -1177,3 +1096,5 @@
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_SEQUENCE_CONTAINER_TEST_ENVIRONMENT_H_
diff --git a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/test_thunks.h b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/test_thunks.h
index e6792ab..4588300 100644
--- a/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/test_thunks.h
+++ b/zircon/system/ulib/fbl/test/include/fbl/tests/intrusive_containers/test_thunks.h
@@ -2,19 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#pragma once
+#ifndef FBL_TESTS_INTRUSIVE_CONTAINERS_TEST_THUNKS_H_
+#define FBL_TESTS_INTRUSIVE_CONTAINERS_TEST_THUNKS_H_
+
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
 namespace intrusive_containers {
 
-#define MAKE_TEST_THUNK(_test_name)    \
-  static bool _test_name##Test() {     \
-    TestEnvironmentClass env;          \
-    BEGIN_TEST;                        \
-    EXPECT_TRUE(env._test_name(), ""); \
-    EXPECT_TRUE(env.Reset(), "");      \
-    END_TEST;                          \
+#define MAKE_TEST_THUNK(_test_name)           \
+  static void _test_name() {                  \
+    TestEnvironmentClass env;                 \
+    ASSERT_NO_FAILURES(env._test_name(), ""); \
+    ASSERT_NO_FAILURES(env.Reset(), "");      \
   }
 
 // A utility class used to generate static test thunks for the various
@@ -106,6 +107,14 @@
 #define DEFINE_TEST_THUNK(_env_type, _container_type, _ptr_type) \
   TestThunks<_env_type##ContainerTestEnvironment<_ptr_type##_container_type##TestTraits>>
 
+#define RUN_ZXTEST(_group, _flavor, _test) \
+  TEST(_group, _test##_##_flavor) {        \
+    auto fn = _flavor ::_test;             \
+    ASSERT_NO_FAILURES(fn());              \
+  }
+
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
+
+#endif  // FBL_TESTS_INTRUSIVE_CONTAINERS_TEST_THUNKS_H_
diff --git a/zircon/system/ulib/fbl/test/intrusive_container_tests.cc b/zircon/system/ulib/fbl/test/intrusive_container_tests.cc
index 7824359..b0d1826 100644
--- a/zircon/system/ulib/fbl/test/intrusive_container_tests.cc
+++ b/zircon/system/ulib/fbl/test/intrusive_container_tests.cc
@@ -4,7 +4,7 @@
 
 #include <fbl/intrusive_container_utils.h>
 #include <fbl/tests/intrusive_containers/objects.h>
-#include <unittest/unittest.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -13,9 +13,7 @@
 size_t TestObjBase::live_obj_count_ = 0;
 
 template <typename T>
-bool swap_test(const T initial_a, const T initial_b) {
-  BEGIN_HELPER;
-
+void swap_test(const T initial_a, const T initial_b) {
   // Starting A and B need to be different in order for us to know that swap
   // worked.
   EXPECT_NE(::memcmp(&initial_a, &initial_b, sizeof(T)), 0);
@@ -26,13 +24,9 @@
 
   EXPECT_EQ(::memcmp(&a, &initial_b, sizeof(T)), 0);
   EXPECT_EQ(::memcmp(&b, &initial_a, sizeof(T)), 0);
-
-  END_HELPER;
 }
 
-bool swap_test() {
-  BEGIN_TEST;
-
+TEST(IntrusiveContainerUtilsTest, Swap) {
   struct SimpleSmallStruct {
     uint8_t a, b;
   };
@@ -43,35 +37,29 @@
     uint64_t a, b;
   };
 
-  EXPECT_TRUE(swap_test<char>('a', 'b'));
-  EXPECT_TRUE(swap_test<int8_t>(-5, 10));
-  EXPECT_TRUE(swap_test<uint8_t>(5, 10));
-  EXPECT_TRUE(swap_test<int16_t>(-12345, 12345));
-  EXPECT_TRUE(swap_test<uint16_t>(12345, 54321));
-  EXPECT_TRUE(swap_test<int32_t>(-1234567890, 123456789));
-  EXPECT_TRUE(swap_test<uint32_t>(1234567890, 987654321));
-  EXPECT_TRUE(swap_test<int64_t>(-12345678901234567, 12345678901234567));
-  EXPECT_TRUE(swap_test<uint64_t>(12345678901234567, 98765432109876543));
-  EXPECT_TRUE(swap_test<float>(-0.1234567f, 0.7654321f));
-  EXPECT_TRUE(swap_test<double>(-0.12345678901234567890, 0.98765432109876543210));
-  EXPECT_TRUE(swap_test<SimpleSmallStruct>({5, 4}, {2, 9}));
-  EXPECT_TRUE(swap_test<SimpleBigStruct>({5, 4}, {2, 9}));
+  swap_test<char>('a', 'b');
+  swap_test<int8_t>(-5, 10);
+  swap_test<uint8_t>(5, 10);
+  swap_test<int16_t>(-12345, 12345);
+  swap_test<uint16_t>(12345, 54321);
+  swap_test<int32_t>(-1234567890, 123456789);
+  swap_test<uint32_t>(1234567890, 987654321);
+  swap_test<int64_t>(-12345678901234567, 12345678901234567);
+  swap_test<uint64_t>(12345678901234567, 98765432109876543);
+  swap_test<float>(-0.1234567f, 0.7654321f);
+  swap_test<double>(-0.12345678901234567890, 0.98765432109876543210);
+  swap_test<SimpleSmallStruct>({5, 4}, {2, 9});
+  swap_test<SimpleBigStruct>({5, 4}, {2, 9});
 #if TEST_WILL_NOT_COMPILE || 0
-  EXPECT_TRUE(swap_test<SimpleHugeStruct>({5, 4}, {2, 9}));
+  swap_test<SimpleHugeStruct>({5, 4}, {2, 9});
 #endif
 
   SimpleBigStruct a = {};
   SimpleBigStruct b = {};
-  EXPECT_TRUE(swap_test<void*>(&a, &b));
-  EXPECT_TRUE(swap_test<SimpleBigStruct*>(&a, &b));
-
-  END_TEST;
+  swap_test<void*>(&a, &b);
+  swap_test<SimpleBigStruct*>(&a, &b);
 }
 
-BEGIN_TEST_CASE(container_utils_tests)
-RUN_NAMED_TEST("swap test", swap_test)
-END_TEST_CASE(container_utils_tests)
-
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl
diff --git a/zircon/system/ulib/fbl/test/intrusive_doubly_linked_list_tests.cc b/zircon/system/ulib/fbl/test/intrusive_doubly_linked_list_tests.cc
index c06e546..f0d86ab 100644
--- a/zircon/system/ulib/fbl/test/intrusive_doubly_linked_list_tests.cc
+++ b/zircon/system/ulib/fbl/test/intrusive_doubly_linked_list_tests.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <unittest/unittest.h>
 #include <fbl/intrusive_double_list.h>
 #include <fbl/tests/intrusive_containers/intrusive_doubly_linked_list_checker.h>
 #include <fbl/tests/intrusive_containers/sequence_container_test_environment.h>
 #include <fbl/tests/intrusive_containers/test_thunks.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -64,219 +64,214 @@
 using SUPCDTE = DEFINE_TEST_THUNK(Sequence, DLL, StdUniquePtrCustomDeleter);
 using RPTE    = DEFINE_TEST_THUNK(Sequence, DLL, RefPtr);
 
-BEGIN_TEST_CASE(double_linked_list_tests)
 //////////////////////////////////////////
 // General container specific tests.
 //////////////////////////////////////////
-RUN_NAMED_TEST("Clear (unmanaged)",                 UMTE::ClearTest)
-RUN_NAMED_TEST("Clear (unique)",                    UPTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr)",                 SUPDDTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr<Del>)",            SUPCDTE::ClearTest)
-RUN_NAMED_TEST("Clear (RefPtr)",                    RPTE::ClearTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    Clear)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    Clear)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, Clear)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, Clear)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    Clear)
 
-RUN_NAMED_TEST("ClearUnsafe (unmanaged)",           UMTE::ClearUnsafeTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    ClearUnsafe)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ClearUnsafe (unique)",              UPTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr)",           SUPDDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr<Del>)",      SUPCDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (RefPtr)",              RPTE::ClearUnsafeTest)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    ClearUnsafe)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, ClearUnsafe)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, ClearUnsafe)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    ClearUnsafe)
 #endif
 
-RUN_NAMED_TEST("IsEmpty (unmanaged)",               UMTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (unique)",                  UPTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr)",               SUPDDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr<Del>)",          SUPCDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (RefPtr)",                  RPTE::IsEmptyTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    IsEmpty)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    IsEmpty)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, IsEmpty)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, IsEmpty)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    IsEmpty)
 
-RUN_NAMED_TEST("Iterate (unmanaged)",               UMTE::IterateTest)
-RUN_NAMED_TEST("Iterate (unique)",                  UPTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr)",               SUPDDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr<Del>)",          SUPCDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (RefPtr)",                  RPTE::IterateTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    Iterate)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    Iterate)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, Iterate)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, Iterate)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    Iterate)
 
-RUN_NAMED_TEST("IterErase (unmanaged)",             UMTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (unique)",                UPTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr)",             SUPDDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr<Del>)",        SUPCDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (RefPtr)",                RPTE::IterEraseTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    IterErase)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    IterErase)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, IterErase)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, IterErase)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    IterErase)
 
-RUN_NAMED_TEST("DirectErase (unmanaged)",           UMTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (unique)",              UPTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr)",           SUPDDTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr<Del>)",      SUPCDTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (RefPtr)",              RPTE::DirectEraseTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    DirectErase)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    DirectErase)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, DirectErase)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, DirectErase)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    DirectErase)
 
-RUN_NAMED_TEST("MakeIterator (unmanaged)",          UMTE::MakeIteratorTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    MakeIterator)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    MakeIterator)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, MakeIterator)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, MakeIterator)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    MakeIterator)
+
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    ReverseIterErase)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    ReverseIterErase)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, ReverseIterErase)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, ReverseIterErase)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    ReverseIterErase)
+
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    ReverseIterate)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    ReverseIterate)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, ReverseIterate)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, ReverseIterate)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    ReverseIterate)
+
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    Swap)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    Swap)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, Swap)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, Swap)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    Swap)
+
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    RvalueOps)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    RvalueOps)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, RvalueOps)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, RvalueOps)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    RvalueOps)
+
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    Scope)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, Scope)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, Scope)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    Scope)
+
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    TwoContainer)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("MakeIterator (unique)",             UPTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr)",          SUPDDTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr<Del>)",     SUPCDTE::MakeIteratorTest)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    TwoContainer)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, TwoContainer)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, TwoContainer)
 #endif
-RUN_NAMED_TEST("MakeIterator (RefPtr)",             RPTE::MakeIteratorTest)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    TwoContainer)
 
-RUN_NAMED_TEST("ReverseIterErase (unmanaged)",      UMTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (unique)",         UPTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr)",      SUPDDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr<Del>)", SUPCDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (RefPtr)",         RPTE::ReverseIterEraseTest)
-
-RUN_NAMED_TEST("ReverseIterate (unmanaged)",        UMTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (unique)",           UPTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr)",        SUPDDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr<Del>)",   SUPCDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (RefPtr)",           RPTE::ReverseIterateTest)
-
-RUN_NAMED_TEST("Swap (unmanaged)",                  UMTE::SwapTest)
-RUN_NAMED_TEST("Swap (unique)",                     UPTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr)",                  SUPDDTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr<Del>)",             SUPCDTE::SwapTest)
-RUN_NAMED_TEST("Swap (RefPtr)",                     RPTE::SwapTest)
-
-RUN_NAMED_TEST("Rvalue Ops (unmanaged)",            UMTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (unique)",               UPTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr)",            SUPDDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr<Del>)",       SUPCDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (RefPtr)",               RPTE::RvalueOpsTest)
-
-RUN_NAMED_TEST("Scope (unique)",                    UPTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr)",                 SUPDDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr<Del>)",            SUPCDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (RefPtr)",                    RPTE::ScopeTest)
-
-RUN_NAMED_TEST("TwoContainer (unmanaged)",          UMTE::TwoContainerTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    ThreeContainerHelper)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("TwoContainer (unique)",             UPTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr)",          SUPDDTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr<Del>)",     SUPCDTE::TwoContainerTest)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    ThreeContainerHelper)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, ThreeContainerHelper)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, ThreeContainerHelper)
 #endif
-RUN_NAMED_TEST("TwoContainer (RefPtr)",             RPTE::TwoContainerTest)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    ThreeContainerHelper)
 
-RUN_NAMED_TEST("ThreeContainerHelper (unmanaged)",  UMTE::ThreeContainerHelperTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    IterCopyPointer)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ThreeContainerHelper (unique)",     UPTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr)",  SUPDDTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr<Del>)", SUPCDTE::ThreeContainerHelperTest)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    IterCopyPointer)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, IterCopyPointer)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, IterCopyPointer)
 #endif
-RUN_NAMED_TEST("ThreeContainerHelper (RefPtr)",     RPTE::ThreeContainerHelperTest)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    IterCopyPointer)
 
-RUN_NAMED_TEST("IterCopyPointer (unmanaged)",       UMTE::IterCopyPointerTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("IterCopyPointer (unique)",          UPTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr)",       SUPDDTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr<Del>)",  SUPCDTE::IterCopyPointerTest)
-#endif
-RUN_NAMED_TEST("IterCopyPointer (RefPtr)",          RPTE::IterCopyPointerTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    EraseIf)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    EraseIf)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, EraseIf)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, EraseIf)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    EraseIf)
 
-RUN_NAMED_TEST("EraseIf (unmanaged)",               UMTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (unique)",                  UPTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr)",               SUPDDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr<Del>)",          SUPCDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (RefPtr)",                  RPTE::EraseIfTest)
-
-RUN_NAMED_TEST("FindIf (unmanaged)",                UMTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (unique)",                   UPTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr)",                SUPDDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr<Del>)",           SUPCDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (RefPtr)",                   RPTE::FindIfTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    FindIf)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    FindIf)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, FindIf)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, FindIf)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    FindIf)
 
 //////////////////////////////////////////
 // Sequence container specific tests.
 //////////////////////////////////////////
-RUN_NAMED_TEST("PushFront (unmanaged)",             UMTE::PushFrontTest)
-RUN_NAMED_TEST("PushFront (unique)",                UPTE::PushFrontTest)
-RUN_NAMED_TEST("PushFront (std::uptr)",             SUPDDTE::PushFrontTest)
-RUN_NAMED_TEST("PushFront (std::uptr<Del>)",        SUPCDTE::PushFrontTest)
-RUN_NAMED_TEST("PushFront (RefPtr)",                RPTE::PushFrontTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    PushFront)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    PushFront)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, PushFront)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, PushFront)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    PushFront)
 
-RUN_NAMED_TEST("PopFront (unmanaged)",              UMTE::PopFrontTest)
-RUN_NAMED_TEST("PopFront (unique)",                 UPTE::PopFrontTest)
-RUN_NAMED_TEST("PopFront (std::uptr)",              SUPDDTE::PopFrontTest)
-RUN_NAMED_TEST("PopFront (std::uptr<Del>)",         SUPCDTE::PopFrontTest)
-RUN_NAMED_TEST("PopFront (RefPtr)",                 RPTE::PopFrontTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    PopFront)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    PopFront)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, PopFront)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, PopFront)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    PopFront)
 
-RUN_NAMED_TEST("PushBack (unmanaged)",              UMTE::PushBackTest)
-RUN_NAMED_TEST("PushBack (unique)",                 UPTE::PushBackTest)
-RUN_NAMED_TEST("PushBack (std::uptr)",              SUPDDTE::PushBackTest)
-RUN_NAMED_TEST("PushBack (std::uptr<Del>)",         SUPCDTE::PushBackTest)
-RUN_NAMED_TEST("PushBack (RefPtr)",                 RPTE::PushBackTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    PushBack)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    PushBack)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, PushBack)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, PushBack)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    PushBack)
 
-RUN_NAMED_TEST("PopBack (unmanaged)",               UMTE::PopBackTest)
-RUN_NAMED_TEST("PopBack (unique)",                  UPTE::PopBackTest)
-RUN_NAMED_TEST("PopBack (std::uptr)",               SUPDDTE::PopBackTest)
-RUN_NAMED_TEST("PopBack (std::uptr<Del>)",          SUPCDTE::PopBackTest)
-RUN_NAMED_TEST("PopBack (RefPtr)",                  RPTE::PopBackTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    PopBack)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    PopBack)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, PopBack)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, PopBack)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    PopBack)
 
-RUN_NAMED_TEST("SeqIterate (unmanaged)",            UMTE::SeqIterateTest)
-RUN_NAMED_TEST("SeqIterate (unique)",               UPTE::SeqIterateTest)
-RUN_NAMED_TEST("SeqIterate (std::uptr)",            SUPDDTE::SeqIterateTest)
-RUN_NAMED_TEST("SeqIterate (std::uptr<Del>)",       SUPCDTE::SeqIterateTest)
-RUN_NAMED_TEST("SeqIterate (RefPtr)",               RPTE::SeqIterateTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    SeqIterate)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    SeqIterate)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, SeqIterate)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, SeqIterate)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    SeqIterate)
 
-RUN_NAMED_TEST("SeqReverseIterate (unmanaged)",     UMTE::SeqReverseIterateTest)
-RUN_NAMED_TEST("SeqReverseIterate (unique)",        UPTE::SeqReverseIterateTest)
-RUN_NAMED_TEST("SeqReverseIterate (std::uptr)",     SUPDDTE::SeqReverseIterateTest)
-RUN_NAMED_TEST("SeqReverseIterate (std::uptr<Del>)",SUPCDTE::SeqReverseIterateTest)
-RUN_NAMED_TEST("SeqReverseIterate (RefPtr)",        RPTE::SeqReverseIterateTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    SeqReverseIterate)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    SeqReverseIterate)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, SeqReverseIterate)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, SeqReverseIterate)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    SeqReverseIterate)
 
-RUN_NAMED_TEST("EraseNext (unmanaged)",             UMTE::EraseNextTest)
-RUN_NAMED_TEST("EraseNext (unique)",                UPTE::EraseNextTest)
-RUN_NAMED_TEST("EraseNext (std::uptr)",             SUPDDTE::EraseNextTest)
-RUN_NAMED_TEST("EraseNext (std::uptr<Del>)",        SUPCDTE::EraseNextTest)
-RUN_NAMED_TEST("EraseNext (RefPtr)",                RPTE::EraseNextTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    EraseNext)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    EraseNext)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, EraseNext)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, EraseNext)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    EraseNext)
 
-RUN_NAMED_TEST("InsertAfter (unmanaged)",           UMTE::InsertAfterTest)
-RUN_NAMED_TEST("InsertAfter (unique)",              UPTE::InsertAfterTest)
-RUN_NAMED_TEST("InsertAfter (std::uptr)",           SUPDDTE::InsertAfterTest)
-RUN_NAMED_TEST("InsertAfter (std::uptr<Del>)",      SUPCDTE::InsertAfterTest)
-RUN_NAMED_TEST("InsertAfter (RefPtr)",              RPTE::InsertAfterTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    InsertAfter)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    InsertAfter)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, InsertAfter)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, InsertAfter)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    InsertAfter)
 
-RUN_NAMED_TEST("Insert (unmanaged)",                UMTE::InsertTest)
-RUN_NAMED_TEST("Insert (unique)",                   UPTE::InsertTest)
-RUN_NAMED_TEST("Insert (std::uptr)",                SUPDDTE::InsertTest)
-RUN_NAMED_TEST("Insert (std::uptr<Del>)",           SUPCDTE::InsertTest)
-RUN_NAMED_TEST("Insert (RefPtr)",                   RPTE::InsertTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    Insert)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    Insert)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, Insert)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, Insert)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    Insert)
 
-RUN_NAMED_TEST("DirectInsert (unmanaged)",          UMTE::DirectInsertTest)
-RUN_NAMED_TEST("DirectInsert (unique)",             UPTE::DirectInsertTest)
-RUN_NAMED_TEST("DirectInsert (std::uptr)",          SUPDDTE::DirectInsertTest)
-RUN_NAMED_TEST("DirectInsert (std::uptr<Del>)",     SUPCDTE::DirectInsertTest)
-RUN_NAMED_TEST("DirectInsert (RefPtr)",             RPTE::DirectInsertTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    DirectInsert)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    DirectInsert)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, DirectInsert)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, DirectInsert)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    DirectInsert)
 
-RUN_NAMED_TEST("Splice (unmanaged)",                UMTE::SpliceTest)
-RUN_NAMED_TEST("Splice (unique)",                   UPTE::SpliceTest)
-RUN_NAMED_TEST("Splice (std::uptr)",                SUPDDTE::SpliceTest)
-RUN_NAMED_TEST("Splice (std::uptr<Del>)",           SUPCDTE::SpliceTest)
-RUN_NAMED_TEST("Splice (RefPtr)",                   RPTE::SpliceTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    Splice)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    Splice)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, Splice)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, Splice)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    Splice)
 
-RUN_NAMED_TEST("ReplaceIfCopy (unmanaged)",         UMTE::ReplaceIfCopyTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    ReplaceIfCopy)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ReplaceIfCopy (unique)",            UPTE::ReplaceIfCopyTest)
-RUN_NAMED_TEST("ReplaceIfCopy (std::uptr)",         SUPDDTE::ReplaceIfCopyTest)
-RUN_NAMED_TEST("ReplaceIfCopy (std::uptr<Del>)",    SUPCDTE::ReplaceIfCopyTest)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    ReplaceIfCopy)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, ReplaceIfCopy)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, ReplaceIfCopy)
 #endif
-RUN_NAMED_TEST("ReplaceIfCopy (RefPtr)",            RPTE::ReplaceIfCopyTest)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    ReplaceIfCopy)
 
-RUN_NAMED_TEST("ReplaceIfMove (unmanaged)",         UMTE::ReplaceIfMoveTest)
-RUN_NAMED_TEST("ReplaceIfMove (unique)",            UPTE::ReplaceIfMoveTest)
-RUN_NAMED_TEST("ReplaceIfMove (std::uptr)",         SUPDDTE::ReplaceIfMoveTest)
-RUN_NAMED_TEST("ReplaceIfMove (std::uptr<Del>)",    SUPCDTE::ReplaceIfMoveTest)
-RUN_NAMED_TEST("ReplaceIfMove (RefPtr)",            RPTE::ReplaceIfMoveTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    ReplaceIfMove)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    ReplaceIfMove)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, ReplaceIfMove)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, ReplaceIfMove)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    ReplaceIfMove)
 
-RUN_NAMED_TEST("ReplaceCopy (unmanaged)",           UMTE::ReplaceCopyTest)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    ReplaceCopy)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ReplaceCopy (unique)",              UPTE::ReplaceCopyTest)
-RUN_NAMED_TEST("ReplaceCopy (std::uptr)",           SUPDDTE::ReplaceCopyTest)
-RUN_NAMED_TEST("ReplaceCopy (std::uptr<Del>)",      SUPCDTE::ReplaceCopyTest)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    ReplaceCopy)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, ReplaceCopy)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, ReplaceCopy)
 #endif
-RUN_NAMED_TEST("ReplaceCopy (RefPtr)",              RPTE::ReplaceCopyTest)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    ReplaceCopy)
 
-RUN_NAMED_TEST("ReplaceMove (unmanaged)",           UMTE::ReplaceMoveTest)
-RUN_NAMED_TEST("ReplaceMove (unique)",              UPTE::ReplaceMoveTest)
-RUN_NAMED_TEST("ReplaceMove (std::uptr)",           SUPDDTE::ReplaceMoveTest)
-RUN_NAMED_TEST("ReplaceMove (std::uptr<Del>)",      SUPCDTE::ReplaceMoveTest)
-RUN_NAMED_TEST("ReplaceMove (RefPtr)",              RPTE::ReplaceMoveTest)
-
-END_TEST_CASE(double_linked_list_tests)
+RUN_ZXTEST(DoublyLinkedListTest, UMTE,    ReplaceMove)
+RUN_ZXTEST(DoublyLinkedListTest, UPTE,    ReplaceMove)
+RUN_ZXTEST(DoublyLinkedListTest, SUPDDTE, ReplaceMove)
+RUN_ZXTEST(DoublyLinkedListTest, SUPCDTE, ReplaceMove)
+RUN_ZXTEST(DoublyLinkedListTest, RPTE,    ReplaceMove)
 // clang-format on
 
 }  // namespace intrusive_containers
diff --git a/zircon/system/ulib/fbl/test/intrusive_hash_table_dll_tests.cc b/zircon/system/ulib/fbl/test/intrusive_hash_table_dll_tests.cc
index 727c88d..682bc6e 100644
--- a/zircon/system/ulib/fbl/test/intrusive_hash_table_dll_tests.cc
+++ b/zircon/system/ulib/fbl/test/intrusive_hash_table_dll_tests.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <unittest/unittest.h>
 #include <fbl/intrusive_double_list.h>
 #include <fbl/intrusive_hash_table.h>
 #include <fbl/tests/intrusive_containers/associative_container_test_environment.h>
 #include <fbl/tests/intrusive_containers/intrusive_hash_table_checker.h>
 #include <fbl/tests/intrusive_containers/test_thunks.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -102,161 +102,155 @@
 using SUPCDTE = DEFINE_TEST_THUNK(Associative, HTDLL, StdUniquePtrCustomDeleter);
 using RPTE    = DEFINE_TEST_THUNK(Associative, HTDLL, RefPtr);
 
-BEGIN_TEST_CASE(hashtable_dll_tests)
 //////////////////////////////////////////
 // General container specific tests.
 //////////////////////////////////////////
-RUN_NAMED_TEST("Clear (unmanaged)",                        UMTE::ClearTest)
-RUN_NAMED_TEST("Clear (unique)",                           UPTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr)",                        SUPDDTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr<Del>)",                   SUPCDTE::ClearTest)
-RUN_NAMED_TEST("Clear (RefPtr)",                           RPTE::ClearTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     Clear)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     Clear)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  Clear)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  Clear)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     Clear)
 
-RUN_NAMED_TEST("ClearUnsafe (unmanaged)",                  UMTE::ClearUnsafeTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     ClearUnsafe)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ClearUnsafe (unique)",                     UPTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr)",                  SUPDDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr<Del>)",             SUPCDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (RefPtr)",                     RPTE::ClearUnsafeTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     ClearUnsafe)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  ClearUnsafe)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  ClearUnsafe)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     ClearUnsafe)
 #endif
 
-RUN_NAMED_TEST("IsEmpty (unmanaged)",                      UMTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (unique)",                         UPTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr)",                      SUPDDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr<Del>)",                 SUPCDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (RefPtr)",                         RPTE::IsEmptyTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     IsEmpty)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     IsEmpty)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  IsEmpty)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  IsEmpty)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     IsEmpty)
 
-RUN_NAMED_TEST("Iterate (unmanaged)",                      UMTE::IterateTest)
-RUN_NAMED_TEST("Iterate (unique)",                         UPTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr)",                      SUPDDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr<Del>)",                 SUPCDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (RefPtr)",                         RPTE::IterateTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     Iterate)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     Iterate)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  Iterate)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  Iterate)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     Iterate)
 
-RUN_NAMED_TEST("IterErase (unmanaged)",                    UMTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (unique)",                       UPTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr)",                    SUPDDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr<Del>)",               SUPCDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (RefPtr)",                       RPTE::IterEraseTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     IterErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     IterErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  IterErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  IterErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     IterErase)
 
-RUN_NAMED_TEST("DirectErase (unmanaged)",                  UMTE::DirectEraseTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("DirectErase (unique)",                     UPTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr)",                  SUPDDTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr<Del>)",             SUPCDTE::DirectEraseTest)
-#endif
-RUN_NAMED_TEST("DirectErase (RefPtr)",                     RPTE::DirectEraseTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     DirectErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     DirectErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  DirectErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  DirectErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     DirectErase)
 
-RUN_NAMED_TEST("MakeIterator (unmanaged)",                 UMTE::MakeIteratorTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("MakeIterator (unique)",                    UPTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr)",                 SUPDDTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr<Del>)",            SUPCDTE::MakeIteratorTest)
-#endif
-RUN_NAMED_TEST("MakeIterator (RefPtr)",                    RPTE::MakeIteratorTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     MakeIterator)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     MakeIterator)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  MakeIterator)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  MakeIterator)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     MakeIterator)
 
-RUN_NAMED_TEST("ReverseIterErase (unmanaged)",             UMTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (unique)",                UPTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr)",             SUPDDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr<Del>)",        SUPCDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (RefPtr)",                RPTE::ReverseIterEraseTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     ReverseIterErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     ReverseIterErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  ReverseIterErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  ReverseIterErase)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     ReverseIterErase)
 
-RUN_NAMED_TEST("ReverseIterate (unmanaged)",               UMTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (unique)",                  UPTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr)",               SUPDDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr<Del>)",          SUPCDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (RefPtr)",                  RPTE::ReverseIterateTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     ReverseIterate)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     ReverseIterate)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  ReverseIterate)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  ReverseIterate)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     ReverseIterate)
 
 // Hash tables do not support swapping or Rvalue operations (Assignment or
 // construction) as doing so would be an O(n) operation (With 'n' == to the
 // number of buckets in the hashtable)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("Swap (unmanaged)",                         UMTE::SwapTest)
-RUN_NAMED_TEST("Swap (unique)",                            UPTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr)",                         SUPDDTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr<Del>)",                    SUPCDTE::SwapTest)
-RUN_NAMED_TEST("Swap (RefPtr)",                            RPTE::SwapTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     Swap)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     Swap)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  Swap)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  Swap)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     Swap)
 
-RUN_NAMED_TEST("Rvalue Ops (unmanaged)",                   UMTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (unique)",                      UPTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr)",                   SUPDDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr<Del>)",              SUPCDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (RefPtr)",                      RPTE::RvalueOpsTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     RvalueOps)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     RvalueOps)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  RvalueOps)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  RvalueOps)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     RvalueOps)
 #endif
 
-RUN_NAMED_TEST("Scope (unique)",                           UPTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr)",                        SUPDDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr<Del>)",                   SUPCDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (RefPtr)",                           RPTE::ScopeTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     Scope)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  Scope)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  Scope)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     Scope)
 
-RUN_NAMED_TEST("TwoContainer (unmanaged)",                 UMTE::TwoContainerTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     TwoContainer)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("TwoContainer (unique)",                    UPTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr)",                 SUPDDTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr<Del>)",            SUPCDTE::TwoContainerTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     TwoContainer)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  TwoContainer)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  TwoContainer)
 #endif
-RUN_NAMED_TEST("TwoContainer (RefPtr)",                    RPTE::TwoContainerTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     TwoContainer)
 
-RUN_NAMED_TEST("ThreeContainerHelper (unmanaged)",         UMTE::ThreeContainerHelperTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     ThreeContainerHelper)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ThreeContainerHelper (unique)",            UPTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr)",         SUPDDTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr<Del>)",    SUPCDTE::ThreeContainerHelperTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     ThreeContainerHelper)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  ThreeContainerHelper)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  ThreeContainerHelper)
 #endif
-RUN_NAMED_TEST("ThreeContainerHelper (RefPtr)",            RPTE::ThreeContainerHelperTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     ThreeContainerHelper)
 
-RUN_NAMED_TEST("IterCopyPointer (unmanaged)",              UMTE::IterCopyPointerTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     IterCopyPointer)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("IterCopyPointer (unique)",                 UPTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr)",              SUPDDTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr<Del>)",         SUPCDTE::IterCopyPointerTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     IterCopyPointer)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  IterCopyPointer)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  IterCopyPointer)
 #endif
-RUN_NAMED_TEST("IterCopyPointer (RefPtr)",                 RPTE::IterCopyPointerTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     IterCopyPointer)
 
-RUN_NAMED_TEST("EraseIf (unmanaged)",                      UMTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (unique)",                         UPTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr)",                      SUPDDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr<Del>)",                 SUPCDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (RefPtr)",                         RPTE::EraseIfTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     EraseIf)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     EraseIf)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  EraseIf)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  EraseIf)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     EraseIf)
 
-RUN_NAMED_TEST("FindIf (unmanaged)",                       UMTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (unique)",                          UPTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr)",                       SUPDDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr<Del>)",                  SUPCDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (RefPtr)",                          RPTE::FindIfTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     FindIf)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     FindIf)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  FindIf)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  FindIf)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     FindIf)
 
 //////////////////////////////////////////
 // Associative container specific tests.
 //////////////////////////////////////////
-RUN_NAMED_TEST("InsertByKey (unmanaged)",                  UMTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (unique)",                     UPTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (std::uptr)",                  SUPDDTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (std::uptr<Del>)",             SUPCDTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (RefPtr)",                     RPTE::InsertByKeyTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     InsertByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     InsertByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  InsertByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  InsertByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     InsertByKey)
 
-RUN_NAMED_TEST("FindByKey (unmanaged)",                    UMTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (unique)",                       UPTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (std::uptr)",                    SUPDDTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (std::uptr<Del>)",               SUPCDTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (RefPtr)",                       RPTE::FindByKeyTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     FindByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     FindByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  FindByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  FindByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     FindByKey)
 
-RUN_NAMED_TEST("EraseByKey (unmanaged)",                   UMTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (unique)",                      UPTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (std::uptr)",                   SUPDDTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (std::uptr<Del>)",              SUPCDTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (RefPtr)",                      RPTE::EraseByKeyTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     EraseByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     EraseByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  EraseByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  EraseByKey)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     EraseByKey)
 
-RUN_NAMED_TEST("InsertOrFind (unmanaged)",                 UMTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (unique)",                    UPTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (std::uptr)",                 SUPDDTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (std::uptr<Del>)",            SUPCDTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (RefPtr)",                    RPTE::InsertOrFindTest)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     InsertOrFind)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     InsertOrFind)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  InsertOrFind)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  InsertOrFind)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     InsertOrFind)
 
-RUN_NAMED_TEST("InsertOrReplace (unmanaged)",              UMTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (unique)",                 UPTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (std::uptr)",              SUPDDTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (std::uptr<Del>)",         SUPCDTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (RefPtr)",                 RPTE::InsertOrReplaceTest)
-END_TEST_CASE(hashtable_dll_tests)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UMTE,     InsertOrReplace)
+RUN_ZXTEST(DoublyLinkedHashTableTest, UPTE,     InsertOrReplace)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPDDTE,  InsertOrReplace)
+RUN_ZXTEST(DoublyLinkedHashTableTest, SUPCDTE,  InsertOrReplace)
+RUN_ZXTEST(DoublyLinkedHashTableTest, RPTE,     InsertOrReplace)
 // clang-format on
 
 }  // namespace intrusive_containers
diff --git a/zircon/system/ulib/fbl/test/intrusive_hash_table_sll_tests.cc b/zircon/system/ulib/fbl/test/intrusive_hash_table_sll_tests.cc
index f67942b..3444242 100644
--- a/zircon/system/ulib/fbl/test/intrusive_hash_table_sll_tests.cc
+++ b/zircon/system/ulib/fbl/test/intrusive_hash_table_sll_tests.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <unittest/unittest.h>
-#include <fbl/intrusive_single_list.h>
 #include <fbl/intrusive_hash_table.h>
+#include <fbl/intrusive_single_list.h>
 #include <fbl/tests/intrusive_containers/associative_container_test_environment.h>
 #include <fbl/tests/intrusive_containers/intrusive_hash_table_checker.h>
 #include <fbl/tests/intrusive_containers/test_thunks.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -102,165 +102,161 @@
 using SUPCDTE = DEFINE_TEST_THUNK(Associative, HTSLL, StdUniquePtrCustomDeleter);
 using RPTE    = DEFINE_TEST_THUNK(Associative, HTSLL, RefPtr);
 
-BEGIN_TEST_CASE(hashtable_sll_tests)
 //////////////////////////////////////////
 // General container specific tests.
 //////////////////////////////////////////
-RUN_NAMED_TEST("Clear (unmanaged)",                        UMTE::ClearTest)
-RUN_NAMED_TEST("Clear (unique)",                           UPTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr)",                        SUPDDTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr<Del>)",                   SUPCDTE::ClearTest)
-RUN_NAMED_TEST("Clear (RefPtr)",                           RPTE::ClearTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     Clear)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     Clear)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  Clear)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  Clear)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     Clear)
 
-RUN_NAMED_TEST("ClearUnsafe (unmanaged)",                  UMTE::ClearUnsafeTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     ClearUnsafe)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ClearUnsafe (unique)",                     UPTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr)",                  SUPDDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr<Del>)",             SUPCDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (RefPtr)",                     RPTE::ClearUnsafeTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     ClearUnsafe)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  ClearUnsafe)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  ClearUnsafe)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     ClearUnsafe)
 #endif
 
-RUN_NAMED_TEST("IsEmpty (unmanaged)",                      UMTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (unique)",                         UPTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr)",                      SUPDDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr<Del>)",                 SUPCDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (RefPtr)",                         RPTE::IsEmptyTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     IsEmpty)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     IsEmpty)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  IsEmpty)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  IsEmpty)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     IsEmpty)
 
-RUN_NAMED_TEST("Iterate (unmanaged)",                      UMTE::IterateTest)
-RUN_NAMED_TEST("Iterate (unique)",                         UPTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr)",                      SUPDDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr<Del>)",                 SUPCDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (RefPtr)",                         RPTE::IterateTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     Iterate)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     Iterate)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  Iterate)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  Iterate)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     Iterate)
 
 // Hashtables with singly linked list bucket can perform direct
 // iterator/reference erase operations, but the operations will be O(n)
-RUN_NAMED_TEST("IterErase (unmanaged)",                    UMTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (unique)",                       UPTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr)",                    SUPDDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr<Del>)",               SUPCDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (RefPtr)",                       RPTE::IterEraseTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     IterErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     IterErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  IterErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  IterErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     IterErase)
 
-RUN_NAMED_TEST("DirectErase (unmanaged)",                  UMTE::DirectEraseTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("DirectErase (unique)",                     UPTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr)",                  SUPDDTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr<Del>)",             SUPCDTE::DirectEraseTest)
-#endif
-RUN_NAMED_TEST("DirectErase (RefPtr)",                     RPTE::DirectEraseTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     DirectErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     DirectErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  DirectErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  DirectErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     DirectErase)
 
-RUN_NAMED_TEST("MakeIterator (unmanaged)",                 UMTE::MakeIteratorTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("MakeIterator (unique)",                    UPTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr)",                 SUPDDTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr<Del>)",            SUPCDTE::MakeIteratorTest)
-#endif
-RUN_NAMED_TEST("MakeIterator (RefPtr)",                    RPTE::MakeIteratorTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     MakeIterator)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     MakeIterator)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  MakeIterator)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  MakeIterator)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     MakeIterator)
 
 // HashTables with SinglyLinkedList buckets cannot iterate backwards (because
 // their buckets cannot iterate backwards)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ReverseIterErase (unmanaged)",             UMTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (unique)",                UPTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr)",             SUPDDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr<Del>)",        SUPCDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (RefPtr)",                RPTE::ReverseIterEraseTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     ReverseIterErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     ReverseIterErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  ReverseIterErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  ReverseIterErase)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     ReverseIterErase)
 
-RUN_NAMED_TEST("ReverseIterate (unmanaged)",               UMTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (unique)",                  UPTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr)",               SUPDDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr<Del>)",          SUPCDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (RefPtr)",                  RPTE::ReverseIterateTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     ReverseIterate)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     ReverseIterate)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  ReverseIterate)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  ReverseIterate)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     ReverseIterate)
 #endif
 
 // Hash tables do not support swapping or Rvalue operations (Assignment or
 // construction) as doing so would be an O(n) operation (With 'n' == to the
 // number of buckets in the hashtable)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("Swap (unmanaged)",                         UMTE::SwapTest)
-RUN_NAMED_TEST("Swap (unique)",                            UPTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr)",                         SUPDDTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr<Del>)",                    SUPCDTE::SwapTest)
-RUN_NAMED_TEST("Swap (RefPtr)",                            RPTE::SwapTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     Swap)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     Swap)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  Swap)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  Swap)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     Swap)
 
-RUN_NAMED_TEST("Rvalue Ops (unmanaged)",                   UMTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (unique)",                      UPTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr)",                   SUPDDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr<Del>)",              SUPCDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (RefPtr)",                      RPTE::RvalueOpsTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     RvalueOps)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     RvalueOps)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  RvalueOps)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  RvalueOps)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     RvalueOps)
 #endif
 
-RUN_NAMED_TEST("Scope (unique)",                           UPTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr)",                        SUPDDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr<Del>)",                   SUPCDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (RefPtr)",                           RPTE::ScopeTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     Scope)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  Scope)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  Scope)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     Scope)
 
-RUN_NAMED_TEST("TwoContainer (unmanaged)",                 UMTE::TwoContainerTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     TwoContainer)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("TwoContainer (unique)",                    UPTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr)",                 SUPDDTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr<Del>)",            SUPCDTE::TwoContainerTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     TwoContainer)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  TwoContainer)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  TwoContainer)
 #endif
-RUN_NAMED_TEST("TwoContainer (RefPtr)",                    RPTE::TwoContainerTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     TwoContainer)
 
-RUN_NAMED_TEST("ThreeContainerHelper (unmanaged)",         UMTE::ThreeContainerHelperTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     ThreeContainerHelper)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ThreeContainerHelper (unique)",            UPTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr)",         SUPDDTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr<Del>)",    SUPCDTE::ThreeContainerHelperTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     ThreeContainerHelper)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  ThreeContainerHelper)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  ThreeContainerHelper)
 #endif
-RUN_NAMED_TEST("ThreeContainerHelper (RefPtr)",            RPTE::ThreeContainerHelperTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     ThreeContainerHelper)
 
-RUN_NAMED_TEST("IterCopyPointer (unmanaged)",              UMTE::IterCopyPointerTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     IterCopyPointer)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("IterCopyPointer (unique)",                 UPTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr)",              SUPDDTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr<Del>)",         DDTE::IterCopyPointerTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     IterCopyPointer)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  IterCopyPointer)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  IterCopyPointer)
 #endif
-RUN_NAMED_TEST("IterCopyPointer (RefPtr)",                 RPTE::IterCopyPointerTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     IterCopyPointer)
 
-RUN_NAMED_TEST("EraseIf (unmanaged)",                      UMTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (unique)",                         UPTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr)",                      SUPCDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (RefPtr)",                         RPTE::EraseIfTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     EraseIf)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     EraseIf)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  EraseIf)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  EraseIf)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     EraseIf)
 
-RUN_NAMED_TEST("FindIf (unmanaged)",                       UMTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (unique)",                          UPTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr)",                       SUPDDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr<Del>)",                  SUPCDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (RefPtr)",                          RPTE::FindIfTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     FindIf)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     FindIf)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  FindIf)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  FindIf)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     FindIf)
 
 //////////////////////////////////////////
 // Associative container specific tests.
 //////////////////////////////////////////
-RUN_NAMED_TEST("InsertByKey (unmanaged)",          UMTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (unique)",             UPTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (std::uptr)",          SUPDDTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (std::uptr<Del>)",     SUPCDTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (RefPtr)",             RPTE::InsertByKeyTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     InsertByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     InsertByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  InsertByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  InsertByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     InsertByKey)
 
-RUN_NAMED_TEST("FindByKey (unmanaged)",            UMTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (unique)",               UPTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (std::uptr)",            SUPDDTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (std::uptr<Del>)",       SUPCDTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (RefPtr)",               RPTE::FindByKeyTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     FindByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     FindByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  FindByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  FindByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     FindByKey)
 
-RUN_NAMED_TEST("EraseByKey (unmanaged)",           UMTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (unique)",              UPTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (std::uptr)",           SUPDDTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (std::uptr<Del>)",      SUPCDTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (RefPtr)",              RPTE::EraseByKeyTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     EraseByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     EraseByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  EraseByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  EraseByKey)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     EraseByKey)
 
-RUN_NAMED_TEST("InsertOrFind (unmanaged)",         UMTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (unique)",            UPTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (std::uptr)",         SUPDDTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (RefPtr)",            RPTE::InsertOrFindTest)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     InsertOrFind)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     InsertOrFind)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  InsertOrFind)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  InsertOrFind)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     InsertOrFind)
 
-RUN_NAMED_TEST("InsertOrReplace (unmanaged)",      UMTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (unique)",         UPTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (std::uptr)",      SUPDDTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (std::uptr<Del>)", SUPCDTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (RefPtr)",         RPTE::InsertOrReplaceTest)
-END_TEST_CASE(hashtable_sll_tests)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UMTE,     InsertOrReplace)
+RUN_ZXTEST(SinglyLinkedHashTableTest, UPTE,     InsertOrReplace)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPDDTE,  InsertOrReplace)
+RUN_ZXTEST(SinglyLinkedHashTableTest, SUPCDTE,  InsertOrReplace)
+RUN_ZXTEST(SinglyLinkedHashTableTest, RPTE,     InsertOrReplace)
 // clang-format on
 
 }  // namespace intrusive_containers
diff --git a/zircon/system/ulib/fbl/test/intrusive_singly_linked_list_tests.cc b/zircon/system/ulib/fbl/test/intrusive_singly_linked_list_tests.cc
index 08820a9..bab204f 100644
--- a/zircon/system/ulib/fbl/test/intrusive_singly_linked_list_tests.cc
+++ b/zircon/system/ulib/fbl/test/intrusive_singly_linked_list_tests.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <unittest/unittest.h>
 #include <fbl/intrusive_single_list.h>
 #include <fbl/tests/intrusive_containers/intrusive_singly_linked_list_checker.h>
 #include <fbl/tests/intrusive_containers/sequence_container_test_environment.h>
 #include <fbl/tests/intrusive_containers/test_thunks.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -56,233 +56,228 @@
                    std::tuple<typename SLLTraits<int*>::Tag1, typename SLLTraits<int*>::Tag2,
                               typename SLLTraits<int*>::Tag3>>);
 
+// clang-format off
 DEFINE_TEST_OBJECTS(SLL);
-using UMTE = DEFINE_TEST_THUNK(Sequence, SLL, Unmanaged);
-using UPTE = DEFINE_TEST_THUNK(Sequence, SLL, UniquePtr);
+using UMTE    = DEFINE_TEST_THUNK(Sequence, SLL, Unmanaged);
+using UPTE    = DEFINE_TEST_THUNK(Sequence, SLL, UniquePtr);
 using SUPDDTE = DEFINE_TEST_THUNK(Sequence, SLL, StdUniquePtrDefaultDeleter);
 using SUPCDTE = DEFINE_TEST_THUNK(Sequence, SLL, StdUniquePtrCustomDeleter);
-using RPTE = DEFINE_TEST_THUNK(Sequence, SLL, RefPtr);
+using RPTE    = DEFINE_TEST_THUNK(Sequence, SLL, RefPtr);
 
-// clang-format off
-BEGIN_TEST_CASE(single_linked_list_tests)
 //////////////////////////////////////////
 // General container specific tests.
 //////////////////////////////////////////
-RUN_NAMED_TEST("Clear (unmanaged)",                         UMTE::ClearTest)
-RUN_NAMED_TEST("Clear (unique)",                            UPTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr)",                         SUPDDTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr<Del>)",                    SUPCDTE::ClearTest)
-RUN_NAMED_TEST("Clear (RefPtr)",                            RPTE::ClearTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    Clear)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    Clear)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, Clear)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, Clear)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    Clear)
 
-RUN_NAMED_TEST("ClearUnsafe (unmanaged)",                   UMTE::ClearUnsafeTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    ClearUnsafe)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ClearUnsafe (unique)",                      UPTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr)",                   SUPDDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr<Del>)",              SUPCDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (RefPtr)",                      RPTE::ClearUnsafeTest)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    ClearUnsafe)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, ClearUnsafe)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, ClearUnsafe)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    ClearUnsafe)
 #endif
 
-RUN_NAMED_TEST("IsEmpty (unmanaged)",                       UMTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (unique)",                          UPTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr)",                       SUPDDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr<Del>)",                  SUPCDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (RefPtr)",                          RPTE::IsEmptyTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    IsEmpty)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    IsEmpty)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, IsEmpty)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, IsEmpty)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    IsEmpty)
 
-RUN_NAMED_TEST("Iterate (unmanaged)",                       UMTE::IterateTest)
-RUN_NAMED_TEST("Iterate (unique)",                          UPTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr)",                       SUPDDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr<Del>)",                  SUPCDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (RefPtr)",                          RPTE::IterateTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    Iterate)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    Iterate)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, Iterate)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, Iterate)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    Iterate)
 
 // SinglyLinkedLists cannot perform direct erase operations, nor can they erase
 // using an iterator.
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("IterErase (unmanaged)",                     UMTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (unique)",                        UPTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr)",                     SUPDDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr<Del>)",                SUPCDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (RefPtr)",                        RPTE::IterEraseTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    IterErase)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    IterErase)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, IterErase)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, IterErase)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    IterErase)
 
-RUN_NAMED_TEST("DirectErase (unmanaged)",                   UMTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (unique)",                      UPTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr)",                   SUPDDTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr<Del>)",              SUPCDTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (RefPtr)",                      RPTE::DirectEraseTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    DirectErase)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    DirectErase)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, DirectErase)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, DirectErase)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    DirectErase)
 #endif
 
-RUN_NAMED_TEST("MakeIterator (unmanaged)",                  UMTE::MakeIteratorTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("MakeIterator (unique)",                     UPTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr)",                  SUPDDTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr<Del>)",             SUPCDTE::MakeIteratorTest)
-#endif
-RUN_NAMED_TEST("MakeIterator (RefPtr)",                     RPTE::MakeIteratorTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    MakeIterator)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    MakeIterator)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, MakeIterator)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, MakeIterator)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    MakeIterator)
 
 // SinglyLinkedLists cannot iterate backwards.
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ReverseIterErase (unmanaged)",              UMTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (unique)",                 UPTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr)",              SUPDDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr<Del>)",         SUPCDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (RefPtr)",                 RPTE::ReverseIterEraseTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    ReverseIterErase)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    ReverseIterErase)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, ReverseIterErase)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, ReverseIterErase)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    ReverseIterErase)
 
-RUN_NAMED_TEST("ReverseIterate (unmanaged)",                UMTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (unique)",                   UPTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr)",                SUPDDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr<Del>)",           SUPCDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (RefPtr)",                   RPTE::ReverseIterateTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    ReverseIterate)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    ReverseIterate)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, ReverseIterate)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, ReverseIterate)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    ReverseIterate)
 #endif
 
-RUN_NAMED_TEST("Swap (unmanaged)",                          UMTE::SwapTest)
-RUN_NAMED_TEST("Swap (unique)",                             UPTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr)",                          SUPDDTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr<Del>)",                     SUPCDTE::SwapTest)
-RUN_NAMED_TEST("Swap (RefPtr)",                             RPTE::SwapTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    Swap)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    Swap)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, Swap)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, Swap)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    Swap)
 
-RUN_NAMED_TEST("Rvalue Ops (unmanaged)",                    UMTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (unique)",                       UPTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr)",                    SUPDDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr<Del>)",               SUPCDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (RefPtr)",                       RPTE::RvalueOpsTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    RvalueOps)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    RvalueOps)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, RvalueOps)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, RvalueOps)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    RvalueOps)
 
-RUN_NAMED_TEST("Scope (unique)",                            UPTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr)",                         SUPDDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr<Del>)",                    SUPCDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (RefPtr)",                            RPTE::ScopeTest)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    Scope)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, Scope)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, Scope)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    Scope)
 
-RUN_NAMED_TEST("TwoContainer (unmanaged)",                  UMTE::TwoContainerTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    TwoContainer)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("TwoContainer (unique)",                     UPTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr)",                  SUPDDTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr<Del>)",             SUPCDTE::TwoContainerTest)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    TwoContainer)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, TwoContainer)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, TwoContainer)
 #endif
-RUN_NAMED_TEST("TwoContainer (RefPtr)",                     RPTE::TwoContainerTest)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    TwoContainer)
 
-RUN_NAMED_TEST("ThreeContainerHelper (unmanaged)",          UMTE::ThreeContainerHelperTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    ThreeContainerHelper)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ThreeContainerHelper (unique)",             UPTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr)",          SUPDDTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr<Del>)",     SUPCDTE::ThreeContainerHelperTest)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    ThreeContainerHelper)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, ThreeContainerHelper)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, ThreeContainerHelper)
 #endif
-RUN_NAMED_TEST("ThreeContainerHelper (RefPtr)",             RPTE::ThreeContainerHelperTest)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    ThreeContainerHelper)
 
-RUN_NAMED_TEST("IterCopyPointer (unmanaged)",               UMTE::IterCopyPointerTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    IterCopyPointer)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("IterCopyPointer (unique)",                  UPTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr)",               SUPDDTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr<Del>)",          SUPCDTE::IterCopyPointerTest)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    IterCopyPointer)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, IterCopyPointer)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, IterCopyPointer)
 #endif
-RUN_NAMED_TEST("IterCopyPointer (RefPtr)",                  RPTE::IterCopyPointerTest)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    IterCopyPointer)
 
-RUN_NAMED_TEST("EraseIf (unmanaged)",                       UMTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (unique)",                          UPTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr)",                       SUPDDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr<Del>)",                  SUPCDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (RefPtr)",                          RPTE::EraseIfTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    EraseIf)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    EraseIf)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, EraseIf)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, EraseIf)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    EraseIf)
 
-RUN_NAMED_TEST("FindIf (unmanaged)",                        UMTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (unique)",                           UPTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr)",                        SUPDDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr<Del>)",                   SUPCDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (RefPtr)",                           RPTE::FindIfTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    FindIf)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    FindIf)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, FindIf)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, FindIf)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    FindIf)
 
 //////////////////////////////////////////
 // Sequence container specific tests.
 //////////////////////////////////////////
-RUN_NAMED_TEST("PushFront (unmanaged)",                     UMTE::PushFrontTest)
-RUN_NAMED_TEST("PushFront (unique)",                        UPTE::PushFrontTest)
-RUN_NAMED_TEST("PushFront (std::uptr)",                     SUPDDTE::PushFrontTest)
-RUN_NAMED_TEST("PushFront (std::uptr<Del>)",                SUPCDTE::PushFrontTest)
-RUN_NAMED_TEST("PushFront (RefPtr)",                        RPTE::PushFrontTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    PushFront)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    PushFront)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, PushFront)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, PushFront)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    PushFront)
 
-RUN_NAMED_TEST("PopFront (unmanaged)",                      UMTE::PopFrontTest)
-RUN_NAMED_TEST("PopFront (unique)",                         UPTE::PopFrontTest)
-RUN_NAMED_TEST("PopFront (std::uptr)",                      SUPDDTE::PopFrontTest)
-RUN_NAMED_TEST("PopFront (std::uptr<Del>)",                 SUPCDTE::PopFrontTest)
-RUN_NAMED_TEST("PopFront (RefPtr)",                         RPTE::PopFrontTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    PopFront)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    PopFront)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, PopFront)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, PopFront)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    PopFront)
 
 // Singly linked lists cannot push/pop to/from the back
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("PushBack (unmanaged)",                     UMTE::PushBackTest)
-RUN_NAMED_TEST("PushBack (unique)",                        UPTE::PushBackTest)
-RUN_NAMED_TEST("PushBack (std::uptr)",                     SUPDDTE::PushBackTest)
-RUN_NAMED_TEST("PushBack (std::uptr<Del>)",                SUPCDTE::PushBackTest)
-RUN_NAMED_TEST("PushBack (RefPtr)",                        RPTE::PushBackTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    PushBack)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    PushBack)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, PushBack)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, PushBack)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    PushBack)
 
-RUN_NAMED_TEST("PopBack (unmanaged)",                      UMTE::PopBackTest)
-RUN_NAMED_TEST("PopBack (unique)",                         UPTE::PopBackTest)
-RUN_NAMED_TEST("PopBack (std::uptr)",                      SUPDDTE::PopBackTest)
-RUN_NAMED_TEST("PopBack (std::uptr<Del>)",                 SUPCDTE::PopBackTest)
-RUN_NAMED_TEST("PopBack (RefPtr)",                         RPTE::PopBackTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    PopBack)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    PopBack)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, PopBack)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, PopBack)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    PopBack)
 #endif
 
-RUN_NAMED_TEST("SeqIterate (unmanaged)",                   UMTE::SeqIterateTest)
-RUN_NAMED_TEST("SeqIterate (unique)",                      UPTE::SeqIterateTest)
-RUN_NAMED_TEST("SeqIterate (std::uptr)",                   SUPDDTE::SeqIterateTest)
-RUN_NAMED_TEST("SeqIterate (std::uptr<Del>)",              SUPCDTE::SeqIterateTest)
-RUN_NAMED_TEST("SeqIterate (RefPtr)",                      RPTE::SeqIterateTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    SeqIterate)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    SeqIterate)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, SeqIterate)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, SeqIterate)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    SeqIterate)
 
 // SinglyLinkedLists cannot iterate backwards.
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("SeqReverseIterate (unmanaged)",            UMTE::SeqReverseIterateTest)
-RUN_NAMED_TEST("SeqReverseIterate (unique)",               UPTE::SeqReverseIterateTest)
-RUN_NAMED_TEST("SeqReverseIterate (std::uptr)",            SUPDDTE::SeqReverseIterateTest)
-RUN_NAMED_TEST("SeqReverseIterate (std::uptr<Del>)",       SUPCDTE::SeqReverseIterateTest)
-RUN_NAMED_TEST("SeqReverseIterate (RefPtr)",               RPTE::SeqReverseIterateTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    SeqReverseIterate)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    SeqReverseIterate)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, SeqReverseIterate)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, SeqReverseIterate)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    SeqReverseIterate)
 #endif
 
-RUN_NAMED_TEST("EraseNext (unmanaged)",                    UMTE::EraseNextTest)
-RUN_NAMED_TEST("EraseNext (unique)",                       UPTE::EraseNextTest)
-RUN_NAMED_TEST("EraseNext (std::uptr)",                    SUPDDTE::EraseNextTest)
-RUN_NAMED_TEST("EraseNext (std::uptr<Del>)",               SUPCDTE::EraseNextTest)
-RUN_NAMED_TEST("EraseNext (RefPtr)",                       RPTE::EraseNextTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    EraseNext)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    EraseNext)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, EraseNext)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, EraseNext)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    EraseNext)
 
-RUN_NAMED_TEST("InsertAfter (unmanaged)",                  UMTE::InsertAfterTest)
-RUN_NAMED_TEST("InsertAfter (unique)",                     UPTE::InsertAfterTest)
-RUN_NAMED_TEST("InsertAfter (std::uptr)",                  SUPDDTE::InsertAfterTest)
-RUN_NAMED_TEST("InsertAfter (std::uptr<Del>)",             SUPCDTE::InsertAfterTest)
-RUN_NAMED_TEST("InsertAfter (RefPtr)",                     RPTE::InsertAfterTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    InsertAfter)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    InsertAfter)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, InsertAfter)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, InsertAfter)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    InsertAfter)
 
-// SinglyLinkedLists cannot perform inserts-bef            ore operations, either with an
+// SinglyLinkedLists cannot perform inserts-before operations, either with an
 // iterator or with a direct object reference.
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("Insert (unmanaged)",                        UMTE::InsertTest)
-RUN_NAMED_TEST("Insert (unique)",                           UPTE::InsertTest)
-RUN_NAMED_TEST("Insert (std::uptr)",                        SUPDDTE::InsertTest)
-RUN_NAMED_TEST("Insert (std::uptr<Del>)",                   SUPCDTE::InsertTest)
-RUN_NAMED_TEST("Insert (RefPtr)",                           RPTE::InsertTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    Insert)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    Insert)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, Insert)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, Insert)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    Insert)
 
-RUN_NAMED_TEST("DirectInsert (unmanaged)",                  UMTE::DirectInsertTest)
-RUN_NAMED_TEST("DirectInsert (unique)",                     UPTE::DirectInsertTest)
-RUN_NAMED_TEST("DirectInsert (std::uptr)",                  SUPDDTE::DirectInsertTest)
-RUN_NAMED_TEST("DirectInsert (std::uptr<Del>)",             SUPCDTE::DirectInsertTest)
-RUN_NAMED_TEST("DirectInsert (RefPtr)",                     RPTE::DirectInsertTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    DirectInsert)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    DirectInsert)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, DirectInsert)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, DirectInsert)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    DirectInsert)
 #endif
 
-// SinglyLinkedLists cannot perform splice oper            ations.
+// SinglyLinkedLists cannot perform splice operations.
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("Splice (unmanaged)",                        UMTE::SpliceTest)
-RUN_NAMED_TEST("Splice (unique)",                           UPTE::SpliceTest)
-RUN_NAMED_TEST("Splice (std::uptr)",                        SUPDDTE::SpliceTest)
-RUN_NAMED_TEST("Splice (std::uptr<Del>)",                   SUPCDTE::SpliceTest)
-RUN_NAMED_TEST("Splice (RefPtr)",                           RPTE::SpliceTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    Splice)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    Splice)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, Splice)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, Splice)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    Splice)
 #endif
 
-RUN_NAMED_TEST("ReplaceIfCopy (unmanaged)",                 UMTE::ReplaceIfCopyTest)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    ReplaceIfCopy)
 #if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ReplaceIfCopy (unique)",                    UPTE::ReplaceIfCopyTest)
-RUN_NAMED_TEST("ReplaceIfCopy (std::uptr)",                 SUPDDTE::ReplaceIfCopyTest)
-RUN_NAMED_TEST("ReplaceIfCopy (std::uptr<Del>)",            SUPCDTE::ReplaceIfCopyTest)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    ReplaceIfCopy)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, ReplaceIfCopy)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, ReplaceIfCopy)
 #endif
-RUN_NAMED_TEST("ReplaceIfCopy (RefPtr)",                    RPTE::ReplaceIfCopyTest)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    ReplaceIfCopy)
 
-RUN_NAMED_TEST("ReplaceIfMove (unmanaged)",                 UMTE::ReplaceIfMoveTest)
-RUN_NAMED_TEST("ReplaceIfMove (unique)",                    UPTE::ReplaceIfMoveTest)
-RUN_NAMED_TEST("ReplaceIfMove (std::uptr)",                 SUPDDTE::ReplaceIfMoveTest)
-RUN_NAMED_TEST("ReplaceIfMove (std::uptr<Del>)",            SUPCDTE::ReplaceIfMoveTest)
-RUN_NAMED_TEST("ReplaceIfMove (RefPtr)",                    RPTE::ReplaceIfMoveTest)
-
-END_TEST_CASE(single_linked_list_tests)
+RUN_ZXTEST(SinglyLinkedListTest, UMTE,    ReplaceIfMove)
+RUN_ZXTEST(SinglyLinkedListTest, UPTE,    ReplaceIfMove)
+RUN_ZXTEST(SinglyLinkedListTest, SUPDDTE, ReplaceIfMove)
+RUN_ZXTEST(SinglyLinkedListTest, SUPCDTE, ReplaceIfMove)
+RUN_ZXTEST(SinglyLinkedListTest, RPTE,    ReplaceIfMove)
 // clang-format on
 
 }  // namespace intrusive_containers
diff --git a/zircon/system/ulib/fbl/test/intrusive_wavl_tree_tests.cc b/zircon/system/ulib/fbl/test/intrusive_wavl_tree_tests.cc
index 6b7ada2..b76c953 100644
--- a/zircon/system/ulib/fbl/test/intrusive_wavl_tree_tests.cc
+++ b/zircon/system/ulib/fbl/test/intrusive_wavl_tree_tests.cc
@@ -3,12 +3,13 @@
 // found in the LICENSE file.
 
 #include <math.h>
+
+#include <fbl/intrusive_pointer_traits.h>
 #include <fbl/intrusive_wavl_tree.h>
 #include <fbl/tests/intrusive_containers/intrusive_wavl_tree_checker.h>
 #include <fbl/tests/intrusive_containers/ordered_associative_container_test_environment.h>
 #include <fbl/tests/intrusive_containers/test_thunks.h>
-#include <fbl/intrusive_pointer_traits.h>
-#include <unittest/unittest.h>
+#include <zxtest/zxtest.h>
 
 namespace fbl {
 namespace tests {
@@ -167,8 +168,7 @@
   static void RecordEraseDoubleRotation() { ++op_counts_.erase_double_rotations_; }
 
   template <typename TreeType>
-  static bool VerifyRankRule(const TreeType& tree, typename TreeType::RawPtrType node) {
-    BEGIN_TEST;
+  static void VerifyRankRule(const TreeType& tree, typename TreeType::RawPtrType node) {
     using NodeTraits = typename TreeType::NodeTraits;
 
     // Check the rank rule.  The rules for a WAVL tree are...
@@ -195,14 +195,10 @@
         ASSERT_GE(2, delta, "Right hand rank difference not on range [1, 2]");
       }
     }
-
-    END_TEST;
   }
 
   template <typename TreeType>
-  static bool VerifyBalance(const TreeType& tree, uint64_t depth) {
-    BEGIN_TEST;
-
+  static void VerifyBalance(const TreeType& tree, uint64_t depth) {
     // Compute the maximum expected depth.
     uint64_t max_depth = 0;
     if (tree.size()) {
@@ -238,8 +234,6 @@
     EXPECT_LE(total_erase_rotations, op_counts_.erase_ops_, "#erase_rotations must be <= #erases");
 
     EXPECT_GE(max_depth, depth);
-
-    END_TEST;
   }
 
  private:
@@ -297,26 +291,20 @@
 
 static constexpr size_t kBalanceTestSize = 2048;
 
-static bool DoBalanceTestInsert(BalanceTestTree& tree, BalanceTestObj* ptr) {
-  BEGIN_TEST;
-
+static void DoBalanceTestInsert(BalanceTestTree& tree, BalanceTestObj* ptr) {
   // The selected object should not be in the tree.
-  ASSERT_NONNULL(ptr);
+  ASSERT_NOT_NULL(ptr);
   ASSERT_FALSE(ptr->InContainer());
 
   // Put the object into the tree.  Assert that it succeeds, then
   // sanity check the tree.
   ASSERT_TRUE(tree.insert_or_find(BalanceTestObjPtr(ptr)));
-  ASSERT_TRUE(WAVLTreeChecker::SanityCheck(tree));
-
-  END_TEST;
+  ASSERT_NO_FAILURES(WAVLTreeChecker::SanityCheck(tree));
 }
 
-static bool DoBalanceTestErase(BalanceTestTree& tree, BalanceTestObj* ptr) {
-  BEGIN_TEST;
-
+static void DoBalanceTestErase(BalanceTestTree& tree, BalanceTestObj* ptr) {
   // The selected object should still be in the tree.
-  ASSERT_NONNULL(ptr);
+  ASSERT_NOT_NULL(ptr);
   ASSERT_TRUE(ptr->InContainer());
 
   // Erase should find the object and transfer its pointer back to us.
@@ -327,9 +315,7 @@
 
   // Run a full sanity check on the tree.  Its depth should be
   // consistent with a tree which has seen both inserts and erases.
-  ASSERT_TRUE(WAVLTreeChecker::SanityCheck(tree));
-
-  END_TEST;
+  ASSERT_NO_FAILURES(WAVLTreeChecker::SanityCheck(tree));
 }
 
 static void ShuffleEraseDeck(const unique_ptr<BalanceTestObj[]>& objects,
@@ -343,9 +329,182 @@
   }
 }
 
-static bool WAVLBalanceTest() {
-  BEGIN_TEST;
+// clang-format off
+//////////////////////////////////////////
+// General container specific tests.
+//////////////////////////////////////////
+RUN_ZXTEST(WavlTreeTest, UMTE,     Clear)
+RUN_ZXTEST(WavlTreeTest, UPTE,     Clear)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  Clear)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  Clear)
+RUN_ZXTEST(WavlTreeTest, RPTE,     Clear)
 
+RUN_ZXTEST(WavlTreeTest, UMTE,     ClearUnsafe)
+#if TEST_WILL_NOT_COMPILE || 0
+RUN_ZXTEST(WavlTreeTest, UPTE,     ClearUnsafe)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  ClearUnsafe)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  ClearUnsafe)
+RUN_ZXTEST(WavlTreeTest, RPTE,     ClearUnsafe)
+#endif
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     IsEmpty)
+RUN_ZXTEST(WavlTreeTest, UPTE,     IsEmpty)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  IsEmpty)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  IsEmpty)
+RUN_ZXTEST(WavlTreeTest, RPTE,     IsEmpty)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     Iterate)
+RUN_ZXTEST(WavlTreeTest, UPTE,     Iterate)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  Iterate)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  Iterate)
+RUN_ZXTEST(WavlTreeTest, RPTE,     Iterate)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     IterErase)
+RUN_ZXTEST(WavlTreeTest, UPTE,     IterErase)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  IterErase)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  IterErase)
+RUN_ZXTEST(WavlTreeTest, RPTE,     IterErase)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     DirectErase)
+RUN_ZXTEST(WavlTreeTest, UPTE,     DirectErase)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  DirectErase)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  DirectErase)
+RUN_ZXTEST(WavlTreeTest, RPTE,     DirectErase)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     MakeIterator)
+RUN_ZXTEST(WavlTreeTest, UPTE,     MakeIterator)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  MakeIterator)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  MakeIterator)
+RUN_ZXTEST(WavlTreeTest, RPTE,     MakeIterator)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     ReverseIterErase)
+RUN_ZXTEST(WavlTreeTest, UPTE,     ReverseIterErase)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  ReverseIterErase)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  ReverseIterErase)
+RUN_ZXTEST(WavlTreeTest, RPTE,     ReverseIterErase)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     ReverseIterate)
+RUN_ZXTEST(WavlTreeTest, UPTE,     ReverseIterate)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  ReverseIterate)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  ReverseIterate)
+RUN_ZXTEST(WavlTreeTest, RPTE,     ReverseIterate)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     Swap)
+RUN_ZXTEST(WavlTreeTest, UPTE,     Swap)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  Swap)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  Swap)
+RUN_ZXTEST(WavlTreeTest, RPTE,     Swap)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     RvalueOps)
+RUN_ZXTEST(WavlTreeTest, UPTE,     RvalueOps)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  RvalueOps)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  RvalueOps)
+RUN_ZXTEST(WavlTreeTest, RPTE,     RvalueOps)
+
+RUN_ZXTEST(WavlTreeTest, UPTE,     Scope)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  Scope)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  Scope)
+RUN_ZXTEST(WavlTreeTest, RPTE,     Scope)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     TwoContainer)
+#if TEST_WILL_NOT_COMPILE || 0
+RUN_ZXTEST(WavlTreeTest, UPTE,     TwoContainer)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  TwoContainer)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  TwoContainer)
+#endif
+RUN_ZXTEST(WavlTreeTest, RPTE,     TwoContainer)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     ThreeContainerHelper)
+#if TEST_WILL_NOT_COMPILE || 0
+RUN_ZXTEST(WavlTreeTest, UPTE,     ThreeContainerHelper)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  ThreeContainerHelper)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  ThreeContainerHelper)
+#endif
+RUN_ZXTEST(WavlTreeTest, RPTE,     ThreeContainerHelper)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     IterCopyPointer)
+#if TEST_WILL_NOT_COMPILE || 0
+RUN_ZXTEST(WavlTreeTest, UPTE,     IterCopyPointer)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  IterCopyPointer)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  IterCopyPointer)
+#endif
+RUN_ZXTEST(WavlTreeTest, RPTE,     IterCopyPointer)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     EraseIf)
+RUN_ZXTEST(WavlTreeTest, UPTE,     EraseIf)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  EraseIf)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  EraseIf)
+RUN_ZXTEST(WavlTreeTest, RPTE,     EraseIf)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     FindIf)
+RUN_ZXTEST(WavlTreeTest, UPTE,     FindIf)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  FindIf)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  FindIf)
+RUN_ZXTEST(WavlTreeTest, RPTE,     FindIf)
+
+//////////////////////////////////////////
+// Associative container specific tests.
+//////////////////////////////////////////
+RUN_ZXTEST(WavlTreeTest, UMTE,     InsertByKey)
+RUN_ZXTEST(WavlTreeTest, UPTE,     InsertByKey)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  InsertByKey)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  InsertByKey)
+RUN_ZXTEST(WavlTreeTest, RPTE,     InsertByKey)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     FindByKey)
+RUN_ZXTEST(WavlTreeTest, UPTE,     FindByKey)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  FindByKey)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  FindByKey)
+RUN_ZXTEST(WavlTreeTest, RPTE,     FindByKey)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     EraseByKey)
+RUN_ZXTEST(WavlTreeTest, UPTE,     EraseByKey)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  EraseByKey)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  EraseByKey)
+RUN_ZXTEST(WavlTreeTest, RPTE,     EraseByKey)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     InsertOrFind)
+RUN_ZXTEST(WavlTreeTest, UPTE,     InsertOrFind)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  InsertOrFind)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  InsertOrFind)
+RUN_ZXTEST(WavlTreeTest, RPTE,     InsertOrFind)
+
+RUN_ZXTEST(WavlTreeTest, UMTE,     InsertOrReplace)
+RUN_ZXTEST(WavlTreeTest, UPTE,     InsertOrReplace)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE,  InsertOrReplace)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE,  InsertOrReplace)
+RUN_ZXTEST(WavlTreeTest, RPTE,     InsertOrReplace)
+
+////////////////////////////////////////////////
+// OrderedAssociative container specific tests.
+////////////////////////////////////////////////
+RUN_ZXTEST(WavlTreeTest, UMTE, OrderedIter)
+RUN_ZXTEST(WavlTreeTest, UPTE, OrderedIter)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE, OrderedIter)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE, OrderedIter)
+RUN_ZXTEST(WavlTreeTest, RPTE, OrderedIter)
+
+RUN_ZXTEST(WavlTreeTest, UMTE, OrderedReverseIter)
+RUN_ZXTEST(WavlTreeTest, UPTE, OrderedReverseIter)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE, OrderedReverseIter)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE, OrderedReverseIter)
+RUN_ZXTEST(WavlTreeTest, RPTE, OrderedReverseIter)
+
+RUN_ZXTEST(WavlTreeTest, UMTE, UpperBound)
+RUN_ZXTEST(WavlTreeTest, UPTE, UpperBound)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE, UpperBound)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE, UpperBound)
+RUN_ZXTEST(WavlTreeTest, RPTE, UpperBound)
+
+RUN_ZXTEST(WavlTreeTest, UMTE, LowerBound)
+RUN_ZXTEST(WavlTreeTest, UPTE, LowerBound)
+RUN_ZXTEST(WavlTreeTest, SUPDDTE, LowerBound)
+RUN_ZXTEST(WavlTreeTest, SUPCDTE, LowerBound)
+RUN_ZXTEST(WavlTreeTest, RPTE, LowerBound)
+
+// The balance test is a pretty heavy test.  Only enable it when asked to do so.
+#if FBL_TEST_ENABLE_WAVL_TREE_BALANCE_TEST
+TEST(WavlTreeTest, Balance) {
   WAVLBalanceTestObserver::OpCounts op_counts;
 
   // Declare these in a specific order (object pointer first) so that the tree
@@ -399,27 +558,31 @@
     // Place each object into the tree, then perform a full sanity check on
     // the tree.  If anything goes wrong, just abort the test.  If we keep
     // going, we are just going to get an unmanageable amt of errors.
-    for (size_t i = 0; i < kBalanceTestSize; ++i)
-      ASSERT_TRUE(DoBalanceTestInsert(tree, &objects[i]));
+    for (size_t i = 0; i < kBalanceTestSize; ++i) {
+      ASSERT_NO_FAILURES(DoBalanceTestInsert(tree, &objects[i]));
+    }
 
     // Shuffle the erase deck.
     ShuffleEraseDeck(objects, rng);
 
     // Erase half of the elements in the tree.
-    for (size_t i = 0; i < (kBalanceTestSize >> 1); ++i)
-      ASSERT_TRUE(DoBalanceTestErase(tree, objects[i].EraseDeckPtr()));
+    for (size_t i = 0; i < (kBalanceTestSize >> 1); ++i) {
+      ASSERT_NO_FAILURES(DoBalanceTestErase(tree, objects[i].EraseDeckPtr()));
+    }
 
     // Put the elements back so that we have inserted some elements into a
     // non-empty tree which has seen erase operations.
-    for (size_t i = 0; i < (kBalanceTestSize >> 1); ++i)
-      ASSERT_TRUE(DoBalanceTestInsert(tree, objects[i].EraseDeckPtr()));
+    for (size_t i = 0; i < (kBalanceTestSize >> 1); ++i) {
+      ASSERT_NO_FAILURES(DoBalanceTestInsert(tree, objects[i].EraseDeckPtr()));
+    }
 
     // Shuffle the erase deck again.
     ShuffleEraseDeck(objects, rng);
 
     // Now erase every element from the tree.
-    for (size_t i = 0; i < kBalanceTestSize; ++i)
-      ASSERT_TRUE(DoBalanceTestErase(tree, objects[i].EraseDeckPtr()));
+    for (size_t i = 0; i < kBalanceTestSize; ++i) {
+      ASSERT_NO_FAILURES(DoBalanceTestErase(tree, objects[i].EraseDeckPtr()));
+    }
 
     ASSERT_EQ(0u, tree.size());
 
@@ -436,197 +599,9 @@
   EXPECT_LT(0u, op_counts.erase_demotes_, "Insufficient test coverage!");
   EXPECT_LT(0u, op_counts.erase_rotations_, "Insufficient test coverage!");
   EXPECT_LT(0u, op_counts.erase_double_rotations_, "Insufficient test coverage!");
-
-  END_TEST;
 }
-
-// clang-format off
-BEGIN_TEST_CASE(wavl_tree_tests)
-//////////////////////////////////////////
-// General container specific tests.
-//////////////////////////////////////////
-RUN_NAMED_TEST("Clear (unmanaged)",                        UMTE::ClearTest)
-RUN_NAMED_TEST("Clear (unique)",                           UPTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr)",                        SUPDDTE::ClearTest)
-RUN_NAMED_TEST("Clear (std::uptr<Del>)",                   SUPCDTE::ClearTest)
-RUN_NAMED_TEST("Clear (RefPtr)",                           RPTE::ClearTest)
-
-RUN_NAMED_TEST("ClearUnsafe (unmanaged)",                  UMTE::ClearUnsafeTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ClearUnsafe (unique)",                     UPTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr)",                  SUPDDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (std::uptr<Del>)",             SUPCDTE::ClearUnsafeTest)
-RUN_NAMED_TEST("ClearUnsafe (RefPtr)",                     RPTE::ClearUnsafeTest)
 #endif
 
-RUN_NAMED_TEST("IsEmpty (unmanaged)",                      UMTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (unique)",                         UPTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr)",                      SUPDDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (std::uptr<Del>)",                 SUPCDTE::IsEmptyTest)
-RUN_NAMED_TEST("IsEmpty (RefPtr)",                         RPTE::IsEmptyTest)
-
-RUN_NAMED_TEST("Iterate (unmanaged)",                      UMTE::IterateTest)
-RUN_NAMED_TEST("Iterate (unique)",                         UPTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr)",                      SUPDDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (std::uptr<Del>)",                 SUPCDTE::IterateTest)
-RUN_NAMED_TEST("Iterate (RefPtr)",                         RPTE::IterateTest)
-
-RUN_NAMED_TEST("IterErase (unmanaged)",                    UMTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (unique)",                       UPTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr)",                    SUPDDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (std::uptr<Del>)",               SUPCDTE::IterEraseTest)
-RUN_NAMED_TEST("IterErase (RefPtr)",                       RPTE::IterEraseTest)
-
-RUN_NAMED_TEST("DirectErase (unmanaged)",                  UMTE::DirectEraseTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("DirectErase (unique)",                     UPTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr)",                  SUPDDTE::DirectEraseTest)
-RUN_NAMED_TEST("DirectErase (std::uptr<Del>)",             SUPCDTE::DirectEraseTest)
-#endif
-RUN_NAMED_TEST("DirectErase (RefPtr)",                     RPTE::DirectEraseTest)
-
-RUN_NAMED_TEST("MakeIterator (unmanaged)",                 UMTE::MakeIteratorTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("MakeIterator (unique)",                    UPTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr)",                 SUPDDTE::MakeIteratorTest)
-RUN_NAMED_TEST("MakeIterator (std::uptr<Del>)",            SUPCDTE::MakeIteratorTest)
-#endif
-RUN_NAMED_TEST("MakeIterator (RefPtr)",                    RPTE::MakeIteratorTest)
-
-RUN_NAMED_TEST("ReverseIterErase (unmanaged)",             UMTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (unique)",                UPTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr)",             SUPDDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (std::uptr<Del>)",        SUPCDTE::ReverseIterEraseTest)
-RUN_NAMED_TEST("ReverseIterErase (RefPtr)",                RPTE::ReverseIterEraseTest)
-
-RUN_NAMED_TEST("ReverseIterate (unmanaged)",               UMTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (unique)",                  UPTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr)",               SUPDDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (std::uptr<Del>)",          SUPCDTE::ReverseIterateTest)
-RUN_NAMED_TEST("ReverseIterate (RefPtr)",                  RPTE::ReverseIterateTest)
-
-RUN_NAMED_TEST("Swap (unmanaged)",                         UMTE::SwapTest)
-RUN_NAMED_TEST("Swap (unique)",                            UPTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr)",                         SUPDDTE::SwapTest)
-RUN_NAMED_TEST("Swap (std::uptr<Del>)",                    SUPCDTE::SwapTest)
-RUN_NAMED_TEST("Swap (RefPtr)",                            RPTE::SwapTest)
-
-RUN_NAMED_TEST("Rvalue Ops (unmanaged)",                   UMTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (unique)",                      UPTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr)",                   SUPDDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (std::uptr<Del>)",              SUPCDTE::RvalueOpsTest)
-RUN_NAMED_TEST("Rvalue Ops (RefPtr)",                      RPTE::RvalueOpsTest)
-
-RUN_NAMED_TEST("Scope (unique)",                           UPTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr)",                        SUPDDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (std::uptr<Del>)",                   SUPCDTE::ScopeTest)
-RUN_NAMED_TEST("Scope (RefPtr)",                           RPTE::ScopeTest)
-
-RUN_NAMED_TEST("TwoContainer (unmanaged)",                 UMTE::TwoContainerTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("TwoContainer (unique)",                    UPTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr)",                 SUPDDTE::TwoContainerTest)
-RUN_NAMED_TEST("TwoContainer (std::uptr<Del>)",            SUPCDTE::TwoContainerTest)
-#endif
-RUN_NAMED_TEST("TwoContainer (RefPtr)",                    RPTE::TwoContainerTest)
-
-RUN_NAMED_TEST("ThreeContainerHelper (unmanaged)",         UMTE::ThreeContainerHelperTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("ThreeContainerHelper (unique)",            UPTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr)",         SUPDDTE::ThreeContainerHelperTest)
-RUN_NAMED_TEST("ThreeContainerHelper (std::uptr<Del>)",    SUPCDTE::ThreeContainerHelperTest)
-#endif
-RUN_NAMED_TEST("ThreeContainerHelper (RefPtr)",            RPTE::ThreeContainerHelperTest)
-
-RUN_NAMED_TEST("IterCopyPointer (unmanaged)",              UMTE::IterCopyPointerTest)
-#if TEST_WILL_NOT_COMPILE || 0
-RUN_NAMED_TEST("IterCopyPointer (unique)",                 UPTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr)",              SUPDDTE::IterCopyPointerTest)
-RUN_NAMED_TEST("IterCopyPointer (std::uptr<Del>)",         SUPCDTE::IterCopyPointerTest)
-#endif
-RUN_NAMED_TEST("IterCopyPointer (RefPtr)",                 RPTE::IterCopyPointerTest)
-
-RUN_NAMED_TEST("EraseIf (unmanaged)",                      UMTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (unique)",                         UPTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr)",                      SUPDDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (std::uptr<Del>)",                 SUPCDTE::EraseIfTest)
-RUN_NAMED_TEST("EraseIf (RefPtr)",                         RPTE::EraseIfTest)
-
-RUN_NAMED_TEST("FindIf (unmanaged)",                       UMTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (unique)",                          UPTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr)",                       SUPDDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (std::uptr<Del>)",                  SUPCDTE::FindIfTest)
-RUN_NAMED_TEST("FindIf (RefPtr)",                          RPTE::FindIfTest)
-
-//////////////////////////////////////////
-// Associative container specific tests.
-//////////////////////////////////////////
-RUN_NAMED_TEST("InsertByKey (unmanaged)",                  UMTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (unique)",                     UPTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (std::uptr)",                  SUPDDTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (std::uptr<Del>)",             SUPCDTE::InsertByKeyTest)
-RUN_NAMED_TEST("InsertByKey (RefPtr)",                     RPTE::InsertByKeyTest)
-
-RUN_NAMED_TEST("FindByKey (unmanaged)",                    UMTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (unique)",                       UPTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (std::uptr)",                    SUPDDTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (std::uptr<Del>)",               SUPCDTE::FindByKeyTest)
-RUN_NAMED_TEST("FindByKey (RefPtr)",                       RPTE::FindByKeyTest)
-
-RUN_NAMED_TEST("EraseByKey (unmanaged)",                   UMTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (unique)",                      UPTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (std::uptr)",                   SUPDDTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (std::uptr<Del>)",              SUPCDTE::EraseByKeyTest)
-RUN_NAMED_TEST("EraseByKey (RefPtr)",                      RPTE::EraseByKeyTest)
-
-RUN_NAMED_TEST("InsertOrFind (unmanaged)",                 UMTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (unique)",                    UPTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (std::uptr)",                 SUPDDTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (std::uptr<Del>)",            SUPCDTE::InsertOrFindTest)
-RUN_NAMED_TEST("InsertOrFind (RefPtr)",                    RPTE::InsertOrFindTest)
-
-RUN_NAMED_TEST("InsertOrReplace (unmanaged)",              UMTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (unique)",                 UPTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (std::uptr)",              SUPDDTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (std::uptr<Del>)",         SUPCDTE::InsertOrReplaceTest)
-RUN_NAMED_TEST("InsertOrReplace (RefPtr)",                 RPTE::InsertOrReplaceTest)
-
-////////////////////////////////////////////////
-// OrderedAssociative container specific tests.
-////////////////////////////////////////////////
-RUN_NAMED_TEST("OrderedIter (unmanaged)",                  UMTE::OrderedIterTest)
-RUN_NAMED_TEST("OrderedIter (unique)",                     UPTE::OrderedIterTest)
-RUN_NAMED_TEST("OrderedIter (std::uptr)",                  SUPDDTE::OrderedIterTest)
-RUN_NAMED_TEST("OrderedIter (std::uptr<Del>)",             SUPCDTE::OrderedIterTest)
-RUN_NAMED_TEST("OrderedIter (RefPtr)",                     RPTE::OrderedIterTest)
-
-RUN_NAMED_TEST("OrderedReverseIter (unmanaged)",           UMTE::OrderedReverseIterTest)
-RUN_NAMED_TEST("OrderedReverseIter (unique)",              UPTE::OrderedReverseIterTest)
-RUN_NAMED_TEST("OrderedReverseIter (std::uptr)",           SUPDDTE::OrderedReverseIterTest)
-RUN_NAMED_TEST("OrderedReverseIter (std::uptr<Del>)",      SUPCDTE::OrderedReverseIterTest)
-RUN_NAMED_TEST("OrderedReverseIter (RefPtr)",              RPTE::OrderedReverseIterTest)
-
-RUN_NAMED_TEST("UpperBound (unmanaged)",                   UMTE::UpperBoundTest)
-RUN_NAMED_TEST("UpperBound (unique)",                      UPTE::UpperBoundTest)
-RUN_NAMED_TEST("UpperBound (std::uptr)",                   SUPDDTE::UpperBoundTest)
-RUN_NAMED_TEST("UpperBound (std::uptr<Del>)",              SUPCDTE::UpperBoundTest)
-RUN_NAMED_TEST("UpperBound (RefPtr)",                      RPTE::UpperBoundTest)
-
-RUN_NAMED_TEST("LowerBound (unmanaged)",                   UMTE::LowerBoundTest)
-RUN_NAMED_TEST("LowerBound (unique)",                      UPTE::LowerBoundTest)
-RUN_NAMED_TEST("LowerBound (std::uptr)",                   SUPDDTE::LowerBoundTest)
-RUN_NAMED_TEST("LowerBound (std::uptr<Del>)",              SUPCDTE::LowerBoundTest)
-RUN_NAMED_TEST("LowerBound (RefPtr)",                      RPTE::LowerBoundTest)
-
-////////////////////////////
-// WAVLTree specific tests.
-////////////////////////////
-// ZX-2230: This can take more than 20 seconds in CI, so mark it medium.
-RUN_NAMED_TEST_MEDIUM("BalanceTest", WAVLBalanceTest)
-
-END_TEST_CASE(wavl_tree_tests)
-// clang-format on
-
 }  // namespace intrusive_containers
 }  // namespace tests
 }  // namespace fbl