@@ -652,3 +652,56 @@ struct lvalue_qualified_begin_end {
652
652
TEST (ranges_test, lvalue_qualified_begin_end) {
653
653
EXPECT_EQ (fmt::format (" {}" , lvalue_qualified_begin_end{}), " [1, 2, 3, 4, 5]" );
654
654
}
655
+
656
+ #if !defined(__cpp_lib_ranges) || __cpp_lib_ranges <= 202106L
657
+ # define ENABLE_INPUT_RANGE_JOIN_TEST 0
658
+ #elif FMT_CLANG_VERSION
659
+ # if FMT_CLANG_VERSION > 1500
660
+ # define ENABLE_INPUT_RANGE_JOIN_TEST 1
661
+ # else
662
+ # define ENABLE_INPUT_RANGE_JOIN_TEST 0
663
+ # endif
664
+ #else
665
+ # define ENABLE_INPUT_RANGE_JOIN_TEST 1
666
+ #endif
667
+
668
+ #if ENABLE_INPUT_RANGE_JOIN_TEST
669
+ TEST (ranges_test, input_range_join) {
670
+ std::istringstream iss (" 1 2 3 4 5" );
671
+ auto view = std::views::istream<std::string>(iss);
672
+ auto joined_view = fmt::join (view.begin (), view.end (), " , " );
673
+ EXPECT_EQ (" 1, 2, 3, 4, 5" , fmt::format (" {}" , std::move (joined_view)));
674
+ }
675
+
676
+ TEST (ranges_test, input_range_join_overload) {
677
+ std::istringstream iss (" 1 2 3 4 5" );
678
+ EXPECT_EQ (
679
+ " 1.2.3.4.5" ,
680
+ fmt::format (" {}" , fmt::join (std::views::istream<std::string>(iss), " ." )));
681
+ }
682
+ #endif
683
+
684
+ TEST (ranges_test, std_istream_iterator_join) {
685
+ std::istringstream iss (" 1 2 3 4 5" );
686
+ std::istream_iterator<int > first{iss};
687
+ std::istream_iterator<int > last{};
688
+ auto joined_view = fmt::join (first, last, " , " );
689
+ EXPECT_EQ (" 1, 2, 3, 4, 5" , fmt::format (" {}" , std::move (joined_view)));
690
+ }
691
+
692
+ TEST (ranges_test, movable_only_istream_iter_join) {
693
+ // Mirrors c++20 std::ranges::basic_istream_view::iterator
694
+ struct UncopyableIstreamIter : std::istream_iterator<int > {
695
+ explicit UncopyableIstreamIter (std::istringstream& iss)
696
+ : std::istream_iterator<int>{iss} {}
697
+ UncopyableIstreamIter (const UncopyableIstreamIter&) = delete ;
698
+ UncopyableIstreamIter (UncopyableIstreamIter&&) = default ;
699
+ };
700
+ static_assert (!std::is_copy_constructible<UncopyableIstreamIter>::value, " " );
701
+
702
+ std::istringstream iss (" 1 2 3 4 5" );
703
+ UncopyableIstreamIter first{iss};
704
+ std::istream_iterator<int > last{};
705
+ auto joined_view = fmt::join (std::move (first), last, " , " );
706
+ EXPECT_EQ (" 1, 2, 3, 4, 5" , fmt::format (" {}" , std::move (joined_view)));
707
+ }
0 commit comments