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

import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.record.EOFRecord;
import org.apache.poi.hssf.record.InterfaceHdrRecord;
import org.apache.poi.hssf.record.NameRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.usermodel.SanityChecker.CheckRecord;
import org.junit.Test;

/**
 * A Test case for a test utility class.<br/>
 * Okay, this may seem strange but I need to test my test logic.
 *
 * @author Glen Stampoultzis (glens at apache.org)
 */
public final class TestSanityChecker {
	private static final Record INTERFACEHDR = new InterfaceHdrRecord(InterfaceHdrRecord.CODEPAGE);
	private static BoundSheetRecord createBoundSheetRec() {
		return new BoundSheetRecord("Sheet1");
	}
	
	@Test
	public void testCheckRecordOrder() {
		final SanityChecker c = new SanityChecker();
		List<Record> records = new ArrayList<Record>();
		records.add(new BOFRecord());
		records.add(INTERFACEHDR);
		records.add(createBoundSheetRec());
		records.add(EOFRecord.instance);
		CheckRecord[] check = {
				new CheckRecord(BOFRecord.class, '1'),
				new CheckRecord(InterfaceHdrRecord.class, '0'),
				new CheckRecord(BoundSheetRecord.class, 'M'),
				new CheckRecord(NameRecord.class, '*'),
				new CheckRecord(EOFRecord.class, '1'),
		};
		// check pass
		c.checkRecordOrder(records, check);
		records.add(2, createBoundSheetRec());
		c.checkRecordOrder(records, check);
		records.remove(1);	  // optional record missing
		c.checkRecordOrder(records, check);
		records.add(3, new NameRecord());
		records.add(3, new NameRecord()); // optional multiple record occurs more than one time
		c.checkRecordOrder(records, check);

		// check fail
		confirmBadRecordOrder(check, new Record[] {
				new BOFRecord(),
				createBoundSheetRec(),
				INTERFACEHDR,
				EOFRecord.instance,
		});

		confirmBadRecordOrder(check, new Record[] {
				new BOFRecord(),
				INTERFACEHDR,
				createBoundSheetRec(),
				INTERFACEHDR,
				EOFRecord.instance,
		});

		confirmBadRecordOrder(check, new Record[] {
				new BOFRecord(),
				createBoundSheetRec(),
				new NameRecord(),
				EOFRecord.instance,
				new NameRecord(),
		});

		confirmBadRecordOrder(check, new Record[] {
				INTERFACEHDR,
				createBoundSheetRec(),
				EOFRecord.instance,
		});

		confirmBadRecordOrder(check, new Record[] {
				new BOFRecord(),
				INTERFACEHDR,
				EOFRecord.instance,
		});

		confirmBadRecordOrder(check, new Record[] {
				INTERFACEHDR,
				createBoundSheetRec(),
				new BOFRecord(),
				EOFRecord.instance,
		});

		confirmBadRecordOrder(check, new Record[] {
				new BOFRecord(),
				createBoundSheetRec(),
				INTERFACEHDR,
				EOFRecord.instance,
		});
	}
	private static void confirmBadRecordOrder(final SanityChecker.CheckRecord[] check, Record[] recs) {
		final SanityChecker c = new SanityChecker();
		final List<Record> records = Arrays.asList(recs);
		try {
			new Runnable() {
				@Override
                public void run() {
					c.checkRecordOrder(records, check);
				}
			}.run();
		} catch (AssertionError pass) {
			// expected during normal test
			return;
		}
		fail("Did not get failure exception as expected");
	}
}
