FontFamilyTests.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using System;
  2. using System.Linq;
  3. using Avalonia.Media;
  4. using Avalonia.Media.Fonts;
  5. using Avalonia.Platform;
  6. using Xunit;
  7. namespace Avalonia.Base.UnitTests.Media
  8. {
  9. public class FontFamilyTests
  10. {
  11. public FontFamilyTests()
  12. {
  13. AssetLoader.RegisterResUriParsers();
  14. }
  15. [Fact]
  16. public void Should_Implicitly_Convert_String_To_FontFamily()
  17. {
  18. FontFamily fontFamily = "Arial";
  19. Assert.Equal(new FontFamily("Arial"), fontFamily);
  20. }
  21. [InlineData("Font A")]
  22. [InlineData("Font A, Font B")]
  23. [InlineData("resm: Avalonia.Visuals.UnitTests#MyFont")]
  24. [InlineData("avares://Avalonia.Visuals.UnitTests/Assets/Fonts#MyFont")]
  25. [Theory]
  26. public void Should_Have_Equal_Hash(string s)
  27. {
  28. var fontFamily = new FontFamily(s);
  29. Assert.Equal(new FontFamily(s).GetHashCode(), fontFamily.GetHashCode());
  30. }
  31. [InlineData("Font A, Font B", "Font B, Font A")]
  32. [InlineData("Font A, Font B", "Font A, Font C")]
  33. [Theory]
  34. public void Should_Not_Have_Equal_Hash(string a, string b)
  35. {
  36. var fontFamily = new FontFamily(b);
  37. Assert.NotEqual(new FontFamily(a).GetHashCode(), fontFamily.GetHashCode());
  38. }
  39. [InlineData("Font A")]
  40. [InlineData("Font A, Font B")]
  41. [InlineData("resm: Avalonia.Visuals.UnitTests#MyFont")]
  42. [InlineData("avares://Avalonia.Visuals.UnitTests/Assets/Fonts#MyFont")]
  43. [Theory]
  44. public void Should_Be_Equal(string s)
  45. {
  46. var fontFamily = new FontFamily(s);
  47. Assert.Equal(new FontFamily(s), fontFamily);
  48. }
  49. [InlineData("Font A, Font B", "Font B, Font A")]
  50. [InlineData("Font A, Font B", "Font A, Font C")]
  51. [Theory]
  52. public void Should_Not_Be_Equal(string a, string b)
  53. {
  54. var fontFamily = new FontFamily(b);
  55. Assert.NotEqual(new FontFamily(a), fontFamily);
  56. }
  57. [Fact]
  58. public void Should_Parse_FontFamily_With_SystemFont_Name()
  59. {
  60. var fontFamily = FontFamily.Parse("Courier New");
  61. Assert.Equal("Courier New", fontFamily.Name);
  62. }
  63. [Fact]
  64. public void Should_Parse_FontFamily_With_Fallbacks()
  65. {
  66. var fontFamily = FontFamily.Parse("Courier New, Times New Roman");
  67. Assert.Equal("Courier New", fontFamily.Name);
  68. Assert.Equal(2, fontFamily.FamilyNames.Count);
  69. Assert.Equal("Times New Roman", fontFamily.FamilyNames.Last());
  70. }
  71. [Fact]
  72. public void Should_Parse_FontFamily_With_Resource_Folder()
  73. {
  74. var source = new Uri("resm:Avalonia.Visuals.UnitTests#MyFont");
  75. var key = new FontFamilyKey(source);
  76. var fontFamily = FontFamily.Parse(source.OriginalString);
  77. Assert.Equal("MyFont", fontFamily.Name);
  78. Assert.Equal(key, fontFamily.Key);
  79. }
  80. [Fact]
  81. public void Should_Parse_FontFamily_With_Resource_Filename()
  82. {
  83. var source = new Uri("resm:Avalonia.Visuals.UnitTests.MyFont.ttf#MyFont");
  84. var key = new FontFamilyKey(source);
  85. var fontFamily = FontFamily.Parse(source.OriginalString);
  86. Assert.Equal("MyFont", fontFamily.Name);
  87. Assert.Equal(key, fontFamily.Key);
  88. }
  89. [Theory]
  90. [InlineData("resm:Avalonia.Visuals.UnitTests/Assets/Fonts#MyFont")]
  91. [InlineData("avares://Avalonia.Visuals.UnitTests/Assets/Fonts#MyFont")]
  92. public void Should_Create_FontFamily_From_Uri(string name)
  93. {
  94. var fontFamily = new FontFamily(name);
  95. Assert.Equal("MyFont", fontFamily.Name);
  96. Assert.NotNull(fontFamily.Key);
  97. }
  98. [Theory]
  99. [InlineData(null, "resm:Avalonia.Visuals.UnitTests.Assets.Fonts#MyFont")]
  100. [InlineData("avares://Avalonia.Visuals.UnitTests/Assets/Fonts", "/#MyFont")]
  101. [InlineData("avares://Avalonia.Visuals.UnitTests", "/Assets/Fonts#MyFont")]
  102. public void Should_Create_FontFamily_From_Uri_With_Base_Uri(string @base, string name)
  103. {
  104. var baseUri = @base != null ? new Uri(@base) : null;
  105. var fontFamily = new FontFamily(baseUri, name);
  106. Assert.Equal("MyFont", fontFamily.Name);
  107. Assert.NotNull(fontFamily.Key);
  108. }
  109. [InlineData(null, "Arial", "Arial", null)]
  110. [InlineData(null, "resm:Avalonia.Skia.UnitTests.Fonts?assembly=Avalonia.Skia.UnitTests#Manrope", "Manrope", "resm:Avalonia.Skia.UnitTests.Fonts?assembly=Avalonia.Skia.UnitTests")]
  111. [InlineData(null, "avares://Avalonia.Fonts.Inter/Assets#Inter", "Inter", null)]
  112. [InlineData("avares://Avalonia.Fonts.Inter", "/Assets#Inter", "Inter", "avares://Avalonia.Fonts.Inter/Assets")]
  113. [InlineData("avares://ControlCatalog/MainWindow.xaml", "avares://Avalonia.Fonts.Inter/Assets#Inter", "Inter", "avares://Avalonia.Fonts.Inter/Assets")]
  114. [Theory]
  115. public void Should_Parse_FontFamily_With_BaseUri(string baseUri, string s, string expectedName, string expectedUri)
  116. {
  117. var b = baseUri is not null ? new Uri(baseUri) : null;
  118. expectedUri = expectedUri is not null ? new Uri(expectedUri).AbsoluteUri : null;
  119. var fontFamily = FontFamily.Parse(s, b);
  120. Assert.Equal(expectedName, fontFamily.Name);
  121. var key = fontFamily.Key;
  122. if (expectedUri is not null)
  123. {
  124. Assert.NotNull(key);
  125. if (key.BaseUri is not null)
  126. {
  127. Assert.True(key.BaseUri.IsAbsoluteUri);
  128. }
  129. if (key.BaseUri is null)
  130. {
  131. Assert.NotNull(key.Source);
  132. Assert.True(key.Source.IsAbsoluteUri);
  133. }
  134. var fontUri = key.BaseUri;
  135. if (key.Source is Uri sourceUri)
  136. {
  137. if (sourceUri.IsAbsoluteUri)
  138. {
  139. fontUri = sourceUri;
  140. }
  141. else
  142. {
  143. fontUri = new Uri(fontUri, sourceUri);
  144. }
  145. }
  146. Assert.Equal(expectedUri, fontUri.AbsoluteUri);
  147. }
  148. }
  149. [InlineData("avares://MyAssembly/", "Some/Path/#FontName", "avares://MyAssembly/Some/Path/"), ]
  150. [InlineData("avares://MyAssembly/", "./Some/Path/#FontName", "avares://MyAssembly/Some/Path/")]
  151. [InlineData("avares://MyAssembly/sub/", "../Some/Path/#FontName", "avares://MyAssembly/Some/Path/")]
  152. [Theory]
  153. public void Should_Parse_Relative_Path(string baseUriString, string path, string expected)
  154. {
  155. var baseUri = new Uri(baseUriString, UriKind.Absolute);
  156. var fontFamily = FontFamily.Parse(path, baseUri);
  157. Assert.NotNull(fontFamily.Key);
  158. Assert.NotNull(fontFamily.Key.BaseUri);
  159. Assert.NotNull(fontFamily.Key.Source);
  160. var actual = new Uri(fontFamily.Key.BaseUri, fontFamily.Key.Source);
  161. Assert.Equal(expected, actual.AbsoluteUri);
  162. }
  163. }
  164. }