diff options
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.java | 239 |
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; + } + +} |