package osm.surveyor.matchtime;
import java.util.*;
import java.io.*;
import java.nio.file.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import static org.hamcrest.CoreMatchers.is;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.apache.commons.codec.digest.DigestUtils;
import static org.junit.Assert.*;
/**
*
* @author yuu
*/
public class RestampTest {
public RestampTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
dirPath = "./target/test-classes/data/images";
outPath = "./target/test-classes/out";
Path dir = Paths.get(outPath);
if (Files.exists(dir) && Files.isDirectory(dir) && Files.isWritable(dir)) {
try {
Files.delete(dir);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
@After
public void tearDown() {
try {
Path dir = Paths.get(outPath);
if (Files.exists(dir) && Files.isDirectory(dir) && Files.isWritable(dir)) {
Files.list(dir).forEach(f -> delFile(f));
Files.delete(dir);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
public void delFile(Path p) {
try {
Files.delete(p);
}
catch(IOException e) {
e.printStackTrace();
};
}
String dirPath;
String outPath;
@Test
public void testMain() {
String[] ans = {
"2019-09-01 16:26:51 JST",
"2019-09-01 16:26:56 JST",
"2019-09-01 16:27:01 JST",
"2019-09-01 16:27:06 JST",
"2019-09-01 16:27:11 JST",
"2019-09-01 16:27:16 JST",
"2019-09-01 16:27:21 JST",
"2019-09-01 16:27:26 JST",
"2019-09-01 16:27:31 JST",
};
try {
String[] argv = new String[]{
dirPath,
"00001.jpg",
"2019-09-01 16:26:51 JST",
"00003.jpg",
"2019-09-01 16:27:01 JST",
outPath
};
HashMap<String, File> before = getMd5(Paths.get(dirPath));
Restamp.main(argv);
check(new File(outPath), ans);
checkUnchanged(before, Paths.get(dirPath));
}
catch (Exception e) {
fail();
}
}
@Test
public void testMain_2() {
String[] ans = {
"2019-09-02 16:26:53 JST", // 0.0 sec
"2019-09-02 16:26:56 JST", // 3.0 sec
"2019-09-02 16:26:58 JST", // 2.0 sec
"2019-09-02 16:27:01 JST", // 3.0 sec
"2019-09-02 16:27:03 JST", // 2.0 sec
"2019-09-02 16:27:06 JST", // 3.0 sec
"2019-09-02 16:27:08 JST", // 2.0 sec
"2019-09-02 16:27:11 JST", // 3.0 sec
"2019-09-02 16:27:13 JST", // 2.0 sec
};
try {
String[] argv = new String[]{
dirPath,
"00002.jpg",
"2019-09-02 16:26:56 JST",
"00004.jpg",
"2019-09-02 16:27:01 JST"
};
Restamp.main(argv);
check(new File(dirPath), ans);
}
catch (Exception e) {
fail();
}
}
@Test
public void testMain_3() {
String[] ans = {
"2019-09-03 16:26:53 JST", // 0.0
"2019-09-03 16:26:55 JST", // 2.0
"2019-09-03 16:26:58 JST", // 3.0
"2019-09-03 16:27:00 JST", // 2.0
"2019-09-03 16:27:03 JST", // 3.0
"2019-09-03 16:27:05 JST", // 2.0
"2019-09-03 16:27:08 JST", // 3.0
"2019-09-03 16:27:10 JST", // 2.0
"2019-09-03 16:27:13 JST", // 3.0
};
try {
String[] argv = new String[]{
dirPath,
"00001.jpg",
"2019-09-03 16:26:53 JST",
"00003.jpg",
"2019-09-03 16:26:58 JST"
};
Restamp.main(argv);
check(new File(dirPath), ans);
}
catch (Exception e) {
fail();
}
}
@Test
public void testMain_4() {
String[] ans = {
"2019-09-04 16:26:53 JST", // 0.0
"2019-09-04 16:26:55 JST", // 2.0
"2019-09-04 16:26:58 JST", // 3.0
"2019-09-04 16:27:00 JST", // 2.0
"2019-09-04 16:27:03 JST", // 3.0
"2019-09-04 16:27:05 JST", // 2.0
"2019-09-04 16:27:08 JST", // 3.0
"2019-09-04 16:27:10 JST", // 2.0
"2019-09-04 16:27:13 JST", // 3.0
};
try {
String[] argv = new String[]{
dirPath,
"00003.jpg",
"2019-09-04 16:26:58 JST",
"00005.jpg",
"2019-09-04 16:27:03 JST"
};
Restamp.main(argv);
check(new File(dirPath), ans);
}
catch (Exception e) {
fail();
}
}
@Test
public void testMain_5() {
String[] ans = {
"2019-09-04 16:26:53 JST", // 0.0
"2019-09-04 16:26:55 JST", // 2.0
"2019-09-04 16:26:58 JST", // 3.0
"2019-09-04 16:27:00 JST", // 2.0
"2019-09-04 16:27:03 JST", // 3.0
"2019-09-04 16:27:05 JST", // 2.0
"2019-09-04 16:27:08 JST", // 3.0
"2019-09-04 16:27:10 JST", // 2.0
"2019-09-04 16:27:13 JST", // 3.0
};
try {
String[] argv = new String[]{
dirPath,
"00003.jpg",
"2019-09-04 16:26:58 JST",
"00005.jpg",
"2019-09-04 16:27:03 JST",
outPath
};
Restamp.main(argv);
check(new File(outPath), ans);
}
catch (Exception e) {
fail();
}
}
void check(File imgDir, String[] ans) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
File[] files = imgDir.listFiles();
assertThat(files.length, is(ans.length));
java.util.Arrays.sort(files, (File file1, File file2) -> file1.getName().compareTo(file2.getName()));
int i = 0;
for (File jpgFile : files) {
long msec = jpgFile.lastModified();
String lastModifiedStr = df.format(new Date(msec));
assertThat(lastModifiedStr, is(ans[i]));
i++;
}
}
void checkUnchanged(HashMap<String,File> map, Path dir) {
assertThat(Files.isDirectory(dir), is(true));
try {
File[] files = dir.toFile().listFiles();
assertThat(files.length, is(map.size()));
for (String key : map.keySet()) {
File sfile = map.get(key);
Path ofile = Paths.get(dir.toString(), sfile.getName());
assertNotNull(ofile);
FileInputStream fis = new FileInputStream(ofile.toFile());
String md5 = DigestUtils.md5Hex(fis);
assertThat(key, is(md5));
}
}
catch (Exception e) {
fail();
}
}
/**
* フォルダ内のファイルとファイルのMD5リストを作成
* @param dir
* @return
*/
HashMap<String,File> getMd5(Path dir) {
HashMap<String, File> map = new HashMap<>();
try {
File[] files = dir.toFile().listFiles();
for (File f : files) {
FileInputStream fis = new FileInputStream(f);
map.put(DigestUtils.md5Hex(fis), f);
}
}
catch (Exception e) {
fail();
}
return map;
}
}