mirror of https://github.com/SixLabors/ImageSharp
6 changed files with 220 additions and 13 deletions
@ -0,0 +1,135 @@ |
|||||
|
// <copyright file="TiffDecoderIfdEntryTests.cs" company="James Jackson-South">
|
||||
|
// Copyright (c) James Jackson-South and contributors.
|
||||
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
// </copyright>
|
||||
|
|
||||
|
namespace ImageSharp.Tests |
||||
|
{ |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using Xunit; |
||||
|
|
||||
|
using ImageSharp.Formats; |
||||
|
|
||||
|
public class TiffDecoderIfdEntryTests |
||||
|
{ |
||||
|
[Theory] |
||||
|
[InlineDataAttribute(TiffType.Byte, 1u, 1u)] |
||||
|
[InlineDataAttribute(TiffType.Ascii, 1u, 1u)] |
||||
|
[InlineDataAttribute(TiffType.Short, 1u, 2u)] |
||||
|
[InlineDataAttribute(TiffType.Long, 1u, 4u)] |
||||
|
[InlineDataAttribute(TiffType.Rational, 1u, 8u)] |
||||
|
[InlineDataAttribute(TiffType.SByte, 1u, 1u)] |
||||
|
[InlineDataAttribute(TiffType.Undefined, 1u, 1u)] |
||||
|
[InlineDataAttribute(TiffType.SShort, 1u, 2u)] |
||||
|
[InlineDataAttribute(TiffType.SLong, 1u, 4u)] |
||||
|
[InlineDataAttribute(TiffType.SRational, 1u, 8u)] |
||||
|
[InlineDataAttribute(TiffType.Float, 1u, 4u)] |
||||
|
[InlineDataAttribute(TiffType.Double, 1u, 8u)] |
||||
|
[InlineDataAttribute(TiffType.Ifd, 1u, 4u)] |
||||
|
[InlineDataAttribute((TiffType)999, 1u, 0u)] |
||||
|
public void GetSizeOfData_SingleItem_ReturnsCorrectSize(ushort type, uint count, uint expectedSize) |
||||
|
{ |
||||
|
TiffIfdEntry entry = new TiffIfdEntry(TiffTags.ImageWidth, (TiffType)type, count, new byte[4]); |
||||
|
uint size = TiffDecoderCore.GetSizeOfData(entry); |
||||
|
Assert.Equal(expectedSize, size); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[InlineDataAttribute(TiffType.Byte, 15u, 15u)] |
||||
|
[InlineDataAttribute(TiffType.Ascii, 20u, 20u)] |
||||
|
[InlineDataAttribute(TiffType.Short, 18u, 36u)] |
||||
|
[InlineDataAttribute(TiffType.Long, 4u, 16u)] |
||||
|
[InlineDataAttribute(TiffType.Rational, 9u, 72u)] |
||||
|
[InlineDataAttribute(TiffType.SByte, 5u, 5u)] |
||||
|
[InlineDataAttribute(TiffType.Undefined, 136u, 136u)] |
||||
|
[InlineDataAttribute(TiffType.SShort, 12u, 24u)] |
||||
|
[InlineDataAttribute(TiffType.SLong, 15u, 60u)] |
||||
|
[InlineDataAttribute(TiffType.SRational, 10u, 80u)] |
||||
|
[InlineDataAttribute(TiffType.Float, 2u, 8u)] |
||||
|
[InlineDataAttribute(TiffType.Double, 2u, 16u)] |
||||
|
[InlineDataAttribute(TiffType.Ifd, 10u, 40u)] |
||||
|
[InlineDataAttribute((TiffType)999, 1050u, 0u)] |
||||
|
public void GetSizeOfData_Array_ReturnsCorrectSize(ushort type, uint count, uint expectedSize) |
||||
|
{ |
||||
|
TiffIfdEntry entry = new TiffIfdEntry(TiffTags.ImageWidth, (TiffType)type, count, new byte[4]); |
||||
|
uint size = TiffDecoderCore.GetSizeOfData(entry); |
||||
|
Assert.Equal(expectedSize, size); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[InlineDataAttribute(TiffType.Byte, 1u, new byte[] { 17 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 1u, new byte[] { 17 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 2u, new byte[] { 17, 28 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 2u, new byte[] { 17, 28 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 4u, new byte[] { 17, 28, 2, 9 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 4u, new byte[] { 17, 28, 2, 9 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 5u, new byte[] { 17, 28, 2, 9, 13 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 5u, new byte[] { 17, 28, 2, 9, 13 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 10u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2, 127, 86 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 10u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2, 127, 86 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Short, 1u, new byte[] { 17, 28 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Short, 1u, new byte[] { 17, 28 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Short, 2u, new byte[] { 17, 28, 2, 9 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Short, 2u, new byte[] { 17, 28, 2, 9 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Short, 3u, new byte[] { 17, 28, 2, 9, 13, 37 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Short, 3u, new byte[] { 17, 28, 2, 9, 13, 37 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Long, 1u, new byte[] { 17, 28, 2, 9 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Long, 1u, new byte[] { 17, 28, 2, 9 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Long, 2u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Long, 2u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Rational, 1u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Rational, 1u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, true)] |
||||
|
public void ReadBytes_ReturnsExpectedData(ushort type, uint count, byte[] bytes, bool isLittleEndian) |
||||
|
{ |
||||
|
(TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, count, bytes), isLittleEndian); |
||||
|
|
||||
|
byte[] result = decoder.ReadBytes(ref entry); |
||||
|
|
||||
|
if (bytes.Length < 4) |
||||
|
result = result.Take(bytes.Length).ToArray(); |
||||
|
|
||||
|
Assert.Equal(bytes, result); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[InlineDataAttribute(TiffType.Byte, 5u, new byte[] { 17, 28, 2, 9, 13 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 5u, new byte[] { 17, 28, 2, 9, 13 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 10u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2, 127, 86 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Byte, 10u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2, 127, 86 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Short, 3u, new byte[] { 17, 28, 2, 9, 13, 37 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Short, 3u, new byte[] { 17, 28, 2, 9, 13, 37 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Long, 2u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Long, 2u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, true)] |
||||
|
[InlineDataAttribute(TiffType.Rational, 1u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, false)] |
||||
|
[InlineDataAttribute(TiffType.Rational, 1u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, true)] |
||||
|
public void ReadBytes_CachesDataLongerThanFourBytes(ushort type, uint count, byte[] bytes, bool isLittleEndian) |
||||
|
{ |
||||
|
(TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, count, bytes), isLittleEndian); |
||||
|
|
||||
|
Assert.Equal(4, entry.Value.Length); |
||||
|
|
||||
|
byte[] result = decoder.ReadBytes(ref entry); |
||||
|
|
||||
|
Assert.Equal(bytes.Length, entry.Value.Length); |
||||
|
Assert.Equal(bytes, entry.Value); |
||||
|
} |
||||
|
|
||||
|
private (TiffDecoderCore, TiffIfdEntry) GenerateTestIfdEntry(TiffGenEntry entry, bool isLittleEndian) |
||||
|
{ |
||||
|
Stream stream = new TiffGenIfd() |
||||
|
{ |
||||
|
Entries = |
||||
|
{ |
||||
|
entry |
||||
|
} |
||||
|
} |
||||
|
.ToStream(isLittleEndian); |
||||
|
|
||||
|
TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); |
||||
|
TiffIfdEntry ifdEntry = decoder.ReadIfd(0).Entries[0]; |
||||
|
|
||||
|
return (decoder, ifdEntry); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue