// 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 new Uri({scheme, String userInfo: "", String host: "", port: 0,
/// String path, Iterable<String> pathSegments, String query, Map<String,
/// String> queryParameters, fragment: ""})
/// Creates a new URI from its components.
/// The query component is set through either query or
/// queryParameters. When query is used the provided string is expected to be
/// fully percent-encoded and is used in its literal form. When queryParameters
/// is used the query is built from the provided map. Each key and value in the
/// map is percent-encoded and joined using equal and ampersand characters.
/// The percent-encoding of the keys and values encodes all characters except
/// for the unreserved characters.
/// @description Checks query set via [queryParameters] on space, unreserved,
/// basic and extended unicode characters
/// @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();

enc(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 = '$unreserved ';
  var y = '\u1111\u2222\u3333\u{10000}\u{10001} ';
  var uri = new Uri(queryParameters: {x:x, y:y});
  Expect.equals('${enc(x)}=${enc(x)}&${enc(y)}=${enc(y)}', uri.query);
}
