/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
 * Test suite for nsIMsgHeaderParser functions:
 *   parseDecodedHeader
 *   parseEncodedHeader
 */

var {MailServices} = ChromeUtils.import("resource:///modules/MailServices.jsm");

function equalArrays(arr1, arr2) {
  Assert.equal(arr1.length, arr2.length);
  for (let i = 0; i < arr1.length; i++) {
    Assert.equal(arr1[i].name, arr2[i].name);
    Assert.equal(arr1[i].email, arr2[i].email);
  }
}

function run_test() {
  // In this array, the sub arrays consist of the following elements:
  // 0: input string
  // 1: expected output from parseDecodedHeader
  // 2: expected output from parseEncodedHeader
  const checks = [
    ["abc@foo.invalid",
     [{name: "", email: "abc@foo.invalid"}],
     [{name: "", email: "abc@foo.invalid"}]],
    ["foo <ghj@foo.invalid>",
     [{name: "foo", email: "ghj@foo.invalid"}],
     [{name: "foo", email: "ghj@foo.invalid"}]],
    ["abc@foo.invalid, foo <ghj@foo.invalid>",
     [{name: "", email: "abc@foo.invalid"},
      {name: "foo", email: "ghj@foo.invalid"}],
     [{name: "", email: "abc@foo.invalid"},
      {name: "foo", email: "ghj@foo.invalid"}]],
    // UTF-8 names
    ["foo\u00D0 bar <foo@bar.invalid>, \u00C3\u00B6foo <ghj@foo.invalid>",
     [{name: "foo\u00D0 bar", email: "foo@bar.invalid"},
      {name: "\u00C3\u00B6foo", email: "ghj@foo.invalid"}],
     [{name: "foo\uFFFD bar", email: "foo@bar.invalid"},
      {name: "\u00F6foo", email: "ghj@foo.invalid"}]],
    // Bug 961564
    ["someone <>",
     [{name: "someone", email: ""}],
     [{name: "someone", email: ""}]],
    // Bug 1423432: Encoded strings with null bytes,
    // in base64 a single null byte can be encoded as AA== to AP==.
    // parseEncodedHeader will remove the nullbyte.
    ["\"null=?UTF-8?Q?=00?=byte\" <nullbyte@example.com>",
      [{name: "null=?UTF-8?Q?=00?=byte", email: "nullbyte@example.com"}],
      [{name: "nullbyte", email: "nullbyte@example.com"}]],
    ["\"null=?UTF-8?B?AA==?=byte\" <nullbyte@example.com>",
      [{name: "null=?UTF-8?B?AA==?=byte", email: "nullbyte@example.com"}],
      [{name: "nullbyte", email: "nullbyte@example.com"}]],
  ];

  for (let check of checks) {
    equalArrays(MailServices.headerParser.parseDecodedHeader(check[0]),
      check[1]);
    equalArrays(MailServices.headerParser.parseEncodedHeader(check[0], "UTF-8"),
      check[2]);
  }
}
