OSDN Git Service

green: タイムスタンプのUTCとローカル時間との表示変換機能のテストを追加
[importpicture/importpicture.git] / importPicture / test / osm / jp / gpx / ImportPictureTest.java
index 3ee1024..a2181fc 100644 (file)
@@ -3,135 +3,709 @@ package osm.jp.gpx;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.*;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.nio.channels.FileChannel;
 
-import org.junit.Before;
-import org.junit.Test;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.commons.imaging.Imaging;
+import org.apache.commons.imaging.common.ImageMetadata;
+import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
+import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
+import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
 import org.junit.runner.*;
-import org.junit.experimental.runners.Enclosed;
+import org.junit.experimental.theories.DataPoints;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
 
-import hayashi.tools.files.DeleteDir;
-
-@RunWith(Enclosed.class)
+@RunWith(Theories.class)
 public class ImportPictureTest {
-       
-       public static class SONYのカメラの場合 {
+       static class Expecter {
+               String value;
+               boolean expect;
+               String timeStr;
+               boolean magver;
+               
+               public Expecter(String value, boolean expect, String timeStr, boolean magver){
+                       this.value = value;
+                       this.expect = expect;
+                       this.timeStr = timeStr;
+                       this.magver = magver;
+               }
+       }
+
+       static class Fixture {
+               String comment;                         // テスト概要(コメント)
+               String tarFilePath;                     // TARデータ
+               String gpxSourcePath;           // GPXファイル(オリジナル)
+               String gpxDestinationPath;      // GPXファイル(配置先)
+               String iniFilePath;                     // iniファイル
+               Expecter[] expecters;
                
-               @Before
-               public void setUp() throws Exception {
-                       // カメラディレクトリを削除する
-                       File dir = new File("testdata/cameradata");
-                       if (dir.exists()) {
-                               DeleteDir.delete(dir);
-                       }
-                       File outDir = new File("testdata/output");
-                       if (outDir.exists()) {
-                               DeleteDir.delete(outDir);
-                       }
-                       outDir.mkdir();
+               public Fixture(
+                               String comment,
+                               String tarFilePath,
+                               String gpxSourcePath,
+                               String gpxDestinationPath,
+                               String iniFilePath,
+                               Expecter[] expecters
+               ) {
+                       this.comment = comment;
+                       this.tarFilePath = tarFilePath;
+                       this.gpxSourcePath = gpxSourcePath;
+                       this.gpxDestinationPath = gpxDestinationPath;
+                       this.iniFilePath = iniFilePath;
+                       this.expecters = expecters;
+               }
+               
+               public String toString() {
+                       String msg = "テストパターン : "+ comment + "\n";
+                       msg += "\ttarFilePath = "+ tarFilePath +"\n";
+                       msg += "\tgpxSourcePath = "+ gpxSourcePath +"\n";
+                       msg += "\tgpxDestinationPath = "+ gpxDestinationPath +"\n";
+                       msg += "\tiniFilePath = "+ iniFilePath;
+                       return msg;
+               }
+       }
+
+       @DataPoints
+       public static Fixture[] datas = {
+                       new Fixture(
+                                       "[A1].SONYカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルはコピー対象外の時",
+                                       "testdata/Sony20170518.tar.gz", 
+                                       "testdata/20170518.gpx",
+                                       "testdata/cameradata/20170518.gpx",
+                                       "testdata/AdjustTime.20170518.A1.ini",
+                                       new Expecter[] {
+                                               new Expecter("10170518/20170518_.gpx", true, null, true),
+                                               new Expecter("10170518/DSC05183.JPG", false, null, false),
+                                               new Expecter("10170518/DSC05184.JPG", true, "2017:05:18 00:34:44", true),
+                                               new Expecter("10170518/DSC05196.JPG", true, "2017:05:18 00:37:32", true),
+                                               new Expecter("10170518/DSC05204.JPG", true, "2017:05:18 00:46:48", true),
+                                               new Expecter("10170518/DSC05205.JPG", false, null, false),
+                                       }),
+                       new Fixture(
+                                       "[A2].SONYカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルもコピーする時",
+                                       "testdata/Sony20170518.tar.gz", 
+                                       "testdata/20170518.gpx",
+                                       "testdata/cameradata/20170518.gpx",
+                                       "testdata/AdjustTime.20170518.A2.ini",
+                                       new Expecter[] {
+                                               new Expecter("10170518/20170518_.gpx", true, null, true),
+                                               new Expecter("10170518/DSC05183.JPG", true, "2017:05:18 00:16:48", true),
+                                               new Expecter("10170518/DSC05184.JPG", true, "2017:05:18 00:34:44", true),
+                                               new Expecter("10170518/DSC05196.JPG", true, "2017:05:18 00:37:32", true),
+                                               new Expecter("10170518/DSC05204.JPG", true, "2017:05:18 00:46:48", true),
+                                               new Expecter("10170518/DSC05205.JPG", true, "2017:05:18 00:48:04", true),
+                                       }),
                        
-                       // カメラディレクトリを作成する
-                       TarGz.uncompress(new File("testdata", "Sony20170518.tar.gz"), dir);
+                       new Fixture(
+                                       "[B1].WiMiUSカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルはコピー対象外の時",
+                                       "testdata/WiMiUS20170518.tar.gz", 
+                                       "testdata/20170518.gpx",
+                                       "testdata/cameradata/20170518.gpx",
+                                       "testdata/AdjustTime.20170518.B1.ini",
+                                       new Expecter[] {
+                                               new Expecter("cameradata/20170518_.gpx", true, null, true),
+                                               new Expecter("cameradata/20170518_092031A.jpg", false, null, false),
+                                               new Expecter("cameradata/20170518_094226A_snap.jpg", true, "2017:05:18 00:42:26", true),
+                                               new Expecter("cameradata/20170518_094737A.jpg", true, "2017:05:18 00:47:36", true),
+                                               new Expecter("cameradata/20170518_094827A.jpg", false, null, false),
+                                       }),
+
+                       new Fixture(
+                                       "[B2].WiMiUSカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルもコピーする時",
+                                       "testdata/WiMiUS20170518.tar.gz", 
+                                       "testdata/20170518.gpx",
+                                       "testdata/cameradata/20170518.gpx",
+                                       "testdata/AdjustTime.20170518.B2.ini",
+                                       new Expecter[] {
+                                               new Expecter("cameradata/20170518_.gpx", true, null, true),
+                                               new Expecter("cameradata/20170518_092031A.jpg", true, "2017:05:18 00:20:30", true),
+                                               new Expecter("cameradata/20170518_094226A_snap.jpg", true, "2017:05:18 00:42:26", true),
+                                               new Expecter("cameradata/20170518_094737A.jpg", true, "2017:05:18 00:47:36", true),
+                                               new Expecter("cameradata/20170518_094827A.jpg", true, "2017:05:18 00:48:26", true),
+                                       }),
                        
-                       // GPXファイルをセット
-               try (   FileInputStream inStream = new FileInputStream(new File("testdata", "20170518.gpx"));
-                               FileOutputStream outStream = new FileOutputStream(new File("testdata/cameradata/10170518/20170518.gpx"));
-                       FileChannel inChannel = inStream.getChannel();
-                       FileChannel outChannel = outStream.getChannel();        )
-               {
-                   inChannel.transferTo(0, inChannel.size(), outChannel);
-               }
-               
-               // プロパティファイルを設定
-                       File iniFile = new File("AdjustTime.ini");
-                       File orgFile = new File("AdjustTime.ini.org");
-                       File testFile = new File("testdata", "AdjustTime.20170518.ini");
-                       if (orgFile.exists()) {
-                               orgFile.delete();
-                       }
-                       if (iniFile.exists()) {
-                               iniFile.renameTo(orgFile);
-                       }
-               try (   FileInputStream inStream = new FileInputStream(testFile);
-                               FileOutputStream outStream = new FileOutputStream(new File("AdjustTime.ini"));
-                               FileChannel inChannel = inStream.getChannel();
-                               FileChannel outChannel = outStream.getChannel();        )
-               {
-                   inChannel.transferTo(0, inChannel.size(),outChannel);
+                       new Fixture(
+                                       "[M1a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.GarminColorado",
+                                       "testdata/separate.tar.gz",
+                                       "testdata/muiltiTRK.GarminColorado.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M1a.separate.ini",
+                                       new Expecter[] {
+                                       // GPX file
+                                               new Expecter("separate/separate_.gpx", true, null, true),
+                                   
+                                   // out of time ( - 2017-05-29T01:23:18)
+                                               new Expecter("separate/20170529_102305A.jpg", false, null, false),
+                                               new Expecter("separate/20170529_102314A.jpg", false, null, false),
+                                   
+                                   // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                               new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                               new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                               new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
+
+                                   // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                               new Expecter("separate/20170529_102409A.jpg", false, null, false),
+                                               new Expecter("separate/20170529_102418A.jpg", false, null, false),
+
+                                   // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                               new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                               new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                   // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                               new Expecter("separate/20170529_103315A.jpg", false, null, false),
+                                               new Expecter("separate/20170529_103545A.jpg", false, null, false),
+
+                                   // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                               new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                               new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M1b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.GarminColorado",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/muiltiTRK.GarminColorado.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M1b.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
+                                                       new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
+                                                       new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
+                                                       new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M1c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.GarminColorado",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/muiltiTRK.GarminColorado.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M1c.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102314A.jpg", false, null, false),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102418A.jpg", false, null, false),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_103545A.jpg", false, null, false),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M1d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.GarminColorado",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/muiltiTRK.GarminColorado.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M1d.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
+                                                       new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
+                                                       new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
+                                                       new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
+                                       }),
+
+                       
+                       new Fixture(
+                                       "[M2a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20J",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M2a.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102314A.jpg", false, null, false),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102418A.jpg", false, null, false),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_103545A.jpg", false, null, false),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M2b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20J",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M2b.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
+                                                       new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
+                                                       new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
+                                                       new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M2c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20J",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M2c.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102314A.jpg", false, null, false),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102418A.jpg", false, null, false),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_103545A.jpg", false, null, false),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M2d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20J",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M2d.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
+                                                       new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
+                                                       new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
+                                                       new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
+                                       }),
+                       
+                       new Fixture(
+                                       "[M3a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20Jreverse",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M2a.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102314A.jpg", false, null, false),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102418A.jpg", false, null, false),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_103545A.jpg", false, null, false),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M3b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20Jreverse",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M2b.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
+                                                       new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
+                                                       new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
+                                                       new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M3c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20Jreverse",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M2c.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102314A.jpg", false, null, false),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_102418A.jpg", false, null, false),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", false, null, false),
+                                                       new Expecter("separate/20170529_103545A.jpg", false, null, false),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
+                                       }),
+
+                       new Fixture(
+                                       "[M3d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20Jreverse",
+                                       "testdata/separate.tar.gz", 
+                                       "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
+                                       "testdata/cameradata/separate.gpx",
+                                       "testdata/AdjustTime.M2d.separate.ini",
+                                       new Expecter[] {
+                                               // GPX file
+                                                       new Expecter("separate/separate_.gpx", true, null, true),
+                                           
+                                           // out of time ( - 2017-05-29T01:23:18)
+                                                       new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
+                                                       new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
+                                           
+                                           // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
+                                                       new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
+                                                       new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
+                                                       new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
+
+                                           // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
+                                                       new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
+                                                       new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
+
+                                           // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
+                                                       new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
+                                                       new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
+
+                                           // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
+                                                       new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
+                                                       new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
+
+                                           // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
+                                                       new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
+                                                       new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
+                                       }),
+       };
+
+
+       @Theory
+       public void パラメータテスト(Fixture dataset) throws Exception {
+               ImportPictureTest.setup(dataset);
+               ImportPictureTest.testdo(dataset.iniFilePath);
+               //SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.UK);
+               
+               Expecter[] es = dataset.expecters;
+               AppParameters params = new AppParameters(dataset.iniFilePath);
+               File outDir = new File(params.getProperty(AppParameters.IMG_OUTPUT_FOLDER));
+               for (int i = 0; i < es.length; i++) {
+               File file = new File(outDir, es[i].value);
+               System.out.println("[JUnit.debug] assert file='"+ file.getAbsolutePath() +"'");
+               assertThat(file.exists(), is(es[i].expect));
+               if (es[i].timeStr != null) {
+                       // JPEG メタデータが存在すること
+                ImageMetadata meta = Imaging.getMetadata(file);
+                
+                // メタデータは インスタンスJpegImageMetadata であること
+               assertThat((meta instanceof JpegImageMetadata), is(true));
+                
+                JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;
+                assertNotNull(jpegMetadata);
+                
+                // EXIFデータが存在すること
+                TiffImageMetadata exif = jpegMetadata.getExif();
+                assertNotNull(exif);
+                
+                // EXIF-TIME が正しく設定されていること
+               String exifTime = ImportPicture.toEXIFString(ImportPicture.toEXIFDate(exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0]));
+               System.out.println("[debug] exifTime = '"+ exifTime +"' <--> '"+ es[i].timeStr +"'");
+               assertThat(exifTime, is(es[i].timeStr));
                }
                }
