Skip to content

Commit

Permalink
tests
Browse files Browse the repository at this point in the history
  • Loading branch information
FolkerKinzel committed Jul 20, 2024
1 parent 5e1a4c3 commit 4edf37b
Show file tree
Hide file tree
Showing 8 changed files with 259 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ public void GetFileTypeExtensionFromUriTest6(string input)
=> Assert.AreEqual(".htm", UriConverter.GetFileTypeExtensionFromUri(
new Uri(input, UriKind.RelativeOrAbsolute)));


[TestMethod]
public void GetFileTypeExtensionFromUriTest7()
=> Assert.AreEqual(".bin", UriConverter.GetFileTypeExtensionFromUri(new Uri("https://www.contoso.com/picture/png", UriKind.Absolute)));
}

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using FolkerKinzel.VCards.Extensions;
using FolkerKinzel.VCards.Intls.Serializers;
using FolkerKinzel.VCards.Models;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace FolkerKinzel.VCards.Tests.Intls.Serializers;

[TestClass]
Expand Down Expand Up @@ -100,4 +101,52 @@ public void SetIndexesTest()
Assert.AreEqual(null, vc.AppIDs!.ElementAt(1).Parameters.Index);

}

[TestMethod]
public void AppendGenderViewsTest1()
{
VCard vc = VCardBuilder
.Create()
.GenderViews.Edit(props => [null])
.GenderViews.Add(null, "something other")
.GenderViews.Add(null, null)
.GenderViews.Add(Sex.Other)
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0);

vc = Vcf.Parse(vcf)[0];

Assert.IsNull(vc.GenderViews);
}

[TestMethod]
public void AppendGenderViewsTest2()
{
VCard vc = VCardBuilder
.Create()
.GenderViews.Add(Sex.Male)
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0, options: Opts.Default.Set(Opts.WriteWabExtensions));

vc = Vcf.Parse(vcf)[0];

Assert.IsNotNull(vc.GenderViews);
}

[TestMethod]
public void AppendGenderViewsTest3()
{
VCard vc = VCardBuilder
.Create()
.GenderViews.Edit(props => [null])
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0);

vc = Vcf.Parse(vcf)[0];

Assert.IsNull(vc.GenderViews);
}
}
59 changes: 58 additions & 1 deletion src/FolkerKinzel.VCards.Tests/V2Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -525,5 +525,62 @@ public void GenderTest1()

}


[TestMethod]
public void BirthdayTest1()
{
VCard vc = VCardBuilder
.Create()
.BirthDayViews.Add(DateTimeOffset.Now)
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V2_1);

StringAssert.Contains(vcf, "BDAY", StringComparison.Ordinal);
}


[TestMethod]
public void BirthdayTest2()
{
VCard vc = VCardBuilder
.Create()
.BirthDayViews.Add("After midnight")
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V2_1);

Assert.IsFalse(vcf.Contains("BDAY", StringComparison.OrdinalIgnoreCase));
}

[TestMethod]
public void LogoPhotoSoundTest1()
{
VCard vc = VCardBuilder
.Create()
.Logos.AddText("text")
.Photos.AddText("text")
.Sounds.AddText("text")
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V2_1);

Assert.IsFalse(vcf.Contains("LOGO", StringComparison.OrdinalIgnoreCase));
Assert.IsFalse(vcf.Contains("PHOTO", StringComparison.OrdinalIgnoreCase));
Assert.IsFalse(vcf.Contains("SOUND", StringComparison.OrdinalIgnoreCase));
}

[TestMethod]
public void QuotedPrintableEncodedUriTest1()
{
const string vcf = """
BEGIN:VCARD
PHOTO;URL;QUOTED-PRINTABLE;UTF-8:http://k=C3=A4se.com
END:VCARD
""";

VCard vc = Vcf.Parse(vcf)[0];

Assert.IsNotNull(vc.Photos);
Assert.AreEqual("http://käse.com", vc.Photos.First()!.Value?.Uri?.OriginalString);
}
}
90 changes: 90 additions & 0 deletions src/FolkerKinzel.VCards.Tests/V3Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -642,4 +642,94 @@ public void EmptyParameterTest1()
Assert.AreEqual(Adr.Dom | Adr.Postal | Adr.Parcel,
vc.Addresses!.First()!.Parameters.AddressType);
}

[TestMethod]
public void BirthdayTest1()
{
VCard vc = VCardBuilder
.Create()
.BirthDayViews.Add(DateTimeOffset.Now)
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0);

