| // Copyright (c) 2017, 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 decodeComponent(String encodedComponent) |
| /// Decodes the percent-encoding in encodedComponent. |
| /// @description Checks expected results on unreserved characters and |
| /// basic and extended unicode characters on manually and library |
| /// encoded strings. |
| /// @author sgrekhov@unipro.ru |
| |
| import 'dart:convert'; |
| import "../../../Utils/expect.dart"; |
| |
| String unreserved = "0123456789" |
| "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| "abcdefghijklmnopqrstuvwxyz" |
| "-._~"; |
| |
| encodeOctet(int x) => |
| x < 0x10 ? '%0${x.toRadixString(16)}' : '%${x.toRadixString(16)}'; |
| |
| manuallyEncode(String s) => s.runes |
| .map((x) => |
| unreserved.runes.contains(x) |
| ? new String.fromCharCode(x) |
| : utf8.encode(new String.fromCharCode(x)).map(encodeOctet).join('')) |
| .join(''); |
| |
| main() { |
| for (int i = 0; i < 65279; i++) { |
| if ((i & 0xF800) == 0xD800) { |
| // Skip surrogates. |
| continue; |
| } |
| String char = new String.fromCharCode(i); |
| String encoded = Uri.encodeComponent(char); |
| Expect.equals(char, Uri.decodeComponent(encoded), "Failed for $i"); |
| Expect.equals(char, Uri.decodeComponent(manuallyEncode(char)), |
| "Failed for $i"); |
| } |
| } |