/*
 * Copyright (c) 2014, 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 
 * @description Test URL segmentation.
 */
import "../../testharness.dart";
import "resources/utilities.dart";

// Format: [URL, [SCHEME, HOST, PORT, PATH, QUERY, REF]]
List cases = [ 
  ["http://user:pass@foo:21/bar;par?b#c",    ["http:","foo","21","/bar;par","?b","#c"]],
  ["http:foo.com",                           ["http:","foo.com","","/","",""]],
  ["\\t   :foo.com   \\n",                   [":","","","","",""]],
  [" foo.com  ",                             [":","","","","",""]],
  ["a:\\t foo.com",                          ["a:","",""," foo.com","",""]],
  ["http://f:21/ b ? d # e ",                ["http:","f","21","/%20b%20","?%20d%20","# e"]],
  ["http://f:/c",                            ["http:","f","","/c","",""]],
  ["http://f:0/c",                           ["http:","f","0","/c","",""]],
  ["http://f:00000000000000/c",              ["http:","f","0","/c","",""]],
  ["http://f:00000000000000000000080/c",     ["http:","f","0","/c","",""]],
  ["http://f:b/c",                           [":","","","","",""]],
  ["http://f: /c",                           [":","","","","",""]],
  ["http://f:\\n/c",                         [":","","","","",""]],
  ["http://f:fifty-two/c",                   [":","","","","",""]],
  ["http://f:999999/c",                      [":","","0","","",""]],
  ["http://f: 21 / b ? d # e ",              [":","","","","",""]],
  ["",                                       ["data:","","","text/plain,baseURL","",""]],
  ["  \\t",                                  ["data:","","","text/plain,baseURL","",""]],
  [":foo.com/",                              [":","","","","",""]],
  [":foo.com\\\\",                           [":","","","","",""]],
  [":",                                      [":","","","","",""]],
  [":a",                                     [":","","","","",""]],
  [":/",                                     [":","","","","",""]],
  [":\\\\",                                  [":","","","","",""]],
  [":#",                                     [":","","","","",""]],
  ["#",                                      ["data:","","","text/plain,baseURL","",""]],
  ["#/",                                     ["data:","","","text/plain,baseURL","","#/"]],
  ["#\\\\",                                  ["data:","","","text/plain,baseURL","","#\\\\"]],
  ["#;?",                                    ["data:","","","text/plain,baseURL","","#;?"]],
  ["?",                                      [":","","","","",""]],
  ["/",                                      [":","","","","",""]],
  [":23",                                    [":","","","","",""]],
  ["/:23",                                   [":","","","","",""]],
  ["//",                                     [":","","","","",""]],
  ["::",                                     [":","","","","",""]],
  ["::23",                                   [":","","","","",""]],
  ["foo://",                                 ["foo:","","","//","",""]],
  ["http://a:b@c:29/d",                      ["http:","c","29","/d","",""]],
  ["http::@c:29",                            ["http:","c","29","/","",""]],
  ["http://&a:foo(b]c@d:2/",                 ["http:","d","2","/","",""]],
  ["http://::@c@d:2",                        ["http:","d","2","/","",""]],
  ["http://foo.com:b@d/",                    ["http:","d","","/","",""]],
  ["http://foo.com/\\\\@",                   ["http:","foo.com","","//@","",""]],
  ["http:\\\\\\\\foo.com\\\\",               ["http:","foo.com","","/","",""]],
  ["http:\\\\\\\\a\\\\b:c\\\\d@foo.com\\\\", ["http:","a","","/b:c/d@foo.com/","",""]],
  ["foo:/",                                  ["foo:","","","/","",""]],
  ["foo:/bar.com/",                          ["foo:","","","/bar.com/","",""]],
  ["foo://///////",                          ["foo:","","","/////////","",""]],
  ["foo://///////bar.com/",                  ["foo:","","","/////////bar.com/","",""]],
  ["foo:////://///",                         ["foo:","","","////://///","",""]],
  ["c:/foo",                                 ["c:","","","/foo","",""]],
  ["//foo/bar",                              [":","","","","",""]],
  ["http://foo/path;a??e#f#g",               ["http:","foo","","/path;a","??e","#f#g"]],
  ["http://foo/abcd?efgh?ijkl",              ["http:","foo","","/abcd","?efgh?ijkl",""]],
  ["http://foo/abcd#foo?bar",                ["http:","foo","","/abcd","","#foo?bar"]],
  ["[61:24:74]:98",                          [":","","","","",""]],
  ["http://[61:27]:98",                      [":","","0","","",""]],
  ["http:[61:27]/:foo",                      [":","","","","",""]],
  ["http://[1::2]:3:4",                      [":","","","","",""]],
  ["http://2001::1",                         [":","","","","",""]],
  ["http://[2001::1",                        [":","","","","",""]],
  ["http://2001::1]",                        [":","","","","",""]],
  ["http://2001::1]:80",                     [":","","","","",""]],
  ["http://[2001::1]",                       ["http:","[2001::1]","","/","",""]],
  ["http://[2001::1]:80",                    ["http:","[2001::1]","","/","",""]],
  ["http://[[::]]",                          [":","","","","",""]],
];

void doTest(int i) {
  String url = cases[i][0];
  List expected = cases[i][1];
  test((){
/*
    Expect.listEquals(
      expected,
      segments(url)
    );
*/    
    Expect.equals(
      expected.toString(),
      segments(url).toString()
    );
    }, ' $i ["$url"]');
}

void main() {
  var originalBaseURL = canonicalize(".");
  setBaseURL("data:text/plain,baseURL");
  for (var i = 0; i < cases.length; ++i) {
    doTest(i);
  }
  checkTestFailures();
  setBaseURL(originalBaseURL);
}
