Skip to content

Commit f9a0d03

Browse files
David Rajchenbach-Tellerbrson
David Rajchenbach-Teller
authored andcommitted
Fixup: forgotten stdtest/rope.rs
1 parent a5dcf66 commit f9a0d03

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed

src/test/stdtest/rope.rs

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
import std::str;
2+
import std::rope::*;
3+
import std::option;
4+
import std::uint;
5+
6+
//Utility function, used for sanity check
7+
fn rope_to_string(r: rope) -> str {
8+
alt(r) {
9+
node::empty. { ret "" }
10+
node::content(x) {
11+
let str = @mutable "";
12+
fn aux(str: @mutable str, node: @node::node) {
13+
alt(*node) {
14+
node::leaf(x) {
15+
*str += str::substr(*x.content, x.byte_offset, x.byte_len);
16+
}
17+
node::concat(x) {
18+
aux(str, x.left);
19+
aux(str, x.right);
20+
}
21+
}
22+
}
23+
aux(str, x);
24+
ret *str
25+
}
26+
}
27+
}
28+
29+
30+
#[test]
31+
fn trivial() {
32+
assert char_len(empty()) == 0u;
33+
assert byte_len(empty()) == 0u;
34+
}
35+
36+
#[test]
37+
fn of_string1() {
38+
let sample = @"0123456789ABCDE";
39+
let r = of_str(sample);
40+
41+
assert char_len(r) == str::char_len(*sample);
42+
assert rope_to_string(r) == *sample;
43+
}
44+
45+
#[test]
46+
fn of_string2() {
47+
let buf = @ mutable "1234567890";
48+
let i = 0;
49+
while i < 10 { *buf = *buf + *buf; i+=1;}
50+
let sample = @*buf;
51+
let r = of_str(sample);
52+
assert char_len(r) == str::char_len(*sample);
53+
assert rope_to_string(r) == *sample;
54+
55+
let string_iter = 0u;
56+
let string_len = str::byte_len(*sample);
57+
let rope_iter = iterator::char::start(r);
58+
let equal = true;
59+
let pos = 0u;
60+
while equal {
61+
alt(node::char_iterator::next(rope_iter)) {
62+
option::none. {
63+
if string_iter < string_len {
64+
equal = false;
65+
} break; }
66+
option::some(c) {
67+
let {ch, next} = str::char_range_at(*sample, string_iter);
68+
string_iter = next;
69+
if ch != c { equal = false; break; }
70+
}
71+
}
72+
pos += 1u;
73+
}
74+
75+
assert equal;
76+
}
77+
78+
#[test]
79+
fn iter1() {
80+
let buf = @ mutable "1234567890";
81+
let i = 0;
82+
while i < 10 { *buf = *buf + *buf; i+=1;}
83+
let sample = @*buf;
84+
let r = of_str(sample);
85+
86+
let len = 0u;
87+
let it = iterator::char::start(r);
88+
while true {
89+
alt(node::char_iterator::next(it)) {
90+
option::none. { break; }
91+
option::some(_) { len += 1u; }
92+
}
93+
}
94+
95+
assert len == str::char_len(*sample);
96+
}
97+
98+
#[test]
99+
fn bal1() {
100+
let init = @ "1234567890";
101+
let buf = @ mutable * init;
102+
let i = 0;
103+
while i < 16 { *buf = *buf + *buf; i+=1;}
104+
let sample = @*buf;
105+
let r1 = of_str(sample);
106+
let r2 = of_str(init);
107+
i = 0;
108+
while i < 16 { r2 = append_rope(r2, r2); i+= 1;}
109+
110+
111+
assert eq(r1, r2);
112+
let r3 = bal(r2);
113+
assert char_len(r1) == char_len(r3);
114+
115+
assert eq(r1, r3);
116+
}
117+
118+
#[test]
119+
fn char_at1() {
120+
//Generate a large rope
121+
let r = of_str(@ "123456789");
122+
uint::range(0u, 10u){|_i|
123+
r = append_rope(r, r);
124+
}
125+
126+
//Copy it in the slowest possible way
127+
let r2 = empty();
128+
uint::range(0u, char_len(r)){|i|
129+
r2 = append_char(r2, char_at(r, i));
130+
}
131+
assert eq(r, r2);
132+
133+
let r3 = empty();
134+
uint::range(0u, char_len(r)){|i|
135+
r3 = prepend_char(r3, char_at(r, char_len(r) - i - 1u));
136+
}
137+
assert eq(r, r3);
138+
139+
//Additional sanity checks
140+
let balr = bal(r);
141+
let bal2 = bal(r2);
142+
let bal3 = bal(r3);
143+
assert eq(r, balr);
144+
assert eq(r, bal2);
145+
assert eq(r, bal3);
146+
assert eq(r2, r3);
147+
assert eq(bal2, bal3);
148+
}

0 commit comments

Comments
 (0)