예제 #1
0
        public void Validate_ShouldThrowWhenSourcePageCropBoxSizeDoesntMatchLayoutCutBoxSize()
        {
            var imposition = new Imposition();
            var layout     = new Layout
            {
                Tiles = new List <Tile>
                {
                    GetDefaultTile(),
                    GetDefaultTile()
                }
            };
            var sourceFiles = new List <SourceFile>
            {
                new SourceFile
                {
                    Pages = new List <SourcePage>
                    {
                        new SourcePage
                        {
                            CropBox = new Box {
                                Width = layout.Tiles[0].CutBox.Width + 1, Height = layout.Tiles[0].CutBox.Height
                            }
                        }
                    }
                }
            };

            var target = new Validator();

            Should.Throw <ApplicationException>(() => target.ValidateSourceFiles(sourceFiles, layout, imposition));
        }
예제 #2
0
        public void Validate_ShouldNotThrowWhenSourcePageCropBoxSizeMatchLayoutCutBoxSize_ButImpositionRequiresRotation()
        {
            var imposition = new Imposition {
                MediaRotationAngle = 90f
            };
            var layout = new Layout
            {
                Tiles = new List <Tile>
                {
                    GetDefaultTile(),
                    GetDefaultTile()
                }
            };
            var sourceFiles = new List <SourceFile>
            {
                new SourceFile
                {
                    Pages = new List <SourcePage>
                    {
                        new SourcePage
                        {
                            CropBox = new Box {
                                Width = layout.Tiles[0].CutBox.Height, Height = layout.Tiles[0].CutBox.Width
                            }
                        }
                    }
                }
            };

            var target = new Validator();

            target.ValidateSourceFiles(sourceFiles, layout, imposition);
        }
        public void Save(Imposition imposition)
        {
            var serialized         = JsonConvert.SerializeObject(imposition, Formatting.Indented);
            var impositionFileName = BuildImpositionFileName(imposition.Key);

            File.WriteAllText(impositionFileName, serialized);
        }
