예제 #1
0
        public void IsInputValid_ShapeNegativePositionX_ShouldReturnFalse()
        {
            //Arrange
            List <ShapeDto> shapeInputs = new List <ShapeDto>();

            ShapeDto shapeDto = new ShapeDto
            {
                ShapeType = ShapeType.Rectangle,
                PositionX = "-10",
                PositionY = "10",
                Width     = "10",
                Height    = "10"
            };

            shapeInputs.Add(shapeDto);

            var settings       = Mock.Create <ISettings>();
            var errorLogger    = Mock.Create <IErrorLogger>();
            var inputValidator = Mock.Create(() => new InputValidator(settings, errorLogger));

            Mock.Arrange(() => settings.CanvasSize).Returns(1000).OccursNever();
            Mock.Arrange(() => errorLogger
                         .LogParameterError(nameof(shapeDto.PositionX), shapeDto.PositionX, shapeDto.ShapeType.ToString())).OccursOnce();

            //Act
            var result = inputValidator.IsInputValid(shapeInputs);

            //Assert
            Assert.False(result);
            Mock.Assert(settings);
            Mock.Assert(errorLogger);
        }
예제 #2
0
        public void IsInputValid_QuadrilateralShapeInputValid_ShouldReturnTrue()
        {
            //Arrange
            List <ShapeDto> shapeInputs = new List <ShapeDto>();

            ShapeDto shapeDto = new ShapeDto
            {
                ShapeType = ShapeType.Rectangle,
                PositionX = "10",
                PositionY = "10",
                Width     = "10",
                Height    = "10"
            };

            shapeInputs.Add(shapeDto);

            var settings       = Mock.Create <ISettings>();
            var errorLogger    = Mock.Create <IErrorLogger>();
            var inputValidator = Mock.Create(() => new InputValidator(settings, errorLogger));

            Mock.Arrange(() => settings.CanvasSize).Returns(1000).Occurs(2);
            Mock.Arrange(() => errorLogger
                         .LogParameterError(Arg.AnyString, Arg.AnyString, Arg.AnyString)).OccursNever();

            //Act
            var result = inputValidator.IsInputValid(shapeInputs);

            //Assert
            Assert.True(result);
            Mock.Assert(settings);
            Mock.Assert(errorLogger);
        }
예제 #3
0
        public void IsInputValid_ShapeHorizontalDiameterInvalidValue_ShouldReturnFalse()
        {
            //Arrange
            List <ShapeDto> shapeInputs = new List <ShapeDto>();

            ShapeDto shapeDto = new ShapeDto
            {
                ShapeType          = ShapeType.Ellipse,
                PositionX          = "10",
                PositionY          = "10",
                HorizontalDiameter = "Test",
                VerticalDiameter   = "10"
            };

            shapeInputs.Add(shapeDto);

            var settings       = Mock.Create <ISettings>();
            var errorLogger    = Mock.Create <IErrorLogger>();
            var inputValidator = Mock.Create(() => new InputValidator(settings, errorLogger));

            Mock.Arrange(() => settings.CanvasSize).Returns(1000).OccursNever();
            Mock.Arrange(() => errorLogger
                         .LogParameterError(nameof(shapeDto.HorizontalDiameter), shapeDto.HorizontalDiameter, shapeDto.ShapeType.ToString())).OccursOnce();

            //Act
            var result = inputValidator.IsInputValid(shapeInputs);

            //Assert
            Assert.False(result);
            Mock.Assert(settings);
            Mock.Assert(errorLogger);
        }
예제 #4
0
        public void IsInputValid_InvalidInput_NullReturned()
        {
            //Arrange
            ShapeDto shapeInput = new ShapeDto
            {
                ShapeType = ShapeType.Square,
                PositionX = "-10",
                PositionY = "10",
                Width     = "10"
            };

            IEnumerable <ShapeDto> shapeInputs = new ShapeDto[] { shapeInput };

            var consoleInputRetriever = Mock.Create <IConsoleInputRetriever>();
            var inputValidator        = Mock.Create <IInputValidator>();
            var consoleReader         = Mock.Create(() => new ConsoleReader(consoleInputRetriever, inputValidator));

            Mock.Arrange(() => consoleInputRetriever.GetShapeInputs()).Returns(shapeInputs).OccursOnce();
            Mock.Arrange(() => inputValidator.IsInputValid(shapeInputs)).Returns(false).OccursOnce();

            //Act
            var shapes = consoleReader.GetShapesData();

            //Assert
            Assert.Null(shapes);
            Mock.Assert(consoleInputRetriever);
            Mock.Assert(inputValidator);
        }
예제 #5
0
        public static IBasicShape MapApiToDomain(ShapeDto input)
        {
            IBasicShape output = null;

            switch (input.Type)
            {
            case ShapeDto.ShapeType.Sphere:
                // TODO: worth normalizing Shape instantiation e.g. new()
                output = Sphere.CreateDefaultInstance();
                break;

            case ShapeDto.ShapeType.Plane:
                output = new Plane();
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(input.Type), "Unrecognized shape type: " + input.Type);
            }

            if (input.Material != null)
            {
                output.Material = MaterialFactory.MapApiToDomain(input.Material);
            }

            if (input.Transformations != null && input.Transformations.Any())
            {
                foreach (var transform in input.Transformations)
                {
                    var domainTransformAction = TransformationFactory.MapApiTransformToDomainAction(transform);
                    domainTransformAction(output.Transformation);
                }
            }

            return(output);
        }
예제 #6
0
 protected override Shape CreateShape(ShapeDto request)
 {
     return(new Triangle(
                x: request.X,
                y: request.Y,
                z: request.Z));
 }
예제 #7
0
        public void IsInputValid_ValidInput_ShapesReturned()
        {
            //Arrange
            ShapeDto shapeInput = new ShapeDto
            {
                ShapeType = ShapeType.Square,
                PositionX = "10",
                PositionY = "10",
                Width     = "10"
            };

            IEnumerable <ShapeDto> shapeInputs = new ShapeDto[] { shapeInput };

            var consoleInputRetriever = Mock.Create <IConsoleInputRetriever>();
            var inputValidator        = Mock.Create <IInputValidator>();
            var consoleReader         = Mock.Create(() => new ConsoleReader(consoleInputRetriever, inputValidator));

            Mock.Arrange(() => consoleInputRetriever.GetShapeInputs()).Returns(shapeInputs).OccursOnce();
            Mock.Arrange(() => inputValidator.IsInputValid(shapeInputs)).Returns(true).OccursOnce();

            //Act
            var square = consoleReader.GetShapesData().First() as Square;

            //Assert
            Assert.Equal(shapeInput.ShapeType.ToString(), square.GetType().Name);
            Assert.Equal(int.Parse(shapeInput.PositionX), square.PositionX);
            Assert.Equal(int.Parse(shapeInput.PositionY), square.PositionY);
            Assert.Equal(int.Parse(shapeInput.Width), square.Width);
            Mock.Assert(consoleInputRetriever);
            Mock.Assert(inputValidator);
        }
예제 #8
0
        private bool IsConstantShapeValid(ShapeDto shape)
        {
            var paramValue = shape.ShapeType == ShapeType.Square ? shape.Width : shape.HorizontalDiameter;
            var paramName  = shape.ShapeType == ShapeType.Square ? nameof(shape.Width) : nameof(shape.HorizontalDiameter);

            return(IsShapePositionAndSizeValid(shape.ShapeType.ToString(),
                                               nameof(shape.PositionX), paramName, shape.PositionX, paramValue) &&
                   IsCanvasParamValid(shape.ShapeType.ToString(), nameof(shape.PositionY), shape.PositionY, out _));
        }
예제 #9
0
        public static Shape Create(ShapeDto dto)
        {
            var shape = new Shape
            {
                Name = dto.Name
            };

            Validate(shape);
            return(shape);
        }
