package seng302.Data;

import org.junit.Before;
import org.junit.Test;
import org.xml.sax.SAXException;
import seng302.DataInput.RaceDataSource;
import seng302.DataInput.RaceXMLReader;
import seng302.DataInput.RegattaDataSource;
import seng302.DataInput.RegattaXMLReader;

import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

import static junit.framework.TestCase.assertTrue;

/**
 * Created by esa46 on 25/04/17.
 */
public class RegattaDataTest {

    private static final String ROOT_TAG = "RegattaConfig";
    private static final String[] REQUIRED_TAGS = new String[]{
            "RegattaID", "RegattaName", "CourseName", "CentralLatitude", "CentralLongitude",
            "CentralAltitude", "UtcOffset", "MagneticVariation"
    };
    String result;
    RegattaDataSource regattaDataSource;

    @Before
    public void initReader() {
        try {
            regattaDataSource = new RegattaXMLReader("mockXML/regattaTest.xml");
            RegattaData regattaData = new RegattaData(regattaDataSource);
            result = regattaData.createXML();


        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void xmlHasAllNecessaryFields() {

        assertTrue(result.contains("<" + ROOT_TAG + ">"));
        for (String tag : REQUIRED_TAGS) {
            System.out.println(tag);
            assertTrue(result.contains("<" + tag + ">") || result.contains("<" + tag + " "));
        }
    }

    @Test
    public void allTagsAreTerminated() {

        for (String tag : REQUIRED_TAGS) {
            int lastIndex = 0;
            String openTag = "<" + tag + ">";
            String closeTag = "</" + tag + ">";
            while (lastIndex < result.length() && lastIndex > 0) {
                lastIndex = result.indexOf(openTag, lastIndex);
                if (lastIndex > 0) {

                    lastIndex = result.indexOf(closeTag, lastIndex);
                    assertTrue(lastIndex > 0);
                }
            }
        }
    }

}