StringAssert.Contains(vcf, "BDAY", StringComparison.Ordinal);
}

[TestMethod]
public void BirthdayTest2()
{
VCard vc = VCardBuilder
.Create()
.BirthDayViews.Add("After midnight")
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0);

Assert.IsFalse(vcf.Contains("BDAY", StringComparison.OrdinalIgnoreCase));
}

[TestMethod]
public void LogoPhotoSoundTest1()
{
VCard vc = VCardBuilder
.Create()
.Logos.AddText("text")
.Photos.AddText("text")
.Sounds.AddText("text")
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0);

Assert.IsFalse(vcf.Contains("LOGO", StringComparison.OrdinalIgnoreCase));
Assert.IsFalse(vcf.Contains("PHOTO", StringComparison.OrdinalIgnoreCase));
Assert.IsFalse(vcf.Contains("SOUND", StringComparison.OrdinalIgnoreCase));
}

[TestMethod]
public void AddressTest1()
{
VCard vc = VCardBuilder
.Create()
.Addresses.Add("street", null, null, null)
.Addresses.Add("street2", null, null, null)
.Addresses.SetPreferences()
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0);

Assert.IsTrue(vcf.Contains("PREF", StringComparison.OrdinalIgnoreCase));
}

[TestMethod]
public void OrgTest1()
{
VCard vc = VCardBuilder
.Create()
.Organizations.Edit(props => [null])
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0);

Assert.IsFalse(vcf.Contains("ORG", StringComparison.OrdinalIgnoreCase));
}

[TestMethod]
public void SortStringTest1()
{
VCard vc = VCardBuilder
.Create()
.Organizations.Add("Contoso", parameters: p => p.SortAs = ["Org"])
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V3_0);

vc = Vcf.Parse(vcf)[0];

Assert.IsNotNull(vc.Organizations);
Assert.IsNull(vc.Organizations.First()!.Parameters.SortAs);
Assert.IsNotNull(vc.NameViews);
Assert.IsNotNull(vc.NameViews.First()!.Parameters.SortAs);
Assert.AreEqual("Org", vc.NameViews.First()!.Parameters.SortAs!.First());
}
}
30 changes: 30 additions & 0 deletions src/FolkerKinzel.VCards.Tests/V4Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -518,5 +518,35 @@ public void NonStandardParameterTest1()
Assert.AreEqual(1, vc.Relations!.First()!.Parameters.NonStandard!.Count());

}

[TestMethod]
public void LogoPhotoSoundTest1()
{
VCard vc = VCardBuilder
.Create()
.Logos.AddText("text")
.Photos.AddText("text")
.Sounds.AddText("text")
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V4_0);

Assert.IsFalse(vcf.Contains("LOGO", StringComparison.OrdinalIgnoreCase));
Assert.IsFalse(vcf.Contains("PHOTO", StringComparison.OrdinalIgnoreCase));
Assert.IsFalse(vcf.Contains("SOUND", StringComparison.OrdinalIgnoreCase));
}

[TestMethod]
public void AltIdTest1()
{
VCard vc = VCardBuilder
.Create()
.BirthDayViews.Edit(props => [null])
.BirthDayViews.Add("After midnight")
.BirthDayViews.Add(1980, 7, 2, parameters: p => p.AltID = "@007")
.VCard;

string vcf = vc.ToVcfString(VCdVersion.V4_0);
}
}

