/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * muCommander is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.commons.io.bom; import org.testng.annotations.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; /** * A test case for the <code>com.mucommander.commons.io.bom</code> package. * * @author Maxence Bernard, Nicolas Rinaudo */ public class BOMTest implements BOMConstants { /** * Tests {@link BOM} comparison methods. */ @Test public void testBOMComparisons() { // Tests BOM#sigStartsWith method assert UTF8_BOM.sigStartsWith(new byte[]{(byte)0xEF, (byte)0xBB}); assert UTF8_BOM.sigStartsWith(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}); assert !UTF8_BOM.sigStartsWith(new byte[]{(byte)0xAA}); assert !UTF8_BOM.sigStartsWith(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF, (byte)0xAA}); // Tests BOM#sigEquals method assert UTF8_BOM.sigEquals(UTF8_BOM.getSignature()); assert !UTF8_BOM.sigEquals(UTF16_LE_BOM.getSignature()); // Tests BOM#equals method assert UTF8_BOM.equals(UTF8_BOM); assert !UTF8_BOM.equals(UTF16_LE_BOM); assert !UTF8_BOM.equals(new Object()); } /** * Tests proper detection of known BOMs. * * @throws IOException should normally not happen */ @Test public void testBOMInputStream() throws IOException { BOMInputStream bomIn; byte[] b; for (BOM bom : SUPPORTED_BOMS) { bomIn = getBOMInputStream(bom.getSignature()); assert bom.equals(bomIn.getBOM()); assertEOF(bomIn); } // UTF-8 BOM, plus one byte after b = new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF, (byte)0x27}; bomIn = getBOMInputStream(b); assert UTF8_BOM.equals(bomIn.getBOM()); assertStreamEquals(new byte[]{(byte)0x27}, bomIn); assertEOF(bomIn); // Not a known BOM b = new byte[]{(byte)0xEF, (byte)0xBB, (byte)0x27}; bomIn = getBOMInputStream(b); assert bomIn.getBOM() == null; assertStreamEquals(b, bomIn); // Empty stream, BOM should be null b = new byte[]{}; bomIn = getBOMInputStream(b); assert bomIn.getBOM() == null; assertEOF(bomIn); // BOMs should not match b = UTF16_BE_BOM.getSignature(); bomIn = getBOMInputStream(b); assert !UTF8_BOM.equals(bomIn.getBOM()); assertEOF(bomIn); } /** * Tests {@link BOM#getInstance(String)}. */ @Test public void testBOMResolution() { for (BOM bom : SUPPORTED_BOMS) { // Test case variations assert bom.equals(BOM.getInstance(bom.getEncoding().toLowerCase())); assert bom.equals(BOM.getInstance(bom.getEncoding().toUpperCase())); } // Test non-UTF encodings assert BOM.getInstance("ISO-8859-1") == null; assert BOM.getInstance("Shift_JIS") == null; // Test UTF aliases assert BOMConstants.UTF16_BE_BOM.equals(BOM.getInstance("UnicodeBig")); assert BOMConstants.UTF16_BE_BOM.equals(BOM.getInstance("UnicodeBigUnmarked")); assert BOMConstants.UTF16_BE_BOM.equals(BOM.getInstance("UTF-16")); assert BOMConstants.UTF16_LE_BOM.equals(BOM.getInstance("UnicodeLittle")); assert BOMConstants.UTF16_LE_BOM.equals(BOM.getInstance("UnicodeLittleUnmarked")); assert BOMConstants.UTF32_BE_BOM.equals(BOM.getInstance("UTF-32")); } /** * Tests {@link BOMWriter}. * * @throws IOException should not happen */ @Test public void testBOMWriter() throws IOException { String testString = "This is a test"; ByteArrayOutputStream baos; BOMWriter bomWriter; BOMInputStream bomIn; for (BOM bom : SUPPORTED_BOMS) { baos = new ByteArrayOutputStream(); bomWriter = new BOMWriter(baos, bom.getEncoding()); bomWriter.write(testString); bomWriter.close(); bomIn = getBOMInputStream(baos.toByteArray()); assert bom.equals(bomIn.getBOM()); assertStreamEquals(testString.getBytes(bom.getEncoding()), bomIn); assertEOF(bomIn); } } //////////////////// // Helper methods // //////////////////// private BOMInputStream getBOMInputStream(byte b[]) throws IOException { return new BOMInputStream(new ByteArrayInputStream(b)); } private void assertEOF(InputStream in) throws IOException { assert-1 == in.read(); // Again assert -1 == in.read(); } private void assertStreamEquals(byte bytes[], InputStream in) throws IOException { for (byte b : bytes) assert b == (byte) (in.read() & 0xFF); assertEOF(in); } }