package edu.vt.marian.Document;

import java.io.*;
import java.net.*;
import java.util.*;

import edu.vt.marian.common.*;


/**
    Unit tester for MarcDocument (and thus MarcRecord) class.
    @author	Robert France
*/

public class MarcDocumentTester
{
	static String docFile = "/u1/marian/data/marc/file14f.mrc";
	static String mapFile = "ansel_uni_comb.map";
								 
    public static void main(String argv[]) throws Exception
    {
        int Err;
        Debug debug = new Debug("debug.conf", "trace.log", false);
        EntityMap testMap = new EntityMap(debug);
        
		
		try {
			BufferedReader inFile = new BufferedReader(new FileReader(mapFile));
		    testMap.load(inFile);
		} catch (IOException e)
		{
			System.err.println("Cannot load table.");
		}
		
		BufferedReader in;
		try {
			in = new BufferedReader(new FileReader(docFile));
		} catch (Exception e)
		{
			System.err.println("Cannot open test file '" + docFile + "'.");
			return;
		}
		
/*
		PrintWriter pw = new PrintWriter(System.out);
		BufferedWriter bw = new BufferedWriter(pw);
*/
		int numDocs = 0;


/*
		try { while( true )
		{
			MarcDocument doc = new MarcDocument(5104, testMap, debug);
			if ( (Err = doc.setFromTapeFormat(in)) != ReturnCodes.OK)
			{
				System.out.println("Error (" + Err + ") on setFromTapeFormat().");
				continue;
			}
			System.out.println("<P>&nbsp;<P>");
			System.out.println("<H3>Example #" + ++numDocs + ":</H3>");
			System.out.println("<H4>MARIAN \"Long Description\" (in ASCII):</H4>");
			System.out.println("<PRE>");
			if ( (Err = doc.presentLong(DigInfObj.ASCII, bw)) != ReturnCodes.OK)
			{
				System.out.println("Error (" + Err + ") on presentLong().");
			}
			bw.newLine();
			bw.flush();
			System.out.println("</PRE>");
			System.out.println("<P>&nbsp;<P>");
			System.out.println("<H4>(In HTML:)</H4>");
			if ( (Err = doc.presentLong(DigInfObj.HTML, bw)) != ReturnCodes.OK)
			{
				System.out.println("Error (" + Err + ") on presentAsHtml().");
			}
			bw.newLine();
			bw.flush();
			System.out.println("<P>&nbsp;<P>");
			System.out.println("<H4>In OAI XML:</H4>");
			System.out.println("<PRE>");
			if ( (Err = doc.presentAsXml(bw)) != ReturnCodes.OK)
			{
				System.out.println("Error (" + Err + ") on presentAsXml().");
			}
			System.out.println("</PRE>");
			bw.newLine();
			bw.newLine();
			bw.flush();
*/
		try { while( true )
		{
			MarcDocument doc = new MarcDocument(5104, testMap, debug);
			if ( (Err = doc.setFromTapeFormat(in)) != ReturnCodes.OK)
			{
				System.out.println("Error (" + Err + ") on setFromTapeFormat().");
				continue;
			}
			numDocs++;
			StringWriter sw = new StringWriter();
			BufferedWriter bw = new BufferedWriter(sw);
                        if ( (Err = doc.presentAsTapeFormat(bw)) != ReturnCodes.OK)
                        {
                                System.err.println("Error (" + Err + ") on presentAsTapeFormat(), doc #" + numDocs + ".");
                        }
			bw.flush();
                        String tapeFormat = sw.toString();
			MarcDocument doc2 = new MarcDocument(5104, testMap, debug);
			if ( (Err = doc2.setFromTapeFormat(tapeFormat)) != ReturnCodes.OK)
			{
				System.out.println("Error (" + Err + ") on second setFromTapeFormat().");
				continue;
			}
			StringWriter sw2 = new StringWriter();
			BufferedWriter bw2 = new BufferedWriter(sw2);
                        if ( (Err = doc2.presentAsTapeFormat(bw2)) != ReturnCodes.OK)
                        {
                                System.err.println("Error (" + Err + ") on second presentAsTapeFormat(), doc #" + numDocs + ".");
                        }
			bw2.flush();
                        String tapeFormat2 = sw2.toString();
			if ( (Err = tapeFormat.compareTo(tapeFormat2)) != 0)
                        {
                                System.err.println("Comparison off (" + Err + ") on doc #" + numDocs + ".");
                        }
 
			StringWriter sw3 = new StringWriter();
			BufferedWriter bw3 = new BufferedWriter(sw3);
                        if ( (Err = doc2.presentAsXml(bw3)) != ReturnCodes.OK)
                        {
                                System.err.println("Error (" + Err + ") on presentAsXml(), doc #" + numDocs + ".");
                        }
			bw3.flush();
                        String xmlFormat = sw3.toString();
// System.err.println(xmlFormat);
			StringReader sr = new StringReader(xmlFormat);
			BufferedReader bsr = new BufferedReader(sr);
			MarcDocument doc3 = new MarcDocument(5104, testMap, debug);
			if ( (Err = doc3.setFromXml(bsr)) != ReturnCodes.OK)
			{
				System.out.println("Error (" + Err + ") on setFromXml().");
				continue;
			}
			StringWriter sw4 = new StringWriter();
			BufferedWriter bw4 = new BufferedWriter(sw4);
                        if ( (Err = doc3.presentAsTapeFormat(bw4)) != ReturnCodes.OK)
                        {
                                System.err.println("Error (" + Err + ") on third presentAsTapeFormat(), doc #" + numDocs + ".");
                        }
			bw4.flush();
                        String tapeFormat4 = sw4.toString();
			if ( (Err = tapeFormat.compareTo(tapeFormat4)) != 0)
                        {
                                System.err.println("Comparison #2 off (" + Err + ") on doc #" + numDocs + ".");
				System.err.println(tapeFormat);
				System.err.println(tapeFormat4);
                        }
 
			if (numDocs%1000 == 0)
				System.err.println("Processed " + numDocs + " documents.");
		} } catch (EOFException e)
		{
		}
        System.err.println("End of File.");
 
    }
}

