Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bitfireAT/vcard4android.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/at/bitfire/vcard4android/ContactWriterTest.kt')
-rw-r--r--src/test/java/at/bitfire/vcard4android/ContactWriterTest.kt492
1 files changed, 492 insertions, 0 deletions
diff --git a/src/test/java/at/bitfire/vcard4android/ContactWriterTest.kt b/src/test/java/at/bitfire/vcard4android/ContactWriterTest.kt
new file mode 100644
index 0000000..bab087b
--- /dev/null
+++ b/src/test/java/at/bitfire/vcard4android/ContactWriterTest.kt
@@ -0,0 +1,492 @@
+package at.bitfire.vcard4android
+
+import at.bitfire.vcard4android.property.*
+import ezvcard.VCard
+import ezvcard.VCardDataType
+import ezvcard.VCardVersion
+import ezvcard.parameter.ImageType
+import ezvcard.property.*
+import ezvcard.util.PartialDate
+import org.junit.Assert.*
+import org.junit.Test
+import java.io.ByteArrayOutputStream
+import java.net.URI
+import java.time.ZoneOffset
+import java.util.*
+
+class ContactWriterTest {
+
+ // test specific fields
+
+ @Test
+ fun testAddress() {
+ val address = Address().apply {
+ streetAddress = "Test Street"
+ country = "XX"
+ }
+ val vCard = generate {
+ addresses.add(LabeledProperty(address))
+ }
+ assertEquals(address, vCard.addresses.first())
+ }
+
+
+ @Test
+ fun testAnniversary_vCard3() {
+ val date = Date(121, 6, 30)
+ val vCard = generate(version = VCardVersion.V3_0) {
+ anniversary = Anniversary(date)
+ }
+ assertNull(vCard.anniversary)
+ assertEquals(date, vCard.getProperty(XAbDate::class.java).date)
+ }
+
+ @Test
+ fun testAnniversary_vCard4() {
+ val ann = Anniversary(Date(121, 6, 30))
+ val vCard = generate(version = VCardVersion.V4_0) {
+ anniversary = ann
+ }
+ assertEquals(ann, vCard.anniversary)
+ }
+
+
+ @Test
+ fun testBirthday() {
+ val bday = Birthday(Date(121, 6, 30))
+ val vCard = generate {
+ birthDay = bday
+ }
+ assertEquals(bday, vCard.birthday)
+ }
+
+
+ @Test
+ fun testCustomDate() {
+ val date = XAbDate(Date(121, 6, 30))
+ val vCard = generate {
+ customDates += LabeledProperty(date)
+ }
+ assertEquals(date, vCard.getProperty(XAbDate::class.java))
+ }
+
+
+ @Test
+ fun testCategories_Some() {
+ val vCard = generate {
+ categories += "cat1"
+ categories += "cat2"
+ }
+ assertEquals("cat1", vCard.categories.values[0])
+ assertEquals("cat2", vCard.categories.values[1])
+ }
+
+ @Test
+ fun testCategories_None() {
+ val vCard = generate { }
+ assertNull(vCard.categories)
+ }
+
+
+ @Test
+ fun testEmail() {
+ val vCard = generate {
+ emails.add(LabeledProperty(Email("test@example.com")))
+ }
+ assertEquals("test@example.com", vCard.emails.first().value)
+ }
+
+
+ @Test
+ fun testFn_vCard3_NoFn_Organization() {
+ val vCard = generate(version = VCardVersion.V3_0) {
+ organization = Organization().apply {
+ values.add("org")
+ values.add("dept")
+ }
+ // other values should be ignored because organization is available
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("nick1")
+ })
+ }
+ assertEquals("org / dept", vCard.formattedName.value)
+ }
+
+ @Test
+ fun testFn_vCard3_NoFn_NickName() {
+ val vCard = generate(version = VCardVersion.V3_0) {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("nick1")
+ })
+ // other values should be ignored because nickname is available
+ emails += LabeledProperty(Email("test@example.com"))
+ }
+ assertEquals("nick1", vCard.formattedName.value)
+ }
+
+ @Test
+ fun testFn_vCard3_NoFn_Email() {
+ val vCard = generate(version = VCardVersion.V3_0) {
+ emails += LabeledProperty(Email("test@example.com"))
+ // other values should be ignored because email is available
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345"))
+ }
+ assertEquals("test@example.com", vCard.formattedName.value)
+ }
+
+ @Test
+ fun testFn_vCard3_NoFn_Phone() {
+ val vCard = generate(version = VCardVersion.V3_0) {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345"))
+ // other values should be ignored because phone is available
+ uid = "uid"
+ }
+ assertEquals("+1 555 12345", vCard.formattedName.value)
+ }
+
+ @Test
+ fun testFn_vCard3_NoFn_Uid() {
+ val vCard = generate(version = VCardVersion.V3_0) {
+ uid = "uid"
+ }
+ assertEquals("uid", vCard.formattedName.value)
+ }
+
+ @Test
+ fun testFn_vCard3_NoFn_Nothing() {
+ val vCard = generate(version = VCardVersion.V3_0) { }
+ assertEquals("", vCard.formattedName.value)
+ }
+
+ @Test
+ fun testFn_vCard3_Fn() {
+ val vCard = generate(version = VCardVersion.V3_0) {
+ displayName = "Display Name"
+ }
+ assertEquals("Display Name", vCard.formattedName.value)
+ }
+
+ @Test
+ fun testFn_vCard4_NoFn() {
+ val vCard = generate(version = VCardVersion.V4_0) { }
+ assertNull(vCard.formattedName)
+ }
+
+ @Test
+ fun testFn_vCard4_Fn() {
+ val vCard = generate(version = VCardVersion.V4_0) {
+ displayName = "Display Name"
+ }
+ assertEquals("Display Name", vCard.formattedName.value)
+ }
+
+
+ @Test
+ fun testImpp() {
+ val vCard = generate {
+ impps.add(LabeledProperty(Impp.xmpp("test@example.com")))
+ }
+ assertEquals(URI("xmpp:test@example.com"), vCard.impps.first().uri)
+ }
+
+
+ @Test
+ fun testKindAndMember_vCard3() {
+ val vCard = generate(GroupMethod.GROUP_VCARDS, VCardVersion.V3_0) {
+ group = true
+ members += "member1"
+ }
+ assertEquals(Kind.GROUP, vCard.getProperty(XAddressBookServerKind::class.java).value)
+ assertEquals("urn:uuid:member1", vCard.getProperty(XAddressBookServerMember::class.java).value)
+ }
+
+ @Test
+ fun testKindAndMember_vCard4() {
+ val vCard = generate(GroupMethod.GROUP_VCARDS, VCardVersion.V4_0) {
+ group = true
+ members += "member1"
+ }
+ assertEquals(Kind.GROUP, vCard.getProperty(Kind::class.java).value)
+ assertEquals("urn:uuid:member1", vCard.members.first().value)
+ }
+
+
+ @Test
+ fun testN_vCard3_NoN() {
+ val vCard = generate(version = VCardVersion.V3_0) { }
+ assertEquals(StructuredName(), vCard.structuredName)
+ }
+
+ @Test
+ fun testN_vCard4_NoN() {
+ val vCard = generate(version = VCardVersion.V4_0) { }
+ assertNull(vCard.structuredName)
+ }
+
+ @Test
+ fun testN() {
+ val vCard = generate(version = VCardVersion.V4_0) {
+ prefix = "P1. P2."
+ givenName = "Given"
+ middleName = "Middle1 Middle2"
+ familyName = "Family"
+ suffix = "S1 S2"
+ }
+ assertEquals(StructuredName().apply {
+ prefixes += "P1."
+ prefixes += "P2."
+ given = "Given"
+ additionalNames += "Middle1"
+ additionalNames += "Middle2"
+ family = "Family"
+ suffixes += "S1"
+ suffixes += "S2"
+ }, vCard.structuredName)
+ }
+
+
+ @Test
+ fun testNote() {
+ val vCard = generate { note = "Some Note" }
+ assertEquals("Some Note", vCard.notes.first().value)
+ }
+
+
+ @Test
+ fun testOrganization() {
+ val org = Organization().apply {
+ values.add("Org")
+ values.add("Dept")
+ }
+ val vCard = generate {
+ organization = org
+ jobTitle = "CEO"
+ jobDescription = "Executive"
+ }
+ assertEquals(org, vCard.organization)
+ assertEquals("CEO", vCard.titles.first().value)
+ assertEquals("Executive", vCard.roles.first().value)
+ }
+
+
+ @Test
+ fun testPhoto() {
+ val testPhoto = ByteArray(128)
+ val vCard = generate { photo = testPhoto }
+ assertEquals(Photo(testPhoto, ImageType.JPEG), vCard.photos.first())
+ }
+
+
+ @Test
+ fun testRelation() {
+ val rel = Related.email("bigbrother@example.com")
+ val vCard = generate { relations += rel }
+ assertEquals(rel, vCard.relations.first())
+ }
+
+
+ @Test
+ fun testTel() {
+ val vCard = generate {
+ phoneNumbers.add(LabeledProperty(Telephone("+1 555 12345")))
+ }
+ assertEquals("+1 555 12345", vCard.telephoneNumbers.first().text)
+ }
+
+
+ @Test
+ fun testUid() {
+ val vCard = generate { uid = "12345" }
+ assertEquals("12345", vCard.uid.value)
+ }
+
+
+ @Test
+ fun testUnknownProperty() {
+ val vCard = generate {
+ unknownProperties = "BEGIN:VCARD\r\n" +
+ "FUTURE-PROPERTY;X-TEST=test1;TYPE=uri:12345\r\n" +
+ "END:VCARD\r\n"
+ }
+ assertEquals("12345", vCard.getExtendedProperty("FUTURE-PROPERTY").value)
+ assertEquals("test1", vCard.getExtendedProperty("FUTURE-PROPERTY").getParameter("X-TEST"))
+ }
+
+
+ @Test
+ fun testUrl() {
+ val vCard = generate { urls += LabeledProperty(Url("https://example.com")) }
+ assertEquals("https://example.com", vCard.urls.first().value)
+ }
+
+
+ @Test
+ fun testXPhoneticName() {
+ val vCard = generate() {
+ phoneticGivenName = "Given"
+ phoneticMiddleName = "Middle"
+ phoneticFamilyName = "Family"
+ }
+ assertEquals("Given", vCard.getProperty(XPhoneticFirstName::class.java).value)
+ assertEquals("Middle", vCard.getProperty(XPhoneticMiddleName::class.java).value)
+ assertEquals("Family", vCard.getProperty(XPhoneticLastName::class.java).value)
+ }
+
+
+
+ // test generator helpers
+
+ @Test
+ fun testAddLabeledProperty_NoLabel() {
+ val vCard = generate {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("nick1")
+ })
+ }
+ assertEquals(2 /* NICK + REV */, vCard.properties.size)
+ assertEquals("nick1", vCard.nickname.values.first())
+ }
+
+ @Test
+ fun testAddLabeledProperty_Label() {
+ val vCard = generate {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("nick1")
+ }, "label1")
+ }
+ assertEquals(3 /* NICK + X-ABLABEL + REV */, vCard.properties.size)
+ vCard.nickname.apply {
+ assertEquals("nick1", values.first())
+ assertEquals("item1", group)
+ }
+ vCard.getProperty(XAbLabel::class.java).apply {
+ assertEquals("label1", value)
+ assertEquals("item1", group)
+ }
+ }
+
+ @Test
+ fun testAddLabeledProperty_Label_CollisionWithUnknownProperty() {
+ val vCard = generate {
+ unknownProperties = "BEGIN:VCARD\n" +
+ "item1.X-TEST:This property is blocking the first item ID\n" +
+ "END:VCARD"
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("nick1")
+ }, "label1")
+ }
+ assertEquals(4 /* X-TEST + NICK + X-ABLABEL + REV */, vCard.properties.size)
+ vCard.nickname.apply {
+ assertEquals("nick1", values.first())
+ assertEquals("item2", group)
+ }
+ vCard.getProperty(XAbLabel::class.java).apply {
+ assertEquals("label1", value)
+ assertEquals("item2", group)
+ }
+ }
+
+
+ @Test
+ fun testRewritePartialDate_vCard3_Date() {
+ val generator = ContactWriter.fromContact(Contact(), VCardVersion.V3_0, GroupMethod.GROUP_VCARDS)
+ val date = Birthday(Date(121, 6, 30))
+ generator.rewritePartialDate(date)
+ assertEquals(Date(121, 6, 30), date.date)
+ assertNull(date.partialDate)
+ }
+
+ @Test
+ fun testRewritePartialDate_vCard4_Date() {
+ val generator = ContactWriter.fromContact(Contact(), VCardVersion.V4_0, GroupMethod.GROUP_VCARDS)
+ val date = Birthday(Date(121, 6, 30))
+ generator.rewritePartialDate(date)
+ assertEquals(Date(121, 6, 30), date.date)
+ assertNull(date.partialDate)
+ assertEquals(0, date.parameters.size())
+ }
+
+ @Test
+ fun testRewritePartialDate_vCard3_PartialDateWithYear() {
+ val generator = ContactWriter.fromContact(Contact(), VCardVersion.V3_0, GroupMethod.GROUP_VCARDS)
+ val date = Birthday(PartialDate.parse("20210730"))
+ generator.rewritePartialDate(date)
+ assertEquals(Date(121, 6, 30), date.date)
+ assertNull(date.partialDate)
+ assertEquals(0, date.parameters.size())
+ }
+
+ @Test
+ fun testRewritePartialDate_vCard4_PartialDateWithYear() {
+ val generator = ContactWriter.fromContact(Contact(), VCardVersion.V4_0, GroupMethod.GROUP_VCARDS)
+ val date = Birthday(PartialDate.parse("20210730"))
+ generator.rewritePartialDate(date)
+ assertNull(date.date)
+ assertEquals(PartialDate.parse("20210730"), date.partialDate)
+ assertEquals(0, date.parameters.size())
+ }
+
+ @Test
+ fun testRewritePartialDate_vCard3_PartialDateWithoutYear() {
+ val generator = ContactWriter.fromContact(Contact(), VCardVersion.V3_0, GroupMethod.GROUP_VCARDS)
+ val date = Birthday(PartialDate.parse("--0730"))
+ generator.rewritePartialDate(date)
+ assertEquals(Date(-300+4, 6, 30), date.date)
+ assertNull(date.partialDate)
+ assertEquals(1, date.parameters.size())
+ assertEquals("1604", date.getParameter(Contact.DATE_PARAMETER_OMIT_YEAR))
+ }
+
+ @Test
+ fun testRewritePartialDate_vCard4_PartialDateWithoutYear() {
+ val generator = ContactWriter.fromContact(Contact(), VCardVersion.V4_0, GroupMethod.GROUP_VCARDS)
+ val date = Birthday(PartialDate.parse("--0730"))
+ generator.rewritePartialDate(date)
+ assertNull(date.date)
+ assertEquals(PartialDate.parse("--0730"), date.partialDate)
+ assertEquals(0, date.parameters.size())
+ }
+
+
+ @Test
+ fun testWriteVCard() {
+ val generator = ContactWriter.fromContact(Contact(), VCardVersion.V4_0, GroupMethod.GROUP_VCARDS)
+ generator.vCard.revision = Revision(Calendar.getInstance(TimeZone.getTimeZone(ZoneOffset.UTC.id)).apply {
+ set(2021, 6, 30, 1, 2, 3)
+ })
+
+ val stream = ByteArrayOutputStream()
+ generator.writeVCard(stream)
+ assertEquals("BEGIN:VCARD\r\n" +
+ "VERSION:4.0\r\n" +
+ "PRODID:ez-vcard 0.11.2\r\n" +
+ "REV:20210730T010203Z\r\n" +
+ "END:VCARD\r\n", stream.toString())
+ }
+
+ @Test
+ fun testWriteVCard_CaretEncoding() {
+ val stream = ByteArrayOutputStream()
+ val contact = Contact().apply {
+ addresses += LabeledProperty(Address().apply {
+ label = "Li^ne 1,1 - \" -"
+ streetAddress = "Line1"
+ country = "Line2"
+ })
+ }
+ ContactWriter
+ .fromContact(contact, VCardVersion.V4_0, GroupMethod.GROUP_VCARDS)
+ .writeVCard(stream)
+ assertTrue(stream.toString().contains("ADR;LABEL=\"Li^^ne 1,1 - ^' -\":;;Line1;;;;Line2"))
+ }
+
+
+ // helpers
+
+ private fun generate(groupMethod: GroupMethod = GroupMethod.GROUP_VCARDS, version: VCardVersion = VCardVersion.V4_0, prepare: Contact.() -> Unit): VCard {
+ val contact = Contact()
+ contact.run(prepare)
+ return ContactWriter.fromContact(contact, version, groupMethod).vCard
+ }
+
+} \ No newline at end of file