/* ====================================================================
   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 static org.apache.poi.hssf.record.TestcaseRecordInputStream.confirmRecordEncoding;
import static org.junit.jupiter.api.Assertions.assertEquals;

import org.apache.poi.util.HexRead;
import org.junit.jupiter.api.Test;

/**
 * Tests for {@link WriteAccessRecord}
 */
final class TestWriteAccessRecord {

	private static final String HEX_SIXTYFOUR_SPACES = ""
		+ "20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "
		+ "20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "
		+ "20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "
		+ "20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20";

	@Test
	void testMissingStringHeader_bug47001a() {
		/*
		 * Data taken from offset 0x0224 in
		 * attachment 23468 from bugzilla 47001
		 */
		byte[] data = HexRead.readFromString(""
				+ "5C 00 70 00 "
				+ "4A 61 76 61 20 45 78 63 65 6C 20 41 50 49 20 76 "
				+ "32 2E 36 2E 34"
				+                "20 20 20 20 20 20 20 20 20 20 20 "
				+ "20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "
				+ HEX_SIXTYFOUR_SPACES);

		RecordInputStream in = TestcaseRecordInputStream.create(data);

		// bug 47001a - Not enough data (0) to read requested (1) bytes
		WriteAccessRecord rec = new WriteAccessRecord(in);
		assertEquals("Java Excel API v2.6.4", rec.getUsername());


		byte[] expectedEncoding = HexRead.readFromString(""
				+ "15 00 00 4A 61 76 61 20 45 78 63 65 6C 20 41 50 "
				+ "49 20 76 32 2E 36 2E 34"
				+                         "20 20 20 20 20 20 20 20 "
				+ "20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 "
				+ HEX_SIXTYFOUR_SPACES);

		confirmRecordEncoding(WriteAccessRecord.sid, expectedEncoding, rec.serialize());
	}

	@Test
	void testShortRecordWrittenByMSAccess() {
		/*
		 * Data taken from two example files
		 * ex42564-21435.xls
		 * bug_42794.xls (from bug 42794 attachment 20429)
		 * In both cases, this data is found at offset 0x0C1C.
		 */
		byte[] data = HexRead.readFromString(""
				+ "5C 00 39 00 "
				+ "36 00 00 41 20 73 61 74 69 73 66 69 65 64 20 4D "
				+ "69 63 72 6F 73 6F 66 74 20 4F 66 66 69 63 65 39 "
				+ "20 55 73 65 72"
				+                "20 20 20 20 20 20 20 20 20 20 20 "
				+ "20 20 20 20 20 20 20 20 20");

		RecordInputStream in = TestcaseRecordInputStream.create(data);
		WriteAccessRecord rec = new WriteAccessRecord(in);
		assertEquals("A satisfied Microsoft Office9 User", rec.getUsername());
		byte[] expectedEncoding = HexRead.readFromString(""
				+ "22 00 00 41 20 73 61 74 69 73 66 69 65 64 20 4D "
				+ "69 63 72 6F 73 6F 66 74 20 4F 66 66 69 63 65 39 "
				+ "20 55 73 65 72"
				+                "20 20 20 20 20 20 20 20 20 20 20 "
				+ HEX_SIXTYFOUR_SPACES);

		confirmRecordEncoding(WriteAccessRecord.sid, expectedEncoding, rec.serialize());
	}
}
