blob: d2e9d6cf9433dac2f4ca9f8ab82a701a999c692e [file] [log] [blame]
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// @assertion String encodeComponent(String component)
/// Encode the string component using percent-encoding to make it safe for
/// literal use as a URI component.
/// All characters except uppercase and lowercase letters, digits and
/// the characters -_.!~*'() are percent-encoded.
/// @description Checks that unlisted characters from Unicode Basic
/// Multilingual Plane are percent-encoded.
/// @author ilya
import "../../../Utils/expect.dart";
String canBeNotEncoded = "0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
r"-_.!~*'()";
findUnescaped(String s) {
var set = new Set();
var skip = 0;
for (var rune in s.runes) {
if (skip > 0) {
--skip;
} else if (rune == '%'.codeUnitAt(0)) {
skip = 2;
} else {
set.add(rune);
}
}
return set;
}
tryRange(start, end) {
var b = new StringBuffer('');
for (var i=start; i<=end; ++i) {
b.writeCharCode(i);
}
var s = b.toString();
var unescapedSet = findUnescaped(Uri.encodeComponent(s));
var diff = unescapedSet.difference(canBeNotEncoded.runes.toSet())
.map((x)=>new String.fromCharCode(x)).toSet();
Expect.isTrue(diff.isEmpty);
}
main() {
tryRange(0, 0xD7FF);
tryRange(0xE000, 0xFFFF);
}