aboutsummaryrefslogtreecommitdiffstats
path: root/tests/src/com/android/inputmethod/latin
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/com/android/inputmethod/latin')
-rw-r--r--tests/src/com/android/inputmethod/latin/InputPointersTests.java74
-rw-r--r--tests/src/com/android/inputmethod/latin/ResizableIntArrayTests.java34
-rw-r--r--tests/src/com/android/inputmethod/latin/ResourceUtilsTests.java84
-rw-r--r--tests/src/com/android/inputmethod/latin/StringUtilsTests.java61
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/Base64ReaderTests.java225
-rw-r--r--tests/src/com/android/inputmethod/latin/utils/CsvUtilsTests.java424
6 files changed, 791 insertions, 111 deletions
diff --git a/tests/src/com/android/inputmethod/latin/InputPointersTests.java b/tests/src/com/android/inputmethod/latin/InputPointersTests.java
index e1149b3fd..301582979 100644
--- a/tests/src/com/android/inputmethod/latin/InputPointersTests.java
+++ b/tests/src/com/android/inputmethod/latin/InputPointersTests.java
@@ -108,13 +108,13 @@ public class InputPointersTests extends AndroidTestCase {
assertNotSame("pointerIds after copy", dst.getPointerIds(), src.getPointerIds());
assertNotSame("times after copy", dst.getTimes(), src.getTimes());
final int size = dst.getPointerSize();
- assertArrayEquals("xCoordinates values after copy",
+ assertIntArrayEquals("xCoordinates values after copy",
dst.getXCoordinates(), 0, src.getXCoordinates(), 0, size);
- assertArrayEquals("yCoordinates values after copy",
+ assertIntArrayEquals("yCoordinates values after copy",
dst.getYCoordinates(), 0, src.getYCoordinates(), 0, size);
- assertArrayEquals("pointerIds values after copy",
+ assertIntArrayEquals("pointerIds values after copy",
dst.getPointerIds(), 0, src.getPointerIds(), 0, size);
- assertArrayEquals("times values after copy",
+ assertIntArrayEquals("times values after copy",
dst.getTimes(), 0, src.getTimes(), 0, size);
}
@@ -135,34 +135,34 @@ public class InputPointersTests extends AndroidTestCase {
dst.append(src, 0, 0);
assertEquals("size after append zero", dstLen, dst.getPointerSize());
- assertArrayEquals("xCoordinates after append zero",
+ assertIntArrayEquals("xCoordinates after append zero",
dstCopy.getXCoordinates(), 0, dst.getXCoordinates(), 0, dstLen);
- assertArrayEquals("yCoordinates after append zero",
+ assertIntArrayEquals("yCoordinates after append zero",
dstCopy.getYCoordinates(), 0, dst.getYCoordinates(), 0, dstLen);
- assertArrayEquals("pointerIds after append zero",
+ assertIntArrayEquals("pointerIds after append zero",
dstCopy.getPointerIds(), 0, dst.getPointerIds(), 0, dstLen);
- assertArrayEquals("times after append zero",
+ assertIntArrayEquals("times after append zero",
dstCopy.getTimes(), 0, dst.getTimes(), 0, dstLen);
dst.append(src, 0, srcLen);
assertEquals("size after append", dstLen + srcLen, dst.getPointerSize());
assertTrue("primitive length after append",
dst.getPointerIds().length >= dstLen + srcLen);
- assertArrayEquals("original xCoordinates values after append",
+ assertIntArrayEquals("original xCoordinates values after append",
dstCopy.getXCoordinates(), 0, dst.getXCoordinates(), 0, dstLen);
- assertArrayEquals("original yCoordinates values after append",
+ assertIntArrayEquals("original yCoordinates values after append",
dstCopy.getYCoordinates(), 0, dst.getYCoordinates(), 0, dstLen);
- assertArrayEquals("original pointerIds values after append",
+ assertIntArrayEquals("original pointerIds values after append",
dstCopy.getPointerIds(), 0, dst.getPointerIds(), 0, dstLen);
- assertArrayEquals("original times values after append",
+ assertIntArrayEquals("original times values after append",
dstCopy.getTimes(), 0, dst.getTimes(), 0, dstLen);
- assertArrayEquals("appended xCoordinates values after append",
+ assertIntArrayEquals("appended xCoordinates values after append",
src.getXCoordinates(), 0, dst.getXCoordinates(), dstLen, srcLen);
- assertArrayEquals("appended yCoordinates values after append",
+ assertIntArrayEquals("appended yCoordinates values after append",
src.getYCoordinates(), 0, dst.getYCoordinates(), dstLen, srcLen);
- assertArrayEquals("appended pointerIds values after append",
+ assertIntArrayEquals("appended pointerIds values after append",
src.getPointerIds(), 0, dst.getPointerIds(), dstLen, srcLen);
- assertArrayEquals("appended times values after append",
+ assertIntArrayEquals("appended times values after append",
src.getTimes(), 0, dst.getTimes(), dstLen, srcLen);
}
@@ -190,47 +190,55 @@ public class InputPointersTests extends AndroidTestCase {
dst.append(srcPointerId, srcTimes, srcXCoords, srcYCoords, 0, 0);
assertEquals("size after append zero", dstLen, dst.getPointerSize());
- assertArrayEquals("xCoordinates after append zero",
+ assertIntArrayEquals("xCoordinates after append zero",
dstCopy.getXCoordinates(), 0, dst.getXCoordinates(), 0, dstLen);
- assertArrayEquals("yCoordinates after append zero",
+ assertIntArrayEquals("yCoordinates after append zero",
dstCopy.getYCoordinates(), 0, dst.getYCoordinates(), 0, dstLen);
- assertArrayEquals("pointerIds after append zero",
+ assertIntArrayEquals("pointerIds after append zero",
dstCopy.getPointerIds(), 0, dst.getPointerIds(), 0, dstLen);
- assertArrayEquals("times after append zero",
+ assertIntArrayEquals("times after append zero",
dstCopy.getTimes(), 0, dst.getTimes(), 0, dstLen);
dst.append(srcPointerId, srcTimes, srcXCoords, srcYCoords, 0, srcLen);
assertEquals("size after append", dstLen + srcLen, dst.getPointerSize());
assertTrue("primitive length after append",
dst.getPointerIds().length >= dstLen + srcLen);
- assertArrayEquals("original xCoordinates values after append",
+ assertIntArrayEquals("original xCoordinates values after append",
dstCopy.getXCoordinates(), 0, dst.getXCoordinates(), 0, dstLen);
- assertArrayEquals("original yCoordinates values after append",
+ assertIntArrayEquals("original yCoordinates values after append",
dstCopy.getYCoordinates(), 0, dst.getYCoordinates(), 0, dstLen);
- assertArrayEquals("original pointerIds values after append",
+ assertIntArrayEquals("original pointerIds values after append",
dstCopy.getPointerIds(), 0, dst.getPointerIds(), 0, dstLen);
- assertArrayEquals("original times values after append",
+ assertIntArrayEquals("original times values after append",
dstCopy.getTimes(), 0, dst.getTimes(), 0, dstLen);
- assertArrayEquals("appended xCoordinates values after append",
+ assertIntArrayEquals("appended xCoordinates values after append",
srcXCoords.getPrimitiveArray(), 0, dst.getXCoordinates(), dstLen, srcLen);
- assertArrayEquals("appended yCoordinates values after append",
+ assertIntArrayEquals("appended yCoordinates values after append",
srcYCoords.getPrimitiveArray(), 0, dst.getYCoordinates(), dstLen, srcLen);
- assertArrayEquals("appended pointerIds values after append",
+ assertIntArrayEquals("appended pointerIds values after append",
srcPointerIds, 0, dst.getPointerIds(), dstLen, srcLen);
- assertArrayEquals("appended times values after append",
+ assertIntArrayEquals("appended times values after append",
srcTimes.getPrimitiveArray(), 0, dst.getTimes(), dstLen, srcLen);
}
- private static void assertArrayEquals(String message, int[] expecteds, int expectedPos,
- int[] actuals, int actualPos, int length) {
- if (expecteds == null && actuals == null) {
+ // TODO: Consolidate this method with
+ // {@link ResizableIntArrayTests#assertIntArrayEquals(String,int[],int,int[],int,int)}.
+ private static void assertIntArrayEquals(final String message, final int[] expecteds,
+ final int expectedPos, final int[] actuals, final int actualPos, final int length) {
+ if (expecteds == actuals) {
return;
}
if (expecteds == null || actuals == null) {
- fail(message + ": expecteds=" + expecteds + " actuals=" + actuals);
+ assertEquals(message, Arrays.toString(expecteds), Arrays.toString(actuals));
+ return;
+ }
+ if (expecteds.length < expectedPos + length || actuals.length < actualPos + length) {
+ fail(message + ": insufficient length: expecteds=" + Arrays.toString(expecteds)
+ + " actuals=" + Arrays.toString(actuals));
+ return;
}
for (int i = 0; i < length; i++) {
- assertEquals(message + ": element at " + i,
+ assertEquals(message + " [" + i + "]",
expecteds[i + expectedPos], actuals[i + actualPos]);
}
}
diff --git a/tests/src/com/android/inputmethod/latin/ResizableIntArrayTests.java b/tests/src/com/android/inputmethod/latin/ResizableIntArrayTests.java
index 2d1b836c2..b9fee950e 100644
--- a/tests/src/com/android/inputmethod/latin/ResizableIntArrayTests.java
+++ b/tests/src/com/android/inputmethod/latin/ResizableIntArrayTests.java
@@ -19,6 +19,8 @@ package com.android.inputmethod.latin;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
+import java.util.Arrays;
+
@SmallTest
public class ResizableIntArrayTests extends AndroidTestCase {
private static final int DEFAULT_CAPACITY = 48;
@@ -186,7 +188,7 @@ public class ResizableIntArrayTests extends AndroidTestCase {
assertEquals("length after copy", dst.getLength(), src.getLength());
assertSame("array after copy", array, dst.getPrimitiveArray());
assertNotSame("array after copy", dst.getPrimitiveArray(), src.getPrimitiveArray());
- assertArrayEquals("values after copy",
+ assertIntArrayEquals("values after copy",
dst.getPrimitiveArray(), 0, src.getPrimitiveArray(), 0, dst.getLength());
final int smallerLength = DEFAULT_CAPACITY / 2;
@@ -197,7 +199,7 @@ public class ResizableIntArrayTests extends AndroidTestCase {
assertEquals("length after copy to smaller", dst.getLength(), src.getLength());
assertNotSame("array after copy to smaller", array2, array3);
assertNotSame("array after copy to smaller", array3, src.getPrimitiveArray());
- assertArrayEquals("values after copy to smaller",
+ assertIntArrayEquals("values after copy to smaller",
dst.getPrimitiveArray(), 0, src.getPrimitiveArray(), 0, dst.getLength());
}
@@ -220,7 +222,7 @@ public class ResizableIntArrayTests extends AndroidTestCase {
dst.append(src, 0, 0);
assertEquals("length after append zero", dstLen, dst.getLength());
assertSame("array after append zero", array, dst.getPrimitiveArray());
- assertArrayEquals("values after append zero",
+ assertIntArrayEquals("values after append zero",
dstCopy.getPrimitiveArray(), 0, dst.getPrimitiveArray(), 0, dstLen);
dst.append(src, 0, srcLen);
@@ -228,9 +230,9 @@ public class ResizableIntArrayTests extends AndroidTestCase {
assertSame("array after append", array, dst.getPrimitiveArray());
assertTrue("primitive length after append",
dst.getPrimitiveArray().length >= dstLen + srcLen);
- assertArrayEquals("original values after append",
+ assertIntArrayEquals("original values after append",
dstCopy.getPrimitiveArray(), 0, dst.getPrimitiveArray(), 0, dstLen);
- assertArrayEquals("appended values after append",
+ assertIntArrayEquals("appended values after append",
src.getPrimitiveArray(), 0, dst.getPrimitiveArray(), dstLen, srcLen);
dst.append(src, 0, srcLen);
@@ -238,11 +240,11 @@ public class ResizableIntArrayTests extends AndroidTestCase {
assertNotSame("array after 2nd append", array, dst.getPrimitiveArray());
assertTrue("primitive length after 2nd append",
dst.getPrimitiveArray().length >= dstLen + srcLen * 2);
- assertArrayEquals("original values after 2nd append",
+ assertIntArrayEquals("original values after 2nd append",
dstCopy.getPrimitiveArray(), 0, dst.getPrimitiveArray(), 0, dstLen);
- assertArrayEquals("appended values after 2nd append",
+ assertIntArrayEquals("appended values after 2nd append",
src.getPrimitiveArray(), 0, dst.getPrimitiveArray(), dstLen, srcLen);
- assertArrayEquals("appended values after 2nd append",
+ assertIntArrayEquals("appended values after 2nd append",
src.getPrimitiveArray(), 0, dst.getPrimitiveArray(), dstLen + srcLen, srcLen);
}
@@ -319,16 +321,22 @@ public class ResizableIntArrayTests extends AndroidTestCase {
}
}
- private static void assertArrayEquals(String message, int[] expecteds, int expectedPos,
- int[] actuals, int actualPos, int length) {
- if (expecteds == null && actuals == null) {
+ private static void assertIntArrayEquals(final String message, final int[] expecteds,
+ final int expectedPos, final int[] actuals, final int actualPos, final int length) {
+ if (expecteds == actuals) {
return;
}
if (expecteds == null || actuals == null) {
- fail(message + ": expecteds=" + expecteds + " actuals=" + actuals);
+ assertEquals(message, Arrays.toString(expecteds), Arrays.toString(actuals));
+ return;
+ }
+ if (expecteds.length < expectedPos + length || actuals.length < actualPos + length) {
+ fail(message + ": insufficient length: expecteds=" + Arrays.toString(expecteds)
+ + " actuals=" + Arrays.toString(actuals));
+ return;
}
for (int i = 0; i < length; i++) {
- assertEquals(message + ": element at " + i,
+ assertEquals(message + " [" + i + "]",
expecteds[i + expectedPos], actuals[i + actualPos]);
}
}
diff --git a/tests/src/com/android/inputmethod/latin/ResourceUtilsTests.java b/tests/src/com/android/inputmethod/latin/ResourceUtilsTests.java
index ed16846b9..c915522ee 100644
--- a/tests/src/com/android/inputmethod/latin/ResourceUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/ResourceUtilsTests.java
@@ -19,25 +19,41 @@ package com.android.inputmethod.latin;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.inputmethod.latin.ResourceUtils.DeviceOverridePatternSyntaxError;
+
import java.util.HashMap;
@SmallTest
public class ResourceUtilsTests extends AndroidTestCase {
public void testFindDefaultConstant() {
final String[] nullArray = null;
- assertNull(ResourceUtils.findDefaultConstant(nullArray));
-
final String[] emptyArray = {};
- assertNull(ResourceUtils.findDefaultConstant(emptyArray));
-
final String[] array = {
+ "HARDWARE=grouper,0.3",
+ "HARDWARE=mako,0.4",
+ ",defaultValue1",
+ "HARDWARE=manta,0.2",
+ ",defaultValue2",
+ };
+
+ try {
+ assertNull(ResourceUtils.findDefaultConstant(nullArray));
+ assertNull(ResourceUtils.findDefaultConstant(emptyArray));
+ assertEquals(ResourceUtils.findDefaultConstant(array), "defaultValue1");
+ } catch (final DeviceOverridePatternSyntaxError e) {
+ fail(e.getMessage());
+ }
+
+ final String[] errorArray = {
"HARDWARE=grouper,0.3",
- "HARDWARE=mako,0.4",
- ",defaultValue1",
- "HARDWARE=manta,0.2",
- ",defaultValue2",
+ "no_comma"
};
- assertEquals(ResourceUtils.findDefaultConstant(array), "defaultValue1");
+ try {
+ final String defaultValue = ResourceUtils.findDefaultConstant(errorArray);
+ fail("exception should be thrown: defaultValue=" + defaultValue);
+ } catch (final DeviceOverridePatternSyntaxError e) {
+ assertEquals("Array element has no comma: no_comma", e.getMessage());
+ }
}
public void testFindConstantForKeyValuePairsSimple() {
@@ -67,33 +83,23 @@ public class ResourceUtilsTests extends AndroidTestCase {
final HashMap<String,String> keyValues = CollectionUtils.newHashMap();
keyValues.put(HARDWARE_KEY, "grouper");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.3");
+ assertEquals("0.3", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.put(HARDWARE_KEY, "mako");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.4");
+ assertEquals("0.4", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.put(HARDWARE_KEY, "manta");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.2");
+ assertEquals("0.2", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
+
+ keyValues.clear();
+ keyValues.put("hardware", "grouper");
+ assertNull(ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
- try {
- keyValues.clear();
- keyValues.put("hardware", "grouper");
- final String constant = ResourceUtils.findConstantForKeyValuePairs(keyValues, array);
- fail("condition without HARDWARE must fail: constant=" + constant);
- } catch (final RuntimeException e) {
- assertEquals(e.getMessage(), "Found unknown key: HARDWARE=grouper");
- }
keyValues.clear();
keyValues.put(HARDWARE_KEY, "MAKO");
assertNull(ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.put(HARDWARE_KEY, "mantaray");
assertNull(ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
- try {
- final String constant = ResourceUtils.findConstantForKeyValuePairs(
- emptyKeyValue, array);
- fail("emptyCondition shouldn't match: constant=" + constant);
- } catch (final RuntimeException e) {
- assertEquals(e.getMessage(), "Found unknown key: HARDWARE=grouper");
- }
+ assertNull(ResourceUtils.findConstantForKeyValuePairs(emptyKeyValue, array));
}
public void testFindConstantForKeyValuePairsCombined() {
@@ -102,6 +108,8 @@ public class ResourceUtilsTests extends AndroidTestCase {
final String MANUFACTURER_KEY = "MANUFACTURER";
final String[] array = {
",defaultValue",
+ "no_comma",
+ "error_pattern,0.1",
"HARDWARE=grouper:MANUFACTURER=asus,0.3",
"HARDWARE=mako:MODEL=Nexus 4,0.4",
"HARDWARE=manta:MODEL=Nexus 10:MANUFACTURER=samsung,0.2"
@@ -117,25 +125,25 @@ public class ResourceUtilsTests extends AndroidTestCase {
keyValues.put(HARDWARE_KEY, "grouper");
keyValues.put(MODEL_KEY, "Nexus 7");
keyValues.put(MANUFACTURER_KEY, "asus");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.3");
+ assertEquals("0.3", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
assertNull(ResourceUtils.findConstantForKeyValuePairs(keyValues, failArray));
keyValues.clear();
keyValues.put(HARDWARE_KEY, "mako");
keyValues.put(MODEL_KEY, "Nexus 4");
keyValues.put(MANUFACTURER_KEY, "LGE");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.4");
+ assertEquals("0.4", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
assertNull(ResourceUtils.findConstantForKeyValuePairs(keyValues, failArray));
keyValues.clear();
keyValues.put(HARDWARE_KEY, "manta");
keyValues.put(MODEL_KEY, "Nexus 10");
keyValues.put(MANUFACTURER_KEY, "samsung");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.2");
+ assertEquals("0.2", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
assertNull(ResourceUtils.findConstantForKeyValuePairs(keyValues, failArray));
keyValues.put(HARDWARE_KEY, "mantaray");
assertNull(ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, failArray), "0.2");
+ assertEquals("0.2", ResourceUtils.findConstantForKeyValuePairs(keyValues, failArray));
}
public void testFindConstantForKeyValuePairsRegexp() {
@@ -144,6 +152,8 @@ public class ResourceUtilsTests extends AndroidTestCase {
final String MANUFACTURER_KEY = "MANUFACTURER";
final String[] array = {
",defaultValue",
+ "no_comma",
+ "HARDWARE=error_regexp:MANUFACTURER=error[regexp,0.1",
"HARDWARE=grouper|tilapia:MANUFACTURER=asus,0.3",
"HARDWARE=[mM][aA][kK][oO]:MODEL=Nexus 4,0.4",
"HARDWARE=manta.*:MODEL=Nexus 10:MANUFACTURER=samsung,0.2"
@@ -153,24 +163,24 @@ public class ResourceUtilsTests extends AndroidTestCase {
keyValues.put(HARDWARE_KEY, "grouper");
keyValues.put(MODEL_KEY, "Nexus 7");
keyValues.put(MANUFACTURER_KEY, "asus");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.3");
+ assertEquals("0.3", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.put(HARDWARE_KEY, "tilapia");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.3");
+ assertEquals("0.3", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.clear();
keyValues.put(HARDWARE_KEY, "mako");
keyValues.put(MODEL_KEY, "Nexus 4");
keyValues.put(MANUFACTURER_KEY, "LGE");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.4");
+ assertEquals("0.4", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.put(HARDWARE_KEY, "MAKO");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.4");
+ assertEquals("0.4", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.clear();
keyValues.put(HARDWARE_KEY, "manta");
keyValues.put(MODEL_KEY, "Nexus 10");
keyValues.put(MANUFACTURER_KEY, "samsung");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.2");
+ assertEquals("0.2", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
keyValues.put(HARDWARE_KEY, "mantaray");
- assertEquals(ResourceUtils.findConstantForKeyValuePairs(keyValues, array), "0.2");
+ assertEquals("0.2", ResourceUtils.findConstantForKeyValuePairs(keyValues, array));
}
}
diff --git a/tests/src/com/android/inputmethod/latin/StringUtilsTests.java b/tests/src/com/android/inputmethod/latin/StringUtilsTests.java
index 29e790a7d..4f260987b 100644
--- a/tests/src/com/android/inputmethod/latin/StringUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/StringUtilsTests.java
@@ -40,57 +40,62 @@ public class StringUtilsTests extends AndroidTestCase {
}));
}
- public void testContainsInCsv() {
- assertFalse("null", StringUtils.containsInCsv("key", null));
- assertFalse("empty", StringUtils.containsInCsv("key", ""));
- assertFalse("not in 1 element", StringUtils.containsInCsv("key", "key1"));
- assertFalse("not in 2 elements", StringUtils.containsInCsv("key", "key1,key2"));
-
- assertTrue("in 1 element", StringUtils.containsInCsv("key", "key"));
- assertTrue("in 2 elements", StringUtils.containsInCsv("key", "key1,key"));
+ public void testContainsInExtraValues() {
+ assertFalse("null", StringUtils.containsInCommaSplittableText("key", null));
+ assertFalse("empty", StringUtils.containsInCommaSplittableText("key", ""));
+ assertFalse("not in 1 element",
+ StringUtils.containsInCommaSplittableText("key", "key1"));
+ assertFalse("not in 2 elements",
+ StringUtils.containsInCommaSplittableText("key", "key1,key2"));
+
+ assertTrue("in 1 element", StringUtils.containsInCommaSplittableText("key", "key"));
+ assertTrue("in 2 elements", StringUtils.containsInCommaSplittableText("key", "key1,key"));
}
- public void testAppendToCsvIfNotExists() {
- assertEquals("null", "key", StringUtils.appendToCsvIfNotExists("key", null));
- assertEquals("empty", "key", StringUtils.appendToCsvIfNotExists("key", ""));
+ public void testAppendToExtraValuesIfNotExists() {
+ assertEquals("null", "key",
+ StringUtils.appendToCommaSplittableTextIfNotExists("key", null));
+ assertEquals("empty", "key",
+ StringUtils.appendToCommaSplittableTextIfNotExists("key", ""));
assertEquals("not in 1 element", "key1,key",
- StringUtils.appendToCsvIfNotExists("key", "key1"));
+ StringUtils.appendToCommaSplittableTextIfNotExists("key", "key1"));
assertEquals("not in 2 elements", "key1,key2,key",
- StringUtils.appendToCsvIfNotExists("key", "key1,key2"));
+ StringUtils.appendToCommaSplittableTextIfNotExists("key", "key1,key2"));
assertEquals("in 1 element", "key",
- StringUtils.appendToCsvIfNotExists("key", "key"));
+ StringUtils.appendToCommaSplittableTextIfNotExists("key", "key"));
assertEquals("in 2 elements at position 1", "key,key2",
- StringUtils.appendToCsvIfNotExists("key", "key,key2"));
+ StringUtils.appendToCommaSplittableTextIfNotExists("key", "key,key2"));
assertEquals("in 2 elements at position 2", "key1,key",
- StringUtils.appendToCsvIfNotExists("key", "key1,key"));
+ StringUtils.appendToCommaSplittableTextIfNotExists("key", "key1,key"));
assertEquals("in 3 elements at position 2", "key1,key,key3",
- StringUtils.appendToCsvIfNotExists("key", "key1,key,key3"));
+ StringUtils.appendToCommaSplittableTextIfNotExists("key", "key1,key,key3"));
}
- public void testRemoveFromCsvIfExists() {
- assertEquals("null", "", StringUtils.removeFromCsvIfExists("key", null));
- assertEquals("empty", "", StringUtils.removeFromCsvIfExists("key", ""));
+ public void testRemoveFromExtraValuesIfExists() {
+ assertEquals("null", "", StringUtils.removeFromCommaSplittableTextIfExists("key", null));
+ assertEquals("empty", "", StringUtils.removeFromCommaSplittableTextIfExists("key", ""));
assertEquals("not in 1 element", "key1",
- StringUtils.removeFromCsvIfExists("key", "key1"));
+ StringUtils.removeFromCommaSplittableTextIfExists("key", "key1"));
assertEquals("not in 2 elements", "key1,key2",
- StringUtils.removeFromCsvIfExists("key", "key1,key2"));
+ StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key2"));
assertEquals("in 1 element", "",
- StringUtils.removeFromCsvIfExists("key", "key"));
+ StringUtils.removeFromCommaSplittableTextIfExists("key", "key"));
assertEquals("in 2 elements at position 1", "key2",
- StringUtils.removeFromCsvIfExists("key", "key,key2"));
+ StringUtils.removeFromCommaSplittableTextIfExists("key", "key,key2"));
assertEquals("in 2 elements at position 2", "key1",
- StringUtils.removeFromCsvIfExists("key", "key1,key"));
+ StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key"));
assertEquals("in 3 elements at position 2", "key1,key3",
- StringUtils.removeFromCsvIfExists("key", "key1,key,key3"));
+ StringUtils.removeFromCommaSplittableTextIfExists("key", "key1,key,key3"));
assertEquals("in 3 elements at position 1,2,3", "",
- StringUtils.removeFromCsvIfExists("key", "key,key,key"));
+ StringUtils.removeFromCommaSplittableTextIfExists("key", "key,key,key"));
assertEquals("in 5 elements at position 2,4", "key1,key3,key5",
- StringUtils.removeFromCsvIfExists("key", "key1,key,key3,key,key5"));
+ StringUtils.removeFromCommaSplittableTextIfExists(
+ "key", "key1,key,key3,key,key5"));
}
diff --git a/tests/src/com/android/inputmethod/latin/utils/Base64ReaderTests.java b/tests/src/com/android/inputmethod/latin/utils/Base64ReaderTests.java
new file mode 100644
index 000000000..b311f5d37
--- /dev/null
+++ b/tests/src/com/android/inputmethod/latin/utils/Base64ReaderTests.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2013 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.inputmethod.latin.utils;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.StringReader;
+
+@SmallTest
+public class Base64ReaderTests extends AndroidTestCase {
+ private static final String EMPTY_STRING = "";
+ private static final String INCOMPLETE_CHAR1 = "Q";
+ // Encode 'A'.
+ private static final String INCOMPLETE_CHAR2 = "QQ";
+ // Encode 'A', 'B'
+ private static final String INCOMPLETE_CHAR3 = "QUI";
+ // Encode 'A', 'B', 'C'
+ private static final String COMPLETE_CHAR4 = "QUJD";
+ private static final String ALL_BYTE_PATTERN =
+ "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj\n"
+ + "JCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZH\n"
+ + "SElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWpr\n"
+ + "bG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P\n"
+ + "kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKz\n"
+ + "tLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX\n"
+ + "2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7\n"
+ + "/P3+/w==";
+
+ public void test0CharInt8() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(EMPTY_STRING)));
+ try {
+ reader.readUint8();
+ fail("0 char");
+ } catch (final EOFException e) {
+ assertEquals("0 char", 0, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test1CharInt8() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(INCOMPLETE_CHAR1)));
+ try {
+ reader.readUint8();
+ fail("1 char");
+ } catch (final EOFException e) {
+ assertEquals("1 char", 0, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test2CharsInt8() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(INCOMPLETE_CHAR2)));
+ try {
+ final int v1 = reader.readUint8();
+ assertEquals("2 chars pos 0", 'A', v1);
+ reader.readUint8();
+ fail("2 chars");
+ } catch (final EOFException e) {
+ assertEquals("2 chars", 1, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test3CharsInt8() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(INCOMPLETE_CHAR3)));
+ try {
+ final int v1 = reader.readUint8();
+ assertEquals("3 chars pos 0", 'A', v1);
+ final int v2 = reader.readUint8();
+ assertEquals("3 chars pos 1", 'B', v2);
+ reader.readUint8();
+ fail("3 chars");
+ } catch (final EOFException e) {
+ assertEquals("3 chars", 2, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test4CharsInt8() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(COMPLETE_CHAR4)));
+ try {
+ final int v1 = reader.readUint8();
+ assertEquals("4 chars pos 0", 'A', v1);
+ final int v2 = reader.readUint8();
+ assertEquals("4 chars pos 1", 'B', v2);
+ final int v3 = reader.readUint8();
+ assertEquals("4 chars pos 2", 'C', v3);
+ reader.readUint8();
+ fail("4 chars");
+ } catch (final EOFException e) {
+ assertEquals("4 chars", 3, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void testAllBytePatternInt8() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(ALL_BYTE_PATTERN)));
+ try {
+ for (int i = 0; i <= 0xff; i++) {
+ final int v = reader.readUint8();
+ assertEquals("value: all byte pattern: pos " + i, i, v);
+ assertEquals("count: all byte pattern: pos " + i, i + 1, reader.getByteCount());
+ }
+ } catch (final EOFException e) {
+ assertEquals("all byte pattern", 256, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test0CharInt16() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(EMPTY_STRING)));
+ try {
+ reader.readInt16();
+ fail("0 char");
+ } catch (final EOFException e) {
+ assertEquals("0 char", 0, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test1CharInt16() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(INCOMPLETE_CHAR1)));
+ try {
+ reader.readInt16();
+ fail("1 char");
+ } catch (final EOFException e) {
+ assertEquals("1 char", 0, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test2CharsInt16() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(INCOMPLETE_CHAR2)));
+ try {
+ reader.readInt16();
+ fail("2 chars");
+ } catch (final EOFException e) {
+ assertEquals("2 chars", 1, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test3CharsInt16() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(INCOMPLETE_CHAR3)));
+ try {
+ final short v1 = reader.readInt16();
+ assertEquals("3 chars pos 0", 'A' << 8 | 'B', v1);
+ reader.readInt16();
+ fail("3 chars");
+ } catch (final EOFException e) {
+ assertEquals("3 chars", 2, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void test4CharsInt16() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(COMPLETE_CHAR4)));
+ try {
+ final short v1 = reader.readInt16();
+ assertEquals("4 chars pos 0", 'A' << 8 | 'B', v1);
+ reader.readInt16();
+ fail("4 chars");
+ } catch (final EOFException e) {
+ assertEquals("4 chars", 3, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+
+ public void testAllBytePatternInt16() {
+ final Base64Reader reader = new Base64Reader(
+ new LineNumberReader(new StringReader(ALL_BYTE_PATTERN)));
+ try {
+ for (int i = 0; i <= 0xff; i += 2) {
+ final short v = reader.readInt16();
+ final short expected = (short)(i << 8 | (i + 1));
+ assertEquals("value: all byte pattern: pos " + i, expected, v);
+ assertEquals("count: all byte pattern: pos " + i, i + 2, reader.getByteCount());
+ }
+ } catch (final EOFException e) {
+ assertEquals("all byte pattern", 256, reader.getByteCount());
+ } catch (final IOException e) {
+ fail("IOException: " + e);
+ }
+ }
+}
diff --git a/tests/src/com/android/inputmethod/latin/utils/CsvUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/CsvUtilsTests.java
new file mode 100644
index 000000000..a0fa8fe4b
--- /dev/null
+++ b/tests/src/com/android/inputmethod/latin/utils/CsvUtilsTests.java
@@ -0,0 +1,424 @@
+/*
+ * Copyright (C) 2013 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.inputmethod.latin.utils;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.inputmethod.latin.utils.CsvUtils.CsvParseException;
+
+import java.util.Arrays;
+
+@SmallTest
+public class CsvUtilsTests extends AndroidTestCase {
+ public void testUnescape() {
+ assertEquals("", CsvUtils.unescapeField(""));
+ assertEquals("text", CsvUtils.unescapeField("text")); // text
+ assertEquals("", CsvUtils.unescapeField("\"\"")); // ""
+ assertEquals("\"", CsvUtils.unescapeField("\"\"\"\"")); // """" -> "
+ assertEquals("text", CsvUtils.unescapeField("\"text\"")); // "text" -> text
+ assertEquals("\"text", CsvUtils.unescapeField("\"\"\"text\"")); // """text" -> "text
+ assertEquals("text\"", CsvUtils.unescapeField("\"text\"\"\"")); // "text""" -> text"
+ assertEquals("te\"xt", CsvUtils.unescapeField("\"te\"\"xt\"")); // "te""xt" -> te"xt
+ assertEquals("\"text\"",
+ CsvUtils.unescapeField("\"\"\"text\"\"\"")); // """text""" -> "text"
+ assertEquals("t\"e\"x\"t",
+ CsvUtils.unescapeField("\"t\"\"e\"\"x\"\"t\"")); // "t""e""x""t" -> t"e"x"t
+ }
+
+ public void testUnescapeException() {
+ try {
+ final String text = CsvUtils.unescapeField("\""); // "
+ fail("Unterminated quote: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\"\"\""); // """
+ fail("Unterminated quote: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\"\"\"\"\""); // """""
+ fail("Unterminated quote: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\"text"); // "text
+ fail("Unterminated quote: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("text\""); // text"
+ fail("Raw quote in text: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in text", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("te\"xt"); // te"xt
+ fail("Raw quote in text: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in text", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\"\"text"); // ""text
+ fail("Raw quote in quoted text: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in quoted text", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("text\"\""); // text""
+ fail("Escaped quote in text: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Escaped quote in text", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("te\"\"xt"); // te""xt
+ fail("Escaped quote in text: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Escaped quote in text", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\"\"text\""); // ""text"
+ fail("Raw quote in quoted text: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in quoted text", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\"text\"\""); // "text""
+ fail("Unterminated quote: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\"te\"xt\""); // "te"xt"
+ fail("Raw quote in quoted text: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in quoted text", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\"b,c"); // "b,c
+ fail("Unterminated quote: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String text = CsvUtils.unescapeField("\",\"a\""); // ","a"
+ fail("Raw quote in quoted text: text=" + text);
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in quoted text", success.getMessage());
+ }
+ }
+
+ private static <T> void assertArrayEquals(final T[] expected, final T[] actual) {
+ if (expected == actual) {
+ return;
+ }
+ if (expected == null || actual == null) {
+ assertEquals(Arrays.toString(expected), Arrays.toString(actual));
+ return;
+ }
+ if (expected.length != actual.length) {
+ assertEquals("[length]", Arrays.toString(expected), Arrays.toString(actual));
+ return;
+ }
+ for (int i = 0; i < expected.length; i++) {
+ final T e = expected[i];
+ final T a = actual[i];
+ if (e == a) {
+ continue;
+ }
+ assertEquals("["+i+"]", expected[i], actual[i]);
+ }
+ }
+
+ public void testSplit() {
+ assertArrayEquals(new String[]{""}, CsvUtils.split(""));
+ assertArrayEquals(new String[]{" "}, CsvUtils.split(" "));
+ assertArrayEquals(new String[]{"text"}, CsvUtils.split("text"));
+ assertArrayEquals(new String[]{" a b "}, CsvUtils.split(" a b "));
+
+ assertArrayEquals(new String[]{"", ""}, CsvUtils.split(","));
+ assertArrayEquals(new String[]{"", "", ""}, CsvUtils.split(",,"));
+ assertArrayEquals(new String[]{" ", " "}, CsvUtils.split(" , "));
+ assertArrayEquals(new String[]{" ", " ", " "}, CsvUtils.split(" , , "));
+ assertArrayEquals(new String[]{"a", "b"}, CsvUtils.split("a,b"));
+ assertArrayEquals(new String[]{" a ", " b "}, CsvUtils.split(" a , b "));
+
+ assertArrayEquals(new String[]{"text"},
+ CsvUtils.split("\"text\"")); // "text"
+ assertArrayEquals(new String[]{" text "},
+ CsvUtils.split("\" text \"")); // "_text_"
+
+ assertArrayEquals(new String[]{""},
+ CsvUtils.split("\"\"")); // ""
+ assertArrayEquals(new String[]{"\""},
+ CsvUtils.split("\"\"\"\"")); // """"
+ assertArrayEquals(new String[]{"", ""},
+ CsvUtils.split("\"\",\"\"")); // "",""
+ assertArrayEquals(new String[]{"\",\""},
+ CsvUtils.split("\"\"\",\"\"\"")); // ""","""
+ assertArrayEquals(new String[]{"\"", "\""},
+ CsvUtils.split("\"\"\"\",\"\"\"\"")); // """",""""
+ assertArrayEquals(new String[]{"\"", "\",\""},
+ CsvUtils.split("\"\"\"\",\"\"\",\"\"\"")); // """",""","""
+ assertArrayEquals(new String[]{"\",\"", "\""},
+ CsvUtils.split("\"\"\",\"\"\",\"\"\"\"")); // """,""",""""
+
+ assertArrayEquals(new String[]{" a ", " b , c "},
+ CsvUtils.split(" a ,\" b , c \"")); // _a_,"_b_,_c_"
+ assertArrayEquals(new String[]{" a ", " b , c ", " d "},
+ CsvUtils.split(" a ,\" b , c \", d ")); // _a_,"_b_,_c_",_d_
+ }
+
+ public void testSplitException() {
+ try {
+ final String[] fields = CsvUtils.split(" \"text\" "); // _"text"_
+ fail("Raw quote in text: fields=" + Arrays.toString(fields));
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in text", success.getMessage());
+ }
+ try {
+ final String[] fields = CsvUtils.split(" \" text \" "); // _"_text_"_
+ fail("Raw quote in text: fields=" + Arrays.toString(fields));
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in text", success.getMessage());
+ }
+
+ try {
+ final String[] fields = CsvUtils.split("a,\"b,"); // a,",b
+ fail("Unterminated quote: fields=" + Arrays.toString(fields));
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String[] fields = CsvUtils.split("a,\"\"\",b"); // a,""",b
+ fail("Unterminated quote: fields=" + Arrays.toString(fields));
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String[] fields = CsvUtils.split("a,\"\"\"\"\",b"); // a,""""",b
+ fail("Unterminated quote: fields=" + Arrays.toString(fields));
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String[] fields = CsvUtils.split("a,\"b,c"); // a,"b,c
+ fail("Unterminated quote: fields=" + Arrays.toString(fields));
+ } catch (final CsvParseException success) {
+ assertEquals("Unterminated quote", success.getMessage());
+ }
+ try {
+ final String[] fields = CsvUtils.split("a,\",\"b,c"); // a,","b,c
+ fail("Raw quote in quoted text: fields=" + Arrays.toString(fields));
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in quoted text", success.getMessage());
+ }
+ try {
+ final String[] fields = CsvUtils.split("a,\",\"b\",\",c"); // a,","b",",c
+ fail("Raw quote in quoted text: fields=" + Arrays.toString(fields));
+ } catch (final CsvParseException success) {
+ assertEquals("Raw quote in quoted text", success.getMessage());
+ }
+ }
+
+ public void testSplitWithTrimSpaces() {
+ final int trimSpaces = CsvUtils.SPLIT_FLAGS_TRIM_SPACES;
+ assertArrayEquals(new String[]{""}, CsvUtils.split(trimSpaces, ""));
+ assertArrayEquals(new String[]{""}, CsvUtils.split(trimSpaces, " "));
+ assertArrayEquals(new String[]{"text"}, CsvUtils.split(trimSpaces, "text"));
+ assertArrayEquals(new String[]{"a b"}, CsvUtils.split(trimSpaces, " a b "));
+
+ assertArrayEquals(new String[]{"", ""}, CsvUtils.split(trimSpaces, ","));
+ assertArrayEquals(new String[]{"", "", ""}, CsvUtils.split(trimSpaces, ",,"));
+ assertArrayEquals(new String[]{"", ""}, CsvUtils.split(trimSpaces, " , "));
+ assertArrayEquals(new String[]{"", "", ""}, CsvUtils.split(trimSpaces, " , , "));
+ assertArrayEquals(new String[]{"a", "b"}, CsvUtils.split(trimSpaces, "a,b"));
+ assertArrayEquals(new String[]{"a", "b"}, CsvUtils.split(trimSpaces, " a , b "));
+
+ assertArrayEquals(new String[]{"text"},
+ CsvUtils.split(trimSpaces, "\"text\"")); // "text"
+ assertArrayEquals(new String[]{"text"},
+ CsvUtils.split(trimSpaces, " \"text\" ")); // _"text"_
+ assertArrayEquals(new String[]{" text "},
+ CsvUtils.split(trimSpaces, "\" text \"")); // "_text_"
+ assertArrayEquals(new String[]{" text "},
+ CsvUtils.split(trimSpaces, " \" text \" ")); // _"_text_"_
+ assertArrayEquals(new String[]{"a", "b"},
+ CsvUtils.split(trimSpaces, " \"a\" , \"b\" ")); // _"a"_,_"b"_
+
+ assertArrayEquals(new String[]{""},
+ CsvUtils.split(trimSpaces, " \"\" ")); // _""_
+ assertArrayEquals(new String[]{"\""},
+ CsvUtils.split(trimSpaces, " \"\"\"\" ")); // _""""_
+ assertArrayEquals(new String[]{"", ""},
+ CsvUtils.split(trimSpaces, " \"\" , \"\" ")); // _""_,_""_
+ assertArrayEquals(new String[]{"\" , \""},
+ CsvUtils.split(trimSpaces, " \"\"\" , \"\"\" ")); // _"""_,_"""_
+ assertArrayEquals(new String[]{"\"", "\""},
+ CsvUtils.split(trimSpaces, " \"\"\"\" , \"\"\"\" ")); // _""""_,_""""_
+ assertArrayEquals(new String[]{"\"", "\" , \""},
+ CsvUtils.split(trimSpaces, " \"\"\"\" , \"\"\" , \"\"\" ")); // _""""_,_"""_,_"""_
+ assertArrayEquals(new String[]{"\" , \"", "\""},
+ CsvUtils.split(trimSpaces, " \"\"\" , \"\"\" , \"\"\"\" ")); // _"""_,_"""_,_""""_
+
+ assertArrayEquals(new String[]{"a", " b , c "},
+ CsvUtils.split(trimSpaces, " a , \" b , c \" ")); // _a_,_"_b_,_c_"_
+ assertArrayEquals(new String[]{"a", " b , c ", "d"},
+ CsvUtils.split(trimSpaces, " a, \" b , c \" , d ")); // _a,_"_b_,_c_"_,_d_
+ }
+
+ public void testEscape() {
+ assertEquals("", CsvUtils.escapeField("", false));
+ assertEquals("plain", CsvUtils.escapeField("plain", false));
+ assertEquals(" ", CsvUtils.escapeField(" ", false));
+ assertEquals(" ", CsvUtils.escapeField(" ", false));
+ assertEquals("a space", CsvUtils.escapeField("a space", false));
+ assertEquals(" space-at-start", CsvUtils.escapeField(" space-at-start", false));
+ assertEquals("space-at-end ", CsvUtils.escapeField("space-at-end ", false));
+ assertEquals("a lot of spaces", CsvUtils.escapeField("a lot of spaces", false));
+ assertEquals("\",\"", CsvUtils.escapeField(",", false));
+ assertEquals("\",,\"", CsvUtils.escapeField(",,", false));
+ assertEquals("\"a,comma\"", CsvUtils.escapeField("a,comma", false));
+ assertEquals("\",comma-at-begin\"", CsvUtils.escapeField(",comma-at-begin", false));
+ assertEquals("\"comma-at-end,\"", CsvUtils.escapeField("comma-at-end,", false));
+ assertEquals("\",,a,lot,,,of,commas,,\"",
+ CsvUtils.escapeField(",,a,lot,,,of,commas,,", false));
+ assertEquals("\"a comma,and a space\"", CsvUtils.escapeField("a comma,and a space", false));
+ assertEquals("\"\"\"\"", CsvUtils.escapeField("\"", false)); // " -> """"
+ assertEquals("\"\"\"\"\"\"", CsvUtils.escapeField("\"\"", false)); // "" -> """"""
+ assertEquals("\"\"\"\"\"\"\"\"", CsvUtils.escapeField("\"\"\"", false)); // """ -> """"""""
+ assertEquals("\"\"\"text\"\"\"",
+ CsvUtils.escapeField("\"text\"", false)); // "text" -> """text"""
+ assertEquals("\"text has \"\" in middle\"",
+ CsvUtils.escapeField("text has \" in middle", false));
+ assertEquals("\"\"\"quote,at begin\"", CsvUtils.escapeField("\"quote,at begin", false));
+ assertEquals("\"quote at,end\"\"\"", CsvUtils.escapeField("quote at,end\"", false));
+ assertEquals("\"\"\"quote at begin\"", CsvUtils.escapeField("\"quote at begin", false));
+ assertEquals("\"quote at end\"\"\"", CsvUtils.escapeField("quote at end\"", false));
+ }
+
+ public void testEscapeWithAlwaysQuoted() {
+ assertEquals("\"\"", CsvUtils.escapeField("", true));
+ assertEquals("\"plain\"", CsvUtils.escapeField("plain", true));
+ assertEquals("\" \"", CsvUtils.escapeField(" ", true));
+ assertEquals("\" \"", CsvUtils.escapeField(" ", true));
+ assertEquals("\"a space\"", CsvUtils.escapeField("a space", true));
+ assertEquals("\" space-at-start\"", CsvUtils.escapeField(" space-at-start", true));
+ assertEquals("\"space-at-end \"", CsvUtils.escapeField("space-at-end ", true));
+ assertEquals("\"a lot of spaces\"", CsvUtils.escapeField("a lot of spaces", true));
+ assertEquals("\",\"", CsvUtils.escapeField(",", true));
+ assertEquals("\",,\"", CsvUtils.escapeField(",,", true));
+ assertEquals("\"a,comma\"", CsvUtils.escapeField("a,comma", true));
+ assertEquals("\",comma-at-begin\"", CsvUtils.escapeField(",comma-at-begin", true));
+ assertEquals("\"comma-at-end,\"", CsvUtils.escapeField("comma-at-end,", true));
+ assertEquals("\",,a,lot,,,of,commas,,\"",
+ CsvUtils.escapeField(",,a,lot,,,of,commas,,", true));
+ assertEquals("\"a comma,and a space\"", CsvUtils.escapeField("a comma,and a space", true));
+ assertEquals("\"\"\"\"", CsvUtils.escapeField("\"", true)); // " -> """"
+ assertEquals("\"\"\"\"\"\"", CsvUtils.escapeField("\"\"", true)); // "" -> """"""
+ assertEquals("\"\"\"\"\"\"\"\"", CsvUtils.escapeField("\"\"\"", true)); // """ -> """"""""
+ assertEquals("\"\"\"text\"\"\"",
+ CsvUtils.escapeField("\"text\"", true)); // "text" -> """text"""
+ assertEquals("\"text has \"\" in middle\"",
+ CsvUtils.escapeField("text has \" in middle", true));
+ assertEquals("\"\"\"quote,at begin\"", CsvUtils.escapeField("\"quote,at begin", true));
+ assertEquals("\"quote at,end\"\"\"", CsvUtils.escapeField("quote at,end\"", true));
+ assertEquals("\"\"\"quote at begin\"", CsvUtils.escapeField("\"quote at begin", true));
+ assertEquals("\"quote at end\"\"\"", CsvUtils.escapeField("quote at end\"", true));
+ }
+
+ public void testJoinWithoutColumnPositions() {
+ assertEquals("", CsvUtils.join());
+ assertEquals("", CsvUtils.join(""));
+ assertEquals(",", CsvUtils.join("", ""));
+
+ assertEquals("text, text,text ",
+ CsvUtils.join("text", " text", "text "));
+ assertEquals("\"\"\"\",\"\"\"\"\"\",\"\"\"text\"\"\"",
+ CsvUtils.join("\"", "\"\"", "\"text\""));
+ assertEquals("a b,\"c,d\",\"e\"\"f\"",
+ CsvUtils.join("a b", "c,d", "e\"f"));
+ }
+
+ public void testJoinWithoutColumnPositionsWithExtraSpace() {
+ final int extraSpace = CsvUtils.JOIN_FLAGS_EXTRA_SPACE;
+ assertEquals("", CsvUtils.join(extraSpace));
+ assertEquals("", CsvUtils.join(extraSpace, ""));
+ assertEquals(", ", CsvUtils.join(extraSpace, "", ""));
+
+ assertEquals("text, text, text ",
+ CsvUtils.join(extraSpace, "text", " text", "text "));
+ // ","","text" -> """","""""","""text"""
+ assertEquals("\"\"\"\", \"\"\"\"\"\", \"\"\"text\"\"\"",
+ CsvUtils.join(extraSpace, "\"", "\"\"", "\"text\""));
+ assertEquals("a b, \"c,d\", \"e\"\"f\"",
+ CsvUtils.join(extraSpace, "a b", "c,d", "e\"f"));
+ }
+
+ public void testJoinWithoutColumnPositionsWithExtraSpaceAndAlwaysQuoted() {
+ final int extrSpaceAndQuoted =
+ CsvUtils.JOIN_FLAGS_EXTRA_SPACE | CsvUtils.JOIN_FLAGS_ALWAYS_QUOTED;
+ assertEquals("", CsvUtils.join(extrSpaceAndQuoted));
+ assertEquals("\"\"", CsvUtils.join(extrSpaceAndQuoted, ""));
+ assertEquals("\"\", \"\"", CsvUtils.join(extrSpaceAndQuoted, "", ""));
+
+ assertEquals("\"text\", \" text\", \"text \"",
+ CsvUtils.join(extrSpaceAndQuoted, "text", " text", "text "));
+ // ","","text" -> """", """""", """text"""
+ assertEquals("\"\"\"\", \"\"\"\"\"\", \"\"\"text\"\"\"",
+ CsvUtils.join(extrSpaceAndQuoted, "\"", "\"\"", "\"text\""));
+ assertEquals("\"a b\", \"c,d\", \"e\"\"f\"",
+ CsvUtils.join(extrSpaceAndQuoted, "a b", "c,d", "e\"f"));
+ }
+
+ public void testJoinWithColumnPositions() {
+ final int noFlags = CsvUtils.JOIN_FLAGS_NONE;
+ assertEquals("", CsvUtils.join(noFlags, new int[]{}));
+ assertEquals(" ", CsvUtils.join(noFlags, new int[]{3}, ""));
+ assertEquals(" ,", CsvUtils.join(noFlags, new int[]{1}, "", ""));
+ assertEquals(", ", CsvUtils.join(noFlags, new int[]{0, 3}, "", ""));
+
+ assertEquals("text, text, text ",
+ CsvUtils.join(noFlags, new int[]{0, 8, 15}, "text", " text", "text "));
+ // ","","text" -> """", """""","""text"""
+ assertEquals("\"\"\"\", \"\"\"\"\"\",\"\"\"text\"\"\"",
+ CsvUtils.join(noFlags, new int[]{0, 8, 15}, "\"", "\"\"", "\"text\""));
+ assertEquals("a b, \"c,d\", \"e\"\"f\"",
+ CsvUtils.join(noFlags, new int[]{0, 8, 15}, "a b", "c,d", "e\"f"));
+ }
+
+ public void testJoinWithColumnPositionsWithExtraSpace() {
+ final int extraSpace = CsvUtils.JOIN_FLAGS_EXTRA_SPACE;
+ assertEquals("", CsvUtils.join(extraSpace, new int[]{}));
+ assertEquals(" ", CsvUtils.join(extraSpace, new int[]{3}, ""));
+ assertEquals(" , ", CsvUtils.join(extraSpace, new int[]{1}, "", ""));
+ assertEquals(", ", CsvUtils.join(extraSpace, new int[]{0, 3}, "", ""));
+
+ assertEquals("text, text, text ",
+ CsvUtils.join(extraSpace, new int[]{0, 8, 15}, "text", " text", "text "));
+ // ","","text" -> """", """""", """text"""
+ assertEquals("\"\"\"\", \"\"\"\"\"\", \"\"\"text\"\"\"",
+ CsvUtils.join(extraSpace, new int[]{0, 8, 15}, "\"", "\"\"", "\"text\""));
+ assertEquals("a b, \"c,d\", \"e\"\"f\"",
+ CsvUtils.join(extraSpace, new int[]{0, 8, 15}, "a b", "c,d", "e\"f"));
+ }
+}