@@ -134,7 +134,8 @@ constexpr const char *s_bad_precision_position =
134
134
" Position of precision parameter must be an integral type" ;
135
135
constexpr const char *s_bad_locale =
136
136
" Locale-specific form may only be used for numeric and boolean types" ;
137
- constexpr const char *s_bad_user_defined = s_unclosed_string;
137
+ constexpr const char *s_bad_user_defined =
138
+ " Nested replacement fields are not allowed in user-defined formatters" ;
138
139
constexpr const char *s_bad_character = " Character types must be formatted with {} or {:cbBodxX}" ;
139
140
constexpr const char *s_bad_string = " String types must be formatted with {} or {:s}" ;
140
141
constexpr const char *s_bad_pointer = " Pointer types must be formatted with {} or {:p}" ;
@@ -461,13 +462,6 @@ CATCH_TEMPLATE_TEST_CASE(
461
462
test_format (make_format (FMT (" {}" ), b), specifier);
462
463
}
463
464
464
- CATCH_SECTION (" User-defined types may be formatted without presentation type" )
465
- {
466
- Specifier specifier {};
467
- test_format (make_format (FMT (" {}" ), g), specifier);
468
- test_format (make_format (FMT (" {}" ), u), specifier);
469
- }
470
-
471
465
CATCH_SECTION (" Presentation type may be set (character)" )
472
466
{
473
467
Specifier specifier {};
@@ -648,9 +642,17 @@ CATCH_TEMPLATE_TEST_CASE(
648
642
test_format (make_format (FMT (" {1:F}" ), f, f), specifier);
649
643
}
650
644
645
+ CATCH_SECTION (" User-defined types may have any formatting options" )
646
+ {
647
+ Specifier specifier {};
648
+ test_format (make_format (FMT (" {}" ), g), specifier);
649
+ test_format (make_format (FMT (" {:g}" ), g), specifier);
650
+ test_format (make_format (FMT (" {:abcdefghijklmnop}" ), g), specifier);
651
+ }
652
+
651
653
CATCH_SECTION (" Specifiers track their size in the format string" )
652
654
{
653
- auto format = make_format (FMT (" ab {0} cd {1:d} ef {2:#0x }" ), 1 , 2 , 3 );
655
+ auto format = make_format (FMT (" ab {0} cd {1:d} ef {2:abcdefghijklmnop }" ), 1 , 2 , u );
654
656
CATCH_CHECK_FALSE (format.context ().has_error ());
655
657
656
658
auto specifier1 = format.next_specifier ();
@@ -663,15 +665,15 @@ CATCH_TEMPLATE_TEST_CASE(
663
665
664
666
auto specifier3 = format.next_specifier ();
665
667
CATCH_REQUIRE (specifier3);
666
- CATCH_CHECK (specifier3->m_size == 7 );
668
+ CATCH_CHECK (specifier3->m_size == 20 );
667
669
668
670
CATCH_CHECK_FALSE (format.next_specifier ());
669
671
}
670
672
671
673
CATCH_SECTION (" Specifiers track their parsing index in the format string" )
672
674
{
673
675
{
674
- auto format = make_format (FMT (" ab {0} cd {1:d} ef {002:#0x }" ), 1 , 2 , 3 );
676
+ auto format = make_format (FMT (" ab {0} cd {1:d} ef {002:abcdefghijklmnop }" ), 1 , 2 , u );
675
677
CATCH_CHECK_FALSE (format.context ().has_error ());
676
678
677
679
auto specifier1 = format.next_specifier ();
@@ -689,7 +691,7 @@ CATCH_TEMPLATE_TEST_CASE(
689
691
CATCH_CHECK_FALSE (format.next_specifier ());
690
692
}
691
693
{
692
- auto format = make_format (FMT (" ab {} cd {:d } ef {:#0x }" ), 1 , 2 , 3 );
694
+ auto format = make_format (FMT (" ab {} cd {:abcdefghijklmnop } ef {:d }" ), 1 , u, 2 );
693
695
CATCH_CHECK_FALSE (format.context ().has_error ());
694
696
695
697
auto specifier1 = format.next_specifier ();
@@ -702,7 +704,7 @@ CATCH_TEMPLATE_TEST_CASE(
702
704
703
705
auto specifier3 = format.next_specifier ();
704
706
CATCH_REQUIRE (specifier3);
705
- CATCH_CHECK (specifier3->m_parse_index == 19 );
707
+ CATCH_CHECK (specifier3->m_parse_index == 34 );
706
708
707
709
CATCH_CHECK_FALSE (format.next_specifier ());
708
710
}
@@ -729,12 +731,13 @@ CATCH_TEMPLATE_TEST_CASE(
729
731
constexpr const int i = 1 ;
730
732
constexpr const float f = 3 .14f ;
731
733
constexpr const bool b = true ;
732
- constexpr const UserFormattedEnum u = UserFormattedEnum::One;
733
734
734
735
CATCH_SECTION (" Cannot parse single opening brace" )
735
736
{
736
737
test_error (make_format (FMT (" {" ), 1 ), s_unclosed_string);
737
738
test_error (make_format (FMT (" {:" ), 1 ), s_unclosed_string);
739
+ test_error (make_format (FMT (" {" ), g), s_unclosed_string);
740
+ test_error (make_format (FMT (" {:" ), g), s_unclosed_string);
738
741
}
739
742
740
743
CATCH_SECTION (" Cannot parse single closing brace" )
@@ -824,7 +827,6 @@ CATCH_TEMPLATE_TEST_CASE(
824
827
{
825
828
test_error (make_format (FMT (" {:#d}" ), i), s_bad_alternate_form);
826
829
test_error (make_format (FMT (" {:#}" ), s), s_bad_alternate_form);
827
- test_error (make_format (FMT (" {:#}" ), g), s_bad_user_defined);
828
830
}
829
831
830
832
CATCH_SECTION (" Zero-padding only valid for numeric types" )
@@ -920,26 +922,21 @@ CATCH_TEMPLATE_TEST_CASE(
920
922
921
923
CATCH_SECTION (" Precision type mismatch (character)" )
922
924
{
923
- test_error (make_format (FMT (" {:c}" ), g), s_bad_user_defined);
924
- test_error (make_format (FMT (" {:c}" ), u), s_bad_user_defined);
925
925
test_error (make_format (FMT (" {:c}" ), s), s_bad_string);
926
- test_error (make_format (FMT (" {:c}" ), &g ), s_bad_pointer);
926
+ test_error (make_format (FMT (" {:c}" ), &i ), s_bad_pointer);
927
927
test_error (make_format (FMT (" {:c}" ), f), s_bad_float);
928
928
}
929
929
930
930
CATCH_SECTION (" Precision type mismatch (string)" )
931
931
{
932
- test_error (make_format (FMT (" {:c}" ), g), s_bad_user_defined);
933
- test_error (make_format (FMT (" {:c}" ), u), s_bad_user_defined);
934
932
test_error (make_format (FMT (" {:s}" ), c), s_bad_character);
935
- test_error (make_format (FMT (" {:s}" ), &g ), s_bad_pointer);
933
+ test_error (make_format (FMT (" {:s}" ), &i ), s_bad_pointer);
936
934
test_error (make_format (FMT (" {:s}" ), i), s_bad_integer);
937
935
test_error (make_format (FMT (" {:s}" ), f), s_bad_float);
938
936
}
939
937
940
938
CATCH_SECTION (" Precision type mismatch (pointer)" )
941
939
{
942
- test_error (make_format (FMT (" {:p}" ), g), s_bad_user_defined);
943
940
test_error (make_format (FMT (" {:p}" ), c), s_bad_character);
944
941
test_error (make_format (FMT (" {:p}" ), i), s_bad_integer);
945
942
test_error (make_format (FMT (" {:p}" ), f), s_bad_float);
@@ -948,123 +945,96 @@ CATCH_TEMPLATE_TEST_CASE(
948
945
949
946
CATCH_SECTION (" Precision type mismatch (binary)" )
950
947
{
951
- test_error (make_format (FMT (" {:b}" ), g), s_bad_user_defined);
952
- test_error (make_format (FMT (" {:b}" ), u), s_bad_user_defined);
953
948
test_error (make_format (FMT (" {:b}" ), s), s_bad_string);
954
- test_error (make_format (FMT (" {:b}" ), &g ), s_bad_pointer);
949
+ test_error (make_format (FMT (" {:b}" ), &i ), s_bad_pointer);
955
950
test_error (make_format (FMT (" {:b}" ), f), s_bad_float);
956
951
957
- test_error (make_format (FMT (" {:B}" ), g), s_bad_user_defined);
958
952
test_error (make_format (FMT (" {:B}" ), s), s_bad_string);
959
- test_error (make_format (FMT (" {:B}" ), &g ), s_bad_pointer);
953
+ test_error (make_format (FMT (" {:B}" ), &i ), s_bad_pointer);
960
954
test_error (make_format (FMT (" {:B}" ), f), s_bad_float);
961
955
}
962
956
963
957
CATCH_SECTION (" Precision type mismatch (octal)" )
964
958
{
965
- test_error (make_format (FMT (" {:o}" ), g), s_bad_user_defined);
966
- test_error (make_format (FMT (" {:o}" ), u), s_bad_user_defined);
967
959
test_error (make_format (FMT (" {:o}" ), s), s_bad_string);
968
- test_error (make_format (FMT (" {:o}" ), &g ), s_bad_pointer);
960
+ test_error (make_format (FMT (" {:o}" ), &i ), s_bad_pointer);
969
961
test_error (make_format (FMT (" {:o}" ), f), s_bad_float);
970
962
}
971
963
972
964
CATCH_SECTION (" Precision type mismatch (decimal)" )
973
965
{
974
- test_error (make_format (FMT (" {:d}" ), g), s_bad_user_defined);
975
- test_error (make_format (FMT (" {:d}" ), u), s_bad_user_defined);
976
966
test_error (make_format (FMT (" {:d}" ), s), s_bad_string);
977
- test_error (make_format (FMT (" {:d}" ), &g ), s_bad_pointer);
967
+ test_error (make_format (FMT (" {:d}" ), &i ), s_bad_pointer);
978
968
test_error (make_format (FMT (" {:d}" ), f), s_bad_float);
979
969
}
980
970
981
971
CATCH_SECTION (" Precision type mismatch (hex)" )
982
972
{
983
- test_error (make_format (FMT (" {:x}" ), g), s_bad_user_defined);
984
- test_error (make_format (FMT (" {:x}" ), u), s_bad_user_defined);
985
973
test_error (make_format (FMT (" {:x}" ), s), s_bad_string);
986
- test_error (make_format (FMT (" {:x}" ), &g ), s_bad_pointer);
974
+ test_error (make_format (FMT (" {:x}" ), &i ), s_bad_pointer);
987
975
test_error (make_format (FMT (" {:x}" ), f), s_bad_float);
988
976
989
- test_error (make_format (FMT (" {:X}" ), g), s_bad_user_defined);
990
- test_error (make_format (FMT (" {:X}" ), u), s_bad_user_defined);
991
977
test_error (make_format (FMT (" {:X}" ), s), s_bad_string);
992
- test_error (make_format (FMT (" {:X}" ), &g ), s_bad_pointer);
978
+ test_error (make_format (FMT (" {:X}" ), &i ), s_bad_pointer);
993
979
test_error (make_format (FMT (" {:X}" ), f), s_bad_float);
994
980
}
995
981
996
982
CATCH_SECTION (" Precision type mismatch (hexfloat)" )
997
983
{
998
- test_error (make_format (FMT (" {:a}" ), g), s_bad_user_defined);
999
- test_error (make_format (FMT (" {:a}" ), u), s_bad_user_defined);
1000
984
test_error (make_format (FMT (" {:a}" ), c), s_bad_character);
1001
985
test_error (make_format (FMT (" {:a}" ), s), s_bad_string);
1002
- test_error (make_format (FMT (" {:a}" ), &g ), s_bad_pointer);
986
+ test_error (make_format (FMT (" {:a}" ), &i ), s_bad_pointer);
1003
987
test_error (make_format (FMT (" {:a}" ), i), s_bad_integer);
1004
988
test_error (make_format (FMT (" {:a}" ), b), s_bad_bool);
1005
989
1006
- test_error (make_format (FMT (" {:A}" ), g), s_bad_user_defined);
1007
- test_error (make_format (FMT (" {:A}" ), u), s_bad_user_defined);
1008
990
test_error (make_format (FMT (" {:A}" ), c), s_bad_character);
1009
991
test_error (make_format (FMT (" {:A}" ), s), s_bad_string);
1010
- test_error (make_format (FMT (" {:A}" ), &g ), s_bad_pointer);
992
+ test_error (make_format (FMT (" {:A}" ), &i ), s_bad_pointer);
1011
993
test_error (make_format (FMT (" {:A}" ), i), s_bad_integer);
1012
994
test_error (make_format (FMT (" {:A}" ), b), s_bad_bool);
1013
995
}
1014
996
1015
997
CATCH_SECTION (" Precision type mismatch (scientific)" )
1016
998
{
1017
- test_error (make_format (FMT (" {:e}" ), g), s_bad_user_defined);
1018
- test_error (make_format (FMT (" {:e}" ), u), s_bad_user_defined);
1019
999
test_error (make_format (FMT (" {:e}" ), c), s_bad_character);
1020
1000
test_error (make_format (FMT (" {:e}" ), s), s_bad_string);
1021
- test_error (make_format (FMT (" {:e}" ), &g ), s_bad_pointer);
1001
+ test_error (make_format (FMT (" {:e}" ), &i ), s_bad_pointer);
1022
1002
test_error (make_format (FMT (" {:e}" ), i), s_bad_integer);
1023
1003
test_error (make_format (FMT (" {:e}" ), b), s_bad_bool);
1024
1004
1025
- test_error (make_format (FMT (" {:E}" ), g), s_bad_user_defined);
1026
- test_error (make_format (FMT (" {:E}" ), u), s_bad_user_defined);
1027
1005
test_error (make_format (FMT (" {:E}" ), c), s_bad_character);
1028
1006
test_error (make_format (FMT (" {:E}" ), s), s_bad_string);
1029
- test_error (make_format (FMT (" {:E}" ), &g ), s_bad_pointer);
1007
+ test_error (make_format (FMT (" {:E}" ), &i ), s_bad_pointer);
1030
1008
test_error (make_format (FMT (" {:E}" ), i), s_bad_integer);
1031
1009
test_error (make_format (FMT (" {:E}" ), b), s_bad_bool);
1032
1010
}
1033
1011
1034
1012
CATCH_SECTION (" Precision type mismatch (fixed)" )
1035
1013
{
1036
- test_error (make_format (FMT (" {:f}" ), g), s_bad_user_defined);
1037
- test_error (make_format (FMT (" {:f}" ), u), s_bad_user_defined);
1038
1014
test_error (make_format (FMT (" {:f}" ), c), s_bad_character);
1039
1015
test_error (make_format (FMT (" {:f}" ), s), s_bad_string);
1040
- test_error (make_format (FMT (" {:f}" ), &g ), s_bad_pointer);
1016
+ test_error (make_format (FMT (" {:f}" ), &i ), s_bad_pointer);
1041
1017
test_error (make_format (FMT (" {:f}" ), i), s_bad_integer);
1042
1018
test_error (make_format (FMT (" {:f}" ), b), s_bad_bool);
1043
1019
1044
- test_error (make_format (FMT (" {:F}" ), g), s_bad_user_defined);
1045
- test_error (make_format (FMT (" {:F}" ), u), s_bad_user_defined);
1046
1020
test_error (make_format (FMT (" {:F}" ), c), s_bad_character);
1047
1021
test_error (make_format (FMT (" {:F}" ), s), s_bad_string);
1048
- test_error (make_format (FMT (" {:F}" ), &g ), s_bad_pointer);
1022
+ test_error (make_format (FMT (" {:F}" ), &i ), s_bad_pointer);
1049
1023
test_error (make_format (FMT (" {:F}" ), i), s_bad_integer);
1050
1024
test_error (make_format (FMT (" {:F}" ), b), s_bad_bool);
1051
1025
}
1052
1026
1053
1027
CATCH_SECTION (" Precision type mismatch (general)" )
1054
1028
{
1055
- test_error (make_format (FMT (" {:g}" ), g), s_bad_user_defined);
1056
- test_error (make_format (FMT (" {:g}" ), u), s_bad_user_defined);
1057
1029
test_error (make_format (FMT (" {:g}" ), c), s_bad_character);
1058
1030
test_error (make_format (FMT (" {:g}" ), s), s_bad_string);
1059
- test_error (make_format (FMT (" {:g}" ), &g ), s_bad_pointer);
1031
+ test_error (make_format (FMT (" {:g}" ), &i ), s_bad_pointer);
1060
1032
test_error (make_format (FMT (" {:g}" ), i), s_bad_integer);
1061
1033
test_error (make_format (FMT (" {:g}" ), b), s_bad_bool);
1062
1034
1063
- test_error (make_format (FMT (" {:G}" ), g), s_bad_user_defined);
1064
- test_error (make_format (FMT (" {:G}" ), u), s_bad_user_defined);
1065
1035
test_error (make_format (FMT (" {:G}" ), c), s_bad_character);
1066
1036
test_error (make_format (FMT (" {:G}" ), s), s_bad_string);
1067
- test_error (make_format (FMT (" {:G}" ), &g ), s_bad_pointer);
1037
+ test_error (make_format (FMT (" {:G}" ), &i ), s_bad_pointer);
1068
1038
test_error (make_format (FMT (" {:G}" ), i), s_bad_integer);
1069
1039
test_error (make_format (FMT (" {:G}" ), b), s_bad_bool);
1070
1040
}
@@ -1073,7 +1043,7 @@ CATCH_TEMPLATE_TEST_CASE(
1073
1043
{
1074
1044
test_error (make_format (FMT (" {:cs}" ), c), s_unclosed_string);
1075
1045
test_error (make_format (FMT (" {:ss}" ), s), s_unclosed_string);
1076
- test_error (make_format (FMT (" {:ps}" ), &g ), s_unclosed_string);
1046
+ test_error (make_format (FMT (" {:ps}" ), &i ), s_unclosed_string);
1077
1047
test_error (make_format (FMT (" {:bs}" ), i), s_unclosed_string);
1078
1048
test_error (make_format (FMT (" {:Bs}" ), i), s_unclosed_string);
1079
1049
test_error (make_format (FMT (" {:os}" ), i), s_unclosed_string);
@@ -1130,6 +1100,11 @@ CATCH_TEMPLATE_TEST_CASE(
1130
1100
test_error (make_format (FMT (" {:Z}" ), i), s_unclosed_string);
1131
1101
}
1132
1102
1103
+ CATCH_SECTION (" User-defined types may not have nested replacement fields" )
1104
+ {
1105
+ test_error (make_format (FMT (" {:{}}" ), g), s_bad_user_defined);
1106
+ }
1107
+
1133
1108
CATCH_SECTION (" Cannot parse erroneous whitespace" )
1134
1109
{
1135
1110
test_error (make_format (FMT (" { 0:_^+#01.2Lf}" ), f), s_unclosed_string);
0 commit comments