package org.wordpress.android.editor;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.wordpress.android.editor.Utils.buildMapFromKeyValuePairs;
import static org.wordpress.android.editor.Utils.decodeHtml;
import static org.wordpress.android.editor.Utils.escapeHtml;
import static org.wordpress.android.editor.Utils.getChangeMapFromSets;
import static org.wordpress.android.editor.Utils.splitDelimitedString;
import static org.wordpress.android.editor.Utils.splitValuePairDelimitedString;
import static org.wordpress.android.editor.Utils.getUrlFromClipboard;
@Config(sdk = 18)
@RunWith(RobolectricTestRunner.class)
public class UtilsTest {
@Test
public void testEscapeHtml() {
// Test null
assertEquals(null, escapeHtml(null));
}
@Test
public void testDecodeHtml() {
// Test null
assertEquals(null, decodeHtml(null));
// Test normal usage
assertEquals("http://www.wordpress.com/", decodeHtml("http%3A%2F%2Fwww.wordpress.com%2F"));
}
@Test
public void testSplitDelimitedString() {
Set<String> splitString = new HashSet<>();
// Test normal usage
splitString.add("p");
splitString.add("bold");
splitString.add("justifyLeft");
assertEquals(splitString, splitDelimitedString("p~bold~justifyLeft", "~"));
// Test empty string
assertEquals(Collections.emptySet(), splitDelimitedString("", "~"));
}
@Test
public void testSplitValuePairDelimitedString() {
// Test usage with a URL containing the delimiter
Set<String> keyValueSet = new HashSet<>();
keyValueSet.add("url=http://www.wordpress.com/~user");
keyValueSet.add("title=I'm a link!");
List<String> identifiers = new ArrayList<>();
identifiers.add("url");
identifiers.add("title");
assertEquals(keyValueSet, splitValuePairDelimitedString(
"url=http://www.wordpress.com/~user~title=I'm a link!", "~", identifiers));
// Test usage with a matching identifier but no delimiters
keyValueSet.clear();
keyValueSet.add("url=http://www.wordpress.com/");
assertEquals(keyValueSet, splitValuePairDelimitedString("url=http://www.wordpress.com/", "~", identifiers));
// Test usage with no matching identifier and no delimiters
keyValueSet.clear();
keyValueSet.add("something=something else");
assertEquals(keyValueSet, splitValuePairDelimitedString("something=something else", "~", identifiers));
}
@Test
public void testBuildMapFromKeyValuePairs() {
Set<String> keyValueSet = new HashSet<>();
Map<String, String> expectedMap = new HashMap<>();
// Test normal usage
keyValueSet.add("id=test");
keyValueSet.add("name=example");
expectedMap.put("id", "test");
expectedMap.put("name", "example");
assertEquals(expectedMap, buildMapFromKeyValuePairs(keyValueSet));
// Test mixed valid and invalid entries
keyValueSet.clear();
keyValueSet.add("test");
keyValueSet.add("name=example");
expectedMap.clear();
expectedMap.put("name", "example");
assertEquals(expectedMap, buildMapFromKeyValuePairs(keyValueSet));
// Test multiple '=' (should split at the first `=` and treat the rest of them as part of the string)
keyValueSet.clear();
keyValueSet.add("id=test");
keyValueSet.add("contents=some text\n<a href=\"http://wordpress.com\">WordPress</a>");
expectedMap.clear();
expectedMap.put("id", "test");
expectedMap.put("contents", "some text\n<a href=\"http://wordpress.com\">WordPress</a>");
assertEquals(expectedMap, buildMapFromKeyValuePairs(keyValueSet));
// Test invalid entry
keyValueSet.clear();
keyValueSet.add("test");
assertEquals(Collections.emptyMap(), buildMapFromKeyValuePairs(keyValueSet));
// Test empty sets
assertEquals(Collections.emptyMap(), buildMapFromKeyValuePairs(Collections.<String>emptySet()));
}
@Test
public void testGetChangeMapFromSets() {
Set<String> oldSet = new HashSet<>();
Set<String> newSet = new HashSet<>();
Map<String, Boolean> expectedMap = new HashMap<>();
// Test normal usage
oldSet.add("p");
oldSet.add("bold");
oldSet.add("justifyLeft");
newSet.add("p");
newSet.add("justifyRight");
expectedMap.put("bold", false);
expectedMap.put("justifyLeft", false);
expectedMap.put("justifyRight", true);
assertEquals(expectedMap, getChangeMapFromSets(oldSet, newSet));
// Test no changes
oldSet.clear();
oldSet.add("p");
oldSet.add("bold");
newSet.clear();
newSet.add("p");
newSet.add("bold");
assertEquals(Collections.emptyMap(), getChangeMapFromSets(oldSet, newSet));
// Test empty sets
assertEquals(Collections.emptyMap(), getChangeMapFromSets(Collections.emptySet(), Collections.emptySet()));
}
@Test
public void testClipboardUrlWithNullContext() {
assertNull(getUrlFromClipboard(null));
}
@Test
public void testClipboardUrlWithNoClipData() {
assertNull(getClipboardUrlHelper(0, null));
}
@Test
public void testClipboardUrlWithNonUriData() {
assertNull(getClipboardUrlHelper(1, "not a URL"));
}
@Test
public void testClipboardUrlWithLocalUriData() {
assertNull(getClipboardUrlHelper(1, "file://test.png"));
}
@Test
public void testClipboardWithUrlData() {
String testUrl = "google.com";
assertEquals(testUrl, getClipboardUrlHelper(1, testUrl));
}
private String getClipboardUrlHelper(int itemCount, String clipText) {
ClipData.Item mockItem = mock(ClipData.Item.class);
when(mockItem.getText()).thenReturn(clipText);
ClipData mockPrimary = mock(ClipData.class);
when(mockPrimary.getItemCount()).thenReturn(itemCount);
when(mockPrimary.getItemAt(0)).thenReturn(mockItem);
ClipboardManager mockManager = mock(ClipboardManager.class);
when(mockManager.getPrimaryClip()).thenReturn(mockPrimary);
Context mockContext = mock(Context.class);
when(mockContext.getSystemService(Context.CLIPBOARD_SERVICE)).thenReturn(mockManager);
return getUrlFromClipboard(mockContext);
}
}