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)); }
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); }
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)); }
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)); }