Newer
Older
restamp / src / test / java / osm / surveyor / matchtime / AppParametersTest.java
@haya4 haya4 on 10 May 2020 7 KB C0 passed: AppParameter.class
package osm.surveyor.matchtime;

import static org.junit.Assert.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.Properties;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.experimental.runners.*;

@RunWith(Enclosed.class)
public class AppParametersTest {
	static final String DEFUALT_FILE_NAME = "ReStamp.properties";

    public static class 定義ファイルが存在しない場合 {

        @Before
        public void setUp() throws Exception {
        	delTestData(DEFUALT_FILE_NAME);
        }

        @After
        public void tearDown() throws Exception {
        	delTestData(DEFUALT_FILE_NAME);
        	delTestData("ReStamp.nosource.properties");
        	delTestData("ReStamp.xx.properties");
        }


        @Test
        public void 引数なしで起動されたとき() {
        	// デフォルトプロパティファイルが適用されること
            try {
            	AppParameters params = new AppParameters();
                String valueStr = params.getProperty(AppParameters.IMG_SOURCE_FOLDER);
                assertNotNull(valueStr);
                File sourceDir = new File(valueStr);
                String sourcePath = sourceDir.getAbsolutePath();
                File cDir = new File(".");
                String cPath = cDir.getAbsolutePath();
                assertEquals(sourcePath, cPath);
            }
            catch (IOException e) {
                fail("Exceptionが発生した。");
            }
        }

        @Test
        public void IMG_SOURCE_FOLDERが定義されていない時() {
            try {
            	// デフォルトに カレントディレクトリが戻ること
            	AppParameters params = new AppParameters("target/test-classes/ReStamp.nosource.properties");
                String valueStr = params.getProperty(AppParameters.IMG_SOURCE_FOLDER);
                assertNotNull(valueStr);
                File sourceDir = new File(valueStr);
                String sourcePath = sourceDir.getAbsolutePath();
                File cDir = new File(".");
                String cPath = cDir.getAbsolutePath();
                assertEquals(sourcePath, cPath);
            }
            catch (IOException e) {
                fail("Exceptionが発生した。");
            }
        }

        @Test
        public void propertyファイルが存在しないとき() {
            try {
            	// デフォルトプロパティファイルが適用されること
            	AppParameters params = new AppParameters("target/test-classes/ReStamp.xx.properties");
                String valueStr = params.getProperty(AppParameters.IMG_SOURCE_FOLDER);
                assertNotNull(valueStr);
                File sourceDir = new File(valueStr);
                String sourcePath = sourceDir.getAbsolutePath();
                File cDir = new File(".");
                String cPath = cDir.getAbsolutePath();
                assertEquals(sourcePath, cPath);
            }
            catch (IOException e) {
                fail("Exceptionが発生した。");
            }
        }

        @Test
        public void propertyが指定されたとき() {
        	// デフォルトプロパティファイルが適用されること
            try {
            	Properties prop = new Properties();
            	AppParameters params = new AppParameters(prop);
                String valueStr = params.getProperty(AppParameters.IMG_SOURCE_FOLDER);
                assertNotNull(valueStr);
                File sourceDir = new File(valueStr);
                String sourcePath = sourceDir.getAbsolutePath();
                File cDir = new File(".");
                String cPath = cDir.getAbsolutePath();
                assertEquals(sourcePath, cPath);
            }
            catch (IOException e) {
                fail("Exceptionが発生した。");
            }
        }
    }

    public static class 空の定義ファイルが指定された場合 {

        @Before
        public void setUp() throws Exception {
        	delTestData(DEFUALT_FILE_NAME);
        	setupTestData("ReStamp.nosource.properties", "ReStamp.properties");
        }

        @After
        public void tearDown() throws Exception {
        	delTestData(DEFUALT_FILE_NAME);
        }

        @Test
        public void IMG_SOURCE_FOLDERが定義されていない時() {
            try {
            	// デフォルトに カレントディレクトリが戻ること
            	AppParameters params = new AppParameters("target/test-classes/ReStamp.properties");
                String valueStr = params.getProperty(AppParameters.IMG_SOURCE_FOLDER);
                assertNotNull(valueStr);
                File sourceDir = new File(valueStr);
                String sourcePath = sourceDir.getAbsolutePath();
                File cDir = new File(".");
                String cPath = cDir.getAbsolutePath();
                assertEquals(sourcePath, cPath);

            	// 書き換える
                params.setProperty(AppParameters.IMG_SOURCE_FOLDER, "xxx");
                params.store();
            }
            catch (IOException e) {
                fail("Exceptionが発生した。");
            }
            try {
            	// デフォルトに カレントディレクトリが戻ること
            	Properties prop = new Properties();
            	File f = new File("target/test-classes/ReStamp.properties");
                prop.load(new FileInputStream(f));
                
                String valueStr = prop.getProperty(AppParameters.IMG_SOURCE_FOLDER);
                assertNotNull(valueStr);
                assertEquals(valueStr, "xxx");
            }
            catch (IOException e) {
                fail("Exceptionが発生した。");
            }
        }
    }

    static void delTestData(String filename) {
    	File ddir = new File("target/test-classes/");
        File iniFile = new File(ddir, filename);
        if (iniFile.exists()) {
            iniFile.delete();
        }
    	ddir = new File(".");
        iniFile = new File(ddir, filename);
        if (iniFile.exists()) {
            iniFile.delete();
        }
    }
    
    static void setupTestData(String sfilename, String dfilename) throws IOException {
    	File ddir = new File("target/test-classes/");
    	File sdir = new File("target/test-classes/props/");
        File testFile = new File(sdir, sfilename);
        FileInputStream inStream = new FileInputStream(testFile);
        FileOutputStream outStream = new FileOutputStream(new File(ddir, dfilename));
        FileChannel inChannel = inStream.getChannel();
        FileChannel outChannel = outStream.getChannel();
        try {
            inChannel.transferTo(0, inChannel.size(),outChannel);
        }
        finally {
            if (inChannel != null) inChannel.close();
            if (outChannel != null) outChannel.close();
            inStream.close();
            outStream.close();
        }
    }
}