comparison tests/run-tests.py @ 31829:4eec2f04a672

run-tests: support per-line conditional output in tests Duplicating entire tests just because the output is different is both error prone and can make the tests harder to read. This harnesses the existing '(?)' infrastructure, both to improve readability, and because it seemed like the path of least resistance. The form is: $ test_cmd output (hghave-feature !) # required if hghave.has_feature(), else optional out2 (no-hghave-feature2 !) # req if not hghave.has_feature2(), else optional I originally extended the '(?)' syntax. For example, this: 2 r4/.hg/cache/checkisexec (execbit ?) pretty naturally reads as "checkisexec, if execbit". In some ways though, this inverts the meaning of '?'. For '(?)', the line is purely optional. In the example, it is mandatory iff execbit. Otherwise, it is carried forward as optional, to preserve the test output. I tried it the other way, (listing 'no-exec' in the example), but that is too confusing to read. Kostia suggested using '!', and that seems fine.
author Matt Harbison <matt_harbison@yahoo.com>
date Wed, 05 Apr 2017 23:17:27 -0400
parents 220d4bffd23e
children cc70c6dbac30
comparison
equal deleted inserted replaced
31828:ff60498211f3 31829:4eec2f04a672
495 495
496 # Bytes that break XML even in a CDATA block: control characters 0-31 496 # Bytes that break XML even in a CDATA block: control characters 0-31
497 # sans \t, \n and \r 497 # sans \t, \n and \r
498 CDATA_EVIL = re.compile(br"[\000-\010\013\014\016-\037]") 498 CDATA_EVIL = re.compile(br"[\000-\010\013\014\016-\037]")
499 499
500 # Match feature conditionalized output lines in the form, capturing the feature
501 # list in group 2, and the preceeding line output in group 1:
502 #
503 # output..output (feature !)\n
504 optline = re.compile(b'(.+) \((.+?) !\)\n$')
505
500 def cdatasafe(data): 506 def cdatasafe(data):
501 """Make a string safe to include in a CDATA block. 507 """Make a string safe to include in a CDATA block.
502 508
503 Certain control characters are illegal in a CDATA block, and 509 Certain control characters are illegal in a CDATA block, and
504 there's no way to include a ]]> in a CDATA either. This function 510 there's no way to include a ]]> in a CDATA either. This function
1269 log('\ninfo, unknown linematch result: %r\n' % r) 1275 log('\ninfo, unknown linematch result: %r\n' % r)
1270 r = False 1276 r = False
1271 if r: 1277 if r:
1272 els.pop(i) 1278 els.pop(i)
1273 break 1279 break
1274 if el and el.endswith(b" (?)\n"): 1280 if el:
1275 optional.append(i) 1281 if el.endswith(b" (?)\n"):
1282 optional.append(i)
1283 else:
1284 m = optline.match(el)
1285 if m:
1286 conditions = [c for c in m.group(2).split(' ')]
1287
1288 if self._hghave(conditions)[0]:
1289 lout = el
1290 else:
1291 optional.append(i)
1292
1276 i += 1 1293 i += 1
1277 1294
1278 if r: 1295 if r:
1279 if r == "retry": 1296 if r == "retry":
1280 continue 1297 continue
1296 break 1313 break
1297 else: 1314 else:
1298 # clean up any optional leftovers 1315 # clean up any optional leftovers
1299 while expected.get(pos, None): 1316 while expected.get(pos, None):
1300 el = expected[pos].pop(0) 1317 el = expected[pos].pop(0)
1301 if el and not el.endswith(b" (?)\n"): 1318 if el:
1302 break 1319 if (not optline.match(el)
1320 and not el.endswith(b" (?)\n")):
1321 break
1303 postout.append(b' ' + el) 1322 postout.append(b' ' + el)
1304 1323
1305 if lcmd: 1324 if lcmd:
1306 # Add on last return code. 1325 # Add on last return code.
1307 ret = int(lcmd.split()[1]) 1326 ret = int(lcmd.split()[1])
1369 return True 1388 return True
1370 if el: 1389 if el:
1371 if el.endswith(b" (?)\n"): 1390 if el.endswith(b" (?)\n"):
1372 retry = "retry" 1391 retry = "retry"
1373 el = el[:-5] + b"\n" 1392 el = el[:-5] + b"\n"
1393 else:
1394 m = optline.match(el)
1395 if m:
1396 el = m.group(1) + b"\n"
1397 retry = "retry"
1398
1374 if el.endswith(b" (esc)\n"): 1399 if el.endswith(b" (esc)\n"):
1375 if PYTHON3: 1400 if PYTHON3:
1376 el = el[:-7].decode('unicode_escape') + '\n' 1401 el = el[:-7].decode('unicode_escape') + '\n'
1377 el = el.encode('utf-8') 1402 el = el.encode('utf-8')
1378 else: 1403 else: