slash.navigation.photo.PhotoFormatIT.java Source code

Java tutorial

Introduction

Here is the source code for slash.navigation.photo.PhotoFormatIT.java

Source

/*
This file is part of RouteConverter.
    
RouteConverter is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
    
RouteConverter is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License
along with RouteConverter; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    
Copyright (C) 2007 Christian Pesch. All Rights Reserved.
*/

package slash.navigation.photo;

import org.apache.commons.imaging.common.RationalNumber;
import org.junit.Test;
import slash.navigation.base.AllNavigationFormatRegistry;
import slash.navigation.base.BaseRoute;
import slash.navigation.base.NavigationFormatParser;
import slash.navigation.base.ParserResult;
import slash.navigation.base.Wgs84Route;

import java.io.File;
import java.io.IOException;

import static java.io.File.createTempFile;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static slash.common.TestCase.assertCalendarEquals;
import static slash.common.TestCase.assertDoubleEquals;
import static slash.common.TestCase.calendar;
import static slash.navigation.base.NavigationTestCase.TEST_PATH;

public class PhotoFormatIT {
    private NavigationFormatParser parser = new NavigationFormatParser(new AllNavigationFormatRegistry());

    public static void assertRationalNumberEquals(RationalNumber expected, RationalNumber was) {
        assertEquals(expected.numerator, was.numerator);
        assertEquals(expected.divisor, was.divisor);
    }

    @Test
    public void testIsJpgWithEmbeddedExifGPSMetadata() throws IOException {
        File source = new File(TEST_PATH + "from-gps.jpg");
        ParserResult result = parser.read(source);
        assertNotNull(result);
        assertEquals(PhotoFormat.class, result.getFormat().getClass());
        BaseRoute theRoute = result.getTheRoute();
        assertEquals(1, theRoute.getPositionCount());
        Wgs84Route route = (Wgs84Route) theRoute;
        PhotoPosition position = (PhotoPosition) route.getPosition(0);
        assertEquals("NIKON CORPORATION NIKON D90 Photo from 2010-08-31T10:31:27Z", position.getDescription());
        assertDoubleEquals(135.0, position.getElevation());
        assertDoubleEquals(8.474513333333334, position.getLongitude());
        assertDoubleEquals(53.026513333333334, position.getLatitude());
        assertNull(position.getSpeed());
        assertEquals(calendar(2010, 8, 31, 8, 30, 58), position.getTime());
        assertEquals(new Integer(10), position.getSatellites());
        assertNull(position.getHdop());
        assertNull(position.getPdop());
        assertNull(position.getVdop());
        assertNull(position.getHeading());
        assertEquals("NIKON CORPORATION", position.getMake());
        assertEquals("NIKON D90", position.getModel());
        assertEquals(new Integer(1024), position.getWidth());
        assertEquals(new Integer(680), position.getHeight());
        assertRationalNumberEquals(new RationalNumber(50, 10), position.getfNumber());
        assertRationalNumberEquals(new RationalNumber(10, 8000), position.getExposure());
        assertEquals(new Integer(0), position.getFlash());
        assertRationalNumberEquals(new RationalNumber(700, 10), position.getFocal());
        assertEquals(new Integer(200), position.getPhotographicSensitivity());
    }

    @Test
    public void testIsJpgWithEmbeddedExifMetadata() throws IOException {
        File source = new File(TEST_PATH + "from-exif.jpg");
        ParserResult result = parser.read(source);
        assertNotNull(result);
        assertEquals(PhotoFormat.class, result.getFormat().getClass());
        BaseRoute theRoute = result.getTheRoute();
        assertEquals(1, theRoute.getPositionCount());
        Wgs84Route route = (Wgs84Route) theRoute;
        PhotoPosition position = (PhotoPosition) route.getPosition(0);
        assertEquals("Palm Pre Photo from 2010-01-30T13:10:15Z", position.getDescription());
        assertNull(position.getElevation());
        assertNull(position.getLongitude());
        assertNull(position.getLatitude());
        assertNull(position.getSpeed());
        assertCalendarEquals(calendar(2010, 1, 30, 13, 10, 15), position.getTime());
        assertNull(position.getSatellites());
        assertNull(position.getHdop());
        assertNull(position.getPdop());
        assertNull(position.getVdop());
        assertNull(position.getHeading());
        assertEquals("Palm", position.getMake());
        assertEquals("Pre", position.getModel());
        assertEquals(new Integer(1520), position.getWidth());
        assertEquals(new Integer(2032), position.getHeight());
        assertRationalNumberEquals(new RationalNumber(24, 10), position.getfNumber());
        assertRationalNumberEquals(new RationalNumber(1, 65536000), position.getExposure());
        assertEquals(new Integer(24), position.getFlash());
        assertRationalNumberEquals(new RationalNumber(100, 41), position.getFocal());
        assertNull(position.getPhotographicSensitivity());
    }

