| // 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 encodeQueryComponent(String component) |
| /// Encode the string component according to the HTML 4.01 rules for encoding |
| /// the posting of a HTML form as a query string component. |
| /// Spaces will be replaced with plus and all characters except |
| /// for uppercase and lowercase letters, decimal digits and the characters -._~. |
| /// @description Compare library result with manually encoded string on |
| /// characters from Unicode Basic Multilingual Plane |
| /// @author ilya |
| |
| import 'dart:convert'; |
| import "../../../Utils/expect.dart"; |
| |
| String unreserved = "0123456789" |
| "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| "abcdefghijklmnopqrstuvwxyz" |
| "-._~"; |
| |
| encodeOctet(int x) => |
| (x < 0x10 ? '%0${x.toRadixString(16)}' : '%${x.toRadixString(16)}') |
| .toUpperCase(); |
| |
| manuallyEncodeQuery(String s) => s.runes |
| .map((x) => |
| unreserved.runes.contains(x) |
| ? new String.fromCharCode(x) |
| : x == 32 |
| ? '+' |
| : utf8.encode(new String.fromCharCode(x)).map(encodeOctet).join('')) |
| .join(''); |
| |
| tryRange(start, end) { |
| for (var i=start; i<=end; ++i) { |
| var s = new String.fromCharCode(i); |
| Expect.equals(manuallyEncodeQuery(s), Uri.encodeQueryComponent(s)); |
| } |
| } |
| |
| main() { |
| tryRange(0, 0xD7FF); |
| tryRange(0xE000, 0xFFFF); |
| } |