예제 #4
0
        public void Impose_ShouldCallDependenciesCorrectly()
        {
            // Arrange
            var layoutKey     = "test_layout";
            var impositionKey = "test_imposition";
            var albumIds      = new List <int> {
                1
            };
            var layout                       = new Layout();
            var imposition                   = new Imposition();
            var sourceFile                   = new SourceFile();
            var outputFile                   = new OutputFile();
            var layoutRepositoryMock         = Substitute.For <ILayoutRepository>();
            var impositionRepositoryMock     = Substitute.For <IImpositionRepository>();
            var sourceFilesRepositoryMock    = Substitute.For <ISourceFilesRepository>();
            var outputFileBuilderFactoryMock = Substitute.For <IOutputFileBuilderFactory>();
            var outputFileBuilderMock        = Substitute.For <IOutputFileBuilder>();
            var validatorMock                = Substitute.For <IValidator>();

            layoutRepositoryMock.Get(Arg.Any <string>()).Returns(layout);
            impositionRepositoryMock.Get(Arg.Any <string>()).Returns(imposition);
            sourceFilesRepositoryMock.Get(Arg.Any <int>()).Returns(sourceFile);
            outputFileBuilderFactoryMock.Get(Arg.Any <Layout>(), Arg.Any <Imposition>()).Returns(outputFileBuilderMock);
            outputFileBuilderMock.Build(Arg.Any <List <SourceFile> >()).Returns(outputFile);

            var target = new Imposer(layoutRepositoryMock, impositionRepositoryMock, sourceFilesRepositoryMock, outputFileBuilderFactoryMock, validatorMock);

            // Act
            target.Impose(new BatchMetadata {
                ImpositionKey = impositionKey, LayoutKey = layoutKey, AlbumIds = albumIds
            });

            //Assert
            layoutRepositoryMock.Received(1).Get(layoutKey);
            validatorMock.Received(1).ValidateLayout(layout);
            impositionRepositoryMock.Received(1).Get(impositionKey);
            sourceFilesRepositoryMock.Received(1).Get(albumIds[0]);
            validatorMock.Received(1).ValidateSourceFiles(Arg.Is <List <SourceFile> >(files => files.Contains(sourceFile)), layout, imposition);
            outputFileBuilderFactoryMock.Received(1).Get(layout, imposition);
            outputFileBuilderMock.Received(1).Build(Arg.Is <List <SourceFile> >(list => list.Single() == sourceFile));
        }
        public void Build_ShouldSetCorrectTileParameters()
        {
            // todo: move tile building to a separate testable class
            var layout = new Layout
            {
                Tiles = new List <Tile>
                {
                    new Tile
                    {
                        RowIndex    = 0,
                        ColumnIndex = 0,
                        MediaBox    = new Box {
                            Left = 0, Bottom = 100, Width = 100, Height = 100
                        },
                        CutBox = new Box {
                            Left = 10, Bottom = 110, Width = 80, Height = 80
                        }
                    },
                    new Tile
                    {
                        RowIndex    = 0,
                        ColumnIndex = 1,
                        MediaBox    = new Box {
                            Left = 100, Bottom = 100, Width = 100, Height = 100
                        },
                        CutBox = new Box {
                            Left = 110, Bottom = 110, Width = 80, Height = 80
                        }
                    },
                    new Tile
                    {
                        RowIndex    = 1,
                        ColumnIndex = 0,
                        MediaBox    = new Box {
                            Left = 0, Bottom = 0, Width = 100, Height = 100
                        },
                        CutBox = new Box {
                            Left = 10, Bottom = 10, Width = 80, Height = 80
                        }
                    },
                    new Tile
                    {
                        RowIndex    = 1,
                        ColumnIndex = 1,
                        MediaBox    = new Box {
                            Left = 100, Bottom = 0, Width = 100, Height = 100
                        },
                        CutBox = new Box {
                            Left = 110, Bottom = 10, Width = 80, Height = 80
                        }
                    }
                }
            };
            var imposition = new Imposition
            {
                MediaRotationAngle = 90.0f
            };
            var target = new DuplexSmartStackerOutputFileBuilder(layout, imposition);

            var sourceFiles = new List <SourceFile>
            {
                new SourceFile
                {
                    FileName = "test_file_name.pdf",
                    Pages    = GetFakeSourcePages(8)
                }
            };

            var actual = target.Build(sourceFiles);

            void ValidateTiles(List <OutputTile> tilesToValidate, Tile layoutTile)
            {
                foreach (var outputTile in tilesToValidate)
                {
                    outputTile.MediaBox.ShouldBe(layoutTile.MediaBox);
                    outputTile.CutBox.ShouldBe(layoutTile.CutBox);
                    outputTile.MediaRotationAngle.ShouldBe(imposition.MediaRotationAngle);
                }
            }

            ValidateTiles(actual.Pages.Select(p => p.Tiles[0, 0]).ToList(), layout.Tiles[0]);
            ValidateTiles(actual.Pages.Select(p => p.Tiles[0, 1]).ToList(), layout.Tiles[1]);
            ValidateTiles(actual.Pages.Select(p => p.Tiles[1, 0]).ToList(), layout.Tiles[2]);
            ValidateTiles(actual.Pages.Select(p => p.Tiles[1, 1]).ToList(), layout.Tiles[3]);
        }
 // only SmartStacker builders are supported yet
 public IOutputFileBuilder Get(Layout layout, Imposition imposition)
 {
     return(imposition.IsDuplex
         ? (IOutputFileBuilder) new DuplexSmartStackerOutputFileBuilder(layout, imposition)
         : new SimplexSmartStackerOutputFileBuilder(layout, imposition));
 }
예제 #7
0
        public void ValidateSourceFiles(List <SourceFile> sourceFiles, Layout layout, Imposition imposition)
        {
            var  cropBoxComparisonTolerance       = 0.01f;
            var  rotationAngleComparisonTolerance = 0.01f;
            var  layoutCutBoxSize = layout.Tiles.First().CutBox.Size;
            Size expectedSourcePageCropBoxSize;

            if (Math.Abs(imposition.MediaRotationAngle) <= rotationAngleComparisonTolerance || Math.Abs(imposition.MediaRotationAngle - 180.0f) <= rotationAngleComparisonTolerance)
            {
                // orientation of the source file page and layout tile match
                expectedSourcePageCropBoxSize = layoutCutBoxSize;
            }
            else
            {
                // orientation of the source file page and layout tile doesn't match
                expectedSourcePageCropBoxSize = new Size {
                    Width = layoutCutBoxSize.Height, Height = layoutCutBoxSize.Width
                };
            }

            var validator = new SourceFileValidator(expectedSourcePageCropBoxSize, cropBoxComparisonTolerance);
            var failedValidationResults = sourceFiles.Select(f => validator.Validate(f)).Where(r => !r.IsValid).ToList();

            if (failedValidationResults.Count > 0)
            {
                var errorMessage = string.Join(Environment.NewLine, failedValidationResults.Select(r => r.ToString()));
                throw new ApplicationException(errorMessage);
            }
        }
 public SimplexSmartStackerOutputFileBuilder(Layout layout, Imposition imposition)
 {
     _layout     = layout ?? throw new ArgumentNullException(nameof(layout));
     _imposition = imposition ?? throw new ArgumentNullException(nameof(imposition));
 }