summaryrefslogtreecommitdiff
path: root/core/src/test/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/test/java')
-rw-r--r--core/src/test/java/android/text/TextUtils.java32
-rw-r--r--core/src/test/java/android/util/Log.java245
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemMother.java16
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java60
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/feed/FeedMother.java12
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/feed/FeedTest.java90
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java65
7 files changed, 520 insertions, 0 deletions
diff --git a/core/src/test/java/android/text/TextUtils.java b/core/src/test/java/android/text/TextUtils.java
new file mode 100644
index 000000000..c31234171
--- /dev/null
+++ b/core/src/test/java/android/text/TextUtils.java
@@ -0,0 +1,32 @@
+package android.text;
+
+/**
+ * A slim-down version of standard {@link android.text.TextUtils} to be used in unit tests.
+ */
+public class TextUtils {
+
+ /**
+ * Returns true if a and b are equal, including if they are both null.
+ * <p><i>Note: In platform versions 1.1 and earlier, this method only worked well if
+ * both the arguments were instances of String.</i></p>
+ * @param a first CharSequence to check
+ * @param b second CharSequence to check
+ * @return true if a and b are equal
+ */
+ public static boolean equals(CharSequence a, CharSequence b) {
+ if (a == b) return true;
+ int length;
+ if (a != null && b != null && (length = a.length()) == b.length()) {
+ if (a instanceof String && b instanceof String) {
+ return a.equals(b);
+ } else {
+ for (int i = 0; i < length; i++) {
+ if (a.charAt(i) != b.charAt(i)) return false;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/core/src/test/java/android/util/Log.java b/core/src/test/java/android/util/Log.java
new file mode 100644
index 000000000..881d10209
--- /dev/null
+++ b/core/src/test/java/android/util/Log.java
@@ -0,0 +1,245 @@
+package android.util;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * A stub for {@link android.util.Log} to be used in unit tests.
+ *
+ * It outputs the log statements to standard error.
+ */
+public final class Log {
+
+ /**
+ * Priority constant for the println method; use Log.v.
+ */
+ public static final int VERBOSE = 2;
+
+ /**
+ * Priority constant for the println method; use Log.d.
+ */
+ public static final int DEBUG = 3;
+
+ /**
+ * Priority constant for the println method; use Log.i.
+ */
+ public static final int INFO = 4;
+
+ /**
+ * Priority constant for the println method; use Log.w.
+ */
+ public static final int WARN = 5;
+
+ /**
+ * Priority constant for the println method; use Log.e.
+ */
+ public static final int ERROR = 6;
+
+ /**
+ * Priority constant for the println method.
+ */
+ public static final int ASSERT = 7;
+
+ private Log() {
+ }
+
+ /**
+ * Send a {@link #VERBOSE} log message.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ */
+ public static int v(String tag, String msg) {
+ return println_native(LOG_ID_MAIN, VERBOSE, tag, msg);
+ }
+
+ /**
+ * Send a {@link #VERBOSE} log message and log the exception.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ * @param tr An exception to log
+ */
+ public static int v(String tag, String msg, Throwable tr) {
+ return printlns(LOG_ID_MAIN, VERBOSE, tag, msg, tr);
+ }
+
+ /**
+ * Send a {@link #DEBUG} log message.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ */
+ public static int d(String tag, String msg) {
+ return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
+ }
+
+ /**
+ * Send a {@link #DEBUG} log message and log the exception.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ * @param tr An exception to log
+ */
+ public static int d(String tag, String msg, Throwable tr) {
+ return printlns(LOG_ID_MAIN, DEBUG, tag, msg, tr);
+ }
+
+ /**
+ * Send an {@link #INFO} log message.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ */
+ public static int i(String tag, String msg) {
+ return println_native(LOG_ID_MAIN, INFO, tag, msg);
+ }
+
+ /**
+ * Send a {@link #INFO} log message and log the exception.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ * @param tr An exception to log
+ */
+ public static int i(String tag, String msg, Throwable tr) {
+ return printlns(LOG_ID_MAIN, INFO, tag, msg, tr);
+ }
+
+ /**
+ * Send a {@link #WARN} log message.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ */
+ public static int w(String tag, String msg) {
+ return println_native(LOG_ID_MAIN, WARN, tag, msg);
+ }
+
+ /**
+ * Send a {@link #WARN} log message and log the exception.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ * @param tr An exception to log
+ */
+ public static int w(String tag, String msg, Throwable tr) {
+ return printlns(LOG_ID_MAIN, WARN, tag, msg, tr);
+ }
+
+ /**
+ * Checks to see whether or not a log for the specified tag is loggable at the specified level.
+ *
+ * @return true in all cases (for unit test environment)
+ */
+ public static boolean isLoggable(String tag, int level) {
+ return true;
+ }
+
+ /*
+ * Send a {@link #WARN} log message and log the exception.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param tr An exception to log
+ */
+ public static int w(String tag, Throwable tr) {
+ return printlns(LOG_ID_MAIN, WARN, tag, "", tr);
+ }
+
+ /**
+ * Send an {@link #ERROR} log message.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ */
+ public static int e(String tag, String msg) {
+ return println_native(LOG_ID_MAIN, ERROR, tag, msg);
+ }
+
+ /**
+ * Send a {@link #ERROR} log message and log the exception.
+ * @param tag Used to identify the source of a log message. It usually identifies
+ * the class or activity where the log call occurs.
+ * @param msg The message you would like logged.
+ * @param tr An exception to log
+ */
+ public static int e(String tag, String msg, Throwable tr) {
+ return printlns(LOG_ID_MAIN, ERROR, tag, msg, tr);
+ }
+
+ /**
+ * What a Terrible Failure: Report a condition that should never happen.
+ * The error will always be logged at level ASSERT with the call stack.
+ * Depending on system configuration, a report may be added to the
+ * {@link android.os.DropBoxManager} and/or the process may be terminated
+ * immediately with an error dialog.
+ * @param tag Used to identify the source of a log message.
+ * @param msg The message you would like logged.
+ */
+ public static int wtf(String tag, String msg) {
+ return wtf(LOG_ID_MAIN, tag, msg, null, false, false);
+ }
+
+ /**
+ * Like {@link #wtf(String, String)}, but also writes to the log the full
+ * call stack.
+ * @hide
+ */
+ public static int wtfStack(String tag, String msg) {
+ return wtf(LOG_ID_MAIN, tag, msg, null, true, false);
+ }
+
+ /**
+ * What a Terrible Failure: Report an exception that should never happen.
+ * Similar to {@link #wtf(String, String)}, with an exception to log.
+ * @param tag Used to identify the source of a log message.
+ * @param tr An exception to log.
+ */
+ public static int wtf(String tag, Throwable tr) {
+ return wtf(LOG_ID_MAIN, tag, tr.getMessage(), tr, false, false);
+ }
+
+ /**
+ * What a Terrible Failure: Report an exception that should never happen.
+ * Similar to {@link #wtf(String, Throwable)}, with a message as well.
+ * @param tag Used to identify the source of a log message.
+ * @param msg The message you would like logged.
+ * @param tr An exception to log. May be null.
+ */
+ public static int wtf(String tag, String msg, Throwable tr) {
+ return wtf(LOG_ID_MAIN, tag, msg, tr, false, false);
+ }
+
+ /**
+ * Priority Constant for wtf.
+ * Added for this custom Log implementation, not in android sources.
+ */
+ private static final int WTF = 8;
+ static int wtf(int logId, String tag, String msg, Throwable tr, boolean localStack,
+ boolean system) {
+ return printlns(LOG_ID_MAIN, WTF, tag, msg, tr);
+ }
+
+ private static final int LOG_ID_MAIN = 0;
+
+ private static final String[] PRIORITY_ABBREV = { "0", "1", "V", "D", "I", "W", "E", "A", "WTF" };
+
+ private static int println_native(int bufID, int priority, String tag, String msg) {
+ String res = PRIORITY_ABBREV[priority] + "/" + tag + " " + msg + System.lineSeparator();
+ System.err.print(res);
+ return res.length();
+ }
+
+ private static int printlns(int bufID, int priority, String tag, String msg,
+ Throwable tr) {
+ StringWriter trSW = new StringWriter();
+ if (tr != null) {
+ trSW.append(" , Exception: ");
+ PrintWriter trPW = new PrintWriter(trSW);
+ tr.printStackTrace(trPW);
+ trPW.flush();
+ }
+ return println_native(bufID, priority, tag, msg + trSW.toString());
+ }
+
+}
diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemMother.java b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemMother.java
new file mode 100644
index 000000000..b78cecc23
--- /dev/null
+++ b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemMother.java
@@ -0,0 +1,16 @@
+package de.danoeh.antennapod.core.feed;
+
+import java.util.Date;
+
+import static de.danoeh.antennapod.core.feed.FeedMother.anyFeed;
+
+class FeedItemMother {
+ private static final String IMAGE_URL = "http://example.com/image";
+
+ static FeedItem anyFeedItemWithImage() {
+ FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.PLAYED, anyFeed());
+ item.setImageUrl(IMAGE_URL);
+ return item;
+ }
+
+}
diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java
new file mode 100644
index 000000000..e36a09f00
--- /dev/null
+++ b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java
@@ -0,0 +1,60 @@
+package de.danoeh.antennapod.core.feed;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static de.danoeh.antennapod.core.feed.FeedItemMother.anyFeedItemWithImage;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+public class FeedItemTest {
+
+ private FeedItem original;
+ private FeedItem changedFeedItem;
+
+ @Before
+ public void setUp() {
+ original = anyFeedItemWithImage();
+ changedFeedItem = anyFeedItemWithImage();
+ }
+
+ @Test
+ public void testUpdateFromOther_feedItemImageDownloadUrlChanged() throws Exception {
+ setNewFeedItemImageDownloadUrl();
+ original.updateFromOther(changedFeedItem);
+ assertFeedItemImageWasUpdated();
+ }
+
+ @Test
+ public void testUpdateFromOther_feedItemImageRemoved() throws Exception {
+ feedItemImageRemoved();
+ original.updateFromOther(changedFeedItem);
+ assertFeedItemImageWasNotUpdated();
+ }
+
+ @Test
+ public void testUpdateFromOther_feedItemImageAdded() throws Exception {
+ original.setImageUrl(null);
+ setNewFeedItemImageDownloadUrl();
+ original.updateFromOther(changedFeedItem);
+ assertFeedItemImageWasUpdated();
+ }
+
+ private void setNewFeedItemImageDownloadUrl() {
+ changedFeedItem.setImageUrl("http://example.com/new_picture");
+ }
+
+ private void feedItemImageRemoved() {
+ changedFeedItem.setImageUrl(null);
+ }
+
+ private void assertFeedItemImageWasUpdated() {
+ assertEquals(original.getImageUrl(), changedFeedItem.getImageUrl());
+ }
+
+ private void assertFeedItemImageWasNotUpdated() {
+ assertEquals(anyFeedItemWithImage().getImageUrl(), original.getImageUrl());
+ }
+
+} \ No newline at end of file
diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/FeedMother.java b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedMother.java
new file mode 100644
index 000000000..f46797d28
--- /dev/null
+++ b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedMother.java
@@ -0,0 +1,12 @@
+package de.danoeh.antennapod.core.feed;
+
+class FeedMother {
+ public static final String IMAGE_URL = "http://example.com/image";
+
+ public static Feed anyFeed() {
+ return new Feed(0, null, "title", "http://example.com", "This is the description",
+ "http://example.com/payment", "Daniel", "en", null, "http://example.com/feed", IMAGE_URL,
+ null, "http://example.com/feed", true);
+ }
+
+}
diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/FeedTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedTest.java
new file mode 100644
index 000000000..4717041f4
--- /dev/null
+++ b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedTest.java
@@ -0,0 +1,90 @@
+package de.danoeh.antennapod.core.feed;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static de.danoeh.antennapod.core.feed.FeedMother.anyFeed;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class FeedTest {
+
+ private Feed original;
+ private Feed changedFeed;
+
+ @Before
+ public void setUp() {
+ original = anyFeed();
+ changedFeed = anyFeed();
+ }
+
+ @Test
+ public void testCompareWithOther_feedImageDownloadUrlChanged() throws Exception {
+ setNewFeedImageDownloadUrl();
+ feedHasChanged();
+ }
+
+ @Test
+ public void testCompareWithOther_sameFeedImage() throws Exception {
+ changedFeed.setImageUrl(FeedMother.IMAGE_URL);
+ feedHasNotChanged();
+ }
+
+ @Test
+ public void testCompareWithOther_feedImageRemoved() throws Exception {
+ feedImageRemoved();
+ feedHasNotChanged();
+ }
+
+ @Test
+ public void testUpdateFromOther_feedImageDownloadUrlChanged() throws Exception {
+ setNewFeedImageDownloadUrl();
+ original.updateFromOther(changedFeed);
+ feedImageWasUpdated();
+ }
+
+ @Test
+ public void testUpdateFromOther_feedImageRemoved() throws Exception {
+ feedImageRemoved();
+ original.updateFromOther(changedFeed);
+ feedImageWasNotUpdated();
+ }
+
+ @Test
+ public void testUpdateFromOther_feedImageAdded() throws Exception {
+ feedHadNoImage();
+ setNewFeedImageDownloadUrl();
+ original.updateFromOther(changedFeed);
+ feedImageWasUpdated();
+ }
+
+ private void feedHasNotChanged() {
+ assertFalse(original.compareWithOther(changedFeed));
+ }
+
+ private void feedHadNoImage() {
+ original.setImageUrl(null);
+ }
+
+ private void setNewFeedImageDownloadUrl() {
+ changedFeed.setImageUrl("http://example.com/new_picture");
+ }
+
+ private void feedHasChanged() {
+ assertTrue(original.compareWithOther(changedFeed));
+ }
+
+ private void feedImageRemoved() {
+ changedFeed.setImageUrl(null);
+ }
+
+ private void feedImageWasUpdated() {
+ assertEquals(original.getImageUrl(), changedFeed.getImageUrl());
+ }
+
+ private void feedImageWasNotUpdated() {
+ assertEquals(anyFeed().getImageUrl(), original.getImageUrl());
+ }
+
+} \ No newline at end of file
diff --git a/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java b/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java
new file mode 100644
index 000000000..0ed77eb9f
--- /dev/null
+++ b/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java
@@ -0,0 +1,65 @@
+package de.danoeh.antennapod.core.util;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class LongLongMapTest {
+
+ @Test
+ public void testEmptyMap() {
+ LongIntMap map = new LongIntMap();
+ assertEquals(0, map.size());
+ assertEquals("LongLongMap{}", map.toString());
+ assertEquals(0, map.get(42));
+ assertEquals(-1, map.get(42, -1));
+ assertEquals(false, map.delete(42));
+ assertEquals(-1, map.indexOfKey(42));
+ assertEquals(-1, map.indexOfValue(42));
+ assertEquals(1, map.hashCode());
+ }
+
+ @Test
+ public void testSingleElement() {
+ LongIntMap map = new LongIntMap();
+ map.put(17, 42);
+ assertEquals(1, map.size());
+ assertEquals("LongLongMap{17=42}", map.toString());
+ assertEquals(42, map.get(17));
+ assertEquals(42, map.get(17, -1));
+ assertEquals(0, map.indexOfKey(17));
+ assertEquals(0, map.indexOfValue(42));
+ assertEquals(true, map.delete(17));
+ }
+
+ @Test
+ public void testAddAndDelete() {
+ LongIntMap map = new LongIntMap();
+ for(int i=0; i < 100; i++) {
+ map.put(i * 17, i * 42);
+ }
+ assertEquals(100, map.size());
+ assertEquals(0, map.get(0));
+ assertEquals(42, map.get(17));
+ assertEquals(42, map.get(17, -1));
+ assertEquals(1, map.indexOfKey(17));
+ assertEquals(1, map.indexOfValue(42));
+ for(int i=0; i < 100; i++) {
+ assertEquals(true, map.delete(i * 17));
+ }
+ }
+
+ @Test
+ public void testOverwrite() {
+ LongIntMap map = new LongIntMap();
+ map.put(17, 42);
+ assertEquals(1, map.size());
+ assertEquals("LongLongMap{17=42}", map.toString());
+ assertEquals(42, map.get(17));
+ map.put(17, 23);
+ assertEquals(1, map.size());
+ assertEquals("LongLongMap{17=23}", map.toString());
+ assertEquals(23, map.get(17));
+ }
+
+}