/*
* Copyright 2006-2014 the original author or authors.
*
* 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 org.springframework.batch.item.file.transform;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.Test;
public class FixedLengthTokenizerTests {
private FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
private String line = null;
/**
* if null or empty string is tokenized, tokenizer returns empty fieldset
* (with no tokens).
*/
@Test
public void testTokenizeEmptyString() {
tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10), new Range(11, 15) });
try {
tokenizer.tokenize("");
fail("Expected IncorrectLineLengthException");
}
catch (IncorrectLineLengthException ex) {
assertEquals(15, ex.getExpectedLength());
assertEquals(0, ex.getActualLength());
assertEquals("", ex.getInput());
}
}
@Test
public void testEmptyStringWithNoRanges() {
tokenizer.setColumns(new Range[] {});
tokenizer.tokenize("");
}
@Test
public void testTokenizeSmallerStringThanRanges() {
tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10), new Range(11, 15) });
try {
tokenizer.tokenize("12345");
fail("Expected IncorrectLineLengthException");
}
catch (IncorrectLineLengthException ex) {
assertEquals(15, ex.getExpectedLength());
assertEquals(5, ex.getActualLength());
assertEquals("12345", ex.getInput());
}
}
@Test
public void testTokenizeSmallerStringThanRangesWithWhitespace() {
tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10) });
FieldSet tokens = tokenizer.tokenize("12345 ");
assertEquals("12345", tokens.readString(0));
assertEquals("", tokens.readString(1));
}
@Test
public void testTokenizeSmallerStringThanRangesNotStrict() {
tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10) });
tokenizer.setStrict(false);
FieldSet tokens = tokenizer.tokenize("12345");
assertEquals("12345", tokens.readString(0));
assertEquals("", tokens.readString(1));
}
@Test
public void testTokenizeSmallerStringThanRangesWithWhitespaceOpenEnded() {
tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6) });
FieldSet tokens = tokenizer.tokenize("12345 ");
assertEquals("12345", tokens.readString(0));
assertEquals("", tokens.readString(1));
}
@Test
public void testTokenizeNullString() {
tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 10), new Range(11, 15) });
try {
tokenizer.tokenize(null);
fail("Expected IncorrectLineLengthException");
}
catch (IncorrectLineLengthException ex) {
assertEquals("", ex.getInput());
}
}
@Test
public void testTokenizeRegularUse() {
tokenizer.setColumns(new Range[] { new Range(1, 2), new Range(3, 7), new Range(8, 12) });
// test shorter line as defined by record descriptor
line = "H11234512345";
FieldSet tokens = tokenizer.tokenize(line);
assertEquals(3, tokens.getFieldCount());
assertEquals("H1", tokens.readString(0));
assertEquals("12345", tokens.readString(1));
assertEquals("12345", tokens.readString(2));
}
@Test
public void testNormalLength() throws Exception {
tokenizer.setColumns(new Range[] { new Range(1, 10), new Range(11, 25), new Range(26, 30) });
// test shorter line as defined by record descriptor
line = "H1 12345678 12345";
FieldSet tokens = tokenizer.tokenize(line);
assertEquals(3, tokens.getFieldCount());
assertEquals(line.substring(0, 10).trim(), tokens.readString(0));
assertEquals(line.substring(10, 25).trim(), tokens.readString(1));
assertEquals(line.substring(25).trim(), tokens.readString(2));
}
@Test
public void testLongerLines() throws Exception {
tokenizer.setColumns(new Range[] { new Range(1, 10), new Range(11, 25), new Range(26, 30) });
line = "H1 12345678 1234567890";
try {
tokenizer.tokenize(line);
fail("Expected IncorrectLineLengthException");
}
catch (IncorrectLineLengthException ex) {
assertEquals(30, ex.getExpectedLength());
assertEquals(35, ex.getActualLength());
assertEquals(line, ex.getInput());
}
}
@Test
public void testLongerLinesOpenRange() throws Exception {
tokenizer.setColumns(new Range[] { new Range(1, 10), new Range(11, 25), new Range(26) });
line = "H1 12345678 1234567890";
FieldSet tokens = tokenizer.tokenize(line);
assertEquals(line.substring(0, 10).trim(), tokens.readString(0));
assertEquals(line.substring(10, 25).trim(), tokens.readString(1));
assertEquals(line.substring(25).trim(), tokens.readString(2));
}
@Test
public void testLongerLinesNotStrict() throws Exception {
tokenizer.setColumns(new Range[] { new Range(1, 10), new Range(11, 25), new Range(26,30) });
line = "H1 12345678 1234567890";
tokenizer.setStrict(false);
FieldSet tokens = tokenizer.tokenize(line);
assertEquals(line.substring(0, 10).trim(), tokens.readString(0));
assertEquals(line.substring(10, 25).trim(), tokens.readString(1));
assertEquals(line.substring(25, 30).trim(), tokens.readString(2));
}
@Test
public void testNonAdjacentRangesUnsorted() throws Exception {
tokenizer.setColumns(new Range[] { new Range(14, 28), new Range(34, 38), new Range(1, 10) });
// test normal length
line = "H1 +++12345678 +++++12345";
FieldSet tokens = tokenizer.tokenize(line);
assertEquals(3, tokens.getFieldCount());
assertEquals(line.substring(0, 10).trim(), tokens.readString(2));
assertEquals(line.substring(13, 28).trim(), tokens.readString(0));
assertEquals(line.substring(33, 38).trim(), tokens.readString(1));
}
@Test
public void testAnotherTypeOfRecord() throws Exception {
tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 15), new Range(16, 25), new Range(26, 27) });
// test another type of record
line = "H2 123456 12345 12";
FieldSet tokens = tokenizer.tokenize(line);
assertEquals(4, tokens.getFieldCount());
assertEquals(line.substring(0, 5).trim(), tokens.readString(0));
assertEquals(line.substring(5, 15).trim(), tokens.readString(1));
assertEquals(line.substring(15, 25).trim(), tokens.readString(2));
assertEquals(line.substring(25).trim(), tokens.readString(3));
}
@Test
public void testFillerAtEnd() throws Exception {
tokenizer.setColumns(new Range[] { new Range(1, 5), new Range(6, 15), new Range(16, 25), new Range(26, 27),
new Range(34) });
// test another type of record
line = "H2 123456 12345 12-123456";
FieldSet tokens = tokenizer.tokenize(line);
assertEquals(5, tokens.getFieldCount());
assertEquals(line.substring(0, 5).trim(), tokens.readString(0));
assertEquals(line.substring(5, 15).trim(), tokens.readString(1));
assertEquals(line.substring(15, 25).trim(), tokens.readString(2));
assertEquals(line.substring(25, 27).trim(), tokens.readString(3));
}
@Test
public void testTokenizerInvalidSetup() {
tokenizer.setNames(new String[] { "a", "b" });
tokenizer.setColumns(new Range[] { new Range(1, 5) });
try {
tokenizer.tokenize("12345");
fail("Exception was expected: too few names provided");
}
catch (IncorrectTokenCountException e) {
assertEquals(2, e.getExpectedCount());
assertEquals(1, e.getActualCount());
}
}
}