// Copyright (c) 2013, 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.

import "dart:async";
import "dart:utf";

part '../../../sdk/lib/io/io_sink.dart';
part "../../../sdk/lib/io/http.dart";
part "../../../sdk/lib/io/http_impl.dart";
part "../../../sdk/lib/io/http_parser.dart";
part "../../../sdk/lib/io/http_utils.dart";
part "../../../sdk/lib/io/socket.dart";

void testParseEncodedString() {
  String encodedString = 'foo+bar%20foobar%25%26';
  Expect.equals(_HttpUtils.decodeUrlEncodedString(encodedString),
                'foo bar foobar%&');
  encodedString = 'A+%2B+B';
  Expect.equals(_HttpUtils.decodeUrlEncodedString(encodedString),
                'A + B');
}

void testParseQueryString() {
  // The query string includes escaped "?"s, "&"s, "%"s and "="s.
  // These should not affect the splitting of the string.
  String queryString =
      '%3F=%3D&foo=bar&%26=%25&sqrt2=%E2%88%9A2&name=Franti%C5%A1ek';
  Map<String, String> map = _HttpUtils.splitQueryString(queryString);
  for (String key in map.keys) {
    Expect.equals(map[key], { '&'     : '%',
                              'foo'   : 'bar',
                              '?'     : '=',
                              'sqrt2' : '\u221A2',
                              'name'  : 'Franti\u0161ek'}[key]);
  }
  Expect.setEquals(map.keys.toSet(), ['&', '?', 'foo', 'sqrt2', 'name']);
}

void main() {
  testParseEncodedString();
  testParseQueryString();
}
