Changeset 6004


Ignore:
Timestamp:
03/09/10 06:49:08 (10 years ago)
Author:
callan
Message:

#466 Significantly more thorough grayscale TIFF parser tests. Almost complete coverage of required tags.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • branches/cleanup/components/bio-formats/test/loci/formats/utests/tiff/TiffParserGrayscaleTest.java

    r6003 r6004  
    11// 
    2 // TiffParserTest.java 
     2// TiffParserGrayscaleTest.java 
    33// 
    44 
     
    3535import loci.formats.tiff.PhotoInterp; 
    3636import loci.formats.tiff.TiffParser; 
     37import loci.formats.tiff.TiffRational; 
    3738 
    3839import org.testng.annotations.BeforeMethod; 
     
    4445 * 
    4546 * <dl><dt><b>Source code:</b></dt> 
    46  * <dd><a href="https://skyking.microscopy.wisc.edu/trac/java/browser/trunk/components/bio-formats/test/loci/formats/utests/tiff/TiffParserTest.java">Trac</a>, 
    47  * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/bio-formats/test/loci/formats/utests/tiff/TiffParserTest.java">SVN</a></dd></dl> 
     47 * <dd><a href="https://skyking.microscopy.wisc.edu/trac/java/browser/trunk/components/bio-formats/test/loci/formats/utests/tiff/TiffParserGrayscaleTest.java">Trac</a>, 
     48 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/bio-formats/test/loci/formats/utests/tiff/TiffParserGrayscaleTest.java">SVN</a></dd></dl> 
    4849 */ 
    49 public class TiffParserTest { 
     50public class TiffParserGrayscaleTest { 
    5051 
    5152  private ByteArrayHandle handle; 
     
    5859    0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 
    5960  }; 
     61   
     62  private static final int ENTRY_VALUE_BEGIN_OFFSET = 65535; 
     63 
     64  private static final int IMAGE_WIDTH = 6; 
     65 
     66  private static final int IMAGE_LENGTH = 4; 
     67 
     68  private static final int BITS_PER_SAMPLE = 8; 
     69 
     70  private static final int COMPRESSION = 1; 
     71 
     72  private static final int[] STRIP_OFFSETS = new int[] { 0, 1, 2 };  
     73 
     74  private static final int[] ROWS_PER_STRIP = new int[] { 2, 2, 2 }; 
     75 
     76  private static final TiffRational X_RESOLUTION = new TiffRational(1, 4); 
     77   
     78  private static final TiffRational Y_RESOLUTION = new TiffRational(1, 2); 
     79   
     80  private static final short RESOLUTION_UNIT = 1; 
     81   
     82  private static final int SAMPLES_PER_PIXEL = 1; 
    6083 
    6184  @BeforeMethod 
    6285  public void setUp() throws IOException { 
    6386    handle = new ByteArrayHandle(TIFF_HEADER); 
     87    handle.seek(TIFF_HEADER.length); 
     88    handle.setOrder(ByteOrder.LITTLE_ENDIAN); 
     89    long next = ENTRY_VALUE_BEGIN_OFFSET; 
     90    // IFD entry count 
     91    handle.writeShort(7); 
     92    // IMAGE_WIDTH 
     93    writeIFDEntry((short) IFD.IMAGE_WIDTH, IFDType.SHORT, IMAGE_WIDTH); 
     94    // IMAGE_LENGTH 
     95    writeIFDEntry((short) IFD.IMAGE_LENGTH, IFDType.SHORT, IMAGE_LENGTH); 
     96    // BITS_PER_SAMPLE 
     97    writeIFDEntry((short) IFD.BITS_PER_SAMPLE, IFDType.SHORT, 
     98                        BITS_PER_SAMPLE); 
     99    // COMPRESSION 
     100    writeIFDEntry((short) IFD.COMPRESSION, IFDType.SHORT, 
     101                        COMPRESSION); 
     102    // PHOTOMETRIC_INTERPRETATION 
     103    writeIFDEntry((short) IFD.PHOTOMETRIC_INTERPRETATION, IFDType.SHORT, 
     104                        PhotoInterp.RGB.getCode()); 
     105    // STRIP_OFFSETS 
     106    next = writeIFDEntry((short) IFD.STRIP_OFFSETS, IFDType.LONG, 
     107                               STRIP_OFFSETS, next); 
     108    // ROWS_PER_STRIP 
     109    next = writeIFDEntry((short) IFD.ROWS_PER_STRIP, IFDType.LONG, 
     110                               ROWS_PER_STRIP, next); 
     111    // Terminating IFD offset 
     112    handle.writeInt(0); 
    64113    in = new RandomAccessInputStream(handle); 
    65114    tiffParser = new TiffParser(in); 
    66115  } 
     116   
     117  private void writeIFDEntry(short tag, IFDType type, int value) 
     118    throws IOException { 
     119    handle.writeShort(tag);  // IFD entry tag 
     120    handle.writeShort(type.getCode());  // IFD entry type 
     121    handle.writeInt(1);  // IFD entry value count 
     122    handle.writeInt(value);  // The actual value 
     123  } 
     124 
     125  private long writeIFDEntry(short tag, IFDType type, int[] values, 
     126                             long offset) throws IOException { 
     127    handle.writeShort(tag);  // IFD entry tag 
     128    handle.writeShort(type.getCode());  // IFD entry type 
     129    handle.writeInt(values.length);  // IFD entry value count 
     130    handle.writeInt((int) offset); // The offset to the value 
     131    long before = handle.getFilePointer(); 
     132    handle.seek(offset); 
     133    for (int value : values) { 
     134      handle.writeInt(value); 
     135    } 
     136    long after = handle.getFilePointer(); 
     137    handle.seek(before); 
     138    return after; 
     139  } 
    67140 
    68141  @Test 
     
    82155  @Test 
    83156  public void testGetPhotoInterp() throws IOException, FormatException { 
    84     handle.seek(TIFF_HEADER.length); 
    85     handle.setOrder(ByteOrder.LITTLE_ENDIAN); 
    86     // TODO: Must be called first 
    87     tiffParser.checkHeader(); 
    88     int firstOffset = (int) tiffParser.getFirstOffset(); 
    89     short ifdCount = 3; 
    90     handle.writeShort(ifdCount); 
    91     handle.writeShort(IFD.PHOTOMETRIC_INTERPRETATION);  // IFD entry tag 
    92     handle.writeShort(IFDType.SHORT.getCode());  // IFD entry type 
    93     handle.writeInt(1);  // IFD entry value count 
    94     handle.writeInt(firstOffset + 2 + (ifdCount * 12) + 4); 
    95     handle.writeShort(IFD.PHOTOMETRIC_INTERPRETATION);  // IFD entry tag 
    96     handle.writeShort(IFDType.SHORT.getCode());  // IFD entry type 
    97     handle.writeInt(1);  // IFD entry value count 
    98     handle.writeInt(firstOffset + 2 + (ifdCount * 12) + 4 + 2); 
    99     handle.writeShort(IFD.PHOTOMETRIC_INTERPRETATION);  // IFD entry tag 
    100     handle.writeShort(IFDType.SHORT.getCode());  // IFD entry type 
    101     handle.writeInt(1);  // IFD entry value count 
    102     handle.writeInt(firstOffset + 2 + (ifdCount * 12) + 4 + 4); 
    103     handle.writeInt(0); 
    104     handle.writeShort(PhotoInterp.BLACK_IS_ZERO.getCode()); 
    105     handle.writeShort(PhotoInterp.BLACK_IS_ZERO.getCode()); 
    106     handle.writeShort(PhotoInterp.BLACK_IS_ZERO.getCode()); 
    107     Boolean isLittleEndian = tiffParser.checkHeader(); 
    108     assertNotNull(isLittleEndian); 
    109     assertTrue(tiffParser.checkHeader()); 
    110     assertEquals(PhotoInterp.BLACK_IS_ZERO, 
     157    // TODO: Must be called first 
     158    assertTrue(tiffParser.checkHeader()); 
     159    assertEquals(PhotoInterp.RGB, 
    111160                 tiffParser.getFirstIFD().getPhotometricInterpretation()); 
    112161  } 
     162 
     163  @Test 
     164  public void testGetImageLength() throws IOException, FormatException { 
     165    // TODO: Must be called first 
     166    assertTrue(tiffParser.checkHeader()); 
     167    assertEquals(IMAGE_LENGTH, 
     168                 tiffParser.getFirstIFD().getImageLength()); 
     169  } 
     170 
     171  @Test 
     172  public void testGetImageWidth() throws IOException, FormatException { 
     173    // TODO: Must be called first 
     174    assertTrue(tiffParser.checkHeader()); 
     175    assertEquals(IMAGE_WIDTH, 
     176                 tiffParser.getFirstIFD().getImageWidth()); 
     177  } 
     178 
     179  @Test 
     180  public void testGetBitsPerSample() throws IOException, FormatException { 
     181    // TODO: Must be called first 
     182    assertTrue(tiffParser.checkHeader()); 
     183    int[] bitsPerSample = tiffParser.getFirstIFD().getBitsPerSample(); 
     184    assertNotNull(bitsPerSample); 
     185    assertEquals(SAMPLES_PER_PIXEL, bitsPerSample.length); 
     186    assertEquals(BITS_PER_SAMPLE, bitsPerSample[0]); 
     187  } 
     188 
     189  @Test 
     190  public void testGetSamplesPerPixel() throws IOException, FormatException { 
     191    // TODO: Must be called first 
     192    assertTrue(tiffParser.checkHeader()); 
     193    assertEquals(SAMPLES_PER_PIXEL, 
     194                 tiffParser.getFirstIFD().getSamplesPerPixel()); 
     195  } 
     196 
     197  @Test 
     198  public void testGetStripOffsets() throws IOException, FormatException { 
     199    // TODO: Must be called first 
     200    assertTrue(tiffParser.checkHeader()); 
     201    long[] stripOffsets = tiffParser.getFirstIFD().getStripOffsets(); 
     202    assertNotNull(stripOffsets); 
     203    assertEquals(STRIP_OFFSETS.length, stripOffsets.length); 
     204    for (int i = 0; i < STRIP_OFFSETS.length; i++) { 
     205      int a = STRIP_OFFSETS[i]; 
     206      long b = stripOffsets[i];  
     207      if (a != b) { 
     208        fail(String.format( 
     209            "Strip offset %d not equivilent: %d != %d", i, a, b)); 
     210      } 
     211    } 
     212  } 
     213 
     214  @Test 
     215  public void testGetRowsPerStrip() throws IOException, FormatException { 
     216    // TODO: Must be called first 
     217    assertTrue(tiffParser.checkHeader()); 
     218    long[] rowsPerStrip = tiffParser.getFirstIFD().getRowsPerStrip(); 
     219    assertNotNull(rowsPerStrip); 
     220    assertEquals(ROWS_PER_STRIP.length, rowsPerStrip.length); 
     221    for (int i = 0; i < ROWS_PER_STRIP.length; i++) { 
     222      int a = ROWS_PER_STRIP[i]; 
     223      long b = rowsPerStrip[i];  
     224      if (a != b) { 
     225        fail(String.format( 
     226            "Rows per strip %d not equivilent: %d != %d", i, a, b)); 
     227      } 
     228    } 
     229  } 
     230 
     231  // TODO: Test non-uniform rows per strip exception 
     232  // TODO: Test bits per sample array length != samples per pixel exception 
    113233} 
Note: See TracChangeset for help on using the changeset viewer.