예제 #10
0
        private bool IsDynamicShapeValid(ShapeDto shape)
        {
            var paramWidthValue  = shape.ShapeType == ShapeType.Ellipse ? shape.HorizontalDiameter : shape.Width;
            var paramWidthName   = shape.ShapeType == ShapeType.Ellipse ? nameof(shape.HorizontalDiameter) : nameof(shape.Width);
            var paramHeightValue = shape.ShapeType == ShapeType.Ellipse ? shape.VerticalDiameter : shape.Height;
            var paramHeightName  = shape.ShapeType == ShapeType.Ellipse ? nameof(shape.VerticalDiameter) : nameof(shape.Height);

            return(IsShapePositionAndSizeValid(shape.ShapeType.ToString(),
                                               nameof(shape.PositionX), paramWidthName, shape.PositionX, paramWidthValue) &&
                   IsShapePositionAndSizeValid(shape.ShapeType.ToString(),
                                               nameof(shape.PositionY), paramHeightName, shape.PositionY, paramHeightValue));
        }
예제 #11
0
        public async Task <long> CreateAsync(ShapeDto request)
        {
            request.ThrowIfNull(nameof(request));
            request.ThrowIfInvalid();

            var shape = request.NewShapeOrThrowIfInvalid();

            var entity = await _context.AddEntityAsync(shape);

            await _context.SaveChangesAsync();

            return(entity.Id);
        }
예제 #12
0
        private bool IsShapeValid(ShapeDto shape)
        {
            if (shape.ShapeType == ShapeType.Square || shape.ShapeType == ShapeType.Circle)
            {
                return(IsConstantShapeValid(shape));
            }
            if (shape.ShapeType == ShapeType.Rectangle || shape.ShapeType == ShapeType.Textbox || shape.ShapeType == ShapeType.Ellipse)
            {
                return(IsDynamicShapeValid(shape));
            }

            return(false);
        }
        public ActionResult SaveShape(ShapeDto dto)
        {
            if (String.IsNullOrWhiteSpace(dto.Name))
            {
                return(this.Direct(new { success = false }));
            }

            if (dto.Id == Guid.Empty.ToString())
            {
                dto.Id = new Guid().ToString();
            }
            return(this.Direct(new { success = true, data = dto }));
        }
예제 #14
0
        public async Task GetAreaByIdAsync_ValidData_OkAsync(ShapeType type, bool enable, long? x, long? y, long? z, long? radius, double expected)
        {
            await using var context = new SqliteContext();
            var target = new ShapeService(context);

            var request = new ShapeDto
            {
                Type = type,
                RadiusEnabled = enable,
                X = x,
                Y = y,
                Z = z,
                Radius = radius
            };
            var shapeId = await target.CreateAsync(request);

            var area = await target.GetAreaByIdAsync(shapeId);

            Assert.Equal(expected, area);
        }
예제 #15
0
        public async Task CreateAsync_ValidData_OkAsync(ShapeType type, bool enable, long? x, long? y, long? z, long? radius = null)
        {
            await using var context = new SqliteContext();
            var target = new ShapeService(context);

            var request = new ShapeDto
            {
                Type = type,
                RadiusEnabled = enable,
                X = x,
                Y = y,
                Z = z,
                Radius = radius
            };
            var shape = await context.Shapes.ByIdOrFailAsync(await target.CreateAsync(request));

            Assert.Equal(x, shape.X);
            Assert.Equal(y, shape.Y);
            Assert.Equal(z, shape.Z);
            Assert.Equal(radius, shape.Radius);
        }
예제 #16
0
        private Shape ConstructShape(ShapeDto shape)
        {
            switch (shape.ShapeType)
            {
            case ShapeType.Square:
                return(Square.Create(int.Parse(shape.PositionX), int.Parse(shape.PositionY), int.Parse(shape.Width)));

            case ShapeType.Rectangle:
                return(Rectangle.Create(int.Parse(shape.PositionX), int.Parse(shape.PositionY), int.Parse(shape.Width), int.Parse(shape.Height)));

            case ShapeType.Textbox:
                return(Textbox.Create(int.Parse(shape.PositionX), int.Parse(shape.PositionY), int.Parse(shape.Width), int.Parse(shape.Height), shape.Text));

            case ShapeType.Circle:
                return(Circle.Create(int.Parse(shape.PositionX), int.Parse(shape.PositionY), int.Parse(shape.HorizontalDiameter)));

            case ShapeType.Ellipse:
                return(Ellipse.Create(int.Parse(shape.PositionX), int.Parse(shape.PositionY), int.Parse(shape.HorizontalDiameter), int.Parse(shape.VerticalDiameter)));

            default:
                return(null);
            }
        }
