1// These are defined by the test: 2// errors (boolean) 3// encoder (function) 4// ranges (array) 5// separator (string) 6// expect (function) 7 8var tests = []; 9var cplist = []; 10var numTests = null; 11var numFrames = 2; 12var chunkSize = 400; 13var numChunks = null; 14var frames = null; 15var frames = null; 16var forms = null; 17var encodedSeparator = encodeURIComponent(separator); 18var currentChunkIndex = 0; 19var pageCharset = document.querySelector("meta[charset]").getAttribute("charset"); 20 21setup(function() { 22 // create a simple list of just those code points for which there is an encoding possible 23 codepoints = []; 24 for (var range of ranges) { 25 for (var i = range[0]; i < range[1]; i++) { 26 result = encoder(String.fromCodePoint(i)); 27 var success = !!result; 28 if (errors) { 29 success = !success; 30 } 31 if (success) { 32 var item = {}; 33 codepoints.push(item); 34 item.cp = i; 35 item.expected = expect(result, i); 36 item.desc = range[2]; 37 } 38 } 39 } 40 41 // convert the information into a simple array of objects that can be easily traversed 42 var currentChunk = []; 43 var currentTests = []; 44 cplist = [currentChunk]; 45 tests = [currentTests]; 46 for (i = 0; i < codepoints.length; i++) { 47 if (currentChunk.length == chunkSize) { 48 currentChunk = []; 49 cplist.push(currentChunk); 50 currentTests = []; 51 tests.push(currentTests); 52 } 53 var item = {}; 54 currentChunk.push(item); 55 item.cp = codepoints[i].cp; 56 item.expected = codepoints[i].expected; 57 item.desc = codepoints[i].desc; 58 currentTests.push(subsetTest(async_test, 59 (item.desc ? item.desc + " " : "") + 60 "U+" + 61 item.cp.toString(16).toUpperCase() + 62 " " + 63 String.fromCodePoint(item.cp) + 64 " " + 65 item.expected 66 )); 67 } 68 69 numChunks = cplist.length; 70 71 for (var i = 0; i < numFrames; i++) { 72 var frame = document.createElement("iframe"); 73 frame.id = frame.name = "frame-" + i; 74 document.body.appendChild(frame); 75 var form = document.createElement("form"); 76 form.id = "form-" + i; 77 form.method = "GET"; 78 form.action = "/common/blank.html"; 79 form.acceptCharset = pageCharset; 80 form.target = frame.id; 81 var input = document.createElement("input"); 82 input.id = input.name = "input-" + i; 83 form.appendChild(input); 84 document.body.appendChild(form); 85 } 86 87 addEventListener("load", function() { 88 frames = Array.prototype.slice.call( 89 document.getElementsByTagName("iframe") 90 ); 91 forms = Array.prototype.slice.call( 92 document.getElementsByTagName("form") 93 ); 94 inputs = Array.prototype.slice.call( 95 document.getElementsByTagName("input") 96 ); 97 for (var i = 0; i < Math.min(numFrames, numChunks); i++) { 98 runNext(i); 99 } 100 }); 101}); 102 103function runNext(id) { 104 var i = currentChunkIndex; 105 currentChunkIndex += 1; 106 107 var iframe = frames[id]; 108 var form = forms[id]; 109 var input = inputs[id]; 110 111 input.value = cplist[i] 112 .map(function(x) { 113 return String.fromCodePoint(x.cp); 114 }) 115 .join(separator); 116 form.submit(); 117 118 iframe.onload = function() { 119 var url = iframe.contentWindow.location; 120 var query = url.search; 121 var result_string = query.substr(query.indexOf("=") + 1); 122 var results = result_string.split(encodedSeparator); 123 124 for (var j = 0; j < cplist[i].length; j++) { 125 var t = tests[i][j]; 126 if (t) { 127 t.step(function() { 128 assert_equals( 129 normalizeStr(results[j]), 130 normalizeStr(cplist[i][j].expected) 131 ); 132 }); 133 t.done(); 134 } 135 } 136 if (currentChunkIndex < numChunks) { 137 runNext(id); 138 } 139 }; 140} 141