Source code
Revision control
Copy as Markdown
Other Tools
gczeal(0);
const hasStringRepresentation = typeof stringRepresentation !== "undefined";
function assertSameAddress(s1, s2) {
if (hasStringRepresentation) {
var s1Repr = stringRepresentation(s1);
var s2Repr = stringRepresentation(s2);
var s1Addr = JSON.parse(s1Repr).address;
var s2Addr = JSON.parse(s2Repr).address;
assertEq(typeof s1Addr, "string");
assertEq(s1Addr, s2Addr);
}
}
// rope.substring(0) should not allocate a new string or flatten the rope.
function testSameSubstring() {
var rope = newRope("abcdefghijklmnop", "0123456789");
for (var i = 0; i < 5; i++) {
var sub = rope.substring(0);
assertEq(isRope(sub), true);
assertSameAddress(rope, sub);
}
}
testSameSubstring();
// If the substring is exactly the left or right child, we should return it
// without flattening the rope.
function testLeftRightSubstring() {
var left = "abcdefghijklmnopqrstuvwxyz";
var right = "012345678901234567890123456789";
var rope = newRope(left, right);
for (var i = 0; i < 10; i++) {
assertSameAddress(rope.substring(0, left.length), left);
assertSameAddress(rope.substring(left.length), right);
assertEq(isRope(rope), true); // Still a rope.
}
}
testLeftRightSubstring();
function testSubstringSpansBoth() {
var left = "abcdefghijklmnopqrstuvwxyz";
var right = "012345678901234567890123456789";
var rope = newRope(left, right);
// If the substring spans both left and right children but fits in an inline
// string, don't flatten the rope.
for (var i = 0; i < 10; i++) {
var substrInline = rope.substring(left.length - 5, left.length + 5);
if (hasStringRepresentation) {
assertEq(stringRepresentation(substrInline).includes("InlineString"), true);
}
assertEq(substrInline, "vwxyz01234");
assertEq(isRope(rope), true); // Still a rope.
}
// If the substring doesn't fit in an inline string, we flatten the rope and
// return a dependent string.
var substrLong = rope.substring(0, rope.length - 1);
assertEq(isRope(rope), false);
assertEq(isRope(substrLong), false);
}
testSubstringSpansBoth();