summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/pure/ropes.nim2
-rw-r--r--tests/stdlib/tropes.nim66
2 files changed, 67 insertions, 1 deletions
diff --git a/lib/pure/ropes.nim b/lib/pure/ropes.nim
index 41d6211b4..0797bbe06 100644
--- a/lib/pure/ropes.nim
+++ b/lib/pure/ropes.nim
@@ -204,8 +204,8 @@ proc `[]`*(r: Rope, i: int): char {.rtl, extern: "nroCharAt".} =
       if x.left.length > j:
         x = x.left
       else:
+        dec(j, x.left.length)
         x = x.right
-        dec(j, x.len)
 
 iterator leaves*(r: Rope): string =
   ## iterates over any leaf string in the rope `r`.
diff --git a/tests/stdlib/tropes.nim b/tests/stdlib/tropes.nim
new file mode 100644
index 000000000..9678e26c3
--- /dev/null
+++ b/tests/stdlib/tropes.nim
@@ -0,0 +1,66 @@
+import ropes
+
+
+block:
+  let r: Rope = nil
+  doAssert r[0] == '\0'
+
+block:
+  var
+    r1 = rope("Hello")
+    r2 = rope("Nim-Lang")
+
+  let r = r1 & r2
+  let s = $r
+  for i in 0 ..< r.len:
+    doAssert r[i] == s[i]
+
+  doAssert r[66] == '\0'
+
+block:
+  let r = rope("Hello, Nim-Lang")
+
+  let s = $r
+  for i in 0 ..< r.len:
+    doAssert r[i] == s[i]
+
+  doAssert r[66] == '\0'
+
+block:
+  var r: Rope
+  r.add rope("Nim ")
+  r.add rope("is ")
+  r.add rope("a ")
+  r.add rope("great ")
+  r.add rope("language")
+
+  let s = $r
+  for i in 0 ..< r.len:
+    doAssert r[i] == s[i]
+
+  doAssert r[66] == '\0'
+
+block:
+  var r: Rope
+  r.add rope("My Conquest")
+  r.add rope(" is ")
+  r.add rope("the Sea of Stars")
+
+  let s = $r
+  for i in 0 ..< r.len:
+    doAssert r[i] == s[i]
+
+  doAssert r[66] == '\0'
+
+block:
+  var r: Rope
+  r.add rope("My Conquest")
+  r.add rope(" is ")
+  r.add rope("the Sea of Stars")
+
+  var i: int
+  for item in r:
+    doAssert r[i] == item
+    inc i
+
+  doAssert r[66] == '\0'