From 34a3d40d18ef4ff73c629e38738068fe509e3c6c Mon Sep 17 00:00:00 2001 From: Florent Date: Thu, 2 Mar 2017 11:48:41 +0100 Subject: fixes #5444 - nre.findIter keeps searching when no match is possible (#5453) --- tests/stdlib/nre/find.nim | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'tests') diff --git a/tests/stdlib/nre/find.nim b/tests/stdlib/nre/find.nim index 94fdd0bc1..116d2111c 100644 --- a/tests/stdlib/nre/find.nim +++ b/tests/stdlib/nre/find.nim @@ -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) -- cgit 1.4.1-2-gfad0