item++;
        return false;
      });

      expect(tup, equal_to(std::make_tuple(2, 3)));
    });
  });

  subsuite<>(_, "tuple_joined()", [](auto &_) {
    using detail::tuple_joined;

    _.test("empty tuple", []() {
      std::tuple<> tup;

      std::ostringstream os1;
      os1 << tuple_joined(tup, [](auto &&) { return "bad"; });
      expect(os1.str(), equal_to(""));

      std::ostringstream os2;
      os2 << tuple_joined(tup, [](auto &&) { return "bad"; }, " and ");
      expect(os2.str(), equal_to(""));
    });

    _.test("1-tuple", []() {
      std::tuple<int> tup(1);

      std::ostringstream os1;
      os1 << tuple_joined(tup, [](auto &&item) { return item; });
      expect(os1.str(), equal_to("1"));

      std::ostringstream os2;