42 changes: 21 additions & 21 deletions src/FolkerKinzel.VCards/Intls/Serializers/VcfSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,12 @@ protected void BuildPrefProperty<T>(string propertyKey,

protected void BuildFirstProperty<T>(string propertyKey,
IEnumerable<T?> serializables,
Func<T, bool>? filter = null) where T : VCardProperty
Func<T, bool> filter) where T : VCardProperty
{
Debug.Assert(serializables is not null);
Debug.Assert(filter is not null);

VCardProperty? first = filter is null ? serializables.FirstOrNullIntl(IgnoreEmptyItems)
: serializables.FirstOrNullIntl(filter, IgnoreEmptyItems);
VCardProperty? first = serializables.FirstOrNullIntl(filter, IgnoreEmptyItems);

if (first is not null)
{
Expand Down Expand Up @@ -495,41 +495,41 @@ protected virtual void AppendAnniversaryViews(IEnumerable<DateAndOrTimeProperty?
Debug.Assert(value is not null);

if (value.WhereNotEmpty()
.FirstOrDefault(static x => x is DateOnlyProperty) is DateOnlyProperty pref)
.FirstOrDefault(static x => x.Value!.TryAsDateOnly(out _)) is DateAndOrTimeProperty prop)
{
_ = prop.Value!.TryAsDateOnly(out DateOnly dto);

if (Options.HasFlag(Opts.WriteXExtensions))
{
BuildAnniversary(VCard.PropKeys.NonStandard.X_ANNIVERSARY, pref.Group);
BuildAnniversary(dto, VCard.PropKeys.NonStandard.X_ANNIVERSARY, prop.Group);
}

if (Options.HasFlag(Opts.WriteEvolutionExtensions))
{
BuildAnniversary(VCard.PropKeys.NonStandard.Evolution.X_EVOLUTION_ANNIVERSARY, pref.Group);
BuildAnniversary(dto, VCard.PropKeys.NonStandard.Evolution.X_EVOLUTION_ANNIVERSARY, prop.Group);
}

if (Options.HasFlag(Opts.WriteKAddressbookExtensions))
{
BuildAnniversary(VcfSerializer.X_KADDRESSBOOK_X_Anniversary, pref.Group);
BuildAnniversary(dto, VcfSerializer.X_KADDRESSBOOK_X_Anniversary, prop.Group);
}

if (Options.HasFlag(Opts.WriteWabExtensions))
{
BuildAnniversary(VCard.PropKeys.NonStandard.X_WAB_WEDDING_ANNIVERSARY, pref.Group);
BuildAnniversary(dto, VCard.PropKeys.NonStandard.X_WAB_WEDDING_ANNIVERSARY, prop.Group);
}
}
}

void BuildAnniversary(string propKey, string? group)
{
DateOnly dto = pref.Value;

var xAnniversary = new NonStandardProperty(
propKey,
pref.IsEmpty ? null : string.Format(CultureInfo.InvariantCulture, "{0:0000}-{1:00}-{2:00}",
dto.Year, dto.Month, dto.Day),
group);
private void BuildAnniversary(DateOnly dto, string propKey, string? group)
{
var xAnniversary = new NonStandardProperty(
propKey,
string.Format(CultureInfo.InvariantCulture, "{0:0000}-{1:00}-{2:00}",
dto.Year, dto.Month, dto.Day),
group);

BuildProperty(propKey, xAnniversary);
}
}
BuildProperty(propKey, xAnniversary);
}

[ExcludeFromCodeCoverage]
Expand Down Expand Up @@ -578,7 +578,7 @@ protected virtual void AppendGenderViews(IEnumerable<GenderProperty?> value)
{
Debug.Assert(value is not null);

if (value.FirstOrDefault(x => x?.Value?.Sex is not null) is GenderProperty pref)
if (value.FirstOrDefault(x => x?.Value.Sex is not null) is GenderProperty pref)
{
Sex sex = pref.Value.Sex!.Value;

Expand Down
12 changes: 7 additions & 5 deletions src/FolkerKinzel.VCards/Intls/Serializers/Vcf_3_0Serializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -233,21 +233,23 @@ protected override void AppendOrganizations(IEnumerable<OrgProperty?> value)
{
OrgProperty? pref = value.PrefOrNullIntl(IgnoreEmptyItems);

if (pref is null) { return; }
if (pref is null)
{
return;
}

BuildProperty(VCard.PropKeys.ORG, pref);

string? sortString = pref.Parameters.SortAs?.FirstOrDefault();

if (sortString is not null)
{
// Required property
Debug.Assert(VCardToSerialize.NameViews is not null);

if (VCardToSerialize.NameViews!
.FirstOrNullIntl(IgnoreEmptyItems)?
.Parameters
.SortAs?
.Any(static x => !string.IsNullOrWhiteSpace(x)) ?? false)
.FirstOrNullIntl(IgnoreEmptyItems)?
.Parameters.SortAs?.Any() ?? false)
{
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ internal DateAndOrTime(OneOf<DateOnly, DateTimeOffset, TimeOnly, string> oneOf)
///
public bool TryAsDateOnly(out DateOnly value)
{
var result = _oneOf.Match<(DateOnly Value, bool Result)>
(DateOnly Value, bool Result) result = _oneOf.Match<(DateOnly Value, bool Result)>
(
dateOnly => (dateOnly, true),
dtOffset => dtOffset.HasDate()
Expand Down

0 comments on commit 4edf37b

Please sign in to comment.