@@ -1044,6 +1044,187 @@ def test_param_with_continuations(self):
10441044 p = function .parameters ['follow_symlinks' ]
10451045 self .assertEqual (True , p .default )
10461046
1047+ def test_param_default_none (self ):
1048+ function = self .parse_function (r"""
1049+ module test
1050+ test.func
1051+ obj: object = None
1052+ str: str(accept={str, NoneType}) = None
1053+ buf: Py_buffer(accept={str, buffer, NoneType}) = None
1054+ """ )
1055+ p = function .parameters ['obj' ]
1056+ self .assertIs (p .default , None )
1057+ self .assertEqual (p .converter .py_default , 'None' )
1058+ self .assertEqual (p .converter .c_default , 'Py_None' )
1059+
1060+ p = function .parameters ['str' ]
1061+ self .assertIs (p .default , None )
1062+ self .assertEqual (p .converter .py_default , 'None' )
1063+ self .assertEqual (p .converter .c_default , 'NULL' )
1064+
1065+ p = function .parameters ['buf' ]
1066+ self .assertIs (p .default , None )
1067+ self .assertEqual (p .converter .py_default , 'None' )
1068+ self .assertEqual (p .converter .c_default , '{NULL, NULL}' )
1069+
1070+ def test_param_default_null (self ):
1071+ function = self .parse_function (r"""
1072+ module test
1073+ test.func
1074+ obj: object = NULL
1075+ str: str = NULL
1076+ buf: Py_buffer = NULL
1077+ fsencoded: unicode_fs_encoded = NULL
1078+ fsdecoded: unicode_fs_decoded = NULL
1079+ """ )
1080+ p = function .parameters ['obj' ]
1081+ self .assertIs (p .default , NULL )
1082+ self .assertEqual (p .converter .py_default , '<unrepresentable>' )
1083+ self .assertEqual (p .converter .c_default , 'NULL' )
1084+
1085+ p = function .parameters ['str' ]
1086+ self .assertIs (p .default , NULL )
1087+ self .assertEqual (p .converter .py_default , '<unrepresentable>' )
1088+ self .assertEqual (p .converter .c_default , 'NULL' )
1089+
1090+ p = function .parameters ['buf' ]
1091+ self .assertIs (p .default , NULL )
1092+ self .assertEqual (p .converter .py_default , '<unrepresentable>' )
1093+ self .assertEqual (p .converter .c_default , '{NULL, NULL}' )
1094+
1095+ p = function .parameters ['fsencoded' ]
1096+ self .assertIs (p .default , NULL )
1097+ self .assertEqual (p .converter .py_default , '<unrepresentable>' )
1098+ self .assertEqual (p .converter .c_default , 'NULL' )
1099+
1100+ p = function .parameters ['fsdecoded' ]
1101+ self .assertIs (p .default , NULL )
1102+ self .assertEqual (p .converter .py_default , '<unrepresentable>' )
1103+ self .assertEqual (p .converter .c_default , 'NULL' )
1104+
1105+ def test_param_default_str_literal (self ):
1106+ function = self .parse_function (r"""
1107+ module test
1108+ test.func
1109+ str: str = ' \t\n\r\v\f\xa0'
1110+ buf: Py_buffer(accept={str, buffer}) = ' \t\n\r\v\f\xa0'
1111+ """ )
1112+ p = function .parameters ['str' ]
1113+ self .assertEqual (p .default , ' \t \n \r \v \f \xa0 ' )
1114+ self .assertEqual (p .converter .py_default , r"' \t\n\r\x0b\x0c\xa0'" )
1115+ self .assertEqual (p .converter .c_default , r'" \t\n\r\v\f\u00a0"' )
1116+
1117+ p = function .parameters ['buf' ]
1118+ self .assertEqual (p .default , ' \t \n \r \v \f \xa0 ' )
1119+ self .assertEqual (p .converter .py_default , r"' \t\n\r\x0b\x0c\xa0'" )
1120+ self .assertEqual (p .converter .c_default ,
1121+ r'{.buf = " \t\n\r\v\f\302\240", .obj = NULL, .len = 8}' )
1122+
1123+ def test_param_default_bytes_literal (self ):
1124+ function = self .parse_function (r"""
1125+ module test
1126+ test.func
1127+ str: str(accept={robuffer}) = b' \t\n\r\v\f\xa0'
1128+ buf: Py_buffer = b' \t\n\r\v\f\xa0'
1129+ """ )
1130+ p = function .parameters ['str' ]
1131+ self .assertEqual (p .default , b' \t \n \r \v \f \xa0 ' )
1132+ self .assertEqual (p .converter .py_default , r"b' \t\n\r\x0b\x0c\xa0'" )
1133+ self .assertEqual (p .converter .c_default , r'" \t\n\r\v\f\240"' )
1134+
1135+ p = function .parameters ['buf' ]
1136+ self .assertEqual (p .default , b' \t \n \r \v \f \xa0 ' )
1137+ self .assertEqual (p .converter .py_default , r"b' \t\n\r\x0b\x0c\xa0'" )
1138+ self .assertEqual (p .converter .c_default ,
1139+ r'{.buf = " \t\n\r\v\f\240", .obj = NULL, .len = 7}' )
1140+
1141+ def test_param_default_byte_literal (self ):
1142+ function = self .parse_function (r"""
1143+ module test
1144+ test.func
1145+ zero: char = b'\0'
1146+ one: char = b'\1'
1147+ lf: char = b'\n'
1148+ nbsp: char = b'\xa0'
1149+ """ )
1150+ p = function .parameters ['zero' ]
1151+ self .assertEqual (p .default , b'\0 ' )
1152+ self .assertEqual (p .converter .py_default , r"b'\x00'" )
1153+ self .assertEqual (p .converter .c_default , r"'\0'" )
1154+
1155+ p = function .parameters ['one' ]
1156+ self .assertEqual (p .default , b'\1 ' )
1157+ self .assertEqual (p .converter .py_default , r"b'\x01'" )
1158+ self .assertEqual (p .converter .c_default , r"'\001'" )
1159+
1160+ p = function .parameters ['lf' ]
1161+ self .assertEqual (p .default , b'\n ' )
1162+ self .assertEqual (p .converter .py_default , r"b'\n'" )
1163+ self .assertEqual (p .converter .c_default , r"'\n'" )
1164+
1165+ p = function .parameters ['nbsp' ]
1166+ self .assertEqual (p .default , b'\xa0 ' )
1167+ self .assertEqual (p .converter .py_default , r"b'\xa0'" )
1168+ self .assertEqual (p .converter .c_default , r"'\240'" )
1169+
1170+ def test_param_default_unicode_char (self ):
1171+ function = self .parse_function (r"""
1172+ module test
1173+ test.func
1174+ zero: int(accept={str}) = '\0'
1175+ one: int(accept={str}) = '\1'
1176+ lf: int(accept={str}) = '\n'
1177+ nbsp: int(accept={str}) = '\xa0'
1178+ snake: int(accept={str}) = '\U0001f40d'
1179+ """ )
1180+ p = function .parameters ['zero' ]
1181+ self .assertEqual (p .default , '\0 ' )
1182+ self .assertEqual (p .converter .py_default , r"'\x00'" )
1183+ self .assertEqual (p .converter .c_default , '0' )
1184+
1185+ p = function .parameters ['one' ]
1186+ self .assertEqual (p .default , '\1 ' )
1187+ self .assertEqual (p .converter .py_default , r"'\x01'" )
1188+ self .assertEqual (p .converter .c_default , '0x01' )
1189+
1190+ p = function .parameters ['lf' ]
1191+ self .assertEqual (p .default , '\n ' )
1192+ self .assertEqual (p .converter .py_default , r"'\n'" )
1193+ self .assertEqual (p .converter .c_default , r"'\n'" )
1194+
1195+ p = function .parameters ['nbsp' ]
1196+ self .assertEqual (p .default , '\xa0 ' )
1197+ self .assertEqual (p .converter .py_default , r"'\xa0'" )
1198+ self .assertEqual (p .converter .c_default , '0xa0' )
1199+
1200+ p = function .parameters ['snake' ]
1201+ self .assertEqual (p .default , '\U0001f40d ' )
1202+ self .assertEqual (p .converter .py_default , "'\U0001f40d '" )
1203+ self .assertEqual (p .converter .c_default , '0x1f40d' )
1204+
1205+ def test_param_default_bool (self ):
1206+ function = self .parse_function (r"""
1207+ module test
1208+ test.func
1209+ bool: bool = True
1210+ intbool: bool(accept={int}) = True
1211+ intbool2: bool(accept={int}) = 2
1212+ """ )
1213+ p = function .parameters ['bool' ]
1214+ self .assertIs (p .default , True )
1215+ self .assertEqual (p .converter .py_default , 'True' )
1216+ self .assertEqual (p .converter .c_default , '1' )
1217+
1218+ p = function .parameters ['intbool' ]
1219+ self .assertIs (p .default , True )
1220+ self .assertEqual (p .converter .py_default , 'True' )
1221+ self .assertEqual (p .converter .c_default , '1' )
1222+
1223+ p = function .parameters ['intbool2' ]
1224+ self .assertEqual (p .default , 2 )
1225+ self .assertEqual (p .converter .py_default , '2' )
1226+ self .assertEqual (p .converter .c_default , '2' )
1227+
10471228 def test_param_default_expr_named_constant (self ):
10481229 function = self .parse_function ("""
10491230 module os
@@ -4209,6 +4390,56 @@ def test_format_escape(self):
42094390 out = libclinic .format_escape (line )
42104391 self .assertEqual (out , expected )
42114392
4393+ def test_c_bytes_repr (self ):
4394+ c_bytes_repr = libclinic .c_bytes_repr
4395+ self .assertEqual (c_bytes_repr (b'' ), '""' )
4396+ self .assertEqual (c_bytes_repr (b'abc' ), '"abc"' )
4397+ self .assertEqual (c_bytes_repr (b'\a \b \f \n \r \t \v ' ), r'"\a\b\f\n\r\t\v"' )
4398+ self .assertEqual (c_bytes_repr (b' \0 \x7f ' ), r'" \000\177"' )
4399+ self .assertEqual (c_bytes_repr (b'"' ), r'"\""' )
4400+ self .assertEqual (c_bytes_repr (b"'" ), r'''"'"''' )
4401+ self .assertEqual (c_bytes_repr (b'\\ ' ), r'"\\"' )
4402+ self .assertEqual (c_bytes_repr (b'??/' ), r'"?\?/"' )
4403+ self .assertEqual (c_bytes_repr (b'???/' ), r'"?\?\?/"' )
4404+ self .assertEqual (c_bytes_repr (b'/*****/ /*/ */*' ), r'"/\*****\/ /\*\/ *\/\*"' )
4405+ self .assertEqual (c_bytes_repr (b'\xa0 ' ), r'"\240"' )
4406+ self .assertEqual (c_bytes_repr (b'\xff ' ), r'"\377"' )
4407+
4408+ def test_c_str_repr (self ):
4409+ c_str_repr = libclinic .c_str_repr
4410+ self .assertEqual (c_str_repr ('' ), '""' )
4411+ self .assertEqual (c_str_repr ('abc' ), '"abc"' )
4412+ self .assertEqual (c_str_repr ('\a \b \f \n \r \t \v ' ), r'"\a\b\f\n\r\t\v"' )
4413+ self .assertEqual (c_str_repr (' \0 \x7f ' ), r'" \000\177"' )
4414+ self .assertEqual (c_str_repr ('"' ), r'"\""' )
4415+ self .assertEqual (c_str_repr ("'" ), r'''"'"''' )
4416+ self .assertEqual (c_str_repr ('\\ ' ), r'"\\"' )
4417+ self .assertEqual (c_str_repr ('??/' ), r'"?\?/"' )
4418+ self .assertEqual (c_str_repr ('???/' ), r'"?\?\?/"' )
4419+ self .assertEqual (c_str_repr ('/*****/ /*/ */*' ), r'"/\*****\/ /\*\/ *\/\*"' )
4420+ self .assertEqual (c_str_repr ('\xa0 ' ), r'"\u00a0"' )
4421+ self .assertEqual (c_str_repr ('\xff ' ), r'"\u00ff"' )
4422+ self .assertEqual (c_str_repr ('\u20ac ' ), r'"\u20ac"' )
4423+ self .assertEqual (c_str_repr ('\U0001f40d ' ), r'"\U0001f40d"' )
4424+
4425+ def test_c_unichar_repr (self ):
4426+ c_unichar_repr = libclinic .c_unichar_repr
4427+ self .assertEqual (c_unichar_repr ('a' ), "'a'" )
4428+ self .assertEqual (c_unichar_repr ('\n ' ), r"'\n'" )
4429+ self .assertEqual (c_unichar_repr ('\b ' ), r"'\b'" )
4430+ self .assertEqual (c_unichar_repr ('\0 ' ), '0' )
4431+ self .assertEqual (c_unichar_repr ('\1 ' ), '0x01' )
4432+ self .assertEqual (c_unichar_repr ('\x7f ' ), '0x7f' )
4433+ self .assertEqual (c_unichar_repr (' ' ), "' '" )
4434+ self .assertEqual (c_unichar_repr ('"' ), """'"'""" )
4435+ self .assertEqual (c_unichar_repr ("'" ), r"'\''" )
4436+ self .assertEqual (c_unichar_repr ('\\ ' ), r"'\\'" )
4437+ self .assertEqual (c_unichar_repr ('?' ), "'?'" )
4438+ self .assertEqual (c_unichar_repr ('\xa0 ' ), '0xa0' )
4439+ self .assertEqual (c_unichar_repr ('\xff ' ), '0xff' )
4440+ self .assertEqual (c_unichar_repr ('\u20ac ' ), '0x20ac' )
4441+ self .assertEqual (c_unichar_repr ('\U0001f40d ' ), '0x1f40d' )
4442+
42124443 def test_indent_all_lines (self ):
42134444 # Blank lines are expected to be unchanged.
42144445 self .assertEqual (libclinic .indent_all_lines ("" , prefix = "bar" ), "" )
0 commit comments