blob: 8f9a468fc532041f74fe0b8855ece9c599f26f75 [file] [log] [blame]
// Copyright 2011 Google Inc. All Rights Reserved.
//
// 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 adaptorlib;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
/**
* Tests for {@link ByteCharInputStream}.
*/
public class ByteCharInputStreamTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void testUTF8ReadEntireStream() throws IOException {
String source = "ABC123 %^& ĀÁÂḀ Ⓐ Μονάχη Laȝamon пустынных ტყაოსანი ಸಂಭವಿ";
InputStream inputStream = new ByteArrayInputStream(source.getBytes("UTF-8"));
ByteCharInputStream byteCharStream = new ByteCharInputStream(inputStream);
// Delimiter does not exist in source string. Should read entire stream.
String result = byteCharStream.readToDelimiter("\n");
assertEquals(source, result);
// Read past end of stream
result = byteCharStream.readToDelimiter("\n");
assertNull(result);
}
@Test
public void testDelimiterSeparation() throws IOException {
String source = "ABC123 %^&\nĀÁÂḀ Ⓐ\r\nΜονάχη Laȝamon пустынных ტყაოსანი ಸಂಭವಿ";
InputStream inputStream = new ByteArrayInputStream(source.getBytes("UTF-8"));
ByteCharInputStream byteCharStream = new ByteCharInputStream(inputStream);
String resultString = byteCharStream.readToDelimiter("\n");
assertEquals("ABC123 %^&", resultString);
resultString = byteCharStream.readToDelimiter("\r\n");
assertEquals("ĀÁÂḀ Ⓐ", resultString);
resultString = byteCharStream.readToDelimiter("\n");
assertEquals("Μονάχη Laȝamon пустынных ტყაოსანი ಸಂಭವಿ", resultString);
resultString = byteCharStream.readToDelimiter("\n");
assertNull(resultString);
}
@Test
public void testByteRead() throws IOException {
byte[] source = {-128, -127, -126, -125,-3, -2, -1, 0, 1, 2, 3, 125, 126, 127};
InputStream inputStream = new ByteArrayInputStream(source);
ByteCharInputStream byteCharStream = new ByteCharInputStream(inputStream);
byte[] result = new byte[source.length];
int length = byteCharStream.readFully(result, 0, 5);
assertEquals(5, length);
assertArrayEquals(Arrays.copyOfRange(source, 0, 5), Arrays.copyOfRange(result, 0, 5));
length = byteCharStream.readFully(result, 0, 8);
assertEquals(8, length);
assertArrayEquals(Arrays.copyOfRange(source, 5, 13), Arrays.copyOfRange(result, 0, 8));
}
@Test
public void testByteReadPastEndOfStream() throws IOException {
byte[] source = {-128, -127, -126, -125,-3, -2, -1, 0, 1, 2, 3, 125, 126, 127};
InputStream inputStream = new ByteArrayInputStream(source);
ByteCharInputStream byteCharStream = new ByteCharInputStream(inputStream);
byte[] result = new byte[100];
int length = byteCharStream.readFully(result, 0, 100);
assertEquals(14, length);
// read past end of stream
length = byteCharStream.readFully(result, 0, 1);
assertEquals(-1, length);
}
@Test
public void testMixedUtf8AndByteRead() throws IOException {
String text1 = "ABC123 %^&\nĀÁÂḀ Ⓐ";
String surrogatePair = "\uD803\uDC22"; // 'OLD TURKIC LETTER ORKHON EM' (U+10C22)
byte[] utf8ForSurrogatePair = {(byte)0xF0, (byte)0x90, (byte)0xB0, (byte)0xA2};
String text1Delimiter = "\n";
String text2 = "Μονάχη Laȝamon пустынных ტყაოსანი ಸಂಭವಿ\n";
byte[] dataBytes1 = {-2, -1, 0, 1, 2};
byte[] dataBytes2 = {-128, 0, 127};
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byteArrayOutputStream.write(text1.getBytes("UTF-8"));
byteArrayOutputStream.write(utf8ForSurrogatePair);
byteArrayOutputStream.write(text1Delimiter.getBytes("UTF-8"));
byteArrayOutputStream.write(dataBytes1);
byteArrayOutputStream.write(text2.getBytes("UTF-8"));
byteArrayOutputStream.write(dataBytes2);
byte[] source = byteArrayOutputStream.toByteArray();
InputStream inputStream = new ByteArrayInputStream(source);
ByteCharInputStream byteCharStream = new ByteCharInputStream(inputStream);
byte[] result = new byte[100];
String resultString = byteCharStream.readToDelimiter(("\n"));
assertEquals("ABC123 %^&", resultString);
resultString = byteCharStream.readToDelimiter(("\n"));
assertEquals("ĀÁÂḀ Ⓐ" + surrogatePair, resultString);
int length = byteCharStream.readFully(result, 0, 5);
assertEquals(5, length);
assertArrayEquals(dataBytes1, Arrays.copyOfRange(result, 0, 5));
resultString = byteCharStream.readToDelimiter(("\n"));
assertEquals("Μονάχη Laȝamon пустынных ტყაოსანი ಸಂಭವಿ", resultString);
// Read to end of stream
length = byteCharStream.readFully(result, 0, 100);
assertEquals(3, length);
assertArrayEquals(dataBytes2, Arrays.copyOfRange(result, 0, 3));
}
@Test
public void testNullDelimiter() throws IOException {
String source = "ABC123";
InputStream inputStream = new ByteArrayInputStream(source.getBytes("UTF-8"));
ByteCharInputStream byteCharStream = new ByteCharInputStream(inputStream);
thrown.expect(IllegalArgumentException.class);
byteCharStream.readToDelimiter(null);
}
@Test
public void testEmptyDelimiter() throws IOException {
String source = "ABC123";
InputStream inputStream = new ByteArrayInputStream(source.getBytes("UTF-8"));
ByteCharInputStream byteCharStream = new ByteCharInputStream(inputStream);
thrown.expect(IllegalArgumentException.class);
byteCharStream.readToDelimiter("");
}
}