diff --git a/readme.md b/readme.md index 36535e7..23aa126 100644 --- a/readme.md +++ b/readme.md @@ -194,7 +194,7 @@ public Task ExcludePdf() => VerifyFile("sample.pdf") .ExcludeTargets("pdf"); ``` -snippet source | anchor +snippet source | anchor To exclude the pdf for every test, call `VerifierSettings.ExcludeTargets("pdf")` at initialization. diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 68762d0..d2abe0a 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,7 @@ CS1591;CS0649;NU1608;NU1109 - 2.5.0 + 2.6.0 1.0.0 preview enable diff --git a/src/Tests/Samples.SkipPdfNormalization.verified.pdf b/src/Tests/Samples.SkipPdfNormalization.verified.pdf new file mode 100644 index 0000000..94d9477 Binary files /dev/null and b/src/Tests/Samples.SkipPdfNormalization.verified.pdf differ diff --git a/src/Tests/Samples.SkipPdfNormalization.verified.txt b/src/Tests/Samples.SkipPdfNormalization.verified.txt new file mode 100644 index 0000000..8bca7f7 --- /dev/null +++ b/src/Tests/Samples.SkipPdfNormalization.verified.txt @@ -0,0 +1,158 @@ +{ + Information: { + Creator: Writer, + Producer: LibreOffice 4.2, + CreationDate: DateTimeOffset_1 + }, + PageCount: 4, + Pages: [ + { + Size: A4, + Text: +Lorem ipsum + +Lorem ipsum dolor sit amet, consectetur adipiscing +elit. Nunc ac faucibus odio. + +Vestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut +varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum +condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus +convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis, +vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus +nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum, +ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet +tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet +mauris tempus fringilla. + +Maecenas mauris lectus, lobortis et purus mattis, blandit dictum tellus. + + Maecenas non lorem quis tellus placerat varius. + + Nulla facilisi. + + Aenean congue fringilla justo ut aliquam. + + Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum ante +sagittis. + + Morbi viverra semper lorem nec molestie. + + Maecenas tincidunt est efficitur ligula euismod, sit amet ornare est vulputate. + +Row 1 Row 2 Row 3 Row 4 +0 +2 +4 +6 +8 +10 +12 + +Column 1 +Column 2 +Column 3 + + }, + { + Index: 1, + Size: A4, + Text: +In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam +est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat +et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis +tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque +scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam +lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel, +ultricies ut purus. Ut facilisis et lacus eu cursus. + +In eleifend velit vitae libero sollicitudin euismod. Fusce vitae vestibulum velit. Pellentesque +vulputate lectus quis pellentesque commodo. Aliquam erat volutpat. Vestibulum in egestas +velit. Pellentesque fermentum nisl vitae fringilla venenatis. Etiam id mauris vitae orci +maximus ultricies. + +Cras fringilla ipsum magna, in fringilla dui commodo +a. + +Lorem ipsum Lorem ipsum Lorem ipsum + +1 In eleifend velit vitae libero sollicitudin euismod. Lorem + +2 Cras fringilla ipsum magna, in fringilla dui commodo +a. +Ipsum + +3 Aliquam erat volutpat. Lorem + +4 Fusce vitae vestibulum velit. Lorem + +5 Etiam vehicula luctus fermentum. Ipsum + +Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui. +Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam, +pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti +sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper +justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo +posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut +et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo +imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem +sed turpis imperdiet eleifend sit amet id sapien. + + }, + { + Index: 2, + Size: A4, + Text: +Lorem ipsum dolor sit amet, consectetur adipiscing +elit. + +Nunc ac faucibus odio. Vestibulum neque massa, scelerisque sit amet ligula eu, congue +molestie mi. Praesent ut varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor +vitae odio interdum condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum +cursus convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis, +vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus +nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum, +ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet +tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet +mauris tempus fringilla. + +Maecenas mauris lectus, lobortis et purus mattis, blandit +dictum tellus. + +Maecenas non lorem quis tellus placerat varius. Nulla facilisi. Aenean congue fringilla justo +ut aliquam. Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum +ante sagittis. Morbi viverra semper lorem nec molestie. Maecenas tincidunt est efficitur +ligula euismod, sit amet ornare est vulputate. + +In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam +est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat +et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis +tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque +scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam +lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel, +ultricies ut purus. Ut facilisis et lacus eu cursus. + +In eleifend velit vitae libero sollicitudin euismod. + +Fusce vitae vestibulum velit. Pellentesque vulputate lectus quis pellentesque commodo. +Aliquam erat volutpat. Vestibulum in egestas velit. Pellentesque fermentum nisl vitae +fringilla venenatis. Etiam id mauris vitae orci maximus ultricies. Cras fringilla ipsum +magna, in fringilla dui commodo a. + +Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui. +Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam, +pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti +sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper +justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo +posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut +et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo +imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem +sed turpis imperdiet eleifend sit amet id sapien. + + }, + { + Index: 3, + Size: A4, + Text: + } + ] +} \ No newline at end of file diff --git a/src/Tests/Samples.cs b/src/Tests/Samples.cs index 1f169e1..b6a0c74 100644 --- a/src/Tests/Samples.cs +++ b/src/Tests/Samples.cs @@ -1,4 +1,4 @@ -[TestFixture] +[TestFixture] public class Samples { #region VerifyPdf @@ -18,6 +18,15 @@ public Task VerifyPdfStream() => #endregion + #region SkipPdfNormalization + + [Test] + public Task SkipPdfNormalization() => + VerifyFile("sample.pdf") + .SkipPdfNormalization(); + + #endregion + #region ExcludePdf [Test] diff --git a/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.pdf b/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.pdf new file mode 100644 index 0000000..7fb7061 Binary files /dev/null and b/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.pdf differ diff --git a/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.txt b/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.txt new file mode 100644 index 0000000..8bca7f7 --- /dev/null +++ b/src/Tests/SkipPdfNormalizationTests.NormalizedSnapshotHoldsTheNeutralizedBytes.verified.txt @@ -0,0 +1,158 @@ +{ + Information: { + Creator: Writer, + Producer: LibreOffice 4.2, + CreationDate: DateTimeOffset_1 + }, + PageCount: 4, + Pages: [ + { + Size: A4, + Text: +Lorem ipsum + +Lorem ipsum dolor sit amet, consectetur adipiscing +elit. Nunc ac faucibus odio. + +Vestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut +varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum +condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus +convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis, +vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus +nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum, +ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet +tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet +mauris tempus fringilla. + +Maecenas mauris lectus, lobortis et purus mattis, blandit dictum tellus. + + Maecenas non lorem quis tellus placerat varius. + + Nulla facilisi. + + Aenean congue fringilla justo ut aliquam. + + Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum ante +sagittis. + + Morbi viverra semper lorem nec molestie. + + Maecenas tincidunt est efficitur ligula euismod, sit amet ornare est vulputate. + +Row 1 Row 2 Row 3 Row 4 +0 +2 +4 +6 +8 +10 +12 + +Column 1 +Column 2 +Column 3 + + }, + { + Index: 1, + Size: A4, + Text: +In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam +est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat +et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis +tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque +scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam +lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel, +ultricies ut purus. Ut facilisis et lacus eu cursus. + +In eleifend velit vitae libero sollicitudin euismod. Fusce vitae vestibulum velit. Pellentesque +vulputate lectus quis pellentesque commodo. Aliquam erat volutpat. Vestibulum in egestas +velit. Pellentesque fermentum nisl vitae fringilla venenatis. Etiam id mauris vitae orci +maximus ultricies. + +Cras fringilla ipsum magna, in fringilla dui commodo +a. + +Lorem ipsum Lorem ipsum Lorem ipsum + +1 In eleifend velit vitae libero sollicitudin euismod. Lorem + +2 Cras fringilla ipsum magna, in fringilla dui commodo +a. +Ipsum + +3 Aliquam erat volutpat. Lorem + +4 Fusce vitae vestibulum velit. Lorem + +5 Etiam vehicula luctus fermentum. Ipsum + +Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui. +Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam, +pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti +sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper +justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo +posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut +et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo +imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem +sed turpis imperdiet eleifend sit amet id sapien. + + }, + { + Index: 2, + Size: A4, + Text: +Lorem ipsum dolor sit amet, consectetur adipiscing +elit. + +Nunc ac faucibus odio. Vestibulum neque massa, scelerisque sit amet ligula eu, congue +molestie mi. Praesent ut varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor +vitae odio interdum condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum +cursus convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis, +vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus +nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum, +ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet +tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet +mauris tempus fringilla. + +Maecenas mauris lectus, lobortis et purus mattis, blandit +dictum tellus. + +Maecenas non lorem quis tellus placerat varius. Nulla facilisi. Aenean congue fringilla justo +ut aliquam. Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum +ante sagittis. Morbi viverra semper lorem nec molestie. Maecenas tincidunt est efficitur +ligula euismod, sit amet ornare est vulputate. + +In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam +est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat +et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis +tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque +scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam +lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel, +ultricies ut purus. Ut facilisis et lacus eu cursus. + +In eleifend velit vitae libero sollicitudin euismod. + +Fusce vitae vestibulum velit. Pellentesque vulputate lectus quis pellentesque commodo. +Aliquam erat volutpat. Vestibulum in egestas velit. Pellentesque fermentum nisl vitae +fringilla venenatis. Etiam id mauris vitae orci maximus ultricies. Cras fringilla ipsum +magna, in fringilla dui commodo a. + +Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui. +Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam, +pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti +sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper +justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo +posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut +et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo +imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem +sed turpis imperdiet eleifend sit amet id sapien. + + }, + { + Index: 3, + Size: A4, + Text: + } + ] +} \ No newline at end of file diff --git a/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.pdf b/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.pdf new file mode 100644 index 0000000..94d9477 Binary files /dev/null and b/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.pdf differ diff --git a/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.txt b/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.txt new file mode 100644 index 0000000..8bca7f7 --- /dev/null +++ b/src/Tests/SkipPdfNormalizationTests.SkippedSnapshotHoldsTheProducerBytes.verified.txt @@ -0,0 +1,158 @@ +{ + Information: { + Creator: Writer, + Producer: LibreOffice 4.2, + CreationDate: DateTimeOffset_1 + }, + PageCount: 4, + Pages: [ + { + Size: A4, + Text: +Lorem ipsum + +Lorem ipsum dolor sit amet, consectetur adipiscing +elit. Nunc ac faucibus odio. + +Vestibulum neque massa, scelerisque sit amet ligula eu, congue molestie mi. Praesent ut +varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor vitae odio interdum +condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum cursus +convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis, +vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus +nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum, +ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet +tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet +mauris tempus fringilla. + +Maecenas mauris lectus, lobortis et purus mattis, blandit dictum tellus. + + Maecenas non lorem quis tellus placerat varius. + + Nulla facilisi. + + Aenean congue fringilla justo ut aliquam. + + Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum ante +sagittis. + + Morbi viverra semper lorem nec molestie. + + Maecenas tincidunt est efficitur ligula euismod, sit amet ornare est vulputate. + +Row 1 Row 2 Row 3 Row 4 +0 +2 +4 +6 +8 +10 +12 + +Column 1 +Column 2 +Column 3 + + }, + { + Index: 1, + Size: A4, + Text: +In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam +est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat +et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis +tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque +scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam +lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel, +ultricies ut purus. Ut facilisis et lacus eu cursus. + +In eleifend velit vitae libero sollicitudin euismod. Fusce vitae vestibulum velit. Pellentesque +vulputate lectus quis pellentesque commodo. Aliquam erat volutpat. Vestibulum in egestas +velit. Pellentesque fermentum nisl vitae fringilla venenatis. Etiam id mauris vitae orci +maximus ultricies. + +Cras fringilla ipsum magna, in fringilla dui commodo +a. + +Lorem ipsum Lorem ipsum Lorem ipsum + +1 In eleifend velit vitae libero sollicitudin euismod. Lorem + +2 Cras fringilla ipsum magna, in fringilla dui commodo +a. +Ipsum + +3 Aliquam erat volutpat. Lorem + +4 Fusce vitae vestibulum velit. Lorem + +5 Etiam vehicula luctus fermentum. Ipsum + +Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui. +Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam, +pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti +sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper +justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo +posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut +et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo +imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem +sed turpis imperdiet eleifend sit amet id sapien. + + }, + { + Index: 2, + Size: A4, + Text: +Lorem ipsum dolor sit amet, consectetur adipiscing +elit. + +Nunc ac faucibus odio. Vestibulum neque massa, scelerisque sit amet ligula eu, congue +molestie mi. Praesent ut varius sem. Nullam at porttitor arcu, nec lacinia nisi. Ut ac dolor +vitae odio interdum condimentum. Vivamus dapibus sodales ex, vitae malesuada ipsum +cursus convallis. Maecenas sed egestas nulla, ac condimentum orci. Mauris diam felis, +vulputate ac suscipit et, iaculis non est. Curabitur semper arcu ac ligula semper, nec luctus +nisl blandit. Integer lacinia ante ac libero lobortis imperdiet. Nullam mollis convallis ipsum, +ac accumsan nunc vehicula vitae. Nulla eget justo in felis tristique fringilla. Morbi sit amet +tortor quis risus auctor condimentum. Morbi in ullamcorper elit. Nulla iaculis tellus sit amet +mauris tempus fringilla. + +Maecenas mauris lectus, lobortis et purus mattis, blandit +dictum tellus. + +Maecenas non lorem quis tellus placerat varius. Nulla facilisi. Aenean congue fringilla justo +ut aliquam. Mauris id ex erat. Nunc vulputate neque vitae justo facilisis, non condimentum +ante sagittis. Morbi viverra semper lorem nec molestie. Maecenas tincidunt est efficitur +ligula euismod, sit amet ornare est vulputate. + +In non mauris justo. Duis vehicula mi vel mi pretium, a viverra erat efficitur. Cras aliquam +est ac eros varius, id iaculis dui auctor. Duis pretium neque ligula, et pulvinar mi placerat +et. Nulla nec nunc sit amet nunc posuere vestibulum. Ut id neque eget tortor mattis +tristique. Donec ante est, blandit sit amet tristique vel, lacinia pulvinar arcu. Pellentesque +scelerisque fermentum erat, id posuere justo pulvinar ut. Cras id eros sed enim aliquam +lobortis. Sed lobortis nisl ut eros efficitur tincidunt. Cras justo mi, porttitor quis mattis vel, +ultricies ut purus. Ut facilisis et lacus eu cursus. + +In eleifend velit vitae libero sollicitudin euismod. + +Fusce vitae vestibulum velit. Pellentesque vulputate lectus quis pellentesque commodo. +Aliquam erat volutpat. Vestibulum in egestas velit. Pellentesque fermentum nisl vitae +fringilla venenatis. Etiam id mauris vitae orci maximus ultricies. Cras fringilla ipsum +magna, in fringilla dui commodo a. + +Etiam vehicula luctus fermentum. In vel metus congue, pulvinar lectus vel, fermentum dui. +Maecenas ante orci, egestas ut aliquet sit amet, sagittis a magna. Aliquam ante quam, +pellentesque ut dignissim quis, laoreet eget est. Aliquam erat volutpat. Class aptent taciti +sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut ullamcorper +justo sapien, in cursus libero viverra eget. Vivamus auctor imperdiet urna, at pulvinar leo +posuere laoreet. Suspendisse neque nisl, fringilla at iaculis scelerisque, ornare vel dolor. Ut +et pulvinar nunc. Pellentesque fringilla mollis efficitur. Nullam venenatis commodo +imperdiet. Morbi velit neque, semper quis lorem quis, efficitur dignissim ipsum. Ut ac lorem +sed turpis imperdiet eleifend sit amet id sapien. + + }, + { + Index: 3, + Size: A4, + Text: + } + ] +} \ No newline at end of file diff --git a/src/Tests/SkipPdfNormalizationTests.cs b/src/Tests/SkipPdfNormalizationTests.cs new file mode 100644 index 0000000..4d2374b --- /dev/null +++ b/src/Tests/SkipPdfNormalizationTests.cs @@ -0,0 +1,28 @@ +using System.Text; +using DeterministicPdf; + +// The Samples entry for SkipPdfNormalization only proves the setting round-trips through a +// verification. These assert the wiring it is actually there for: with the setting the snapshotted +// bytes are the producer's own, and without it they are the normalized ones. +[TestFixture] +public class SkipPdfNormalizationTests +{ + [Test] + public void SampleIsNotAlreadyNormalized() + { + // The premise the two tests below rest on. If sample.pdf were already byte-identical to its + // normalized form they would both pass while asserting nothing. + var raw = File.ReadAllBytes("sample.pdf"); + + Assert.That(PdfNormalizer.Normalize(raw), Is.Not.EqualTo(raw)); + } + + [Test] + public Task SkippedSnapshotHoldsTheProducerBytes() => + Verify(new MemoryStream(File.ReadAllBytes("sample.pdf")), "pdf") + .SkipPdfNormalization(); + + [Test] + public Task NormalizedSnapshotHoldsTheNeutralizedBytes() => + Verify(new MemoryStream(File.ReadAllBytes("sample.pdf")), "pdf"); +} diff --git a/src/Verify.PdfPig/PdfPigSettings.cs b/src/Verify.PdfPig/PdfPigSettings.cs index 57859b1..3205556 100644 --- a/src/Verify.PdfPig/PdfPigSettings.cs +++ b/src/Verify.PdfPig/PdfPigSettings.cs @@ -1,4 +1,4 @@ -namespace VerifyTests; +namespace VerifyTests; public static class PdfPigSettings { @@ -46,4 +46,36 @@ internal static ParsingOptions PdfPigParsingOptions(this IReadOnlyDictionary + /// Snapshots the pdf bytes exactly as produced, skipping the normalization that neutralizes the + /// trailer /ID, the /CreationDate and /ModDate, and the XMP dates and + /// identifiers. Use it when the producer already emits byte-deterministic documents, since + /// normalizing them again copies the whole buffer, rescans it, and — when the XMP packet is + /// canonicalized — rebuilds it and repairs the cross-reference table, all to change nothing. + /// + /// + /// Only skip this when the producer is genuinely deterministic. Without it a freshly generated + /// pdf carries a wall-clock /CreationDate and a fresh /ID, so the snapshot differs + /// on every run. + /// + /// The XMP canonicalization is worth calling out because it is the pass that changes bytes for + /// an already-deterministic producer: it collapses the packet's whitespace, so enabling or + /// disabling this setting on an existing suite shifts the stored .verified.pdf even + /// though nothing about the document changed. Expect to re-accept those snapshots once. + /// + /// + public static void SkipPdfNormalization(this VerifySettings settings) => + settings.Context["PdfPig.SkipNormalization"] = true; + + /// + public static SettingsTask SkipPdfNormalization(this SettingsTask settings) + { + settings.CurrentSettings.SkipPdfNormalization(); + return settings; + } + + internal static bool Normalize(this IReadOnlyDictionary context) => + !context.TryGetValue("PdfPig.SkipNormalization", out var value) || + value is not true; +} diff --git a/src/Verify.PdfPig/VerifyPdfPig.cs b/src/Verify.PdfPig/VerifyPdfPig.cs index 49f23e7..a93b224 100644 --- a/src/Verify.PdfPig/VerifyPdfPig.cs +++ b/src/Verify.PdfPig/VerifyPdfPig.cs @@ -63,9 +63,13 @@ static ConversionResult Convert(string? name, Stream stream, IReadOnlyDictionary // Generating the pdf is expensive, so skip it entirely when the pdf target is excluded. if (!context.IsTargetExcluded("pdf")) { - // Neutralize the volatile fields for the pdf snapshot only once the document, which reads - // lazily from the same buffer, has been released. - bytes = PdfNormalizer.Normalize(bytes); + if (context.Normalize()) + { + // Neutralize the volatile fields for the pdf snapshot only once the document, which + // reads lazily from the same buffer, has been released. + bytes = PdfNormalizer.Normalize(bytes); + } + targets.Add( new("pdf", new MemoryStream(bytes)) {