예제 #17
0
 private Shape GetShape(ShapeDto dto)
 {
     return(new ShapeFactory(dto).Get());
 }
예제 #18
0
        public static SceneDto GetSphereCentralWithPlanesExample()
        {
            // Templates
            var defaultSphere   = Sphere.CreateDefaultInstance();
            var defaultMaterial = Material.CreateDefaultInstance();
            var white           = Color.White;

            // Copying ReRenderSphereCentralWithPlanes code using serializable DTOs.

            // Planes

            var floor = new ShapeDto
            {
                Type     = ShapeDto.ShapeType.Plane,
                Material = new MaterialDto
                {
                    Color = new ColorDto
                    {
                        A = Material.DefaultColorA,
                        R = 1F,
                        G = 0.9F,
                        B = 0.9F
                    },
                    Specular  = 0F,
                    Ambient   = defaultMaterial.Ambient,
                    Diffuse   = defaultMaterial.Diffuse,
                    Shininess = defaultMaterial.Shininess
                }
            };

            var left_wall = new ShapeDto
            {
                Type            = ShapeDto.ShapeType.Plane,
                Material        = floor.Material,
                Transformations = new List <TransformDto>
                {
                    new TransformDto
                    {
                        TransformType   = TransformDto.TransformationType.RotateX,
                        RotationRadians = MathF.PI / 2
                    },
                    new TransformDto
                    {
                        TransformType   = TransformDto.TransformationType.RotateY,
                        RotationRadians = -MathF.PI / 4
                    },
                    new TransformDto
                    {
                        TransformType        = TransformDto.TransformationType.Translate,
                        VectorTransformation = new VectorDto
                        {
                            X = 0F, Y = 0F, Z = 5F
                        }
                    }
                }
            };

            var right_wall = new ShapeDto
            {
                Type            = ShapeDto.ShapeType.Plane,
                Material        = floor.Material,
                Transformations = new List <TransformDto>
                {
                    new TransformDto
                    {
                        TransformType   = TransformDto.TransformationType.RotateX,
                        RotationRadians = MathF.PI / 2
                    },
                    new TransformDto
                    {
                        TransformType   = TransformDto.TransformationType.RotateY,
                        RotationRadians = MathF.PI / 4
                    },
                    new TransformDto
                    {
                        TransformType        = TransformDto.TransformationType.Translate,
                        VectorTransformation = new VectorDto
                        {
                            X = 0F, Y = 0F, Z = 5F
                        }
                    }
                }
            };


            // Spheres

            var middle = new ShapeDto
            {
                Type     = ShapeDto.ShapeType.Sphere,
                Material = new MaterialDto
                {
                    Color = new ColorDto
                    {
                        A = Material.DefaultColorA,
                        R = 0.1F,
                        G = 1F,
                        B = 0.5F
                    },
                    Diffuse   = 0.7F,
                    Specular  = 0.3F,
                    Ambient   = defaultMaterial.Ambient,
                    Shininess = defaultMaterial.Shininess
                },
                Transformations = new List <TransformDto>
                {
                    new TransformDto
                    {
                        TransformType        = TransformDto.TransformationType.Translate,
                        VectorTransformation = new VectorDto
                        {
                            X = -0.5F, Y = 1F, Z = 0.5F
                        }
                    }
                }
            };

            var right = new ShapeDto
            {
                Type     = ShapeDto.ShapeType.Sphere,
                Material = new MaterialDto
                {
                    Color = new ColorDto
                    {
                        A = Material.DefaultColorA,
                        R = 0.5F,
                        G = 1F,
                        B = 0.1F
                    },
                    Diffuse   = 0.7F,
                    Specular  = 0.3F,
                    Ambient   = defaultMaterial.Ambient,
                    Shininess = defaultMaterial.Shininess
                },
                Transformations = new List <TransformDto>
                {
                    new TransformDto
                    {
                        TransformType        = TransformDto.TransformationType.Scale,
                        VectorTransformation = new VectorDto
                        {
                            X = 0.5F, Y = 0.5F, Z = 0.5F
                        }
                    },
                    new TransformDto
                    {
                        TransformType        = TransformDto.TransformationType.Translate,
                        VectorTransformation = new VectorDto
                        {
                            X = 1.5F, Y = 0.5F, Z = -0.5F
                        }
                    }
                }
            };

            var left = new ShapeDto
            {
                Type     = ShapeDto.ShapeType.Sphere,
                Material = new MaterialDto
                {
                    Color = new ColorDto
                    {
                        A = Material.DefaultColorA,
                        R = 1F,
                        G = 0.8F,
                        B = 0.1F
                    },
                    Diffuse   = 0.7F,
                    Specular  = 0.3F,
                    Ambient   = defaultMaterial.Ambient,
                    Shininess = defaultMaterial.Shininess
                },
                Transformations = new List <TransformDto>
                {
                    new TransformDto
                    {
                        TransformType        = TransformDto.TransformationType.Scale,
                        VectorTransformation = new VectorDto
                        {
                            X = 0.33F, Y = 0.33F, Z = 0.33F
                        }
                    },
                    new TransformDto
                    {
                        TransformType        = TransformDto.TransformationType.Translate,
                        VectorTransformation = new VectorDto
                        {
                            X = -1.5F, Y = 0.33F, Z = -0.75F
                        }
                    }
                }
            };


            // Scene - pull together shapes into root serializable object

            // Use low res until happy, then crank up. Takes a lot of clock cycles!
#pragma warning disable CS0219 // Variable is assigned but its value is never used
            int high   = 1000;
            int medium = 500;
            int low    = 250;
            int res    = medium;
#pragma warning restore CS0219 // Variable is assigned but its value is never used

            var scene = new SceneDto
            {
                Shapes = new List <ShapeDto>
                {
                    floor, left_wall, right_wall,
                    left, middle, right
                },
                LightSource = new LightDto
                {
                    Position = new VectorDto
                    {
                        X = -10F,
                        Y = 10F,
                        Z = -10F
                    },
                    Intensity = new ColorDto
                    {
                        A = white.ScA,
                        R = white.ScR,
                        G = white.ScG,
                        B = white.ScB
                    }
                },
                Camera = new CameraDto
                {
                    HSize       = res,
                    VSize       = res / 2,
                    FieldOfView = MathF.PI / 3,
                    From        = new VectorDto {
                        X = 0F, Y = 1.5F, Z = -5F
                    },
                    To = new VectorDto {
                        X = 0F, Y = 1F, Z = 0F
                    },
                    Up = new VectorDto {
                        X = 0F, Y = 1F, Z = 0F
                    }
                }
            };

            return(scene);
        }
예제 #19
0
 private IShape GetShape(ShapeDto shape)
 {
     return(ShapeServices.WithDto(shape).Get());
 }
예제 #20
0
 protected abstract Shape CreateShape(ShapeDto request);
예제 #21
0
        public Shape GetShape(ShapeDto request)
        {
            Shape shape = CreateShape(request);

            return(shape);
        }
예제 #22
0
        public ActionResult SaveShape(ShapeDto dto)
        {
            if (String.IsNullOrWhiteSpace(dto.Name))
                return this.Direct(new { success = false });

            if (dto.Id == Guid.Empty.ToString()) dto.Id = new Guid().ToString();
            return this.Direct(new { success = true, data = dto });
        }
예제 #23
0
 public async Task <long> CreateAsync(ShapeDto rectangle)
 {
     return(await _shapeService.CreateAsync(rectangle));
 }
예제 #24
0
 protected override Shape CreateShape(ShapeDto request)
 {
     return(new Circle(
                radius: request.Radius));
 }