// 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 decodeQueryComponent(String encodedComponent,
/// {Encoding encoding: utf8})
/// Decodes the percent-encoding in encodedComponent, converting pluses
/// to spaces
/// @description Checks expected results on unreserved characters and
/// basic and extended unicode characters on manually and library
/// encoded strings.
/// @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)}';

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('');

main() {
  var x;
  x = 'a.A- \u0000 \u0001 \u{1D11E}';
  Expect.equals(x, Uri.decodeQueryComponent(manuallyEncodeQuery(x)));
  Expect.equals(x, Uri.decodeQueryComponent(Uri.encodeQueryComponent(x)));

  x = '~foo_BAR \uD7FF \uE000 \u{10000}';
  Expect.equals(x, Uri.decodeQueryComponent(manuallyEncodeQuery(x)));
  Expect.equals(x, Uri.decodeQueryComponent(Uri.encodeQueryComponent(x)));

  x = r"! $ & ' ( ) * + , ; = : @";
  Expect.equals(x, Uri.decodeQueryComponent(manuallyEncodeQuery(x)));
  Expect.equals(x, Uri.decodeQueryComponent(Uri.encodeQueryComponent(x)));
}
