зеркало из https://github.com/SixLabors/Shapes.git
get Rectangle to 100% test coverage
This commit is contained in:
Родитель
60db258029
Коммит
39f036d57d
|
@ -215,17 +215,14 @@ namespace Shaper2D
|
|||
{
|
||||
var buffer = new Point[2];
|
||||
var c = this.FindIntersections(start, end, buffer, 2, 0);
|
||||
if (c == 2)
|
||||
switch (c)
|
||||
{
|
||||
return buffer;
|
||||
}
|
||||
else if (c == 1)
|
||||
{
|
||||
return new[] { buffer[0] };
|
||||
}
|
||||
else
|
||||
{
|
||||
return Enumerable.Empty<Point>();
|
||||
case 2:
|
||||
return buffer;
|
||||
case 1:
|
||||
return new[] { buffer[0] };
|
||||
default:
|
||||
return Enumerable.Empty<Point>();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -248,18 +245,26 @@ namespace Shaper2D
|
|||
Vector2 startPoint = Vector2.Clamp(start, this.topLeft, this.bottomRight);
|
||||
Vector2 endPoint = Vector2.Clamp(end, this.topLeft, this.bottomRight);
|
||||
|
||||
if (startPoint == Vector2.Clamp(startPoint, start, end))
|
||||
// start doesn't change when its inside the shape thus not crossing
|
||||
if (startPoint != start.ToVector2())
|
||||
{
|
||||
// if start closest is within line then its a valid point
|
||||
discovered++;
|
||||
buffer[offset++] = startPoint;
|
||||
if (startPoint == Vector2.Clamp(startPoint, start, end))
|
||||
{
|
||||
// if start closest is within line then its a valid point
|
||||
discovered++;
|
||||
buffer[offset++] = startPoint;
|
||||
}
|
||||
}
|
||||
|
||||
if (endPoint == Vector2.Clamp(endPoint, start, end))
|
||||
// end didn't change it must not intercept with an edge
|
||||
if (endPoint != end.ToVector2())
|
||||
{
|
||||
// if start closest is within line then its a valid point
|
||||
discovered++;
|
||||
buffer[offset++] = endPoint;
|
||||
if (endPoint == Vector2.Clamp(endPoint, start, end))
|
||||
{
|
||||
// if start closest is within line then its a valid point
|
||||
discovered++;
|
||||
buffer[offset] = endPoint;
|
||||
}
|
||||
}
|
||||
|
||||
return discovered;
|
||||
|
@ -327,8 +332,7 @@ namespace Shaper2D
|
|||
{
|
||||
// closer to rhs
|
||||
clamped.X = this.bottomRight.X; // x is already the same
|
||||
|
||||
distanceAlongEdge = (this.bottomRight.Y - clamped.Y) + this.Size.Width;
|
||||
distanceAlongEdge = (clamped.Y - this.topLeft.Y) + this.Size.Width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -355,11 +359,16 @@ namespace Shaper2D
|
|||
}
|
||||
else if (this.bottomRight.X == clamped.X)
|
||||
{
|
||||
distanceAlongEdge = (this.bottomRight.Y - clamped.Y) + this.Size.Width;
|
||||
distanceAlongEdge = (clamped.Y - this.topLeft.Y) + this.Size.Width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (distanceAlongEdge == this.length)
|
||||
{
|
||||
distanceAlongEdge = 0;
|
||||
}
|
||||
|
||||
return new PointInfo
|
||||
{
|
||||
SearchPoint = point,
|
||||
|
|
|
@ -24,6 +24,79 @@ namespace Shaper2D.Tests
|
|||
false
|
||||
}, //corner is inside
|
||||
};
|
||||
public static TheoryData<TestPoint, TestSize, TestPoint, float> DistanceTheoryData =
|
||||
new TheoryData<TestPoint, TestSize, TestPoint, float>
|
||||
{
|
||||
{
|
||||
new Point(10,10), // loc
|
||||
new Size(100,100), // size
|
||||
new Point(10,10), // test
|
||||
0f
|
||||
}, //corner is inside
|
||||
{
|
||||
new Point(10,10), // loc
|
||||
new Size(100,100), // size
|
||||
new Point(9,10), // test
|
||||
1f
|
||||
},
|
||||
{
|
||||
new Point(10,10), // loc
|
||||
new Size(100,100), // size
|
||||
new Point(10,13), // test
|
||||
0f
|
||||
},
|
||||
{
|
||||
new Point(10,10), // loc
|
||||
new Size(100,100), // size
|
||||
new Point(14,13), // test
|
||||
-3f
|
||||
},
|
||||
{
|
||||
new Point(10,10), // loc
|
||||
new Size(100,100), // size
|
||||
new Point(13,14), // test
|
||||
-3f
|
||||
},
|
||||
{
|
||||
new Point(10,10), // loc
|
||||
new Size(100,100), // size
|
||||
new Point(7,6), // test
|
||||
5f
|
||||
},
|
||||
};
|
||||
|
||||
public static TheoryData<TestPoint, float, float> PathDistanceTheoryData =
|
||||
new TheoryData<TestPoint, float, float>
|
||||
{
|
||||
{ new Point(0,0), 0f, 0f },
|
||||
{ new Point(1,0), 0f, 1f },
|
||||
{ new Point(9,0), 0f, 9f },
|
||||
{ new Point(10,0), 0f, 10f },
|
||||
{ new Point(10, 1), 0f, 11f },
|
||||
{ new Point(10,9), 0f, 19f },
|
||||
{ new Point(10,10), 0f, 20f },
|
||||
{ new Point(9,10), 0f, 21f },
|
||||
{ new Point(1,10), 0f, 29f },
|
||||
{ new Point(0,10), 0f, 30f },
|
||||
{ new Point(0,9), 0f, 31f },
|
||||
{ new Point(0,1), 0f, 39f },
|
||||
|
||||
{ new Point(4,3), 3f, 4f },
|
||||
{ new Point(3, 4), 3f, 36f },
|
||||
|
||||
{ new Point(-1,0), 1f, 0f },
|
||||
{ new Point(1,-1), 1f, 1f },
|
||||
{ new Point(9,-1), 1f, 9f },
|
||||
{ new Point(11,0), 1f, 10f },
|
||||
{ new Point(11, 1), 1f, 11f },
|
||||
{ new Point(11,9), 1f, 19f },
|
||||
{ new Point(11,10), 1f, 20f },
|
||||
{ new Point(9,11), 1f, 21f },
|
||||
{ new Point(1,11), 1f, 29f },
|
||||
{ new Point(-1,10), 1f, 30f },
|
||||
{ new Point(-1,9), 1f, 31f },
|
||||
{ new Point(-1,1), 1f, 39f },
|
||||
};
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(PointInPolygonTheoryData))]
|
||||
|
@ -32,5 +105,150 @@ namespace Shaper2D.Tests
|
|||
var shape = new Rectangle(location, size);
|
||||
Assert.Equal(isInside, shape.Contains(point));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(DistanceTheoryData))]
|
||||
public void Distance(TestPoint location, TestSize size, TestPoint point, float expectecDistance)
|
||||
{
|
||||
IShape shape = new Rectangle(location, size);
|
||||
|
||||
Assert.Equal(expectecDistance, shape.Distance(point));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(PathDistanceTheoryData))]
|
||||
public void DistanceFromPath_Path(TestPoint point, float expectecDistance, float alongPath)
|
||||
{
|
||||
IPath shape = new Rectangle(0, 0, 10, 10);
|
||||
var info = shape.Distance(point);
|
||||
Assert.Equal(expectecDistance, info.DistanceFromPath);
|
||||
Assert.Equal(alongPath, info.DistanceAlongPath);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Left()
|
||||
{
|
||||
var shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(10, shape.Left);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Right()
|
||||
{
|
||||
var shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(22, shape.Right);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Top()
|
||||
{
|
||||
var shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(11, shape.Top);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Bottom()
|
||||
{
|
||||
var shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(24, shape.Bottom);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Size()
|
||||
{
|
||||
var shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(12, shape.Size.Width);
|
||||
Assert.Equal(13, shape.Size.Height);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Bounds_Shape()
|
||||
{
|
||||
IShape shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(10, shape.Bounds.Left);
|
||||
Assert.Equal(22, shape.Bounds.Right);
|
||||
Assert.Equal(11, shape.Bounds.Top);
|
||||
Assert.Equal(24, shape.Bounds.Bottom);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LienearSegements()
|
||||
{
|
||||
ILineSegment shape = new Rectangle(10, 11, 12, 13);
|
||||
var segemnts = shape.AsSimpleLinearPath();
|
||||
Assert.Equal(new Point(10, 11), segemnts[0]);
|
||||
Assert.Equal(new Point(22, 11), segemnts[1]);
|
||||
Assert.Equal(new Point(22, 24), segemnts[2]);
|
||||
Assert.Equal(new Point(10, 24), segemnts[3]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Intersections_2()
|
||||
{
|
||||
IShape shape = new Rectangle(1, 1, 10, 10);
|
||||
var intersections = shape.FindIntersections(new Point(0, 5), new Point(20, 5));
|
||||
|
||||
Assert.Equal(2, intersections.Count());
|
||||
Assert.Equal(new Point(1, 5), intersections.First());
|
||||
Assert.Equal(new Point(11, 5), intersections.Last());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Intersections_1()
|
||||
{
|
||||
IShape shape = new Rectangle(1, 1, 10, 10);
|
||||
var intersections = shape.FindIntersections(new Point(0, 5), new Point(5, 5));
|
||||
|
||||
Assert.Equal(1, intersections.Count());
|
||||
Assert.Equal(new Point(1, 5), intersections.First());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Intersections_0()
|
||||
{
|
||||
IShape shape = new Rectangle(1, 1, 10, 10);
|
||||
var intersections = shape.FindIntersections(new Point(0, 5), new Point(-5, 5));
|
||||
|
||||
Assert.Equal(0, intersections.Count());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Bounds_Path()
|
||||
{
|
||||
IPath shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(10, shape.Bounds.Left);
|
||||
Assert.Equal(22, shape.Bounds.Right);
|
||||
Assert.Equal(11, shape.Bounds.Top);
|
||||
Assert.Equal(24, shape.Bounds.Bottom);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void IsClosed_Path()
|
||||
{
|
||||
IPath shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(true, shape.IsClosed);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Length_Path()
|
||||
{
|
||||
IPath shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(50, shape.Length);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MaxIntersections_Shape()
|
||||
{
|
||||
IShape shape = new Rectangle(10, 11, 12, 13);
|
||||
Assert.Equal(4, shape.MaxIntersections);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ShapePaths()
|
||||
{
|
||||
IShape shape = new Rectangle(10, 11, 12, 13);
|
||||
|
||||
Assert.Equal((IPath)shape, shape.Paths.Single());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Shaper2D.Tests
|
||||
{
|
||||
public static class TestData
|
||||
{
|
||||
static Random rand = new Random();
|
||||
|
||||
public static Size RandomSize()
|
||||
{
|
||||
return new Size((float)(rand.NextDouble() * rand.Next()), (float)(rand.NextDouble() * rand.Next()));
|
||||
}
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче