/**
   * This example has been prepared with Outlook 2003, it is full of errors, but still the library
   * should be able to parse it as well as possible.
   *
   * <p>This test also makes use of a custom ParameterRegistry, that allows me to work around the
   * Outlook quirk, that places the TYPE parameter values without the TYPE string, i.e. instead of
   * TYPE=HOME,WORK, we have only HOME,WORK.
   *
   * @throws ParserException
   * @throws IOException
   * @throws ValidationException
   * @throws DecoderException
   */
  @Test
  public void testOutlookExample()
      throws IOException, ParserException, ValidationException, DecoderException {
    File file = new File("src/test/resources/samples/vcard-antoni-outlook2003.vcf");
    Reader reader = new FileReader(file);
    GroupRegistry groupRegistry = new GroupRegistry();
    PropertyFactoryRegistry propReg = new PropertyFactoryRegistry();
    ParameterFactoryRegistry parReg = new ParameterFactoryRegistry();

    /*
     * The custom registry allows the file to be parsed correctly. It's the
     * first workaround for the Outlook problem.
     */
    VCardBuilder builder = new VCardBuilder(reader, groupRegistry, propReg, parReg);

    VCard card = builder.build();
    assertEquals("Antoni Jozef Mylka jun.", card.getProperty(Id.FN).getValue());

    /*
     * To test whether the file has really been parsed correctly, we
     * generate a string out of it. Before writing this test, the builder
     * contained a bug. The file contains non-standard folding. The LABEL
     * property has two lines, but the second line is not indented properly.
     * The builder used to interpret it as a separate property. Since it
     * didn't know it, it used to insert NULL into the property list. This
     * NULL yielded a NullPointerException when trying to serialize the file
     * back.
     *
     * If we can't preserve all data we should still have "something"
     *
     * note: we use non-validating outputter, since the ENCODING parameter
     * has been deprecated in the newest versions
     */
    VCardOutputter outputter = new VCardOutputter(false);
    StringWriter writer = new StringWriter();
    outputter.output(card, writer);

    /*
     * We don't support quoted printable, and we don't try to support
     * the crappy Outlook 2003 folding, but we would still like to
     * get something.
     */
    Property labelProperty = card.getProperty(Id.LABEL);
    String labelvalue = labelProperty.getValue();
    assertEquals(
        "3.10=0D=0ATrippstadter Str. 122=0D=0AKaiserslautern, " + "Rheinland-Pfalz 67663=",
        labelvalue);

    /*
     * A workaround for the limitation above, a utility method, that
     * checks the encoding of a property, and returns an un-encoded
     * value.
     */
    assertEquals(
        "3.10\r\nTrippstadter Str. 122\r\nKaiserslautern, " + "Rheinland-Pfalz 67663",
        getDecodedPropertyalue(labelProperty));

    /*
     * Another issue found, the BDAY property is parsed, but the
     * value is not converted to a date, and te BDay.getDate() method
     * returns null.
     */
    BDay bday = (BDay) card.getProperty(Id.BDAY);
    assertNotNull(bday.getDate());
    assertEquals("19800118", bday.getValue());

    /*
     * Yet another issue. The entry in PropertyFactoryRegistry for the ORG
     * property was invalid. There should be TWO values for this file
     * and the org property.
     */
    String[] vals = ((Org) card.getProperty(Id.ORG)).getValues();
    assertEquals(2, vals.length);
    assertEquals("DFKI", vals[0]);
    assertEquals("Knowledge-Management", vals[1]);
  }
 @Test
 public void testOutput() throws IOException, ValidationException {
   StringWriter out = new StringWriter();
   outputter.output(card, out);
   assertEquals(expectedOutput, out.toString().replaceAll("\\r\\n ", ""));
 }