| //------------------------------------------------------------------------------------------------------- | |
| // Copyright (C) Microsoft. All rights reserved. | |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
| //------------------------------------------------------------------------------------------------------- | |
| var CompoundString = | |
| { | |
| create: function(charCount, pointerCount, cloneCount, strings) { | |
| var ch = "a"; | |
| var ptr = "<aaaaaaa>"; | |
| var s = ""; | |
| while(true) { | |
| s += ""; // nondestructive, clone if necessary | |
| for(var i = 0; i < charCount; ++i) | |
| s += ch; // destructive | |
| for(var i = 0; i < pointerCount; ++i) | |
| s += ptr; // destructive | |
| if(cloneCount === 0) | |
| break; | |
| var s2 = s + ch; // nondestructive, clone for appending | |
| strings.push(s); | |
| s = s2; | |
| --cloneCount; | |
| charCount >>= 2; | |
| pointerCount >>= 2; | |
| } | |
| strings.push(s); | |
| }, | |
| createTestStrings: function() { | |
| var strings = []; | |
| for(var pointerCount = 0; pointerCount <= 128; pointerCount = pointerCount === 0 ? 1 : pointerCount << 2) { | |
| for(var charCount = 0; charCount <= 1024; charCount = charCount === 0 ? 1 : charCount << 2) { | |
| for(var cloneCount = 0; cloneCount <= 8; cloneCount = cloneCount === 0 ? 1 : cloneCount << 2) { | |
| this.create(charCount, pointerCount, cloneCount, strings); | |
| if(charCount !== 0) | |
| this.create(charCount + 1, pointerCount, cloneCount, strings); | |
| if(pointerCount !== 0) | |
| this.create(charCount + 1, pointerCount, cloneCount, strings); | |
| } | |
| } | |
| } | |
| var ch = "a"; | |
| var ptr = "<aaaaaaa>"; | |
| var replaceCh = "_"; | |
| var replaceRegex = /_/; | |
| strings.push((ch + replaceCh + ch).replace(replaceRegex, ch)); | |
| strings.push((ptr + replaceCh + ptr).replace(replaceRegex, ch)); | |
| strings.push((ch + replaceCh + ch).replace(replaceRegex, ptr)); | |
| strings.push((ptr + replaceCh + ptr).replace(replaceRegex, ptr)); | |
| // Large CompoundString created by concatenating a string to itself multiple times | |
| var bigString = "b"; // not using "a" here so that the concats will be destructive | |
| for(var i = 0; i < 16; ++i) | |
| bigString += bigString; // destructive | |
| bigString += replaceCh; | |
| if(bigString.length !== 0x10001) | |
| throw new Error("Big string length is invalid"); | |
| strings.push(bigString.replace(replaceRegex, ch)); | |
| // String with a high nesting level of CompoundString objects | |
| var nestedCompoundString = "c"; | |
| nestedCompoundString += "c"; | |
| nestedCompoundString += "c"; | |
| for(var i = 0; i < 100000; ++i) { | |
| var s = "c"; | |
| s += "c"; | |
| s += "c"; | |
| s += nestedCompoundString; | |
| nestedCompoundString = s; | |
| } | |
| strings.push(nestedCompoundString); | |
| // String with a high nesting level of ConcatString objects | |
| var nestedConcatString = "d"; | |
| for(var i = 0; i < 100000; ++i) | |
| nestedConcatString = "d" + nestedConcatString; | |
| strings.push(nestedConcatString); | |
| // String with a high nesting level of alternating CompoundString and ConcatString objects | |
| var nestedConcatCompoundString = ""; | |
| for(var i = 0; i < 100000; ++i) { | |
| var s = "e"; | |
| s += "e"; | |
| s += "e"; | |
| s += nestedConcatCompoundString; | |
| nestedConcatCompoundString = "e" + s; | |
| } | |
| strings.push(nestedConcatCompoundString); | |
| return strings; | |
| } | |
| }; |