unit IdTestVCard;

{
http://www.faqs.org/rfcs/rfc2425.html A MIME Content-Type for Directory Information
http://www.faqs.org/rfcs/rfc2426.html vCard MIME Directory Profile
http://www.faqs.org/rfcs/rfc2739.html Calendar Attributes for vCard and LDAP
}

interface

uses
  IdSys,
  IdTest,
  IdObjs,
  IdVCard;

type

  TIdTestVCard = class(TIdTest)
  published
    procedure TestLoad;
    procedure TestParseDateTime;
  end;

implementation

const
  cEol=#13#10;

  cName='Holmes;Sherlock;;Mr';
  cFullName='Sherlock Holmes';
  //should test with more variations here
  cCompany='Example Company';
  cDivisions='Division 1;Division 2';
  cPhoneWorkVoice='+49 (555) 12345';
  cEmail='sherlock@example.com';

  {
  The structured type value corresponds,
  in sequence, to the post office box; the extended address; the street
  address; the locality (e.g., city); the region (e.g., state or
  province); the postal code; the country Name.
  }
  cAddrPOBox='My PO Box';
  cAddrExtended='More Address';
  cAddrStreet='My Street';
  cAddrLocality='My Locality';
  cAddrRegion='My Region';
  cAddrPostCode='12345';
  cAddrNation='My Nation';

  cData='BEGIN:VCARD'+cEol
 +'BEGIN:VCARD'+cEol
 +'VERSION:2.1'+cEol
 +'N:'+cName+cEol
 +'FN:'+cFullName+cEol
 +'ORG:'+cCompany+';'+cDivisions+cEol
 +'TEL;WORK;VOICE:'+cPhoneWorkVoice+cEol
 +'ADR;WORK:'+cAddrPOBox+';'+cAddrExtended+';'+cAddrStreet+';'+cAddrLocality+';'+cAddrRegion+';'+cAddrPostCode+';'+cAddrNation+cEol
 //LABEL;WORK;ENCODING=QUOTED-PRINTABLE:Testroad 1=0D=0AEntenhausen 12345=0D=0ADeutschland
 +'EMAIL;PREF;INTERNET:'+cEMail+cEol
 //REV:20050531T195358Z
 +'END:VCARD';

procedure TIdTestVCard.TestLoad;
//could also test
var
 aCard:TIdVCard;
 aList:TIdStringList;
 aPhone:TIdCardPhoneNumber;
 aMail:TIdVCardEMailItem;
 aAddr:TIdCardAddressItem;
begin
 aCard:=TIdVCard.Create(nil);
 aList:=TIdStringList.Create;
 try
 aList.Text:=cData;
 aCard.ReadFromTStrings(aList);

 Assert(aCard.Telephones.Count=1);
 aPhone:=aCard.Telephones[0];
 Assert(aPhone.Number=cPhoneWorkVoice);
 Assert(aPhone.PhoneAttributes=[tpaWork,tpaVoice]);

 Assert(aCard.EMailAddresses.Count=1);
 aMail:=aCard.EMailAddresses[0];
 Assert(aMail.Preferred);
 Assert(aMail.Address=cEmail);
 Assert(aMail.EMailType=ematInternet);

 //see rfc2426 3.2.1 ADR Type Definition
 Assert(aCard.Addresses.Count=1);
 aAddr:=aCard.Addresses[0];
 Assert(aAddr.AddressAttributes=[tatWork]);
 Assert(aAddr.POBox=cAddrPOBox);
 Assert(aAddr.ExtendedAddress=cAddrExtended);
 Assert(aAddr.StreetAddress=cAddrStreet);
 Assert(aAddr.Locality=cAddrLocality);
 Assert(aAddr.Region=cAddrRegion);
 Assert(aAddr.PostalCode=cAddrPostCode);
 Assert(aAddr.Nation=cAddrNation);

 //LastRevised isnt published by vcard, fix?

 //see rfc2426 3.5.5 ORG Type Definition
 //fails, bug in procedure ParseOrg
 //example:
 //ORG:ABC\, Inc.;North American Division;Marketing
 //todo1 add a test for parsing an escaped-comma. could be in ANY property
 Assert(aCard.BusinessInfo.Organization=cCompany);

 aCard.BusinessInfo.Divisions.Delimiter:=';';
 //delimitedtext adds quotes
 //Assert(aCard.BusinessInfo.Divisions.DelimitedText=cDivisions);
 Assert(aCard.BusinessInfo.Divisions.Count=2);

 finally
 Sys.FreeAndNil(aCard);
 Sys.FreeAndNil(aList);
 end;
end;

procedure TIdTestVCard.TestParseDateTime;
const
 cFormat='yyyy-mm-dd hh:nn:ss';
 cDate1='1995-10-31T22:27:10Z';
 cDate1b='1995-10-31 22:27:10';
 cDate2='1997-11-15';
 cDate2b='1997-11-15 00:00:00';
 cOutlookFormat='20050531T195358Z';
 cOutlookFormatb='2005-05-31 19:53:58';
var
 aDate:TDateTime;
begin
 aDate:=ParseDateTimeStamp(cDate1);
 Assert(Sys.FormatDateTime(cFormat,aDate)=cDate1b);

 aDate:=ParseDateTimeStamp(cDate2);
 Assert(Sys.FormatDateTime(cFormat,aDate)=cDate2b);

 aDate:=ParseDateTimeStamp(cOutlookFormat);
 Assert(Sys.FormatDateTime(cFormat,aDate)=cOutlookFormatb);
end;

initialization

  TIdTest.RegisterTest(TIdTestVCard);

end.