    @Test
    public void testIsJpgWithoutMetadata() throws IOException {
        File source = new File(TEST_PATH + "from-plain.jpg");
        ParserResult result = parser.read(source);
        assertNotNull(result);
        BaseRoute theRoute = result.getTheRoute();
        assertEquals(PhotoFormat.class, result.getFormat().getClass());
        assertEquals(1, theRoute.getPositionCount());
        Wgs84Route route = (Wgs84Route) theRoute;
        PhotoPosition position = (PhotoPosition) route.getPosition(0);
        assertEquals("No EXIF data", position.getDescription());
        assertNull(position.getElevation());
        assertNull(position.getLongitude());
        assertNull(position.getLatitude());
        assertNull(position.getSpeed());
        assertCalendarEquals(calendar(2016, 1, 27, 21, 1, 58), position.getTime());
        assertNull(position.getSatellites());
        assertNull(position.getHdop());
        assertNull(position.getPdop());
        assertNull(position.getVdop());
        assertNull(position.getHeading());
        assertNull(position.getMake());
        assertNull(position.getModel());
        assertNull(position.getWidth());
        assertNull(position.getHeight());
        assertNull(position.getfNumber());
        assertNull(position.getExposure());
        assertNull(position.getFlash());
        assertNull(position.getFocal());
        assertNull(position.getPhotographicSensitivity());
    }

    private void modifyImage(String path) throws IOException {
        File source = new File(path);
        ParserResult result = parser.read(source);
        assertNotNull(result);
        BaseRoute theRoute = result.getTheRoute();
        PhotoFormat format = (PhotoFormat) result.getFormat();
        Wgs84Route route = (Wgs84Route) theRoute;
        PhotoPosition position = (PhotoPosition) route.getPosition(0);
        position.setDescription("description");
        position.setElevation(222.0);
        position.setLongitude(10.0);
        position.setLatitude(50.0);
        position.setSpeed(40.0);
        position.setTime(calendar(2014, 2, 11, 15, 3, 25));
        position.setSatellites(4);
        position.setHdop(1.0);
        position.setPdop(2.0);
        position.setVdop(3.0);
        position.setHeading(111.0);
        position.setMake("make");
        position.setModel("model");
        position.setWidth(1024);
        position.setHeight(512);
        position.setfNumber(new RationalNumber(53, 10));
        position.setExposure(new RationalNumber(11, 8000));
        position.setFlash(1);
        position.setFocal(new RationalNumber(35, 1));
        position.setPhotographicSensitivity(800);

        File target = createTempFile("target", ".jpg");
        target.deleteOnExit();
        try {
            parser.write(route, format, false, false, null, target);
            assertTrue(target.exists());

            ParserResult result2 = parser.read(target);
            assertNotNull(result2);
            assertEquals(PhotoFormat.class, result2.getFormat().getClass());
            BaseRoute theRoute2 = result2.getTheRoute();
            Wgs84Route route2 = (Wgs84Route) theRoute2;
            assertEquals(1, route2.getPositionCount());
            PhotoPosition position2 = (PhotoPosition) route2.getPosition(0);
            assertEquals("description", position2.getDescription());
            assertDoubleEquals(222.0, position2.getElevation());
            assertDoubleEquals(10.0, position2.getLongitude());
            assertDoubleEquals(50.0, position2.getLatitude());
            assertDoubleEquals(40.0, position2.getSpeed());
            assertCalendarEquals(calendar(2014, 2, 11, 15, 3, 25), position2.getTime());
            assertEquals(new Integer(4), position2.getSatellites());
            assertNull(position2.getHdop());
            assertDoubleEquals(2.0, position2.getPdop());
            assertNull(position2.getVdop());
            assertDoubleEquals(111.0, position2.getHeading());
            assertEquals("make", position2.getMake());
            assertEquals("model", position2.getModel());
            assertEquals(new Integer(1024), position2.getWidth());
            assertEquals(new Integer(512), position2.getHeight());
            assertRationalNumberEquals(new RationalNumber(53, 10), position2.getfNumber());
            assertRationalNumberEquals(new RationalNumber(11, 8000), position2.getExposure());
            assertEquals(new Integer(1), position2.getFlash());
            assertRationalNumberEquals(new RationalNumber(35, 1), position2.getFocal());
            assertEquals(new Integer(800), position.getPhotographicSensitivity());

            assertTrue(target.delete());
        } finally {
            // avoid to clutter the temp directory
            if (target.exists())
                assertTrue(target.delete());
        }
    }

    @Test
    public void testModifyJpgWithEmbeddedExifGPSMetadata() throws IOException {
        modifyImage(TEST_PATH + "from-gps.jpg");
    }

    @Test
    public void testModifyJpgWithEmbeddedExifMetadata() throws IOException {
        modifyImage(TEST_PATH + "from-exif.jpg");
    }

    @Test
    public void testModifyJpgWithoutMetadata() throws IOException {
        modifyImage(TEST_PATH + "from-plain.jpg");
    }
}