aboutsummaryrefslogtreecommitdiff
path: root/velocity-engine-core/src/test/java/org/apache/velocity/io/UnicodeInputStreamTestCase.java
diff options
context:
space:
mode:
Diffstat (limited to 'velocity-engine-core/src/test/java/org/apache/velocity/io/UnicodeInputStreamTestCase.java')
-rw-r--r--velocity-engine-core/src/test/java/org/apache/velocity/io/UnicodeInputStreamTestCase.java239
1 files changed, 239 insertions, 0 deletions
diff --git a/velocity-engine-core/src/test/java/org/apache/velocity/io/UnicodeInputStreamTestCase.java b/velocity-engine-core/src/test/java/org/apache/velocity/io/UnicodeInputStreamTestCase.java
new file mode 100644
index 00000000..68c10842
--- /dev/null
+++ b/velocity-engine-core/src/test/java/org/apache/velocity/io/UnicodeInputStreamTestCase.java
@@ -0,0 +1,239 @@
+package org.apache.velocity.io;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.apache.commons.lang3.ArrayUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+
+/**
+ * Test the UnicodeInputStream.
+ *
+ * @author $author$
+ * @version $Revision$, $Date$
+ */
+public class UnicodeInputStreamTestCase
+ extends TestCase
+{
+
+ public UnicodeInputStreamTestCase(final String name)
+ {
+ super(name);
+ }
+
+ public static Test suite()
+ {
+ return new TestSuite(UnicodeInputStreamTestCase.class);
+ }
+
+ public void testSimpleStream()
+ throws Exception
+ {
+ testRun(null, "Ich bin zwei Oeltanks", "US-ASCII", true);
+ testRun(null, "Ich bin zwei Oeltanks", "US-ASCII", false);
+ }
+
+ public void testSimpleUTF8()
+ throws Exception
+ {
+ testRun(null, "Ich bin zwei Oeltanks", "UTF-8", true);
+ testRun(null, "Ich bin zwei Oeltanks", "UTF-8", false);
+ }
+
+ public void testRealUTF8()
+ throws Exception
+ {
+ testRun(null, "Ich bin zwei \u00d6ltanks", "UTF-8", true);
+ testRun(null, "Ich bin zwei \u00d6ltanks", "UTF-8", false);
+ }
+
+ public void testRealUTF8WithBOM()
+ throws Exception
+ {
+ testRun(UnicodeInputStream.UTF8_BOM, "Ich bin ein Test",
+ "UTF-8", true);
+ testRun(UnicodeInputStream.UTF8_BOM, "Ich bin ein Test",
+ "UTF-8", false);
+ }
+
+ public void testRealUTF16BEWithBOM()
+ throws Exception
+ {
+ testRun(UnicodeInputStream.UTF16BE_BOM, "Ich bin ein Test",
+ "UTF-16BE", true);
+ testRun(UnicodeInputStream.UTF16BE_BOM, "Ich bin ein Test",
+ "UTF-16BE", false);
+ }
+
+ public void testRealUTF16LEWithBOM()
+ throws Exception
+ {
+ testRun(UnicodeInputStream.UTF16LE_BOM, "Ich bin ein Test",
+ "UTF-16LE", true);
+ testRun(UnicodeInputStream.UTF16LE_BOM, "Ich bin ein Test",
+ "UTF-16LE", false);
+ }
+
+ public void testRealUTF32BEWithBOM()
+ throws Exception
+ {
+ testRun(UnicodeInputStream.UTF32BE_BOM, null,
+ "UTF-32BE", true);
+ testRun(UnicodeInputStream.UTF32BE_BOM, null,
+ "UTF-32BE", false);
+ }
+
+ public void testRealUTF32LEWithBOM()
+ throws Exception
+ {
+ testRun(UnicodeInputStream.UTF32LE_BOM, null,
+ "UTF-32LE", true);
+ testRun(UnicodeInputStream.UTF32LE_BOM, null,
+ "UTF-32LE", false);
+ }
+
+
+ protected void testRun(final UnicodeInputStream.UnicodeBOM bom, final String str, final String testEncoding, final boolean skipBOM)
+ throws Exception
+ {
+
+ byte [] testString = buildTestString(bom, str, testEncoding, skipBOM);
+
+ InputStream is = null;
+ UnicodeInputStream uis = null;
+
+ try
+ {
+ is = createInputStream(bom, str, testEncoding);
+ uis = new UnicodeInputStream(is, skipBOM);
+
+ assertEquals("BOM Skipping problem", skipBOM, uis.isSkipBOM());
+
+ if (bom != null)
+ {
+ assertEquals("Wrong Encoding detected", testEncoding, uis.getEncodingFromStream());
+ }
+
+ byte [] result = readAllBytes(uis, testEncoding);
+
+ assertNotNull(testString);
+ assertNotNull(result);
+ assertEquals("Wrong result length", testString.length, result.length);
+
+ for (int i = 0; i < result.length; i++)
+ {
+ assertEquals("Wrong Byte at " + i, testString[i], result[i]);
+ }
+ }
+ finally
+ {
+
+ if (uis != null)
+ {
+ uis.close();
+ }
+
+ if (is != null)
+ {
+ is.close();
+ }
+ }
+ }
+
+ protected InputStream createInputStream(final UnicodeInputStream.UnicodeBOM bom, final String str, final String enc)
+ throws Exception
+ {
+
+ if (bom == null)
+ {
+ if (str != null)
+ {
+ return new ByteArrayInputStream(str.getBytes(enc));
+ }
+ else
+ {
+ return new ByteArrayInputStream(new byte[0]);
+ }
+ }
+ else
+ {
+ if (str != null)
+ {
+ return new ByteArrayInputStream(ArrayUtils.addAll(bom.getBytes(), str.getBytes(enc)));
+ }
+ else
+ {
+ return new ByteArrayInputStream(ArrayUtils.addAll(bom.getBytes(), new byte[0]));
+ }
+ }
+ }
+
+ protected byte [] buildTestString(final UnicodeInputStream.UnicodeBOM bom, final String str, final String enc, final boolean skipBOM)
+ throws Exception
+ {
+
+ byte [] strBytes = (str != null) ? str.getBytes(enc) : new byte[0];
+
+ if ((bom == null) || skipBOM)
+ {
+ return strBytes;
+ }
+ else
+ {
+ return ArrayUtils.addAll(bom.getBytes(), strBytes);
+ }
+ }
+
+ protected byte [] readAllBytes(final InputStream inputStream, final String enc)
+ throws Exception
+ {
+ InputStreamReader isr = null;
+
+ byte [] res = new byte[0];
+
+ try
+ {
+ byte[] buf = new byte[1024];
+ int read = 0;
+
+ while ((read = inputStream.read(buf)) >= 0)
+ {
+ res = ArrayUtils.addAll(res, ArrayUtils.subarray(buf, 0, read));
+ }
+ }
+ finally
+ {
+
+ if (isr != null)
+ {
+ isr.close();
+ }
+ }
+
+ return res;
+ }
+
+}