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);
+ }
+ }
+}