blob: 1fc15f227148e7eb0b37019971b3172505af1a39 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* 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 com.android.providers.contacts;
import android.content.Context;
import android.graphics.BitmapFactory;
import com.google.android.collect.Sets;
import junit.framework.Assert;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Set;
/**
* Contains additional assertion methods not found in Junit or MoreAsserts.
*/
public final class EvenMoreAsserts {
// Non instantiable.
private EvenMoreAsserts() { }
public static <T extends Exception> void assertThrows(Class<T> exception, Runnable r) {
assertThrows(null, exception, r);
}
public static <T extends Exception> void assertThrows(String message, Class<T> exception,
Runnable r) {
try {
r.run();
// Cannot invoke Assert.fail() here because it will be caught by the try/catch below
// and, if we are expecting an AssertionError or AssertionFailedError (depending on
// the platform), we might incorrectly identify that as a success.
} catch (Exception caught) {
if (!exception.isInstance(caught)) {
Assert.fail(appendUserMessage("Exception " + exception + " expected but " +
caught +" thrown.", message));
}
return;
}
Assert.fail(appendUserMessage(
"Exception " + exception + " expected but no exception was thrown.",
message));
}
private static String appendUserMessage(String errorMsg, String userMsg) {
return userMsg == null ? errorMsg : errorMsg + userMsg;
}
public static void assertImageRawData(Context context, byte[] expected,
InputStream actualStream)
throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
final byte[] buffer = new byte[4096];
int count;
while ((count = actualStream.read(buffer)) != -1) {
baos.write(buffer, 0, count);
}
actualStream.close();
assertImageRawData(context, expected, baos.toByteArray());
}
public static void assertImageRawData(Context context, byte[] expected, byte[] actual) {
String failReason = null;
if (expected.length != actual.length) {
failReason = "Different data lengths:" +
" expected=" + expected.length + " actual=" + actual.length;
} else if (!Arrays.equals(expected, actual)) {
failReason = "Different data:";
}
if (failReason == null) {
return;
}
String expectedFile = TestUtils.dumpToCacheDir(context, "expected", ".jpg", expected);
String actualFile = TestUtils.dumpToCacheDir(context, "actual", ".jpg", actual);
// Length or hashCode is different. We'll fail, but put the dimensions in the message.
Assert.fail(failReason + ", expected dimentions=" + getImageDimensions(expected) +
" actual dimentions=" + getImageDimensions(actual) +
" Data written to " + expectedFile + " and " + actualFile);
}
private static final String getImageDimensions(byte[] imageData) {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(imageData, 0, imageData.length, o);
return "[" + o.outWidth + " x " + o.outHeight + "]";
}
public static void assertUnique(Object... values) {
Set<Object> set = Sets.newHashSet();
for (Object o : values) {
Assert.assertFalse("Duplicate found: " + o, set.contains(o));
set.add(o);
}
}
}