PathMarkupParserTests.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // Copyright (c) The Avalonia Project. All rights reserved.
  2. // Licensed under the MIT license. See licence.md file in the project root for full license information.
  3. using Avalonia.Media;
  4. using Avalonia.Visuals.Platform;
  5. using Xunit;
  6. namespace Avalonia.Visuals.UnitTests.Media
  7. {
  8. public class PathMarkupParserTests
  9. {
  10. [Fact]
  11. public void Parses_Move()
  12. {
  13. var pathGeometry = new PathGeometry();
  14. using (var context = new PathGeometryContext(pathGeometry))
  15. using (var parser = new PathMarkupParser(context))
  16. {
  17. parser.Parse("M10 10");
  18. var figure = pathGeometry.Figures[0];
  19. Assert.Equal(new Point(10, 10), figure.StartPoint);
  20. }
  21. }
  22. [Fact]
  23. public void Parses_Line()
  24. {
  25. var pathGeometry = new PathGeometry();
  26. using (var context = new PathGeometryContext(pathGeometry))
  27. using (var parser = new PathMarkupParser(context))
  28. {
  29. parser.Parse("M0 0L10 10");
  30. var figure = pathGeometry.Figures[0];
  31. var segment = figure.Segments[0];
  32. Assert.IsType<LineSegment>(segment);
  33. var lineSegment = (LineSegment)segment;
  34. Assert.Equal(new Point(10, 10), lineSegment.Point);
  35. }
  36. }
  37. [Fact]
  38. public void Parses_Close()
  39. {
  40. var pathGeometry = new PathGeometry();
  41. using (var context = new PathGeometryContext(pathGeometry))
  42. using (var parser = new PathMarkupParser(context))
  43. {
  44. parser.Parse("M0 0L10 10z");
  45. var figure = pathGeometry.Figures[0];
  46. Assert.True(figure.IsClosed);
  47. }
  48. }
  49. [Fact]
  50. public void Parses_FillMode_Before_Move()
  51. {
  52. var pathGeometry = new PathGeometry();
  53. using (var context = new PathGeometryContext(pathGeometry))
  54. using (var parser = new PathMarkupParser(context))
  55. {
  56. parser.Parse("F 1M0,0");
  57. Assert.Equal(FillRule.NonZero, pathGeometry.FillRule);
  58. }
  59. }
  60. [Theory]
  61. [InlineData("M0 0 10 10 20 20")]
  62. [InlineData("M0,0 10,10 20,20")]
  63. [InlineData("M0,0,10,10,20,20")]
  64. public void Parses_Implicit_Line_Command_After_Move(string pathData)
  65. {
  66. var pathGeometry = new PathGeometry();
  67. using (var context = new PathGeometryContext(pathGeometry))
  68. using (var parser = new PathMarkupParser(context))
  69. {
  70. parser.Parse(pathData);
  71. var figure = pathGeometry.Figures[0];
  72. var segment = figure.Segments[0];
  73. Assert.IsType<LineSegment>(segment);
  74. var lineSegment = (LineSegment)segment;
  75. Assert.Equal(new Point(10, 10), lineSegment.Point);
  76. figure = pathGeometry.Figures[1];
  77. segment = figure.Segments[0];
  78. Assert.IsType<LineSegment>(segment);
  79. lineSegment = (LineSegment)segment;
  80. Assert.Equal(new Point(20, 20), lineSegment.Point);
  81. }
  82. }
  83. [Theory]
  84. [InlineData("m0 0 10 10 20 20")]
  85. [InlineData("m0,0 10,10 20,20")]
  86. [InlineData("m0,0,10,10,20,20")]
  87. public void Parses_Implicit_Line_Command_After_Relative_Move(string pathData)
  88. {
  89. var pathGeometry = new PathGeometry();
  90. using (var context = new PathGeometryContext(pathGeometry))
  91. using (var parser = new PathMarkupParser(context))
  92. {
  93. parser.Parse(pathData);
  94. var figure = pathGeometry.Figures[0];
  95. var segment = figure.Segments[0];
  96. Assert.IsType<LineSegment>(segment);
  97. var lineSegment = (LineSegment)segment;
  98. Assert.Equal(new Point(10, 10), lineSegment.Point);
  99. segment = figure.Segments[1];
  100. Assert.IsType<LineSegment>(segment);
  101. lineSegment = (LineSegment)segment;
  102. Assert.Equal(new Point(30, 30), lineSegment.Point);
  103. }
  104. }
  105. [Theory]
  106. [InlineData("F1 M24,14 A2,2,0,1,1,20,14 A2,2,0,1,1,24,14 z")] // issue #1107
  107. [InlineData("M0 0L10 10z")]
  108. [InlineData("M50 50 L100 100 L150 50")]
  109. [InlineData("M50 50L100 100L150 50")]
  110. [InlineData("M50,50 L100,100 L150,50")]
  111. [InlineData("M50 50 L-10 -10 L10 50")]
  112. [InlineData("M50 50L-10-10L10 50")]
  113. [InlineData("M50 50 L100 100 L150 50zM50 50 L70 70 L120 50z")]
  114. [InlineData("M 50 50 L 100 100 L 150 50")]
  115. [InlineData("M50 50 L100 100 L150 50 H200 V100Z")]
  116. [InlineData("M 80 200 A 100 50 45 1 0 100 50")]
  117. [InlineData(
  118. "F1 M 16.6309 18.6563C 17.1309 8.15625 29.8809 14.1563 29.8809 14.1563C 30.8809 11.1563 34.1308 11.4063" +
  119. " 34.1308 11.4063C 33.5 12 34.6309 13.1563 34.6309 13.1563C 32.1309 13.1562 31.1309 14.9062 31.1309 14.9" +
  120. "062C 41.1309 23.9062 32.6309 27.9063 32.6309 27.9062C 24.6309 24.9063 21.1309 22.1562 16.6309 18.6563 Z" +
  121. " M 16.6309 19.9063C 21.6309 24.1563 25.1309 26.1562 31.6309 28.6562C 31.6309 28.6562 26.3809 39.1562 18" +
  122. ".3809 36.1563C 18.3809 36.1563 18 38 16.3809 36.9063C 15 36 16.3809 34.9063 16.3809 34.9063C 16.3809 34" +
  123. ".9063 10.1309 30.9062 16.6309 19.9063 Z ")]
  124. [InlineData(
  125. "F1M16,12C16,14.209 14.209,16 12,16 9.791,16 8,14.209 8,12 8,11.817 8.03,11.644 8.054,11.467L6.585,10 4,10 " +
  126. "4,6.414 2.5,7.914 0,5.414 0,3.586 3.586,0 4.414,0 7.414,3 7.586,3 9,1.586 11.914,4.5 10.414,6 " +
  127. "12.461,8.046C14.45,8.278,16,9.949,16,12")]
  128. public void Should_Parse(string pathData)
  129. {
  130. var pathGeometry = new PathGeometry();
  131. using (var context = new PathGeometryContext(pathGeometry))
  132. using (var parser = new PathMarkupParser(context))
  133. {
  134. parser.Parse(pathData);
  135. Assert.True(true);
  136. }
  137. }
  138. }
  139. }