3 import static org.hamcrest.CoreMatchers.is;
4 import static org.junit.Assert.*;
6 import java.io.BufferedInputStream;
7 import java.io.BufferedOutputStream;
9 import java.io.FileInputStream;
10 import java.io.FileOutputStream;
11 import java.io.IOException;
12 import java.nio.channels.FileChannel;
14 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
15 import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
16 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
17 import org.apache.commons.imaging.Imaging;
18 import org.apache.commons.imaging.common.ImageMetadata;
19 import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
20 import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
21 import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
22 import org.junit.runner.*;
23 import org.junit.experimental.theories.DataPoints;
24 import org.junit.experimental.theories.Theories;
25 import org.junit.experimental.theories.Theory;
27 @RunWith(Theories.class)
28 public class ImportPictureTest {
29 static class Expecter {
35 public Expecter(String value, boolean expect, String timeStr, boolean magver){
38 this.timeStr = timeStr;
43 static class Fixture {
44 String comment; // テスト概要(コメント)
45 String tarFilePath; // TARデータ
46 String gpxSourcePath; // GPXファイル(オリジナル)
47 String gpxDestinationPath; // GPXファイル(配置先)
48 String iniFilePath; // iniファイル
55 String gpxDestinationPath,
59 this.comment = comment;
60 this.tarFilePath = tarFilePath;
61 this.gpxSourcePath = gpxSourcePath;
62 this.gpxDestinationPath = gpxDestinationPath;
63 this.iniFilePath = iniFilePath;
64 this.expecters = expecters;
67 public String toString() {
68 String msg = "テストパターン : "+ comment + "\n";
69 msg += "\ttarFilePath = "+ tarFilePath +"\n";
70 msg += "\tgpxSourcePath = "+ gpxSourcePath +"\n";
71 msg += "\tgpxDestinationPath = "+ gpxDestinationPath +"\n";
72 msg += "\tiniFilePath = "+ iniFilePath;
78 public static Fixture[] datas = {
80 "[A1].SONYカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルはコピー対象外の時",
81 "testdata/Sony20170518.tar.gz",
82 "testdata/20170518.gpx",
83 "testdata/cameradata/20170518.gpx",
84 "testdata/AdjustTime.20170518.A1.ini",
86 new Expecter("10170518/20170518_.gpx", true, null, true),
87 new Expecter("10170518/DSC05183.JPG", false, null, false),
88 new Expecter("10170518/DSC05184.JPG", true, "2017:05:18 00:34:44", true),
89 new Expecter("10170518/DSC05196.JPG", true, "2017:05:18 00:37:32", true),
90 new Expecter("10170518/DSC05204.JPG", true, "2017:05:18 00:46:48", true),
91 new Expecter("10170518/DSC05205.JPG", false, null, false),
94 "[A2].SONYカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルもコピーする時",
95 "testdata/Sony20170518.tar.gz",
96 "testdata/20170518.gpx",
97 "testdata/cameradata/20170518.gpx",
98 "testdata/AdjustTime.20170518.A2.ini",
100 new Expecter("10170518/20170518_.gpx", true, null, true),
101 new Expecter("10170518/DSC05183.JPG", true, "2017:05:18 00:16:48", true),
102 new Expecter("10170518/DSC05184.JPG", true, "2017:05:18 00:34:44", true),
103 new Expecter("10170518/DSC05196.JPG", true, "2017:05:18 00:37:32", true),
104 new Expecter("10170518/DSC05204.JPG", true, "2017:05:18 00:46:48", true),
105 new Expecter("10170518/DSC05205.JPG", true, "2017:05:18 00:48:04", true),
109 "[B1].WiMiUSカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルはコピー対象外の時",
110 "testdata/WiMiUS20170518.tar.gz",
111 "testdata/20170518.gpx",
112 "testdata/cameradata/20170518.gpx",
113 "testdata/AdjustTime.20170518.B1.ini",
115 new Expecter("cameradata/20170518_.gpx", true, null, true),
116 new Expecter("cameradata/20170518_092031A.jpg", false, null, false),
117 new Expecter("cameradata/20170518_094226A_snap.jpg", true, "2017:05:18 00:42:26", true),
118 new Expecter("cameradata/20170518_094737A.jpg", true, "2017:05:18 00:47:36", true),
119 new Expecter("cameradata/20170518_094827A.jpg", false, null, false),
123 "[B2].WiMiUSカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルもコピーする時",
124 "testdata/WiMiUS20170518.tar.gz",
125 "testdata/20170518.gpx",
126 "testdata/cameradata/20170518.gpx",
127 "testdata/AdjustTime.20170518.B2.ini",
129 new Expecter("cameradata/20170518_.gpx", true, null, true),
130 new Expecter("cameradata/20170518_092031A.jpg", true, "2017:05:18 00:20:30", true),
131 new Expecter("cameradata/20170518_094226A_snap.jpg", true, "2017:05:18 00:42:26", true),
132 new Expecter("cameradata/20170518_094737A.jpg", true, "2017:05:18 00:47:36", true),
133 new Expecter("cameradata/20170518_094827A.jpg", true, "2017:05:18 00:48:26", true),
137 "[M1a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.GarminColorado",
138 "testdata/separate.tar.gz",
139 "testdata/muiltiTRK.GarminColorado.gpx.xml",
140 "testdata/cameradata/separate.gpx",
141 "testdata/AdjustTime.M1a.separate.ini",
144 new Expecter("separate/separate_.gpx", true, null, true),
146 // out of time ( - 2017-05-29T01:23:18)
147 new Expecter("separate/20170529_102305A.jpg", false, null, false),
148 new Expecter("separate/20170529_102314A.jpg", false, null, false),
150 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
151 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
152 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
153 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
155 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
156 new Expecter("separate/20170529_102409A.jpg", false, null, false),
157 new Expecter("separate/20170529_102418A.jpg", false, null, false),
159 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
160 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
161 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
163 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
164 new Expecter("separate/20170529_103315A.jpg", false, null, false),
165 new Expecter("separate/20170529_103545A.jpg", false, null, false),
167 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
168 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
169 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
173 "[M1b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.GarminColorado",
174 "testdata/separate.tar.gz",
175 "testdata/muiltiTRK.GarminColorado.gpx.xml",
176 "testdata/cameradata/separate.gpx",
177 "testdata/AdjustTime.M1b.separate.ini",
180 new Expecter("separate/separate_.gpx", true, null, true),
182 // out of time ( - 2017-05-29T01:23:18)
183 new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
184 new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
186 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
187 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
188 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
189 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
191 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
192 new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
193 new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
195 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
196 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
197 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
199 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
200 new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
201 new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
203 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
204 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
205 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
209 "[M1c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.GarminColorado",
210 "testdata/separate.tar.gz",
211 "testdata/muiltiTRK.GarminColorado.gpx.xml",
212 "testdata/cameradata/separate.gpx",
213 "testdata/AdjustTime.M1c.separate.ini",
216 new Expecter("separate/separate_.gpx", true, null, true),
218 // out of time ( - 2017-05-29T01:23:18)
219 new Expecter("separate/20170529_102305A.jpg", false, null, false),
220 new Expecter("separate/20170529_102314A.jpg", false, null, false),
222 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
223 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
224 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
225 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
227 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
228 new Expecter("separate/20170529_102409A.jpg", false, null, false),
229 new Expecter("separate/20170529_102418A.jpg", false, null, false),
231 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
232 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
233 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
235 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
236 new Expecter("separate/20170529_103315A.jpg", false, null, false),
237 new Expecter("separate/20170529_103545A.jpg", false, null, false),
239 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
240 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
241 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
245 "[M1d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.GarminColorado",
246 "testdata/separate.tar.gz",
247 "testdata/muiltiTRK.GarminColorado.gpx.xml",
248 "testdata/cameradata/separate.gpx",
249 "testdata/AdjustTime.M1d.separate.ini",
252 new Expecter("separate/separate_.gpx", true, null, true),
254 // out of time ( - 2017-05-29T01:23:18)
255 new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
256 new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
258 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
259 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
260 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
261 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
263 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
264 new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
265 new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
267 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
268 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
269 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
271 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
272 new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
273 new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
275 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
276 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
277 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
282 "[M2a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20J",
283 "testdata/separate.tar.gz",
284 "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
285 "testdata/cameradata/separate.gpx",
286 "testdata/AdjustTime.M2a.separate.ini",
289 new Expecter("separate/separate_.gpx", true, null, true),
291 // out of time ( - 2017-05-29T01:23:18)
292 new Expecter("separate/20170529_102305A.jpg", false, null, false),
293 new Expecter("separate/20170529_102314A.jpg", false, null, false),
295 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
296 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
297 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
298 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
300 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
301 new Expecter("separate/20170529_102409A.jpg", false, null, false),
302 new Expecter("separate/20170529_102418A.jpg", false, null, false),
304 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
305 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
306 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
308 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
309 new Expecter("separate/20170529_103315A.jpg", false, null, false),
310 new Expecter("separate/20170529_103545A.jpg", false, null, false),
312 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
313 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
314 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
318 "[M2b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20J",
319 "testdata/separate.tar.gz",
320 "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
321 "testdata/cameradata/separate.gpx",
322 "testdata/AdjustTime.M2b.separate.ini",
325 new Expecter("separate/separate_.gpx", true, null, true),
327 // out of time ( - 2017-05-29T01:23:18)
328 new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
329 new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
331 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
332 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
333 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
334 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
336 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
337 new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
338 new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
340 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
341 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
342 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
344 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
345 new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
346 new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
348 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
349 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
350 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
354 "[M2c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20J",
355 "testdata/separate.tar.gz",
356 "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
357 "testdata/cameradata/separate.gpx",
358 "testdata/AdjustTime.M2c.separate.ini",
361 new Expecter("separate/separate_.gpx", true, null, true),
363 // out of time ( - 2017-05-29T01:23:18)
364 new Expecter("separate/20170529_102305A.jpg", false, null, false),
365 new Expecter("separate/20170529_102314A.jpg", false, null, false),
367 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
368 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
369 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
370 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
372 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
373 new Expecter("separate/20170529_102409A.jpg", false, null, false),
374 new Expecter("separate/20170529_102418A.jpg", false, null, false),
376 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
377 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
378 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
380 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
381 new Expecter("separate/20170529_103315A.jpg", false, null, false),
382 new Expecter("separate/20170529_103545A.jpg", false, null, false),
384 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
385 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
386 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
390 "[M2d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20J",
391 "testdata/separate.tar.gz",
392 "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
393 "testdata/cameradata/separate.gpx",
394 "testdata/AdjustTime.M2d.separate.ini",
397 new Expecter("separate/separate_.gpx", true, null, true),
399 // out of time ( - 2017-05-29T01:23:18)
400 new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
401 new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
403 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
404 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
405 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
406 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
408 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
409 new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
410 new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
412 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
413 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
414 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
416 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
417 new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
418 new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
420 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
421 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
422 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
426 "[M3a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20Jreverse",
427 "testdata/separate.tar.gz",
428 "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
429 "testdata/cameradata/separate.gpx",
430 "testdata/AdjustTime.M2a.separate.ini",
433 new Expecter("separate/separate_.gpx", true, null, true),
435 // out of time ( - 2017-05-29T01:23:18)
436 new Expecter("separate/20170529_102305A.jpg", false, null, false),
437 new Expecter("separate/20170529_102314A.jpg", false, null, false),
439 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
440 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
441 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
442 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
444 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
445 new Expecter("separate/20170529_102409A.jpg", false, null, false),
446 new Expecter("separate/20170529_102418A.jpg", false, null, false),
448 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
449 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
450 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
452 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
453 new Expecter("separate/20170529_103315A.jpg", false, null, false),
454 new Expecter("separate/20170529_103545A.jpg", false, null, false),
456 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
457 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
458 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
462 "[M3b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20Jreverse",
463 "testdata/separate.tar.gz",
464 "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
465 "testdata/cameradata/separate.gpx",
466 "testdata/AdjustTime.M2b.separate.ini",
469 new Expecter("separate/separate_.gpx", true, null, true),
471 // out of time ( - 2017-05-29T01:23:18)
472 new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
473 new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
475 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
476 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
477 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
478 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
480 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
481 new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
482 new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
484 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
485 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
486 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
488 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
489 new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
490 new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
492 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
493 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
494 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
498 "[M3c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20Jreverse",
499 "testdata/separate.tar.gz",
500 "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
501 "testdata/cameradata/separate.gpx",
502 "testdata/AdjustTime.M2c.separate.ini",
505 new Expecter("separate/separate_.gpx", true, null, true),
507 // out of time ( - 2017-05-29T01:23:18)
508 new Expecter("separate/20170529_102305A.jpg", false, null, false),
509 new Expecter("separate/20170529_102314A.jpg", false, null, false),
511 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
512 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
513 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
514 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
516 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
517 new Expecter("separate/20170529_102409A.jpg", false, null, false),
518 new Expecter("separate/20170529_102418A.jpg", false, null, false),
520 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
521 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
522 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
524 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
525 new Expecter("separate/20170529_103315A.jpg", false, null, false),
526 new Expecter("separate/20170529_103545A.jpg", false, null, false),
528 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
529 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
530 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
534 "[M3d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20Jreverse",
535 "testdata/separate.tar.gz",
536 "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
537 "testdata/cameradata/separate.gpx",
538 "testdata/AdjustTime.M2d.separate.ini",
541 new Expecter("separate/separate_.gpx", true, null, true),
543 // out of time ( - 2017-05-29T01:23:18)
544 new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
545 new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
547 // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
548 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
549 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
550 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
552 // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
553 new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
554 new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
556 // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
557 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
558 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
560 // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
561 new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
562 new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
564 // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
565 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
566 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
572 public void パラメータテスト(Fixture dataset) throws Exception {
573 ImportPictureTest.setup(dataset);
574 ImportPictureTest.testdo(dataset.iniFilePath);
575 //SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.UK);
577 Expecter[] es = dataset.expecters;
578 AppParameters params = new AppParameters(dataset.iniFilePath);
579 File outDir = new File(params.getProperty(AppParameters.IMG_OUTPUT_FOLDER));
580 for (int i = 0; i < es.length; i++) {
581 File file = new File(outDir, es[i].value);
582 System.out.println("[JUnit.debug] assert file='"+ file.getAbsolutePath() +"'");
583 assertThat(file.exists(), is(es[i].expect));
584 if (es[i].timeStr != null) {
586 ImageMetadata meta = Imaging.getMetadata(file);
588 // メタデータは インスタンスJpegImageMetadata であること
589 assertThat((meta instanceof JpegImageMetadata), is(true));
591 JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;
592 assertNotNull(jpegMetadata);
595 TiffImageMetadata exif = jpegMetadata.getExif();
598 // EXIF-TIME が正しく設定されていること
599 String exifTime = ImportPicture.toEXIFString(ImportPicture.toEXIFDate(exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0]));
600 System.out.println("[debug] exifTime = '"+ exifTime +"' <--> '"+ es[i].timeStr +"'");
601 assertThat(exifTime, is(es[i].timeStr));
606 static void setup(Fixture dataset) throws IOException {
607 System.out.println(dataset.toString());
610 File dir = new File("testdata/cameradata");
612 ImportPictureTest.delete(dir);
614 File outDir = new File("testdata/output");
615 if (outDir.exists()) {
616 ImportPictureTest.delete(outDir);
621 ImportPictureTest.uncompress(new File(dataset.tarFilePath), new File("testdata/cameradata"));
624 try ( FileInputStream inStream = new FileInputStream(new File(dataset.gpxSourcePath));
625 FileOutputStream outStream = new FileOutputStream(new File(dataset.gpxDestinationPath));
626 FileChannel inChannel = inStream.getChannel();
627 FileChannel outChannel = outStream.getChannel(); )
629 inChannel.transferTo(0, inChannel.size(), outChannel);
637 static void testdo(String iniFilePath) {
639 String[] argv = new String[1];
640 argv[0] = new String(iniFilePath);
641 ImportPicture.main(argv);
643 catch (Exception e) {
645 fail("Exceptionが発生した。");
651 * ファイル更新日時をオリジナルと同じにします。
652 * @param tazFile 解凍する*.tar.gzファイル
653 * @param dest 解凍先フォルダ
654 * @throws IOException
656 public static void uncompress(File tazFile, File dest) throws IOException {
659 TarArchiveInputStream tarIn = null;
660 tarIn = new TarArchiveInputStream(new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(tazFile))));
662 TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
663 while (tarEntry != null) {
664 File destPath = new File(dest, tarEntry.getName());
665 //System.out.println("uncompress: " + destPath.getCanonicalPath());
666 if (tarEntry.isDirectory()) {
670 File dir = new File(destPath.getParent());
674 destPath.createNewFile();
675 byte[] btoRead = new byte[1024];
676 BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath));
679 while ((len = tarIn.read(btoRead)) != -1) {
680 bout.write(btoRead, 0, len);
684 destPath.setLastModified(tarEntry.getLastModifiedDate().getTime());
687 tarEntry = tarIn.getNextTarEntry();
692 public static void delete(File file) throws IOException {
693 if (!file.exists()) {
694 System.out.println("ERROR: ファイルまたはディレクトリが見つかりませんでした。");
695 throw new IOException("File not found.");
698 if (file.isDirectory()) {
699 File files[] = file.listFiles();
701 for (int i=0; i < files.length; i++) {
702 delete(files[i]); // 再帰呼び出し
706 if (!file.delete()) {
707 System.out.println("ERROR: ファイルは削除できませんでした。 '" + file.getAbsolutePath() +"'");