tikhomirov@352: /* tikhomirov@352: * Copyright (c) 2011 TMate Software Ltd tikhomirov@352: * tikhomirov@352: * This program is free software; you can redistribute it and/or modify tikhomirov@352: * it under the terms of the GNU General Public License as published by tikhomirov@352: * the Free Software Foundation; version 2 of the License. tikhomirov@352: * tikhomirov@352: * This program is distributed in the hope that it will be useful, tikhomirov@352: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@352: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@352: * GNU General Public License for more details. tikhomirov@352: * tikhomirov@352: * For information on how to redistribute this software under tikhomirov@352: * the terms of a license other than GNU General Public License tikhomirov@352: * contact TMate Software at support@hg4j.com tikhomirov@352: */ tikhomirov@352: package org.tmatesoft.hg.test; tikhomirov@352: tikhomirov@352: import java.io.File; tikhomirov@352: import java.io.FileInputStream; tikhomirov@352: import java.io.FileOutputStream; tikhomirov@352: import java.nio.ByteBuffer; tikhomirov@352: tikhomirov@352: import org.junit.Assert; tikhomirov@352: import org.junit.Test; tikhomirov@352: import org.tmatesoft.hg.internal.NewlineFilter; tikhomirov@352: tikhomirov@352: /** tikhomirov@352: * tikhomirov@352: * @author Artem Tikhomirov tikhomirov@352: * @author TMate Software Ltd. tikhomirov@352: */ tikhomirov@352: public class TestNewlineFilter { tikhomirov@352: tikhomirov@352: public static void main(String[] args) throws Exception { tikhomirov@352: FileInputStream fis = new FileInputStream(new File("/temp/design.lf.txt")); tikhomirov@352: FileOutputStream fos = new FileOutputStream(new File("/temp/design.newline.out")); tikhomirov@352: ByteBuffer b = ByteBuffer.allocate(12); tikhomirov@352: NewlineFilter nlFilter = NewlineFilter.createNix2Win(true); tikhomirov@352: while (fis.getChannel().read(b) != -1) { tikhomirov@352: b.flip(); // get ready to be read tikhomirov@352: ByteBuffer f = nlFilter.filter(b); tikhomirov@352: fos.getChannel().write(f); // XXX in fact, f may not be fully consumed tikhomirov@352: if (b.hasRemaining()) { tikhomirov@352: b.compact(); tikhomirov@352: } else { tikhomirov@352: b.clear(); tikhomirov@352: } tikhomirov@352: } tikhomirov@352: fis.close(); tikhomirov@352: fos.flush(); tikhomirov@352: fos.close(); tikhomirov@352: } tikhomirov@352: tikhomirov@352: // pure tikhomirov@352: private final String crlf_1 = "\r\nA\r\nBC\r\n\r\nDEF\r\n"; tikhomirov@352: private final String lf_1 = "\nA\nBC\n\nDEF\n"; tikhomirov@352: // mixed tikhomirov@352: private final String crlf_2 = "\r\nA\r\nBC\n\nDEF\r\n"; tikhomirov@352: private final String lf_2 = "\nA\nBC\r\n\r\nDEF\n"; tikhomirov@352: tikhomirov@352: @Test tikhomirov@352: public void testPure_CRLF_2_LF() { tikhomirov@352: final byte[] input = crlf_1.getBytes(); tikhomirov@352: byte[] result = apply(NewlineFilter.createWin2Nix(false), input); tikhomirov@352: Assert.assertArrayEquals(lf_1.getBytes(), result); tikhomirov@352: } tikhomirov@352: tikhomirov@352: @Test tikhomirov@352: public void testPure_LF_2_CRLF() { tikhomirov@352: final byte[] input = lf_1.getBytes(); tikhomirov@352: byte[] result = apply(NewlineFilter.createNix2Win(false), input); tikhomirov@352: Assert.assertArrayEquals(crlf_1.getBytes(), result); tikhomirov@352: } tikhomirov@352: tikhomirov@352: @Test tikhomirov@352: public void testRelaxedMixed_CRLF_2_LF() { tikhomirov@352: // mixed \n and \r\n to uniform \n tikhomirov@352: byte[] result = apply(NewlineFilter.createWin2Nix(true), crlf_2.getBytes()); tikhomirov@352: Assert.assertArrayEquals(lf_1.getBytes(), result); tikhomirov@352: } tikhomirov@352: tikhomirov@352: @Test tikhomirov@352: public void testRelaxedMixed_LF_2_CRLF() { tikhomirov@352: // mixed \n and \r\n to uniform \r\n tikhomirov@352: byte[] result = apply(NewlineFilter.createNix2Win(true), lf_2.getBytes()); tikhomirov@352: Assert.assertArrayEquals(crlf_1.getBytes(), result); tikhomirov@352: } tikhomirov@352: tikhomirov@352: @Test tikhomirov@352: public void testStrictMixed_CRLF_2_LF() { tikhomirov@355: final byte[] input = crlf_2.getBytes(); tikhomirov@355: byte[] result = apply(NewlineFilter.createWin2Nix(false), input); tikhomirov@355: Assert.assertArrayEquals(input, result); tikhomirov@352: } tikhomirov@352: tikhomirov@352: @Test tikhomirov@352: public void testStrictMixed_LF_2_CRLF() { tikhomirov@355: final byte[] input = lf_2.getBytes(); tikhomirov@355: byte[] result = apply(NewlineFilter.createNix2Win(false), input); tikhomirov@355: Assert.assertArrayEquals(input, result); tikhomirov@352: } tikhomirov@353: tikhomirov@353: @Test tikhomirov@353: public void testBufferEndInTheMiddle_CRLF_2_LF() { tikhomirov@353: // filter works with ByteBuffer that may end with \r, and the next one starting with \n tikhomirov@353: // need to make sure this is handled correctly. tikhomirov@353: byte[] i1 = "\r\nA\r\nBC\r".getBytes(); tikhomirov@353: byte[] i2 = "\n\r\nDEF\r\n".getBytes(); tikhomirov@353: NewlineFilter nlFilter = NewlineFilter.createWin2Nix(false); tikhomirov@353: ByteBuffer input = ByteBuffer.allocate(i1.length + i2.length); tikhomirov@353: ByteBuffer res = ByteBuffer.allocate(i1.length + i2.length); // at most of the original size tikhomirov@355: nlFilter.preview(ByteBuffer.wrap(i1)); tikhomirov@355: nlFilter.preview(ByteBuffer.wrap(i2)); tikhomirov@355: // tikhomirov@353: input.put(i1).flip(); tikhomirov@353: res.put(nlFilter.filter(input)); tikhomirov@353: Assert.assertTrue("Unpocessed chars shall be left in input buffer", input.remaining() > 0); tikhomirov@353: input.compact(); tikhomirov@353: input.put(i2); tikhomirov@353: input.flip(); tikhomirov@353: res.put(nlFilter.filter(input)); tikhomirov@353: Assert.assertTrue("Input shall be consumed completely", input.remaining() == 0); tikhomirov@353: // tikhomirov@353: res.flip(); tikhomirov@353: byte[] result = new byte[res.remaining()]; tikhomirov@353: res.get(result); tikhomirov@353: Assert.assertArrayEquals(lf_1.getBytes(), result); tikhomirov@353: // tikhomirov@353: // tikhomirov@353: // check the same, with extra \r at the end of first portion tikhomirov@353: nlFilter = NewlineFilter.createWin2Nix(false); tikhomirov@353: res.clear(); tikhomirov@353: input.clear(); tikhomirov@353: input.put(i1).put("\r\r\r".getBytes()).flip(); tikhomirov@355: // preview requred tikhomirov@355: nlFilter.preview(input); tikhomirov@355: nlFilter.preview(ByteBuffer.wrap(i2)); tikhomirov@355: // input.position(0); correctly written preview shall not affect buffer position tikhomirov@355: // tikhomirov@353: res.put(nlFilter.filter(input)); tikhomirov@353: Assert.assertTrue("Unpocessed chars shall be left in input buffer", input.remaining() > 0); tikhomirov@353: input.compact(); tikhomirov@353: input.put(i2); tikhomirov@353: input.flip(); tikhomirov@353: res.put(nlFilter.filter(input)); tikhomirov@353: Assert.assertTrue("Input shall be consumed completely", input.remaining() == 0); tikhomirov@353: res.flip(); tikhomirov@353: result = new byte[res.remaining()]; tikhomirov@353: res.get(result); tikhomirov@353: Assert.assertArrayEquals(lf_1.getBytes(), result); tikhomirov@353: } tikhomirov@353: tikhomirov@353: @Test tikhomirov@353: public void testNoConversionLoneCR() { tikhomirov@353: // CRLF -> LF tikhomirov@353: final byte[] input = "\r\nA\rBC\r\rDE\r\nFGH".getBytes(); tikhomirov@353: final byte[] output = "\nA\rBC\r\rDE\nFGH".getBytes(); tikhomirov@353: byte[] result = apply(NewlineFilter.createWin2Nix(false), input); tikhomirov@353: Assert.assertArrayEquals(output, result); tikhomirov@353: // tikhomirov@353: // LF -> CRLF tikhomirov@353: result = apply(NewlineFilter.createNix2Win(false), output); tikhomirov@353: Assert.assertArrayEquals(input, result); tikhomirov@353: } tikhomirov@352: tikhomirov@352: tikhomirov@352: @Test tikhomirov@352: public void testNoConversionNeeded_LF_2_LF() { tikhomirov@352: final byte[] input = lf_1.getBytes(); tikhomirov@352: Assert.assertTrue("sanity", indexOf(input, '\r') == -1); tikhomirov@352: byte[] result = apply(NewlineFilter.createWin2Nix(false), input); tikhomirov@352: Assert.assertArrayEquals(input, result); tikhomirov@352: } tikhomirov@352: tikhomirov@352: @Test tikhomirov@352: public void testNoConversionNeeded_CRLF_2_CRLF() { tikhomirov@352: final byte[] input = crlf_1.getBytes(); tikhomirov@352: byte[] result = apply(NewlineFilter.createNix2Win(false), input); tikhomirov@352: Assert.assertArrayEquals(input, result); tikhomirov@352: } tikhomirov@352: tikhomirov@352: private static byte[] apply(NewlineFilter nlFilter, byte[] input) { tikhomirov@355: final ByteBuffer inputBuffer = ByteBuffer.wrap(input); tikhomirov@355: nlFilter.preview(inputBuffer); tikhomirov@355: // inputBuffer.position(0); correctly written filter shall not affect buffer position tikhomirov@355: ByteBuffer result = nlFilter.filter(inputBuffer); tikhomirov@352: byte[] res = new byte[result.remaining()]; tikhomirov@352: result.get(res); tikhomirov@352: return res; tikhomirov@352: } tikhomirov@352: tikhomirov@352: private static int indexOf(byte[] arr, int val) { tikhomirov@352: for (int i = 0; i < arr.length; i++) { tikhomirov@352: if (arr[i] == val) { tikhomirov@352: return i; tikhomirov@352: } tikhomirov@352: } tikhomirov@352: return -1; tikhomirov@352: } tikhomirov@352: }