summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
authorn5m <72841454+n5m@users.noreply.github.com>2021-06-02 14:19:30 +0000
committerGitHub <noreply@github.com>2021-06-02 16:19:30 +0200
commit4ee6eddad4a43e1ba6104e091f221f6295aece64 (patch)
tree73bac90598f02590e631d0fc22ecb97186ac626a /tests
parent6768f507fb432610ab401ba2a9902f54c1ef99a3 (diff)
downloadNim-4ee6eddad4a43e1ba6104e091f221f6295aece64.tar.gz
add string-string tests for find and rfind (#18137)
* add string-string tests for find and rfind

* remove duplicate test cases

* remove more redundant test cases
Diffstat (limited to 'tests')
-rw-r--r--tests/stdlib/tstrutils.nim101
1 files changed, 98 insertions, 3 deletions
diff --git a/tests/stdlib/tstrutils.nim b/tests/stdlib/tstrutils.nim
index 637661ba3..68ee5812b 100644
--- a/tests/stdlib/tstrutils.nim
+++ b/tests/stdlib/tstrutils.nim
@@ -221,6 +221,69 @@ template main() =
     doAssert "0123456789ABCDEFGH".find({'A'..'C'}, 5, 10) == 10
     doAssert "0123456789ABCDEFGH".find({'A'..'C'}, 5, 9) == -1
 
+    block:
+      const haystack: string = "ABCABABABABCAB"
+      doAssert haystack.len == 14
+
+      # only last argument
+      doAssert haystack.find("ABC") == 0
+      doAssert haystack.find("ABC", last=13) == 0 # after the second ABC
+      doAssert haystack.find("ABC", last=5) == 0 # before the second ABC
+
+      # only start argument
+      doAssert haystack.find("ABC", start=0) == 0
+      doAssert haystack.find("ABC", start=1) == 9
+      doAssert haystack.find("ABC", start=9) == 9
+      doAssert haystack.find("ABC", start=10) == -1
+
+      # both start and last arguments
+      doAssert haystack.find("ABC", start=0, last=14) == 0
+      doAssert haystack.find("ABC", start=0, last=13) == 0
+      doAssert haystack.find("ABC", start=0, last=12) == 0
+      doAssert haystack.find("ABC", start=1, last=13) == 9
+      doAssert haystack.find("ABC", start=1, last=12) == 9
+      doAssert haystack.find("ABC", start=1, last=11) == 9
+      doAssert haystack.find("ABC", start=1, last=10) == -1
+
+    doAssert "".find("/") == -1
+    doAssert "/".find("/") == 0
+    doAssert "/".find("//") == -1
+    doAssert "///".find("//", start=3) == -1
+
+    # searching for empty string
+    doAssert "".find("") == 0
+    doAssert "abc".find("") == 0
+    doAssert "abc".find("", start=1) == 1
+    doAssert "abc".find("", start=2) == 2
+    doAssert "abc".find("", start=3) == 3
+    doAssert "abc".find("", start=4) == -1
+    doAssert "abc".find("", start=400) == -1
+    doAssert "abc".find("", start=1, last=3) == 1
+    doAssert "abc".find("", start=1, last=2) == 1
+    doAssert "abc".find("", start=1, last=1) == 1
+    doAssert "abc".find("", start=1, last=0) == 1
+    doAssert "abc".find("", start=1, last = -1) == 1
+
+    # when last <= start, searching for non-empty string
+    block:
+      let last: int = -1
+      doAssert "abcd".find("ab", start=0, last=last) == -1
+      doAssert "abcd".find("ab", start=1, last=last) == -1
+      doAssert "abcd".find("bc", start=1, last=last) == -1
+      doAssert "abcd".find("bc", start=2, last=last) == -1
+    block:
+      let last: int = 0
+      doAssert "abcd".find("ab", start=0, last=last) == 0
+      doAssert "abcd".find("ab", start=1, last=last) == -1
+      doAssert "abcd".find("bc", start=1, last=last) == 1
+      doAssert "abcd".find("bc", start=2, last=last) == -1
+    block:
+      let last: int = 1
+      doAssert "abcd".find("ab", start=0, last=last) == 0
+      doAssert "abcd".find("ab", start=1, last=last) == -1
+      doAssert "abcd".find("bc", start=1, last=last) == -1
+      doAssert "abcd".find("bc", start=2, last=last) == -1
+
   block: # rfind
     doAssert "0123456789ABCDEFGAH".rfind('A') == 17
     doAssert "0123456789ABCDEFGAH".rfind('A', last=13) == 10
@@ -254,11 +317,8 @@ template main() =
 
       doAssert haystack.rfind("ABC", start=0) == 9
       doAssert haystack.rfind("ABC", start=1) == 9
-      doAssert haystack.rfind("ABC", start=2) == 9
       doAssert haystack.rfind("ABC", start=9) == 9
       doAssert haystack.rfind("ABC", start=10) == -1
-      doAssert haystack.rfind("ABC", start=11) == -1
-      doAssert haystack.rfind("ABC", start=12) == -1
 
       doAssert haystack.rfind("ABC", start=0, last=13) == 9
       doAssert haystack.rfind("ABC", start=0, last=12) == 9
@@ -271,6 +331,41 @@ template main() =
     doAssert "/".rfind("//") == -1
     doAssert "///".rfind("//", start=3) == -1
 
+    # searching for empty string
+    doAssert "".rfind("") == -1
+    doAssert "abc".rfind("") == -1
+    doAssert "abc".rfind("", start=1) == -1
+    doAssert "abc".rfind("", start=2) == -1
+    doAssert "abc".rfind("", start=3) == -1
+    doAssert "abc".rfind("", start=4) == -1
+    doAssert "abc".rfind("", start=400) == -1
+
+    doAssert "abc".rfind("", start=1, last=3) == -1
+    doAssert "abc".rfind("", start=1, last=2) == -1
+    doAssert "abc".rfind("", start=1, last=1) == -1
+    doAssert "abc".rfind("", start=1, last=0) == -1
+    doAssert "abc".rfind("", start=1, last = -1) == -1
+
+    # when last <= start, searching for non-empty string
+    block:
+      let last: int = -1
+      doAssert "abcd".rfind("ab", start=0, last=last) == 0
+      doAssert "abcd".rfind("ab", start=1, last=last) == -1
+      doAssert "abcd".rfind("bc", start=1, last=last) == 1
+      doAssert "abcd".rfind("bc", start=2, last=last) == -1
+    block:
+      let last: int = 0
+      doAssert "abcd".rfind("ab", start=0, last=last) == -1
+      doAssert "abcd".rfind("ab", start=1, last=last) == -1
+      doAssert "abcd".rfind("bc", start=1, last=last) == -1
+      doAssert "abcd".rfind("bc", start=2, last=last) == -1
+    block:
+      let last: int = 1
+      doAssert "abcd".rfind("ab", start=0, last=last) == 0
+      doAssert "abcd".rfind("ab", start=1, last=last) == -1
+      doAssert "abcd".rfind("bc", start=1, last=last) == -1
+      doAssert "abcd".rfind("bc", start=2, last=last) == -1
+
   block: # trimZeros
     var x = "1200"
     x.trimZeros()