fixes #5444 - nre.findIter keeps searching when no match is possible (#5453)

This commit is contained in:
Florent 2017-03-02 11:48:41 +01:00 • committed by Andreas Rumpf
commit 34a3d40d18
2 changed files with 25 additions and 6 deletions

View file

@ -1,6 +1,7 @@
import unittest, sequtils
import nre except toSeq
import optional_nonstrict
import times, strutils
suite "find":
test "find text":
@ -25,3 +26,21 @@ suite "find":
check("word word".findAll(re"\b") == @["", "", "", ""])
check("word\r\lword".findAll(re"(*ANYCRLF)(?m)$") == @["", ""])
check("слово слово".findAll(re"(*U)\b") == @["", "", "", ""])
test "bail early":
## we expect nothing to be found and we should be bailing out early which means that
## the timing difference between searching in small and large data should be well
## within a tolerance area
const tolerance = 0.0001
var smallData = repeat("url.sequence = \"http://whatever.com/jwhrejrhrjrhrjhrrjhrjrhrjrh\"", 10)
var largeData = repeat("url.sequence = \"http://whatever.com/jwhrejrhrjrhrjhrrjhrjrhrjrh\"", 1000000)
var start = cpuTime()
check(largeData.findAll(re"url.*? = '(.*?)'") == newSeq[string]())
var stop = cpuTime()
var elapsedLarge = stop - start
start = cpuTime()
check(smallData.findAll(re"url.*? = '(.*?)'") == newSeq[string]())
stop = cpuTime()
var elapsedSmall = stop - start
var difference = elapsedLarge - elapsedSmall
check(difference < tolerance)