/*
* Copyright (C) 2016 Patrick Favre-Bulle
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package at.favre.tools.dconvert.test;
import at.favre.tools.dconvert.arg.*;
import at.favre.tools.dconvert.exceptions.InvalidArgumentException;
import at.favre.tools.dconvert.ui.CLIInterpreter;
import org.apache.tools.ant.types.Commandline;
import org.junit.*;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import static junit.framework.TestCase.assertEquals;
/**
* Unit test of command line parser
*/
public class CLIParserTest {
private static final String FOLDER1 = "test-out";
private static final float DEFAULT_SCALE = 4;
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
private File defaultSrc;
private String defaultCmd;
@BeforeClass
public static void oneTimeSetUp() {
}
@AfterClass
public static void oneTimeTearDown() {
}
@Before
public void setUp() throws IOException {
defaultSrc = temporaryFolder.newFolder(FOLDER1);
defaultCmd = "-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + DEFAULT_SCALE;
}
@After
public void tearDown() {
defaultSrc = null;
defaultCmd = null;
}
@Test
public void testSimpleUsage() throws Exception {
float scale = 2f;
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + scale,
new Arguments.Builder(defaultSrc, scale).build());
}
@Test
public void testScales() throws Exception {
for (Float scale : Arrays.asList(new Float[]{0.75f, 1f, 2f, 3f, 4f, 5f, 6f, 1.33f, 2.3936573f})) {
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + scale,
new Arguments.Builder(defaultSrc, scale).build());
}
}
@Test
public void testScalesWidthInDp() throws Exception {
for (Integer scale : Arrays.asList(new Integer[]{1, 12, 24, 48, 106, 33, 500, 96, 256, 480})) {
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + scale + "dp",
new Arguments.Builder(defaultSrc, scale).scaleMode(EScaleMode.DP_WIDTH).build());
}
}
@Test(expected = InvalidArgumentException.class)
public void test0ScalesWidthInDp() throws Exception {
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + 0 + "dp",
new Arguments.Builder(defaultSrc, 0).scaleMode(EScaleMode.DP_WIDTH).build());
}
@Test(expected = InvalidArgumentException.class)
public void test9999ScalesWidthInDp() throws Exception {
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + 9999 + "dp",
new Arguments.Builder(defaultSrc, 9999).scaleMode(EScaleMode.DP_WIDTH).build());
}
@Test
public void testScalesHeightInDp() throws Exception {
for (Integer scale : Arrays.asList(new Integer[]{1, 12, 24, 48, 106, 33, 500, 96, 256, 480})) {
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_IS_HEIGHT_DP_ARG + " -" + CLIInterpreter.SCALE_ARG + " " + scale + "dp",
new Arguments.Builder(defaultSrc, scale).scaleMode(EScaleMode.DP_HEIGHT).build());
}
}
@Test(expected = InvalidArgumentException.class)
public void testScale0fShouldFail() throws Exception {
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + 0f,
new Arguments.Builder(defaultSrc, 0f).build());
}
@Test(expected = InvalidArgumentException.class)
public void testScale100ShouldFail() throws Exception {
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + defaultSrc.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + 100f,
new Arguments.Builder(defaultSrc, 100f).build());
}
@Test
public void testSourceDirectories() throws Exception {
File[] srcDirs = new File[]{temporaryFolder.newFolder("muh"), temporaryFolder.newFolder("android"), temporaryFolder.newFolder("out"),
temporaryFolder.newFolder("layer1", "layer2"), temporaryFolder.newFolder("user", "Project", "su_Bf4-ldr")};
for (File srcFolder : Arrays.asList(srcDirs)) {
check("-" + CLIInterpreter.SOURCE_ARG + " \"" + srcFolder.getAbsolutePath() + "\" -" + CLIInterpreter.SCALE_ARG + " " + DEFAULT_SCALE,
new Arguments.Builder(srcFolder, DEFAULT_SCALE).build());
}
}
@Test
public void testDestDirectories() throws Exception {
File[] dstDirs = new File[]{temporaryFolder.newFolder("simpleOut"), temporaryFolder.newFolder("ios"), temporaryFolder.newFolder("in"),
temporaryFolder.newFolder("res", "drawable-xxhdpi"), temporaryFolder.newFolder("user", "Project", "su_Bf4-ldr")};
for (File dstFolder : Arrays.asList(dstDirs)) {
check(defaultCmd + " -" + CLIInterpreter.DST_ARG + " \"" + dstFolder.getAbsolutePath() + "\"",
new Arguments.Builder(defaultSrc, DEFAULT_SCALE).dstFolder(dstFolder).build());
}
}
@Test
public void testPlatforms() throws Exception {
check(defaultCmd + " -" + CLIInterpreter.PLATFORM_ARG + " all", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).platform(EPlatform.getAll()).build());
check(defaultCmd + " -" + CLIInterpreter.PLATFORM_ARG + " android", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).platform(Collections.singleton(EPlatform.ANDROID)).build());
check(defaultCmd + " -" + CLIInterpreter.PLATFORM_ARG + " ios", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).platform(Collections.singleton(EPlatform.IOS)).build());
check(defaultCmd + " -" + CLIInterpreter.PLATFORM_ARG + " win", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).platform(Collections.singleton(EPlatform.WINDOWS)).build());
check(defaultCmd + " -" + CLIInterpreter.PLATFORM_ARG + " web", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).platform(Collections.singleton(EPlatform.WEB)).build());
}
@Test
public void testScalingAlgorithms() throws Exception {
for (EScalingAlgorithm algorithm : EScalingAlgorithm.getAllEnabled()) {
if (algorithm.getSupportedForType().contains(EScalingAlgorithm.Type.DOWNSCALING)) {
check(defaultCmd + " -" + CLIInterpreter.DOWNSCALING_ALGO_ARG + " " + algorithm.getName(), new Arguments.Builder(defaultSrc, DEFAULT_SCALE).downScaleAlgorithm(algorithm).build());
}
if (algorithm.getSupportedForType().contains(EScalingAlgorithm.Type.UPSCALING)) {
check(defaultCmd + " -" + CLIInterpreter.UPSCALING_ALGO_ARG + " " + algorithm.getName(), new Arguments.Builder(defaultSrc, DEFAULT_SCALE).upScaleAlgorithm(algorithm).build());
}
}
}
@Test
public void testOutCompressions() throws Exception {
check(defaultCmd + " -" + CLIInterpreter.OUT_COMPRESSION_ARG + " jpg", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).compression(EOutputCompressionMode.AS_JPG).build());
check(defaultCmd + " -" + CLIInterpreter.OUT_COMPRESSION_ARG + " png", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).compression(EOutputCompressionMode.AS_PNG).build());
check(defaultCmd + " -" + CLIInterpreter.OUT_COMPRESSION_ARG + " gif", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).compression(EOutputCompressionMode.AS_GIF).build());
check(defaultCmd + " -" + CLIInterpreter.OUT_COMPRESSION_ARG + " bmp", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).compression(EOutputCompressionMode.AS_BMP).build());
check(defaultCmd + " -" + CLIInterpreter.OUT_COMPRESSION_ARG + " png+jpg", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).compression(EOutputCompressionMode.AS_JPG_AND_PNG).build());
}
@Test
public void testCompressionQuality() throws Exception {
for (Float compression : Arrays.asList(new Float[]{0.0f, 0.1f, 0.05f, 1.0f, 0.5f, 0.7f, 0.8f, 0.999f, 0.0001f})) {
check(defaultCmd + " -" + CLIInterpreter.OUT_COMPRESSION_ARG + " jpg" + " -" + CLIInterpreter.COMPRESSION_QUALITY_ARG + " " + compression, new Arguments.Builder(defaultSrc, DEFAULT_SCALE).compression(EOutputCompressionMode.AS_JPG, compression).build());
}
}
@Test(expected = InvalidArgumentException.class)
public void testCompressionQualityShouldFail() throws Exception {
check(defaultCmd + " -" + CLIInterpreter.OUT_COMPRESSION_ARG + " jpg" + " -" + CLIInterpreter.COMPRESSION_QUALITY_ARG + " " + 1.1f,
new Arguments.Builder(defaultSrc, DEFAULT_SCALE).compression(EOutputCompressionMode.AS_JPG, 1.1f).build());
}
@Test
public void testThreadCounts() throws Exception {
for (Integer threadCount : Arrays.asList(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8})) {
check(defaultCmd + " -" + CLIInterpreter.THREADS_ARG + " " + threadCount, new Arguments.Builder(defaultSrc, DEFAULT_SCALE).threadCount(threadCount).build());
}
}
@Test(expected = InvalidArgumentException.class)
public void testThreadCount0ShouldFail() throws Exception {
check(defaultCmd + " -" + CLIInterpreter.THREADS_ARG + " " + 0, new Arguments.Builder(defaultSrc, DEFAULT_SCALE).threadCount(0).build());
}
@Test
public void testRoundingModes() throws Exception {
check(defaultCmd + " -" + CLIInterpreter.ROUNDING_MODE_ARG + " round", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).scaleRoundingStragy(RoundingHandler.Strategy.ROUND_HALF_UP).build());
check(defaultCmd + " -" + CLIInterpreter.ROUNDING_MODE_ARG + " floor", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).scaleRoundingStragy(RoundingHandler.Strategy.FLOOR).build());
check(defaultCmd + " -" + CLIInterpreter.ROUNDING_MODE_ARG + " ceil", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).scaleRoundingStragy(RoundingHandler.Strategy.CEIL).build());
}
@Test
public void testFlags() throws Exception {
check(defaultCmd + " -skipUpscaling", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).skipUpscaling(true).build());
check(defaultCmd + " -" + CLIInterpreter.SKIP_EXISTING_ARG, new Arguments.Builder(defaultSrc, DEFAULT_SCALE).skipExistingFiles(true).build());
check(defaultCmd + " -androidIncludeLdpiTvdpi", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).includeAndroidLdpiTvdpi(true).build());
check(defaultCmd + " -" + CLIInterpreter.VERBOSE_ARG, new Arguments.Builder(defaultSrc, DEFAULT_SCALE).verboseLog(true).build());
check(defaultCmd + " -haltOnError", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).haltOnError(true).build());
check(defaultCmd + " -androidMipmapInsteadOfDrawable", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).createMipMapInsteadOfDrawableDir(true).build());
check(defaultCmd + " -antiAliasing", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).antiAliasing(true).build());
check(defaultCmd + " -postProcessorPngCrush", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).enablePngCrush(true).build());
check(defaultCmd + " -postProcessorWebp", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).postConvertWebp(true).build());
check(defaultCmd + " -postProcessorMozJpeg", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).enableMozJpeg(true).build());
check(defaultCmd + " -keepOriginalPostProcessedFiles", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).keepUnoptimizedFilesPostProcessor(true).build());
check(defaultCmd + " -iosCreateImagesetFolders", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).iosCreateImagesetFolders(true).build());
check(defaultCmd + " -clean", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).clearDirBeforeConvert(true).build());
}
@Test
public void testFlagsCombinations() throws Exception {
check(defaultCmd + " -skipUpscaling -haltOnError -postProcessorPngCrush", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).haltOnError(true).enablePngCrush(true).skipUpscaling(true).build());
check(defaultCmd + " -antiAliasing -androidIncludeLdpiTvdpi", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).antiAliasing(true).includeAndroidLdpiTvdpi(true).build());
check(defaultCmd + " -postProcessorWebp -" + CLIInterpreter.VERBOSE_ARG + " -skipUpscaling -antiAliasing", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).antiAliasing(true).postConvertWebp(true).verboseLog(true).skipUpscaling(true).build());
}
@Test
public void testDryRun() throws Exception {
check(defaultCmd + " -dryRun", new Arguments.Builder(defaultSrc, DEFAULT_SCALE).dryRun(true).build());
}
private static void check(String cmd, Arguments ref) {
Arguments arg = CLIInterpreter.parse(asArgArray(cmd));
assertEquals("should create same args", ref, arg);
System.out.println("command line: " + cmd);
System.out.println("resulting arg: " + arg);
}
public static String[] asArgArray(String cmd) {
return Commandline.translateCommandline(cmd);
}
}