-
-               @Test
-               public void FILE_UPDATE時間を基準にして時間外のファイルはコピー対象外の時() throws Exception {
-               // "AdjustTime.20170517.ini"のデフォルト状態で実行
-                       AppParameters params = new AppParameters();
-                       params.setProperty(AppParameters.GPX_BASETIME, "FILE_UPDATE");
-                       params.setProperty(AppParameters.IMG_OUTPUT_ALL, "false");
-                       params.store();
-               
-               // 実行する
-               try {
-                       String[] argv = {
-                                       "./testdata/cameradata/10170518",
-                                       "DSC05183.JPG",
-                                       "2017-05-18T09:16:48",
-                                       "./testdata/output",
-                                       "./testdata/cameradata/10170518"
-                       };
-                       ImportPicture.main(argv);
-                       }
-                       catch (Exception e) {
-                               fail("Exceptionが発生した。");
-                       }
-
-               File file0 = new File("./testdata/output/10170518", "DSC05183.JPG");
-               assertThat(file0.exists(), is(false));
-               File file1 = new File("./testdata/output/10170518", "DSC05184.JPG");
-               assertThat(file1.exists(), is(true));
-               File file2 = new File("./testdata/output/10170518", "DSC05196.JPG");
-               assertThat(file2.exists(), is(true));
-               File file3 = new File("./testdata/output/10170518", "DSC05204.JPG");
-               assertThat(file3.exists(), is(true));
-               File file4 = new File("./testdata/output/10170518", "DSC05205.JPG");
-               assertThat(file4.exists(), is(false));
+       }
+       
+       static void setup(Fixture dataset) throws IOException {
+               System.out.println(dataset.toString());
+               
+               // カメラディレクトリを削除する
+               File dir = new File("testdata/cameradata");
+               if (dir.exists()) {
+                       ImportPictureTest.delete(dir);
+               }
+               File outDir = new File("testdata/output");
+               if (outDir.exists()) {
+                       ImportPictureTest.delete(outDir);
                }
+               outDir.mkdir();
+
+               // カメラディレクトリを作成する
+               ImportPictureTest.uncompress(new File(dataset.tarFilePath), new File("testdata/cameradata"));
                
-               @Test
-               public void FILE_UPDATE時間を基準にして時間外のファイルもコピーする時() throws Exception {
-                       AppParameters params = new AppParameters();
-                       params.setProperty(AppParameters.GPX_BASETIME, "FILE_UPDATE");
-                       params.setProperty(AppParameters.IMG_OUTPUT_ALL, "true");
-                       params.store();
-               
-               // 実行する
-               try {
-                       String[] argv = {
-                                       "./testdata/cameradata/10170518",
-                                       "DSC05183.JPG",
-                                       "2017-05-18T09:16:48",
-                                       "./testdata/output",
-                                       "./testdata/cameradata/10170518"
-                       };
-                       ImportPicture.main(argv);
-                       }
-                       catch (Exception e) {
-                               fail("Exceptionが発生した。");
-                       }
-
-               File file0 = new File("./testdata/output/10170518", "DSC05183.JPG");
-               assertThat(file0.exists(), is(true));
-               File file1 = new File("./testdata/output/10170518", "DSC05184.JPG");
-               assertThat(file1.exists(), is(true));
-               File file2 = new File("./testdata/output/10170518", "DSC05196.JPG");
-               assertThat(file2.exists(), is(true));
-               File file3 = new File("./testdata/output/10170518", "DSC05204.JPG");
-               assertThat(file3.exists(), is(true));
-               File file4 = new File("./testdata/output/10170518", "DSC05205.JPG");
-               assertThat(file4.exists(), is(true));
+               // GPXファイルをセット
+        try (  FileInputStream inStream = new FileInputStream(new File(dataset.gpxSourcePath));
+                       FileOutputStream outStream = new FileOutputStream(new File(dataset.gpxDestinationPath));
+               FileChannel inChannel = inStream.getChannel();
+               FileChannel outChannel = outStream.getChannel();        )
+        {
+            inChannel.transferTo(0, inChannel.size(), outChannel);
+        }
+       }
+       
+       /**
+        * 実行する
+        * @throws Exception
+        */
+       static void testdo(String iniFilePath) {
+        try {
+               String[] argv = new String[1];
+               argv[0] = new String(iniFilePath);
+               ImportPicture.main(argv);
+               }
+               catch (Exception e) {
+                       e.printStackTrace();
+                       fail("Exceptionが発生した。");
                }
        }
 
+       /**
+     * *.tar.gz解凍
+     * ファイル更新日時をオリジナルと同じにします。
+     * @param tazFile 解凍する*.tar.gzファイル
+     * @param dest 解凍先フォルダ
+     * @throws IOException 
+     */
+    public static void uncompress(File tazFile, File dest) throws IOException {
+        dest.mkdir();
+        
+        TarArchiveInputStream tarIn = null;
+        tarIn = new TarArchiveInputStream(new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(tazFile))));
+
+        TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
+        while (tarEntry != null) {
+            File destPath = new File(dest, tarEntry.getName());
+            //System.out.println("uncompress: " + destPath.getCanonicalPath());
+            if (tarEntry.isDirectory()) {
+                destPath.mkdirs();
+            }
+            else {
+               File dir = new File(destPath.getParent());
+               if (!dir.exists()) {
+                       dir.mkdirs();
+               }
+                destPath.createNewFile();
+                byte[] btoRead = new byte[1024];
+                BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath));
+                int len = 0;
+
+                while ((len = tarIn.read(btoRead)) != -1) {
+                    bout.write(btoRead, 0, len);
+                }
+
+                bout.close();
+                destPath.setLastModified(tarEntry.getLastModifiedDate().getTime());
+                btoRead = null;
+            }
+            tarEntry = tarIn.getNextTarEntry();
+        }
+        tarIn.close();
+    }
+
+    public static void delete(File file) throws IOException {
+        if (!file.exists()) {
+            System.out.println("ERROR: ファイルまたはディレクトリが見つかりませんでした。");
+            throw new IOException("File not found.");
+        }
+        
+        if (file.isDirectory()) {
+            File files[] = file.listFiles();
+            if (files != null) {
+                for (int i=0; i < files.length; i++) {
+                    delete(files[i]);    // 再帰呼び出し
+                }
+            }
+        }
+        if (!file.delete()) {
+                       System.out.println("ERROR: ファイルは削除できませんでした。 '" + file.getAbsolutePath() +"'");
+        }
+        return;
+    }
 }