/*
* 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.Arguments;
import at.favre.tools.dconvert.arg.EPlatform;
import at.favre.tools.dconvert.arg.ImageType;
import at.favre.tools.dconvert.converters.AndroidConverter;
import at.favre.tools.dconvert.util.ImageUtil;
import at.favre.tools.dconvert.util.MiscUtil;
import org.junit.Test;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static org.junit.Assert.*;
/**
* Unit test of the {@link at.favre.tools.dconvert.converters.IPlatformConverter} for android
*/
public class AndroidConverterTest extends AConverterTest {
@Test
public void testMipmapFolder() throws Exception {
List<File> files = copyToTestPath(defaultSrc, "png_example1_alpha_144.png");
test(new Arguments.Builder(defaultSrc, DEFAULT_SCALE).dstFolder(defaultDst).createMipMapInsteadOfDrawableDir(true).includeAndroidLdpiTvdpi(true).platform(Collections.singleton(getType())).build(), files);
}
@Test
public void testLdpiAndTvdpi() throws Exception {
List<File> files = copyToTestPath(defaultSrc, "png_example1_alpha_144.png");
test(new Arguments.Builder(defaultSrc, DEFAULT_SCALE).dstFolder(defaultDst).includeAndroidLdpiTvdpi(true).platform(Collections.singleton(getType())).build(), files);
}
@Test
public void testSingleNinePatch() throws Exception {
List<File> files = copyToTestPath(defaultSrc, "ninepatch_bubble.9.png");
defaultTest(files);
}
@Override
protected EPlatform getType() {
return EPlatform.ANDROID;
}
@Override
protected void checkOutDir(File dstDir, Arguments arguments, List<File> files, EPlatform type) throws IOException {
checkOutDirAndroid(dstDir, arguments, files);
}
public static void checkOutDirAndroid(File dstDir, Arguments arguments, List<File> files) throws IOException {
Map<File, Dimension> dimensionMap = createDimensionMap(files);
List<DensityFolder> expectedDirs = new ArrayList<>();
expectedDirs.addAll(AndroidConverter.getAndroidDensityDescriptors(arguments).stream().map(
androidDensityDescriptor -> new DensityFolder(androidDensityDescriptor.folderName, androidDensityDescriptor.scale)).collect(Collectors.toList()));
assertFalse("expected dirs should not be empty", expectedDirs.isEmpty());
if (!files.isEmpty()) {
assertFalse("output dir should not be empty", dstDir.list() == null && dstDir.list().length == 0);
System.out.println("Android-convert " + files);
for (String path : dstDir.list()) {
expectedDirs.stream().filter(expectedDir -> expectedDir.folderName.equals(path)).forEach(expectedDir -> {
try {
expectedDir.found = true;
List<ImageCheck> expectedFiles = createExpectedFilesMap(arguments, new File(dstDir, path), files);
assertTrue("files count should match input", files.isEmpty() == expectedFiles.isEmpty());
for (ImageCheck expectedFile : expectedFiles) {
for (File imageFile : new File(dstDir, path).listFiles()) {
if (expectedFile.targetFile.equals(imageFile)) {
expectedFile.found = true;
Dimension expectedDimension = getScaledDimension(expectedFile.srcFile, arguments, dimensionMap.get(expectedFile.srcFile), expectedDir.scaleFactor, expectedFile.isNinepatch);
Dimension actualDimensions = ImageUtil.getImageDimension(imageFile);
assertEquals("height should match", expectedDimension.getHeight(), actualDimensions.getHeight(), expectedFile.isNinepatch ? 15 : 0.1);
assertEquals("width should match", expectedDimension.getWidth(), actualDimensions.getWidth(), expectedFile.isNinepatch ? 15 : 0.1);
}
}
}
for (ImageCheck expectedFile : expectedFiles) {
assertTrue(expectedFile.targetFile + " file should be generated in path", expectedFile.found);
}
System.out.print("found " + expectedFiles.size() + " files in " + expectedDir.folderName + ", ");
} catch (Exception e) {
fail();
e.printStackTrace();
}
});
}
for (DensityFolder expectedDir : expectedDirs) {
assertTrue(expectedDir.folderName + " should be generated in path", expectedDir.found);
}
System.out.println();
} else {
assertTrue(dstDir.list() == null || dstDir.list().length == 0);
}
}
private static List<ImageCheck> createExpectedFilesMap(Arguments arguments, File file, List<File> files) throws IOException {
List<ImageCheck> expectedFiles = new ArrayList<>();
for (File srcImageFile : files) {
for (ImageType.ECompression compression : Arguments.getOutCompressionForType(arguments.outputCompressionMode, Arguments.getImageType(srcImageFile))) {
expectedFiles.add(new ImageCheck(srcImageFile, new File(file, MiscUtil.getFileNameWithoutExtension(srcImageFile) + "." + compression.extension)));
}
}
return expectedFiles;
}
private static class ImageCheck {
public final File srcFile;
public final File targetFile;
public final boolean isNinepatch;
public boolean found;
public ImageCheck(File srcFile, File targetFile) throws IOException {
this.srcFile = srcFile;
this.targetFile = targetFile;
this.isNinepatch = AndroidConverter.isNinePatch(srcFile);
}
}
private static class DensityFolder {
public final String folderName;
public final float scaleFactor;
public boolean found;
public DensityFolder(String folderName, float scaleFactor) {
this.folderName = folderName;
this.scaleFactor = scaleFactor;
}
}
}