unit tests are done
This commit is contained in:
@@ -13,6 +13,26 @@ namespace Shapes
|
||||
[DataContract]
|
||||
public class Circle : GeometricShape
|
||||
{
|
||||
|
||||
|
||||
[DataMember]
|
||||
public override Color Fill { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public override Color Stroke { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public override Point CenterPoint { get; protected set; }
|
||||
|
||||
[DataMember]
|
||||
public double Radius { get; private set; }
|
||||
|
||||
[DataMember]
|
||||
public double Height { get; internal set; }
|
||||
|
||||
[DataMember]
|
||||
public double Width { get; internal set; }
|
||||
|
||||
internal IFileIO _fileWriter;
|
||||
|
||||
/**
|
||||
@@ -52,17 +72,6 @@ namespace Shapes
|
||||
Width = radius * 2;
|
||||
}
|
||||
|
||||
[DataMember] public override Color Fill { get; set; }
|
||||
|
||||
[DataMember] public override Color Stroke { get; set; }
|
||||
|
||||
[DataMember] public override Point CenterPoint { get; protected set; }
|
||||
|
||||
[DataMember] public double Radius { get; private set; }
|
||||
|
||||
[DataMember] public override double Height { get; internal set; }
|
||||
|
||||
[DataMember] public override double Width { get; internal set; }
|
||||
|
||||
[ExcludeFromCodeCoverage]
|
||||
internal override void ComputeCenter()
|
||||
|
||||
@@ -1,20 +1,37 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.Serialization;
|
||||
[assembly:InternalsVisibleTo("UnitTests")]
|
||||
namespace Shapes
|
||||
{
|
||||
[DataContract]
|
||||
public class CompositeShape : Shape
|
||||
{
|
||||
private readonly List<Shape> thisShapesList = new List<Shape>();
|
||||
|
||||
[DataMember]
|
||||
internal readonly List<Shape> thisShapesList = new List<Shape>();
|
||||
[DataMember]
|
||||
public override Color Fill { get; set; }
|
||||
[DataMember]
|
||||
public override Color Stroke { get; set; }
|
||||
[DataMember]
|
||||
public override List<Point> Points { get; protected set; }
|
||||
|
||||
internal IFileIO _fileWriter;
|
||||
|
||||
public CompositeShape()
|
||||
{
|
||||
Points = new List<Point>();
|
||||
}
|
||||
|
||||
public void Add(Shape shape)
|
||||
{
|
||||
Stroke = Color.Black;
|
||||
Points.AddRange(shape.Points);
|
||||
if (shape.CompositeShape)
|
||||
throw new ShapeException("This shape has already been added to a composite");
|
||||
if (shape == this)
|
||||
@@ -36,10 +53,10 @@ namespace Shapes
|
||||
|
||||
public override void Save(Stream stream)
|
||||
{
|
||||
var fileWriter = new FileIO();
|
||||
fileWriter.SaveShape(stream, this);
|
||||
_fileWriter.SaveShape(stream, this);
|
||||
}
|
||||
|
||||
[ExcludeFromCodeCoverage]
|
||||
public override void Draw(Stream stream)
|
||||
{
|
||||
var tmp = new Bitmap(1000, 1000);
|
||||
@@ -60,6 +77,13 @@ namespace Shapes
|
||||
|
||||
public void RemoveShape(Shape shape)
|
||||
{
|
||||
if(Points.Count > 0)
|
||||
{
|
||||
foreach (var point in shape.Points)
|
||||
{
|
||||
Points.Remove(point);
|
||||
}
|
||||
}
|
||||
if (!thisShapesList.Contains(shape))
|
||||
throw new ShapeException($"{shape.GetType().Name} is not part of the composite shape.");
|
||||
thisShapesList.Remove(shape);
|
||||
@@ -71,7 +95,7 @@ namespace Shapes
|
||||
while (thisShapesList.Count > 0)
|
||||
{
|
||||
thisShapesList[0].CompositeShape = false;
|
||||
thisShapesList.Remove(thisShapesList[0]);
|
||||
RemoveShape(thisShapesList[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Runtime.Serialization.Json;
|
||||
|
||||
namespace Shapes
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class FileIO : IFileIO
|
||||
{
|
||||
public void SaveShape(Stream stream, Shape shape)
|
||||
|
||||
@@ -9,11 +9,8 @@ namespace Shapes
|
||||
[KnownType(typeof(Triangle))]
|
||||
public abstract class GeometricShape : Shape
|
||||
{
|
||||
[DataMember] public abstract double Width { get; internal set; }
|
||||
|
||||
[DataMember] public abstract double Height { get; internal set; }
|
||||
|
||||
[DataMember] public abstract Point CenterPoint { get; protected set; }
|
||||
[DataMember]
|
||||
public abstract Point CenterPoint { get; protected set; }
|
||||
|
||||
internal abstract void ComputeCenter();
|
||||
|
||||
@@ -42,20 +39,14 @@ namespace Shapes
|
||||
{
|
||||
var tmpCenter = CenterPoint;
|
||||
|
||||
var property = GetType().GetProperties().Equals(nameof(Points));
|
||||
Console.WriteLine(property.GetType());
|
||||
|
||||
if (property)
|
||||
{
|
||||
Console.WriteLine(property.GetType());
|
||||
|
||||
foreach (var point in Points)
|
||||
{
|
||||
var tmpPoint = point - tmpCenter;
|
||||
Console.WriteLine($"({tmpPoint.X}, {tmpPoint.Y})");
|
||||
point.X = deltaX + tmpPoint.X;
|
||||
point.Y = deltaY + tmpPoint.Y;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CenterPoint = new Point(deltaX, deltaY);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using static Shapes.ImageManager;
|
||||
|
||||
namespace Shapes
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class Image : Rectangle
|
||||
{
|
||||
public Image(Point point1, Point point2, Point point3, Point point4, Stream stream) : base(point1, point2,
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using System.Collections;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
|
||||
namespace Shapes
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public static class ImageManager
|
||||
{
|
||||
private static readonly Hashtable _images;
|
||||
|
||||
@@ -6,6 +6,10 @@ namespace Shapes
|
||||
[DataContract(Name = "Line", Namespace = "Shapes")]
|
||||
public class Line
|
||||
{
|
||||
[DataMember]
|
||||
public Point Point1 { get; private set; }
|
||||
[DataMember]
|
||||
public Point Point2 { get; private set; }
|
||||
/**
|
||||
* Constructor based on x-y Locations
|
||||
* @param x1 The x-location of first point -- must be a valid double.
|
||||
@@ -34,10 +38,6 @@ namespace Shapes
|
||||
Point2 = point2;
|
||||
}
|
||||
|
||||
[DataMember] public Point Point1 { get; private set; }
|
||||
|
||||
[DataMember] public Point Point2 { get; private set; }
|
||||
|
||||
/**
|
||||
* Move a line
|
||||
*
|
||||
|
||||
@@ -14,6 +14,23 @@ namespace Shapes
|
||||
public class Rectangle : GeometricShape
|
||||
{
|
||||
internal IFileIO _fileWriter;
|
||||
|
||||
[DataMember]
|
||||
public override List<Point> Points { get; protected set; }
|
||||
[DataMember]
|
||||
public override Color Fill { get; set; }
|
||||
[DataMember]
|
||||
public override Color Stroke { get; set; }
|
||||
[DataMember]
|
||||
public List<Line> Lines { get; }
|
||||
[DataMember]
|
||||
public override Point CenterPoint { get; protected set; }
|
||||
[DataMember]
|
||||
public double Width { get; internal set; }
|
||||
[DataMember]
|
||||
public double Height { get; internal set; }
|
||||
|
||||
|
||||
|
||||
public Rectangle(Point point1, Point point2, Point point3, Point point4)
|
||||
{
|
||||
@@ -92,20 +109,7 @@ namespace Shapes
|
||||
Validator.ValidateRectangle(Points, $"Attempted to create an invalid shape {GetType()}");
|
||||
}
|
||||
|
||||
[DataMember] public override List<Point> Points { get; internal set; }
|
||||
|
||||
[DataMember] public override Color Fill { get; set; }
|
||||
|
||||
[DataMember] public override Color Stroke { get; set; }
|
||||
|
||||
[DataMember] public List<Line> Lines { get; }
|
||||
|
||||
[DataMember] public override Point CenterPoint { get; protected set; }
|
||||
|
||||
[DataMember] public sealed override double Width { get; internal set; }
|
||||
|
||||
[DataMember] public sealed override double Height { get; internal set; }
|
||||
|
||||
|
||||
public override double ComputeArea()
|
||||
{
|
||||
return Height * Width;
|
||||
|
||||
@@ -15,14 +15,15 @@ namespace Shapes
|
||||
CompositeShape = false;
|
||||
}
|
||||
|
||||
[DataMember] public virtual List<Point> Points { get; internal set; }
|
||||
|
||||
[DataMember] public abstract Color Fill { get; set; }
|
||||
|
||||
[DataMember] public abstract Color Stroke { get; set; }
|
||||
|
||||
[DataMember] protected internal bool CompositeShape { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public virtual List<Point> Points { get; protected set; }
|
||||
[DataMember]
|
||||
public abstract Color Fill { get; set; }
|
||||
[DataMember]
|
||||
public abstract Color Stroke { get; set; }
|
||||
[DataMember]
|
||||
protected internal bool CompositeShape { get; set; }
|
||||
|
||||
public abstract double ComputeArea();
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
|
||||
namespace Shapes
|
||||
{
|
||||
[ExcludeFromCodeCoverage]
|
||||
public class ShapeFactory
|
||||
{
|
||||
public T GetShapeFromFile<T>(FileStream fileStream)
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Shapes
|
||||
@@ -11,6 +14,24 @@ namespace Shapes
|
||||
[DataContract(Name = "Triangle", Namespace = "Shapes")]
|
||||
public class Triangle : GeometricShape
|
||||
{
|
||||
|
||||
[DataMember]
|
||||
public sealed override List<Point> Points { get; protected set; }
|
||||
|
||||
[DataMember]
|
||||
public override Color Fill { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public override Color Stroke { get; set; }
|
||||
|
||||
[DataMember]
|
||||
public sealed override Point CenterPoint { get; protected set; }
|
||||
|
||||
[DataMember]
|
||||
public List<Line> Lines { get; internal set; }
|
||||
|
||||
internal IFileIO _fileWriter;
|
||||
|
||||
public Triangle(Point point1, Point point2, Point point3)
|
||||
{
|
||||
Stroke = Color.Black;
|
||||
@@ -26,14 +47,7 @@ namespace Shapes
|
||||
Lines.Add(new Line(point2, point3));
|
||||
Lines.Add(new Line(point3, point1));
|
||||
|
||||
var centerOfLine1 = (point1 - point2) / 2 + point1;
|
||||
var centerTriangle = (point1 - centerOfLine1) / 2 + point1;
|
||||
|
||||
|
||||
CenterPoint = centerTriangle;
|
||||
|
||||
Height = new Line(point1, point3).ComputeLength();
|
||||
Width = new Line(point1, point2).ComputeLength();
|
||||
ComputeCenter();
|
||||
}
|
||||
|
||||
public Triangle(double x1, double y1, double x2, double y2, double x3, double y3)
|
||||
@@ -56,28 +70,10 @@ namespace Shapes
|
||||
Lines.Add(new Line(point2, point3));
|
||||
Lines.Add(new Line(point3, point1));
|
||||
|
||||
var centerOfLine3 = (point1 - point3) / 2 + point1;
|
||||
var centerTriangle = (point1 - centerOfLine3) / 2 + point1;
|
||||
|
||||
Height = new Line(point1, point3).ComputeLength();
|
||||
Width = new Line(point1, point2).ComputeLength();
|
||||
|
||||
CenterPoint = centerTriangle;
|
||||
ComputeCenter();
|
||||
}
|
||||
|
||||
[DataMember] public sealed override List<Point> Points { get; internal set; }
|
||||
|
||||
[DataMember] public override Color Fill { get; set; }
|
||||
|
||||
[DataMember] public override Color Stroke { get; set; }
|
||||
|
||||
[DataMember] public override double Height { get; internal set; }
|
||||
|
||||
[DataMember] public override double Width { get; internal set; }
|
||||
|
||||
[DataMember] public sealed override Point CenterPoint { get; protected set; }
|
||||
|
||||
[DataMember] public List<Line> Lines { get; internal set; }
|
||||
|
||||
|
||||
public override double ComputeArea()
|
||||
{
|
||||
@@ -103,14 +99,13 @@ namespace Shapes
|
||||
|
||||
public override void Save(Stream stream)
|
||||
{
|
||||
var fileWriter = new FileIO();
|
||||
fileWriter.SaveShape(stream, this);
|
||||
_fileWriter.SaveShape(stream, this);
|
||||
}
|
||||
|
||||
[ExcludeFromCodeCoverage]
|
||||
public override void Draw(Stream stream)
|
||||
{
|
||||
var tmp = new Bitmap((int) Width * 2, (int) Height * 2);
|
||||
var tmp = new Bitmap((int) Lines.Max(x => x.ComputeLength()) * 2, (int) Lines.Max(x => x.ComputeLength()) * 2);
|
||||
var blackPen = new Pen(Stroke, 3);
|
||||
// Draw line to screen.
|
||||
using (var graphics = Graphics.FromImage(tmp))
|
||||
@@ -128,9 +123,10 @@ namespace Shapes
|
||||
|
||||
internal override void ComputeCenter()
|
||||
{
|
||||
var centerOfLine3 = (Points[0] - Points[2]) / 2 + Points[0];
|
||||
var centerTriangle = (Points[0] - centerOfLine3) / 2 + Points[0];
|
||||
CenterPoint = centerTriangle;
|
||||
var x = (Points[0].X + Points[1].X + Points[2].X) * 0.33333333333;
|
||||
var y = (Points[0].Y + Points[1].Y + Points[2].Y) * 0.33333333333;
|
||||
CenterPoint = new Point(x, y);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,11 +34,24 @@ namespace Shapes
|
||||
|| Math.Abs(lengthLine1.ComputeLength() - lengthLine2.ComputeLength()) > TOLERANCE)
|
||||
throw new ShapeException(errorMessage);
|
||||
|
||||
// while (pointList.Count > 0)
|
||||
// {
|
||||
// var tmp = pointList[0];
|
||||
// pointList.Remove(tmp);
|
||||
// if (pointList.Contains(tmp)) throw new ShapeException(errorMessage);
|
||||
// }
|
||||
|
||||
while (pointList.Count > 0)
|
||||
{
|
||||
var tmp = pointList[0];
|
||||
pointList.Remove(tmp);
|
||||
if (pointList.Contains(tmp)) throw new ShapeException(errorMessage);
|
||||
foreach (var point in pointList)
|
||||
{
|
||||
if (point.X.Equals(tmp.X) && point.Y.Equals(tmp.Y))
|
||||
throw new ShapeException(errorMessage);
|
||||
}
|
||||
|
||||
//if (pointList.Contains(tmp)) throw new ShapeException(errorMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user