Path: blob/master/test/jdk/javax/imageio/plugins/tiff/TIFFDirectoryTest.java
41153 views
/*1* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @bug 814902826* @author a.stepanov27* @summary some simple checks for TIFFDirectory28* @run main TIFFDirectoryTest29*/3031import java.util.List;32import java.util.ArrayList;33import javax.imageio.metadata.*;34import javax.imageio.plugins.tiff.*;353637public class TIFFDirectoryTest {3839private static void check(boolean ok, String msg) {40if (!ok) { throw new RuntimeException(msg); }41}4243private void run() {4445int type = TIFFTag.TIFF_LONG, dt = 1 << type;46int n0 = 1000, n1 = 1001, n2 = 1002, n3 = 1003;4748TIFFTag tag1 = new TIFFTag(Integer.toString(n1), n1, dt);49TIFFTag tag2 = new TIFFTag(Integer.toString(n2), n2, dt);50TIFFTag tag3 = new TIFFTag(Integer.toString(n3), n3, dt);51TIFFTag parent = new TIFFTag(Integer.toString(n0), n0, dt);5253// tag sets array must not be null54boolean ok = false;55try { new TIFFDirectory(null, parent); }56catch (NullPointerException e) { ok = true; }57check(ok, "can construct TIFFDirectory with null tagsets array");5859// but can be empty60TIFFTagSet emptySets[] = {};61TIFFDirectory d = new TIFFDirectory(emptySets, parent);62check(d.getTagSets().length == 0, "invalid number of tag sets");63check(d.getParentTag().getName().equals(Integer.toString(n0)) &&64(d.getParentTag().getNumber() == n0), "invalid parent tag");656667// add tags68List<TIFFTag> tags = new ArrayList<>();69tags.add(tag1);70tags.add(tag2);71TIFFTagSet ts1 = new TIFFTagSet(tags);7273tags.clear();74tags.add(tag3);75TIFFTagSet ts2 = new TIFFTagSet(tags);7677TIFFTagSet sets[] = {ts1, ts2};78d = new TIFFDirectory(sets, parent);7980check(d.getTagSets().length == sets.length, "invalid number of tag sets");8182// check getTag()83for (int i = n1; i <= n3; i++) {84TIFFTag t = d.getTag(i);85check(t.getNumber() == i, "invalid tag number");86check(t.getName().equals(Integer.toString(i)), "invalid tag name");87check(t.getDataTypes() == dt, "invalid tag data types");88}8990TIFFDirectory d2;91try { d2 = d.clone(); }92catch (CloneNotSupportedException e) { throw new RuntimeException(e); }9394// check removeTagSet()95d.removeTagSet(ts2);96check(d.getTagSets().length == 1, "invalid number of tag sets");97check(d.getTagSets()[0].getTag(n1).getName().equals(Integer.toString(n1)),98"invalid tag name");99check(d.getTagSets()[0].getTag(n2).getName().equals(Integer.toString(n2)),100"invalid tag name");101102d.removeTagSet(ts1);103check(d.getTagSets().length == 0, "invalid number of tag sets");104105// check cloned data106check(d2.getTagSets().length == sets.length,107"invalid number of tag sets");108TIFFTagSet sets2[] = d2.getTagSets();109check(sets2.length == sets.length, "invalid number of tag sets");110check(111(sets2[0].getTag(Integer.toString(n1)).getNumber() == n1) &&112(sets2[0].getTag(Integer.toString(n2)).getNumber() == n2) &&113(sets2[0].getTag(Integer.toString(n0)) == null) &&114(sets2[1].getTag(Integer.toString(n3)).getNumber() == n3) &&115(sets2[1].getTag(Integer.toString(n0)) == null), "invalid data");116117check(118(sets2[0].getTag(Integer.toString(n1)).getDataTypes() == dt) &&119(sets2[0].getTag(Integer.toString(n2)).getDataTypes() == dt) &&120(sets2[1].getTag(Integer.toString(n3)).getDataTypes() == dt),121"invalid data type");122123// must not be able to call removeTagSet with null argument124ok = false;125try { d.removeTagSet(null); }126catch (NullPointerException e) { ok = true; }127check(ok, "must not be able to use null as an argument for remove");128129// check parent tag130check( d.getParentTag().getName().equals(Integer.toString(n0)) &&131d2.getParentTag().getName().equals(Integer.toString(n0)),132"invalid parent tag name");133134check(( d.getParentTag().getNumber() == n0) &&135(d2.getParentTag().getNumber() == n0),136"invalid parent tag number");137138check(( d.getParentTag().getDataTypes() == dt) &&139(d2.getParentTag().getDataTypes() == dt),140"invalid parent data type");141142d.addTagSet(ts1);143d.addTagSet(ts2);144145// add the same tag set twice and check that nothing changed146d.addTagSet(ts2);147148check(d.getTagSets().length == 2, "invalid number of tag sets");149150// check field operations151check(d.getNumTIFFFields() == 0, "invalid TIFFFields number");152check(d.getTIFFField(Integer.MAX_VALUE) == null,153"must return null TIFFField");154155long offset = 4L;156long a[] = {0, Integer.MAX_VALUE, (1 << 32) - 1};157int v = 100500;158TIFFField159f1 = new TIFFField(tag1, type, offset, d),160f2 = new TIFFField(tag2, v),161f3 = new TIFFField(tag3, type, a.length, a);162163d.addTIFFField(f1);164d.addTIFFField(f2);165d.addTIFFField(f3);166167check(d.containsTIFFField(n1) &&168d.containsTIFFField(n2) &&169d.containsTIFFField(n3) &&170!d.containsTIFFField(n0), "invalid containsTIFFField() results");171172check(d.getTIFFField(n0) == null, "can get unadded field");173174check(d.getNumTIFFFields() == 3, "invalid TIFFFields number");175176check(d.getTIFFField(n1).getCount() == 1, "invalid TIFFField count");177check(d.getTIFFField(n1).getAsLong(0) == offset, "invalid offset");178179check(d.getTIFFField(n2).getCount() == 1, "invalid TIFFField count");180check(d.getTIFFField(n2).getAsInt(0) == v, "invalid TIFFField value");181182check(d.getTIFFField(n3).getCount() == a.length,183"invalid TIFFField count");184for (int i = 0; i < a.length; ++i) {185check(d.getTIFFField(n3).getAsLong(i) == a[i],186"invalid TIFFField value");187}188189TIFFField nested = d.getTIFFField(n1).getDirectory().getTIFFField(n1);190check(nested.getTag().getNumber() == n1, "invalid tag number");191check(nested.getCount() == 1, "invalid field count");192check(nested.getAsLong(0) == offset, "invalid offset");193194// check that the field is overwritten correctly195int v2 = 1 << 16;196d.addTIFFField(new TIFFField(tag3, v2));197check(d.getTIFFField(n3).getCount() == 1, "invalid TIFFField count");198check(d.getTIFFField(n3).getAsInt(0)== v2, "invalid TIFFField value");199check(d.getNumTIFFFields() == 3, "invalid TIFFFields number");200201// check removeTIFFField()202d.removeTIFFField(n3);203check(d.getNumTIFFFields() == 2, "invalid TIFFFields number");204check(d.getTIFFField(n3) == null, "can get removed field");205206d.removeTIFFFields();207check((d.getTIFFField(n1) == null) && (d.getTIFFField(n2) == null),208"can get removed field");209check((d.getNumTIFFFields() == 0) && (d.getTIFFFields().length == 0),210"invalid TIFFFields number");211212// check that array returned by getTIFFFields() is sorted213// by tag number (as it stated in the docs)214d.addTIFFField(f3);215d.addTIFFField(f1);216d.addTIFFField(f2);217218TIFFField fa[] = d.getTIFFFields();219check(fa.length == 3, "invalid number of fields");220check((fa[0].getTagNumber() == n1) &&221(fa[1].getTagNumber() == n2) &&222(fa[2].getTagNumber() == n3),223"array of the fields must be sorted by tag number");224225d.removeTIFFFields();226d.addTIFFField(f2);227228// test getAsMetaData / createFromMetadata229try {230d2 = TIFFDirectory.createFromMetadata(d.getAsMetadata());231} catch (IIOInvalidTreeException e) {232throw new RuntimeException(e);233}234235// check new data236check(d2.getTagSets().length == sets.length,237"invalid number of tag sets");238sets2 = d2.getTagSets();239check(sets2.length == sets.length, "invalid number of tag sets");240check(241(sets2[0].getTag(Integer.toString(n1)).getNumber() == n1) &&242(sets2[0].getTag(Integer.toString(n2)).getNumber() == n2) &&243(sets2[0].getTag(Integer.toString(n0)) == null) &&244(sets2[1].getTag(Integer.toString(n3)).getNumber() == n3) &&245(sets2[1].getTag(Integer.toString(n0)) == null), "invalid data");246247check(248(sets2[0].getTag(Integer.toString(n1)).getDataTypes() == dt) &&249(sets2[0].getTag(Integer.toString(n2)).getDataTypes() == dt) &&250(sets2[1].getTag(Integer.toString(n3)).getDataTypes() == dt),251"invalid data type");252253check(!d2.containsTIFFField(n1) &&254d2.containsTIFFField(n2) &&255!d2.containsTIFFField(n3), "invalid containsTIFFField() results");256check(d2.getTIFFField(n2).getCount() == 1, "invalid TIFFField count");257check(d2.getTIFFField(n2).getAsInt(0) == v, "invalid TIFFField value");258259check((d2.getParentTag().getNumber() == n0) &&260d2.getParentTag().getName().equals(Integer.toString(n0)),261"invalid parent tag");262}263264public static void main(String[] args) { (new TIFFDirectoryTest()).run(); }265}266267268