import std/private/miscdollars import std/strutils template flakyAssert*(cond: untyped, msg = "", notifySuccess = true) = ## API to deal with flaky or failing tests. This avoids disabling entire tests ## altogether so that at least the parts that are working are kept being ## tested. This also avoids making CI fail periodically for tests known to ## be flaky. Finally, for known failures, passing `notifySuccess = true` will ## log that the test succeeded, which may indicate that a bug was fixed ## "by accident" and should be looked into. const info = instantiationInfo(-1, true) const expr = astToStr(cond) if cond and not notifySuccess: discard # silent success else: var msg2 = "" toLocation(msg2, info.filename, info.line, info.column) if cond: # a flaky test is failing, we still report it but we don't fail CI msg2.add " FLAKY_SUCCESS " else: # a previously failing test is now passing, a pre-existing bug might've been # fixed by accidend msg2.add " FLAKY_FAILURE " msg2.add $expr & " " & msg echo msg2 proc greedyOrderedSubsetLines*(lhs, rhs: string): bool = ## returns true if each stripped line in `lhs` appears in rhs, using a greedy matching. let rhs = rhs.strip var currentPos = 0 for line in lhs.strip.splitLines: currentPos = rhs.find(line.strip, currentPos) if currentPos < 0: return false return true