/* ====================================================================
   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.
==================================================================== */

package org.apache.poi.hssf.record;

import org.apache.poi.util.HexRead;

import junit.framework.AssertionFailedError;
import junit.framework.TestCase;

/**
 * Tests for {@link RecordInputStream}
 *
 * @author Josh Micich
 */
public final class TestRecordInputStream extends TestCase {

	/**
	 * Data inspired by attachment 22626 of bug 45866<br/>
	 * A unicode string of 18 chars, with a continue record where the compression flag changes
	 */
	private static final String HED_DUMP1 = ""
			+ "1A 59 00 8A 9E 8A " // 3 uncompressed unicode chars
			+ "3C 00 " // Continue sid
			+ "10 00 " // rec size 16 (1+15)
			+ "00"	// next chunk is compressed
			+ "20 2D 20 4D 75 6C 74 69 6C 69 6E 67 75 61 6C " // 15 chars
	;
	/**
	 * same string re-arranged
	 */
	private static final String HED_DUMP2 = ""
			// 15 chars at end of current record
			+ "4D 75 6C 74 69 6C 69 6E 67 75 61 6C 20 2D 20"
			+ "3C 00 " // Continue sid
			+ "07 00 " // rec size 7 (1+6)
			+ "01"	// this bit uncompressed
			+ "1A 59 00 8A 9E 8A " // 3 uncompressed unicode chars
	;
	public void testChangeOfCompressionFlag_bug25866() {
		byte[] changingFlagSimpleData = HexRead.readFromString(""
				+ "AA AA "  // fake SID
				+ "06 00 "  // first rec len 6
				+ HED_DUMP1
				);
		RecordInputStream in = TestcaseRecordInputStream.create(changingFlagSimpleData);
		String actual;
		try {
			actual = in.readUnicodeLEString(18);
		} catch (IllegalArgumentException e) {
			if ("compressByte in continue records must be 1 while reading unicode LE string".equals(e.getMessage())) {
				throw new AssertionFailedError("Identified bug 45866");
			}
				
			throw e;
		}
		assertEquals("\u591A\u8A00\u8A9E - Multilingual", actual);
	}

	public void testChangeFromUnCompressedToCompressed() {
		byte[] changingFlagSimpleData = HexRead.readFromString(""
				+ "AA AA "  // fake SID
				+ "0F 00 "  // first rec len 15
				+ HED_DUMP2
				);
		RecordInputStream in = TestcaseRecordInputStream.create(changingFlagSimpleData);
		String actual = in.readCompressedUnicode(18);
		assertEquals("Multilingual - \u591A\u8A00\u8A9E", actual);
	}
	
	public void testReadString() {
		byte[] changingFlagFullData = HexRead.readFromString(""
				+ "AA AA "  // fake SID
				+ "12 00 "  // first rec len 18 (15 + next 3 bytes)
				+ "12 00 "  // total chars 18
				+ "00 "	 // this bit compressed
				+ HED_DUMP2
				);
		RecordInputStream in = TestcaseRecordInputStream.create(changingFlagFullData);
		String actual = in.readString();
		assertEquals("Multilingual - \u591A\u8A00\u8A9E", actual);
	}

	public void testLeftoverDataException() {
	    // just ensure that the exception is created correctly, even with unknown sids
	    new RecordInputStream.LeftoverDataException(1, 200);
	    new RecordInputStream.LeftoverDataException(0, 200);
        new RecordInputStream.LeftoverDataException(999999999, 200);
	    new RecordInputStream.LeftoverDataException(HeaderRecord.sid, 200);
	}
}
