diff --git a/src/Avalonia.Visuals/Media/Fonts/FontFamilyKey.cs b/src/Avalonia.Visuals/Media/Fonts/FontFamilyKey.cs index d0e3207c70..204d419be4 100644 --- a/src/Avalonia.Visuals/Media/Fonts/FontFamilyKey.cs +++ b/src/Avalonia.Visuals/Media/Fonts/FontFamilyKey.cs @@ -16,7 +16,9 @@ namespace Avalonia.Media.Fonts /// /// public FontFamilyKey(Uri source) - { + { + if (source == null) throw new ArgumentNullException(nameof(source)); + if (source.AbsolutePath.Contains(".ttf")) { var filePathWithoutExtension = source.AbsolutePath.Replace(".ttf", ""); diff --git a/src/Avalonia.Visuals/Media/Fonts/FontFamilyLoader.cs b/src/Avalonia.Visuals/Media/Fonts/FontFamilyLoader.cs index d972c7571a..89d5e07e5c 100644 --- a/src/Avalonia.Visuals/Media/Fonts/FontFamilyLoader.cs +++ b/src/Avalonia.Visuals/Media/Fonts/FontFamilyLoader.cs @@ -21,7 +21,7 @@ namespace Avalonia.Media.Fonts s_defaultAssembly = new AssemblyDescriptor(Assembly.GetEntryAssembly()); } - public static IEnumerable GetFontResources(FontFamilyKey fontFamilyKey) + public static IEnumerable LoadFontResources(FontFamilyKey fontFamilyKey) { return fontFamilyKey.FileName != null ? GetFontResourcesByFileName(fontFamilyKey.Location, fontFamilyKey.FileName) diff --git a/src/Skia/Avalonia.Skia/SKTypefaceCollectionCache.cs b/src/Skia/Avalonia.Skia/SKTypefaceCollectionCache.cs index fddca39f3f..254f6cff1b 100644 --- a/src/Skia/Avalonia.Skia/SKTypefaceCollectionCache.cs +++ b/src/Skia/Avalonia.Skia/SKTypefaceCollectionCache.cs @@ -22,7 +22,7 @@ namespace Avalonia.Skia private static SKTypefaceCollection CreateCustomFontCollection(FontFamily fontFamily) { - var resources = FontFamilyLoader.GetFontResources(fontFamily.Key); + var resources = FontFamilyLoader.LoadFontResources(fontFamily.Key); var typeFaceCollection = new SKTypefaceCollection(); diff --git a/src/Windows/Avalonia.Direct2D1/Media/Direct2D1FontCollectionCache.cs b/src/Windows/Avalonia.Direct2D1/Media/Direct2D1FontCollectionCache.cs index bbb438b204..881f27351a 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Direct2D1FontCollectionCache.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Direct2D1FontCollectionCache.cs @@ -24,7 +24,7 @@ namespace Avalonia.Direct2D1.Media private static SharpDX.DirectWrite.FontCollection CreateFontCollection(FontFamilyKey key) { - var resources = FontFamilyLoader.GetFontResources(key); + var resources = FontFamilyLoader.LoadFontResources(key); var fontLoader = new DWriteResourceFontLoader(s_factory, resources); diff --git a/tests/Avalonia.Visuals.UnitTests/Assets/MyFont.ttf b/tests/Avalonia.Visuals.UnitTests/Assets/MyFont.ttf new file mode 100644 index 0000000000..5f282702bb --- /dev/null +++ b/tests/Avalonia.Visuals.UnitTests/Assets/MyFont.ttf @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj b/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj index 2b559c9c56..0b2a7faef0 100644 --- a/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj +++ b/tests/Avalonia.Visuals.UnitTests/Avalonia.Visuals.UnitTests.csproj @@ -7,6 +7,12 @@ + + + + + + diff --git a/tests/Avalonia.Visuals.UnitTests/Media/FontFamilyTests.cs b/tests/Avalonia.Visuals.UnitTests/Media/FontFamilyTests.cs new file mode 100644 index 0000000000..66aa1ab583 --- /dev/null +++ b/tests/Avalonia.Visuals.UnitTests/Media/FontFamilyTests.cs @@ -0,0 +1,75 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Avalonia.Media; +using Avalonia.Media.Fonts; +using Xunit; + +namespace Avalonia.Visuals.UnitTests.Media +{ + public class FontFamilyTests + { + [Fact] + public void Exception_Should_Be_Thrown_If_Name_Is_Null() + { + Assert.Throws(() => new FontFamily((string)null)); + } + + [Fact] + public void Exception_Should_Be_Thrown_If_Names_Is_Null() + { + Assert.Throws(() => new FontFamily((IEnumerable)null)); + } + + [Fact] + public void Parse_Parses_FontFamily_With_Name() + { + var fontFamily = FontFamily.Parse("Courier New"); + + Assert.Equal("Courier New", fontFamily.Name); + } + + [Fact] + public void Parse_Parses_FontFamily_With_Names() + { + var fontFamily = FontFamily.Parse("Courier New, Times New Roman"); + + Assert.Equal("Courier New", fontFamily.Name); + + Assert.Equal(2, fontFamily.FamilyNames.Count()); + + Assert.Equal("Times New Roman", fontFamily.FamilyNames.Last()); + } + + [Fact] + public void Parse_Parses_FontFamily_With_Resource_Folder() + { + var source = new Uri("resm:Avalonia.Visuals.UnitTests#MyFont"); + + var key = new FontFamilyKey(source); + + var fontFamily = FontFamily.Parse(source.OriginalString); + + Assert.Equal("MyFont", fontFamily.Name); + + Assert.Equal(key, fontFamily.Key); + } + + [Fact] + public void Parse_Parses_FontFamily_With_Resource_Filename() + { + var source = new Uri("resm:Avalonia.Visuals.UnitTests.MyFont.ttf#MyFont"); + + var key = new FontFamilyKey(source); + + var fontFamily = FontFamily.Parse(source.OriginalString); + + Assert.Equal("MyFont", fontFamily.Name); + + Assert.Equal(key, fontFamily.Key); + } + } +} diff --git a/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FamilyNameCollectionTests.cs b/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FamilyNameCollectionTests.cs new file mode 100644 index 0000000000..fef86ac4fc --- /dev/null +++ b/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FamilyNameCollectionTests.cs @@ -0,0 +1,25 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using System.Linq; +using Avalonia.Media.Fonts; +using Xunit; + +namespace Avalonia.Visuals.UnitTests.Media.Fonts +{ + public class FamilyNameCollectionTests + { + [Fact] + public void Exception_Should_Be_Thrown_If_Names_Is_Null() + { + Assert.Throws(() => new FamilyNameCollection(null)); + } + + [Fact] + public void Exception_Should_Be_Thrown_If_Names_Is_Empty() + { + Assert.Throws(() => new FamilyNameCollection(Enumerable.Empty())); + } + } +} diff --git a/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FontFamilyKeyTests.cs b/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FontFamilyKeyTests.cs new file mode 100644 index 0000000000..d119ed2d47 --- /dev/null +++ b/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FontFamilyKeyTests.cs @@ -0,0 +1,43 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using Avalonia.Media; +using Avalonia.Media.Fonts; +using Xunit; + +namespace Avalonia.Visuals.UnitTests.Media.Fonts +{ + public class FontFamilyKeyTests + { + [Fact] + public void Exception_Should_Be_Thrown_If_Source_Is_Null() + { + Assert.Throws(() => new FontFamilyKey(null)); + } + + [Fact] + public void Should_Initialize_With_Location() + { + var source = new Uri("resm:Avalonia.Visuals.UnitTests#MyFont"); + + var fontFamilyKey = new FontFamilyKey(source); + + Assert.Equal(new Uri("resm:Avalonia.Visuals.UnitTests"), fontFamilyKey.Location); + + Assert.Null(fontFamilyKey.FileName); + } + + [Fact] + public void Should_Initialize_With_Location_And_Filename() + { + var source = new Uri("resm:Avalonia.Visuals.UnitTests.MyFont.ttf#MyFont"); + + var fontFamilyKey = new FontFamilyKey(source); + + Assert.Equal(new Uri("resm:Avalonia.Visuals.UnitTests"), fontFamilyKey.Location); + + Assert.Equal("MyFont.ttf", fontFamilyKey.FileName); + } + } +} diff --git a/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FontFamilyLoaderTests.cs b/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FontFamilyLoaderTests.cs new file mode 100644 index 0000000000..10a841ba84 --- /dev/null +++ b/tests/Avalonia.Visuals.UnitTests/Media/Fonts/FontFamilyLoaderTests.cs @@ -0,0 +1,38 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using System.Linq; +using Avalonia.Media.Fonts; +using Avalonia.UnitTests; +using Xunit; + +namespace Avalonia.Visuals.UnitTests.Media.Fonts +{ + public class FontFamilyLoaderTests + { + [Fact] + public void Should_Load_Single_FontResource() + { + const string resourcePath = "resm:Avalonia.Visuals.UnitTests.Assets.MyFont.ttf?assembly=Avalonia.Visuals.UnitTests#MyFont"; + + using (StartWithResources((resourcePath, "MyFont.ttf"))) + { + var source = new Uri(resourcePath, UriKind.RelativeOrAbsolute); + + var key = new FontFamilyKey(source); + + var resources = FontFamilyLoader.LoadFontResources(key); + + Assert.Single(resources); + } + } + + private static IDisposable StartWithResources(params (string, string)[] assets) + { + var assetLoader = new MockAssetLoader(assets); + var services = new TestServices(assetLoader: assetLoader, platform: new AppBuilder().RuntimePlatform); + return UnitTestApplication.Start(services); + } + } +}