package at.favre.tools.dconvert.test; import at.favre.tools.dconvert.arg.*; import at.favre.tools.dconvert.converters.postprocessing.MozJpegProcessor; import at.favre.tools.dconvert.converters.postprocessing.PngCrushProcessor; import at.favre.tools.dconvert.converters.postprocessing.WebpProcessor; import at.favre.tools.dconvert.test.helper.TestPreferenceStore; import at.favre.tools.dconvert.ui.GUI; import at.favre.tools.dconvert.ui.GUIController; import javafx.scene.Scene; import javafx.scene.control.ChoiceBox; import javafx.scene.input.KeyCode; import javafx.stage.Stage; import org.junit.*; import org.junit.rules.TemporaryFolder; import org.testfx.framework.junit.ApplicationTest; import java.awt.*; import java.io.File; import java.util.Collections; import java.util.Locale; import java.util.ResourceBundle; import static org.junit.Assert.assertEquals; /** * Tests GUI */ public class GUITest extends ApplicationTest { public static final boolean HEADLESS = true; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); private GUIController controller; private Arguments.Builder defaultBuilder; private File defaultSrcFolder; private ResourceBundle bundle = ResourceBundle.getBundle("bundles.strings", Locale.getDefault()); private Scene scene; @BeforeClass public static void setupSpec() throws Exception { if (HEADLESS) { System.setProperty("testfx.robot", "glass"); System.setProperty("testfx.headless", "true"); System.setProperty("prism.order", "sw"); System.setProperty("prism.text", "t2k"); System.setProperty("java.awt.headless", "true"); System.setProperty("headless.geometry", "1920x1200-32"); } } @Override public void start(Stage stage) throws Exception { controller = GUI.setup(stage, new TestPreferenceStore(), new Dimension(1920, 1080)); stage.show(); scene = stage.getScene(); } @Before public void setUp() throws Exception { defaultSrcFolder = temporaryFolder.newFolder(); defaultBuilder = new Arguments.Builder(defaultSrcFolder, Arguments.DEFAULT_SCALE).guiAdvancedOptions(true).verboseLog(true); controller.setSrcForTest(defaultSrcFolder); clickOn("#rbOptAdvanced"); assertEquals("default should match", defaultBuilder.build(), controller.getFromUI(false)); } @After public void tearDown() throws Exception { clickOn("#btnReset"); assertEquals("should be default after reset", new Arguments.Builder(new File(""), Arguments.DEFAULT_SCALE).skipParamValidation(true).verboseLog(true).build(), controller.getFromUI(true)); } @Test public void testScaleTypes() throws Exception { clickOn("#rbDpWidth").clickOn("#textFieldDp").write("48"); assertEquals("arguments should match", new Arguments.Builder(defaultSrcFolder, 48).scaleMode(EScaleMode.DP_WIDTH).guiAdvancedOptions(true).verboseLog(true).build(), controller.getFromUI(false)); clickOn("#rbDpHeight").clickOn("#textFieldDp").write("1"); assertEquals("arguments should match", new Arguments.Builder(defaultSrcFolder, 148).scaleMode(EScaleMode.DP_HEIGHT).guiAdvancedOptions(true).verboseLog(true).build(), controller.getFromUI(false)); clickOn("#rbFactor").clickOn("#scaleSlider"); assertEquals("arguments should match", new Arguments.Builder(defaultSrcFolder, 3).scaleMode(EScaleMode.FACTOR).guiAdvancedOptions(true).verboseLog(true).build(), controller.getFromUI(false)); } @Test public void testPostProcessors() throws Exception { if (new WebpProcessor().isSupported()) { clickOn("#cbPostConvertWebp"); assertEquals("arguments should match", defaultBuilder.postConvertWebp(true).build(), controller.getFromUI(false)); clickOn("#cbPostConvertWebp"); assertEquals("arguments should match", defaultBuilder.postConvertWebp(false).build(), controller.getFromUI(false)); } if (new PngCrushProcessor().isSupported()) { clickOn("#cbEnablePngCrush"); assertEquals("arguments should match", defaultBuilder.enablePngCrush(true).build(), controller.getFromUI(false)); clickOn("#cbEnablePngCrush"); assertEquals("arguments should match", defaultBuilder.enablePngCrush(false).build(), controller.getFromUI(false)); } if (new MozJpegProcessor().isSupported()) { clickOn("#cbEnableMozJpeg"); assertEquals("arguments should match", defaultBuilder.enableMozJpeg(true).build(), controller.getFromUI(false)); clickOn("#cbEnableMozJpeg"); assertEquals("arguments should match", defaultBuilder.enableMozJpeg(false).build(), controller.getFromUI(false)); } clickOn("#cbKeepUnoptimized"); assertEquals("arguments should match", defaultBuilder.keepUnoptimizedFilesPostProcessor(true).build(), controller.getFromUI(false)); clickOn("#cbKeepUnoptimized"); assertEquals("arguments should match", defaultBuilder.keepUnoptimizedFilesPostProcessor(false).build(), controller.getFromUI(false)); } @Test public void testCBOptions() throws Exception { clickOn("#cbMipmapInsteadDrawable"); assertEquals("arguments should match", defaultBuilder.createMipMapInsteadOfDrawableDir(true).build(), controller.getFromUI(false)); clickOn("#cbMipmapInsteadDrawable"); assertEquals("arguments should match", defaultBuilder.createMipMapInsteadOfDrawableDir(false).build(), controller.getFromUI(false)); clickOn("#cbAntiAliasing"); assertEquals("arguments should match", defaultBuilder.antiAliasing(true).build(), controller.getFromUI(false)); clickOn("#cbAntiAliasing"); assertEquals("arguments should match", defaultBuilder.antiAliasing(false).build(), controller.getFromUI(false)); clickOn("#cbAndroidIncludeLdpiTvdpi"); assertEquals("arguments should match", defaultBuilder.includeAndroidLdpiTvdpi(true).build(), controller.getFromUI(false)); clickOn("#cbAndroidIncludeLdpiTvdpi"); assertEquals("arguments should match", defaultBuilder.includeAndroidLdpiTvdpi(false).build(), controller.getFromUI(false)); clickOn("#cbHaltOnError"); assertEquals("arguments should match", defaultBuilder.haltOnError(true).build(), controller.getFromUI(false)); clickOn("#cbHaltOnError"); assertEquals("arguments should match", defaultBuilder.haltOnError(false).build(), controller.getFromUI(false)); clickOn("#cbDryRun"); assertEquals("arguments should match", defaultBuilder.dryRun(true).build(), controller.getFromUI(false)); clickOn("#cbDryRun"); assertEquals("arguments should match", defaultBuilder.dryRun(false).build(), controller.getFromUI(false)); clickOn("#cbSkipUpscaling"); assertEquals("arguments should match", defaultBuilder.skipUpscaling(true).build(), controller.getFromUI(false)); clickOn("#cbSkipUpscaling"); assertEquals("arguments should match", defaultBuilder.skipUpscaling(false).build(), controller.getFromUI(false)); clickOn("#cbSkipExisting"); assertEquals("arguments should match", defaultBuilder.skipExistingFiles(true).build(), controller.getFromUI(false)); clickOn("#cbSkipExisting"); assertEquals("arguments should match", defaultBuilder.skipExistingFiles(false).build(), controller.getFromUI(false)); clickOn("#cbIosCreateImageset"); assertEquals("arguments should match", defaultBuilder.iosCreateImagesetFolders(true).build(), controller.getFromUI(false)); clickOn("#cbIosCreateImageset"); assertEquals("arguments should match", defaultBuilder.iosCreateImagesetFolders(false).build(), controller.getFromUI(false)); clickOn("#cbCleanBeforeConvert"); assertEquals("arguments should match", defaultBuilder.clearDirBeforeConvert(true).build(), controller.getFromUI(false)); clickOn("#cbCleanBeforeConvert"); assertEquals("arguments should match", defaultBuilder.clearDirBeforeConvert(false).build(), controller.getFromUI(false)); } @Test public void testPlatforms() throws Exception { for (EPlatform ePlatform : Arguments.DEFAULT_PLATFORM) { clickOn(getIdForPlatform(ePlatform)); } for (EPlatform ePlatform : EPlatform.values()) { clickOn(getIdForPlatform(ePlatform)); assertEquals("arguments should match", defaultBuilder.platform(Collections.singleton(ePlatform)).build(), controller.getFromUI(false)); clickOn(getIdForPlatform(ePlatform)); } } //this test needs fixing: bug is that click on algo name is not distinct - sometimes it picks the correct choicebox, sometimes the other (up <> downsclaing have the same values @Ignore public void testDownScalingQuality() throws Exception { Assume.assumeFalse("this only seems to work in non-headless test", HEADLESS); for (EScalingAlgorithm algo : EScalingAlgorithm.getAllEnabled()) { if (algo.getSupportedForType().contains(EScalingAlgorithm.Type.DOWNSCALING)) { clickOn("#choiceDownScale").clickOn(algo.toString()); assertEquals("arguments should match", defaultBuilder.downScaleAlgorithm(algo).build(), controller.getFromUI(false)); } } } //this test needs fixing: bug is that click on algo name is not distinct - sometimes it picks the correct choicebox, sometimes the other (up <> downsclaing have the same values @Ignore public void testUpScalingQuality() throws Exception { for (EScalingAlgorithm algo : EScalingAlgorithm.getAllEnabled()) { if (algo.getSupportedForType().contains(EScalingAlgorithm.Type.UPSCALING)) { ChoiceBox choiceBox = (ChoiceBox) scene.lookup("#choiceUpScale"); //choiceBox.getSelectionModel(). for (Object o : choiceBox.getItems()) { if (o.toString().equals(algo.toString())) { } } clickOn("#choiceUpScale").clickOn(algo.toString()); assertEquals("arguments should match", defaultBuilder.upScaleAlgorithm(algo).build(), controller.getFromUI(false)); } } } private String getIdForPlatform(EPlatform platform) { switch (platform) { case ANDROID: return "#tgAndroid"; case IOS: return "#tgIos"; case WINDOWS: return "#tgWindows"; case WEB: return "#tgWeb"; default: throw new IllegalArgumentException("platform unknown"); } } @Test public void testCompressions() throws Exception { for (EOutputCompressionMode eOutputCompressionMode : EOutputCompressionMode.values()) { clickOn("#choiceCompression").clickOn(bundle.getString(eOutputCompressionMode.rbKey)); assertEquals("arguments should match", defaultBuilder.compression(eOutputCompressionMode).build(), controller.getFromUI(false)); } } @Test public void testRounding() throws Exception { for (RoundingHandler.Strategy strategy : RoundingHandler.Strategy.values()) { clickOn("#choiceRounding").clickOn(strategy.toString()); assertEquals("arguments should match", defaultBuilder.scaleRoundingStragy(strategy).build(), controller.getFromUI(false)); } } @Test public void testThreads() throws Exception { for (int i = 1; i < Arguments.MAX_THREAD_COUNT + 1; i++) { clickOn("#choiceThreads").clickOn(String.valueOf(i)); assertEquals("arguments should match", defaultBuilder.threadCount(i).build(), controller.getFromUI(false)); } } @Test public void testJpegQuality() throws Exception { clickOn("#choiceCompression").clickOn(bundle.getString(EOutputCompressionMode.AS_JPG.rbKey)); for (float i = 0f; i < 1.1f; i += 0.1) { clickOn("#choiceCompressionQuality").clickOn(GUIController.toJpgQ(i)); assertEquals("arguments should match", defaultBuilder.compression(EOutputCompressionMode.AS_JPG, Float.parseFloat(String.format(Locale.US, "%.1f", i))).build(), controller.getFromUI(false)); } clickOn("#choiceCompressionQuality").clickOn(GUIController.toJpgQ(Arguments.DEFAULT_COMPRESSION_QUALITY)); clickOn("#choiceCompression").clickOn(bundle.getString(EOutputCompressionMode.SAME_AS_INPUT_PREF_PNG.rbKey)); assertEquals("arguments should match", defaultBuilder.compression(EOutputCompressionMode.SAME_AS_INPUT_PREF_PNG, Arguments.DEFAULT_COMPRESSION_QUALITY).build(), controller.getFromUI(false)); } @Test public void testClickSelectFolder() throws Exception { clickOn("#btnSrcFolder").sleep(400).press(KeyCode.ESCAPE); } @Test public void testClickSelectFile() throws Exception { clickOn("#btnSrcFile").sleep(400).press(KeyCode.ESCAPE); } @Test public void testClickSelectDstFolder() throws Exception { clickOn("#btnDstFolder").sleep(400).press(KeyCode.ESCAPE); } @Test public void testCase1() throws Exception { for (EPlatform ePlatform : Arguments.DEFAULT_PLATFORM) { clickOn(getIdForPlatform(ePlatform)); } clickOn("#rbDpHeight").clickOn("#textFieldDp").write("64"); clickOn(getIdForPlatform(EPlatform.ANDROID)); clickOn("#cbSkipUpscaling"); clickOn("#cbSkipExisting"); clickOn("#choiceThreads").clickOn(String.valueOf(2)); assertEquals("arguments should match", new Arguments.Builder(defaultSrcFolder, 64).guiAdvancedOptions(true).verboseLog(true) .scaleMode(EScaleMode.DP_HEIGHT).platform(Collections.singleton(EPlatform.ANDROID)).skipUpscaling(true).threadCount(2).skipExistingFiles(true) .build(), controller.getFromUI(false)); } @Test public void testCase2() throws Exception { for (EPlatform ePlatform : Arguments.DEFAULT_PLATFORM) { clickOn(getIdForPlatform(ePlatform)); } clickOn("#rbDpWidth").clickOn("#textFieldDp").write("128"); clickOn(getIdForPlatform(EPlatform.ANDROID)); clickOn("#choiceCompression").clickOn(bundle.getString(EOutputCompressionMode.AS_JPG.rbKey)); float jpegQ = 0.3f; clickOn("#choiceCompressionQuality").clickOn(GUIController.toJpgQ(jpegQ)); clickOn("#cbSkipExisting"); assertEquals("arguments should match", new Arguments.Builder(defaultSrcFolder, 128).guiAdvancedOptions(true).verboseLog(true) .scaleMode(EScaleMode.DP_WIDTH).platform(Collections.singleton(EPlatform.ANDROID)).skipExistingFiles(true) .compression(EOutputCompressionMode.AS_JPG, Float.parseFloat(String.format(Locale.US, "%.1f", jpegQ))) .build(), controller.getFromUI(false)); } }