diff --git a/src/UglyToad.PdfPig.Tests/Parser/Parts/DirectObjectFinderTests.cs b/src/UglyToad.PdfPig.Tests/Parser/Parts/DirectObjectFinderTests.cs new file mode 100644 index 00000000..536fb3ab --- /dev/null +++ b/src/UglyToad.PdfPig.Tests/Parser/Parts/DirectObjectFinderTests.cs @@ -0,0 +1,106 @@ +namespace UglyToad.PdfPig.Tests.Parser.Parts +{ + using System; + using Exceptions; + using PdfPig.Parser.Parts; + using PdfPig.Tokens; + using Tokens; + using Xunit; + + public class DirectObjectFinderTests + { + private readonly TestPdfTokenScanner scanner = new TestPdfTokenScanner(); + + [Fact] + public void TryGetCanFollowMultipleReferenceLinks() + { + var reference1 = new IndirectReference(7, 0); + var reference2 = new IndirectReference(9, 0); + + scanner.Objects[reference1] = new ObjectToken(10, reference1, new IndirectReferenceToken(reference2)); + scanner.Objects[reference2] = new ObjectToken(12, reference2, new NumericToken(69)); + + Assert.True(DirectObjectFinder.TryGet(new IndirectReferenceToken(reference1), scanner, out NumericToken result)); + + Assert.Equal(69, result.Int); + } + + [Fact] + public void GetCanFollowMultipleReferenceLinks() + { + var reference1 = new IndirectReference(7, 0); + var reference2 = new IndirectReference(9, 0); + + scanner.Objects[reference1] = new ObjectToken(10, reference1, new IndirectReferenceToken(reference2)); + scanner.Objects[reference2] = new ObjectToken(12, reference2, new NumericToken(69)); + + var result = DirectObjectFinder.Get(reference1, scanner); + + Assert.Equal(69, result.Int); + } + + [Fact] + public void GetTokenCanFollowMultipleReferenceLinks() + { + var reference1 = new IndirectReference(7, 0); + var reference2 = new IndirectReference(9, 0); + + scanner.Objects[reference1] = new ObjectToken(10, reference1, new IndirectReferenceToken(reference2)); + scanner.Objects[reference2] = new ObjectToken(12, reference2, new NumericToken(69)); + + var result = DirectObjectFinder.Get(new IndirectReferenceToken(reference1), scanner); + + Assert.Equal(69, result.Int); + } + + [Fact] + public void GetReturnsSingleItemFromArray() + { + var reference = new IndirectReference(10, 0); + + const string expected = "Goopy"; + scanner.Objects[reference] = new ObjectToken(10, reference, new ArrayToken(new [] + { + new StringToken(expected) + })); + + var result = DirectObjectFinder.Get(reference, scanner); + + Assert.Equal(expected, result.Data); + } + + [Fact] + public void GetFollowsSingleIndirectReferenceFromArray() + { + var reference = new IndirectReference(10, 0); + var reference2 = new IndirectReference(69, 0); + + const string expected = "Goopy"; + scanner.Objects[reference] = new ObjectToken(10, reference, new ArrayToken(new[] + { + new IndirectReferenceToken(reference2) + })); + + scanner.Objects[reference2] = new ObjectToken(69, reference2, new StringToken(expected)); + + var result = DirectObjectFinder.Get(reference, scanner); + + Assert.Equal(expected, result.Data); + } + + [Fact] + public void GetThrowsOnInvalidArray() + { + var reference = new IndirectReference(10, 0); + + scanner.Objects[reference] = new ObjectToken(10, reference, new ArrayToken(new[] + { + new NumericToken(5), new NumericToken(6), new NumericToken(0) + })); + + Action action = () => DirectObjectFinder.Get(reference, scanner); + + Assert.Throws(action); + } + } +} diff --git a/src/UglyToad.PdfPig.Tests/Tokens/TestPdfTokenScanner.cs b/src/UglyToad.PdfPig.Tests/Tokens/TestPdfTokenScanner.cs index c28e43fa..f1913b7a 100644 --- a/src/UglyToad.PdfPig.Tests/Tokens/TestPdfTokenScanner.cs +++ b/src/UglyToad.PdfPig.Tests/Tokens/TestPdfTokenScanner.cs @@ -2,12 +2,15 @@ namespace UglyToad.PdfPig.Tests.Tokens { using System; + using System.Collections.Generic; using PdfPig.Tokenization; using PdfPig.Tokenization.Scanner; using PdfPig.Tokens; internal class TestPdfTokenScanner : IPdfTokenScanner { + public Dictionary Objects { get; } + = new Dictionary(); public bool MoveNext() { throw new NotImplementedException(); @@ -37,7 +40,7 @@ namespace UglyToad.PdfPig.Tests.Tokens public ObjectToken Get(IndirectReference reference) { - throw new NotImplementedException(); + return Objects[reference]; } } }