/*
* ====================
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008-2009 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License("CDDL") (the "License"). You may not use this file
* except in compliance with the License.
*
* You can obtain a copy of the License at
* http://opensource.org/licenses/cddl1.php
* See the License for the specific language governing permissions and limitations
* under the License.
*
* When distributing the Covered Code, include this CDDL Header Notice in each file
* and include the License file at http://opensource.org/licenses/cddl1.php.
* If applicable, add the following below this CDDL Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
* ====================
*/
package org.identityconnectors.common;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import org.testng.annotations.Test;
public class StringUtilTests {
// ========================================================================
// JUnit Tests
// ========================================================================
/**
*/
@Test
public void testIndexOfDigit() {
int test = 0;
final String TEST0 = null;
final String TEST1 = "fsadlkjffj";
final String TEST2 = "abac2dafj";
final String TEST3 = "fa323jf4af";
test = StringUtil.indexOfDigit(TEST0);
assertEquals(test, -1);
test = StringUtil.indexOfDigit(TEST1);
assertEquals(test, -1);
test = StringUtil.indexOfDigit(TEST2);
assertEquals(test, 4);
test = StringUtil.indexOfDigit(TEST3);
assertEquals(test, 2);
}
/**
*/
@Test
public void testIndexOfNonDigit() {
int test = 0;
final String TEST0 = null;
final String TEST1 = "2131398750976";
final String TEST2 = "21312a9320484";
final String TEST3 = "32323aa323435";
test = StringUtil.indexOfNonDigit(TEST0);
assertEquals(test, -1);
test = StringUtil.indexOfNonDigit(TEST1);
assertEquals(test, -1);
test = StringUtil.indexOfNonDigit(TEST2);
assertEquals(test, 5);
test = StringUtil.indexOfNonDigit(TEST3);
assertEquals(test, 5);
}
/**
*/
@Test
public void testSubDigitString() {
}
/**
*/
@Test
public void testStripXmlAttribute() {
final String DATA[][] = {
// source, attr, result
{ null, null, null },
{ "attr='fads'", "attr", "" },
{ "at1='fasd' at1=''", "at1", "" }
};
String tst = null;
for (int i = 0; i < DATA.length; i++) {
tst = StringUtil.stripXmlAttribute(DATA[i][0], DATA[i][1]);
assertEquals(tst, DATA[i][2]);
}
}
/**
* Make sure it removes '\n'.
*/
@Test
public void testStripNewlines() {
final String[][] TESTS = new String[][] { { null, null },
{ "afdslf\n", "afdslf" }, { "afds\nfadkfj", "afdsfadkfj" },
{ "afds \nfadkfj", "afds fadkfj" },
{ "afds\n fadkfj", "afds fadkfj" } };
String tmp;
for (String[] data : TESTS) {
tmp = StringUtil.stripNewlines(data[0]);
assertEquals(tmp, data[1]);
}
}
/**
*/
@Test
public void testStripXmlComments() {
final String DATA[][] = {
// test data -> result
{ null, null }, { "<!--test1-->", "" },
{ "test data", "test data" },
{ "<!--test data", "<!--test data" },
{ "test data-->", "test data-->" },
{ "test data <!-- fasdkfj -->", "test data " },
{ "<!-- fasdkfj --> test data", " test data" },
{ "<!-- fasdkfj --> test data<!-- fadsom-->", " test data" } };
String tst = null;
for (int i = 0; i < DATA.length; i++) {
tst = StringUtil.stripXmlComments(DATA[i][0]);
assertEquals(tst, DATA[i][1]);
}
}
@Test
public void testIsEmpty() {
assertTrue(StringUtil.isEmpty(null));
assertTrue(StringUtil.isEmpty(""));
assertFalse(StringUtil.isEmpty(" "));
assertFalse(StringUtil.isEmpty("bob"));
assertFalse(StringUtil.isEmpty(" bob "));
}
@Test
public void testIsBlank() {
assertTrue(StringUtil.isBlank(null));
assertTrue(StringUtil.isBlank(""));
assertTrue(StringUtil.isBlank(" "));
assertFalse(StringUtil.isBlank("bob"));
assertFalse(StringUtil.isBlank(" bob "));
}
@Test
public void testIsNotEmpty() {
assertFalse(StringUtil.isNotEmpty(null));
assertFalse(StringUtil.isNotEmpty(""));
assertTrue(StringUtil.isNotEmpty(" "));
assertTrue(StringUtil.isNotEmpty("bob"));
assertTrue(StringUtil.isNotEmpty(" bob "));
}
@Test
public void testIsNotBlank() {
assertFalse(StringUtil.isNotBlank(null));
assertFalse(StringUtil.isNotBlank(""));
assertFalse(StringUtil.isNotBlank(" "));
assertTrue(StringUtil.isNotBlank("bob"));
assertTrue(StringUtil.isNotBlank(" bob "));
}
private static final String TEMPLATE = "StringUtilTests_template.js";
private static final String PAUSE_TEXT = "pause.text";
private static final String RESUME_TEXT = "resume.text";
private static final String REFRESH_TIME = "refresh.time";
private static final String GRAPH_IDS = "graphs";
@Test
public void testReplaceVariables() {
// test using the following template..
Map<String, String> vars = new HashMap<String, String>();
vars.put(PAUSE_TEXT, "PAUSE");
vars.put(REFRESH_TIME, "5");
vars.put(RESUME_TEXT, "RESUME");
vars.put(GRAPH_IDS, "1,2,4345");
String tmpl = IOUtil.getResourceAsString(getClass(), TEMPLATE);
for (Map.Entry<String, String> entry : vars.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
tmpl = StringUtil.replaceVariable(tmpl, key, value);
assertTrue(tmpl.indexOf(value) != -1);
}
}
/**
* Tests the {@link StringUtil#isWhitespace(char)} method.
*/
@Test
public void testWhtiespace() {
assertTrue(StringUtil.isWhitespace(' '));
assertTrue(StringUtil.isWhitespace('\t'));
assertFalse(StringUtil.isWhitespace('\n'));
assertFalse(StringUtil.isWhitespace('\r'));
for (char i = 'a'; i < 'Z'; i++) {
assertFalse(StringUtil.isWhitespace(i));
}
}
final char TEXTQ = '"';
final char FEILDD = ',';
/**
* Tests the {@link StringUtil#parseLine(String, char, char)} method.
*/
@Test
public void testParseLine() {
List<Object> values;
values = CollectionUtil.<Object> newReadOnlyList("bob", "george", 4, 23, 230948);
parseLineTest(TEXTQ, FEILDD, values);
}
@Test
public void testRandomParseLine() {
// try random stuff..
final Random r = new Random(17);
final char[] replace = new char[] { TEXTQ, FEILDD };
for (int i = 0; i < 100; i++) {
final List<Object> values = randomList(r, 10, replace, 'a');
parseLineTest(TEXTQ, FEILDD, values);
}
}
/**
* Tests the {@link StringUtil#parseLine(String, char, char)} methods on the
* arguments provided.
*/
static void parseLineTest(final char textQ, final char fieldD, final List<Object> values) {
String csv = createCSVLine(textQ, fieldD, values);
List<String> parsedValues = StringUtil.parseLine(csv, fieldD, textQ);
assertEquals(parsedValues, toStringList(values));
}
/**
* Create a CSV line based on the values provided.
*/
static String createCSVLine(final char textQ, final char fieldD, final List<Object> values) {
StringBuilder bld = new StringBuilder();
boolean first = true;
for (Object o : values) {
// apply field delimiter..
if (first) {
first = false;
} else {
bld.append(fieldD);
}
// if its a string add the text qualifiers..
// don't bother escape text qualifiers in the string yet..
if (o instanceof String) {
bld.append(textQ);
}
bld.append(o);
if (o instanceof String) {
bld.append(textQ);
}
}
return bld.toString();
}
/**
* Converts a {@link List} of objects to a {@link List} of {@link String}s.
*/
static List<String> toStringList(final List<Object> list) {
List<String> ret = new ArrayList<String>();
for (Object o : list) {
ret.add(o.toString());
}
return ret;
}
static List<Object> randomList(final Random r, final int size, final char[] invalid,
final char valid) {
List<Object> ret = new ArrayList<Object>();
for (int i = 0; i < size; i++) {
final Object add;
if (r.nextBoolean()) {
add = r.nextInt();
} else if (r.nextBoolean()) {
add = r.nextDouble();
} else {
String str = StringUtil.randomString(r, r.nextInt(30));
for (char c : invalid) {
// replace all w/ 'a'..
str = str.replace(c, valid);
}
add = str;
}
ret.add(add);
}
return ret;
}
@Test
public void testRandomString() {
// just execute it because it doesn't really matter..
String s = StringUtil.randomString();
assertTrue(s.length() < 257);
}
@Test
public void testEndsWith() {
assertTrue(StringUtil.endsWith("afdsf", 'f'));
assertFalse(StringUtil.endsWith(null, 'f'));
assertFalse(StringUtil.endsWith("fadsfkj", 'f'));
}
private static final String PROP_TEST[] = {
"# Some comment",
"prop1=SomeProp",
"prop2=OtherProp"
};
@Test
public void testToProperties() {
StringPrintWriter wrt = new StringPrintWriter();
wrt.println(PROP_TEST);
wrt.flush();
String inp = wrt.getString();
Properties prop = StringUtil.toProperties(inp);
assertEquals(prop.get("prop1"), "SomeProp");
assertEquals(prop.get("prop2"), "OtherProp");
}
}