//package uk.co.bytemark.vm.enigma.inquisition.questions.xml;
//
//import static org.junit.Assert.assertEquals;
//import static org.junit.Assert.assertNotNull;
//import static org.junit.Assert.fail;
//
//import java.io.IOException;
//import java.text.ParseException;
//import java.util.EnumSet;
//import java.util.List;
//
//import org.jdom.Attribute;
//import org.jdom.DataConversionException;
//import org.jdom.Element;
//import org.jdom.JDOMException;
//import org.junit.Before;
//import org.junit.Test;
//
//import uk.co.bytemark.vm.enigma.inquisition.misc.Utils;
//import uk.co.bytemark.vm.enigma.inquisition.questions.MultipleChoiceQuestion;
//import uk.co.bytemark.vm.enigma.inquisition.questions.Question;
//
//public class XmlQuestionSetParserTest {
//
// private XmlQuestionSetParser xmlQuestionSetParser;
//
// @Test
// public void shouldReturnCorrectXMLRepresentation() {
// Element root = multipleOptionModeQuestion.asXML();
// assertEquals("MultipleChoiceQuestion", root.getName());
// checkXMLRepresentationRootElementAttributes(root);
// assertEquals(3, root.getChildren().size());
// checkXMLRepresentationQuestionAndExplanationElements(root);
// checkXMLRepresentationOptionsElement(root);
// }
//
// @SuppressWarnings("unchecked")
// // See below
// private void checkXMLRepresentationOptionsElement(Element root) {
// Element optionsElement = root.getChild("Options");
// assertNotNull(optionsElement);
// assertEquals(0, optionsElement.getAttributes().size());
// List<Element> optionElements = optionsElement.getChildren(); // We trust the JDOM API
// assertEquals(multipleOptionModeQuestion.numberOfOptions(), optionElements.size());
// for (Element optionElement : optionElements)
// assertEquals("Option", optionElement.getName());
// }
//
// private void checkXMLRepresentationQuestionAndExplanationElements(Element root) {
// Element questionTextElement = root.getChild("QuestionText");
// assertNotNull(questionTextElement);
// assertEquals(0, questionTextElement.getAttributes().size());
// assertEquals(0, questionTextElement.getChildren().size());
// assertEquals(multipleOptionModeQuestion.getQuestionText(), questionTextElement.getText());
// Element explanationTextElement = root.getChild("ExplanationText");
// assertNotNull(explanationTextElement);
// assertEquals(0, explanationTextElement.getAttributes().size());
// assertEquals(0, explanationTextElement.getChildren().size());
// assertEquals(multipleOptionModeQuestion.getExplanationText(), explanationTextElement.getText());
// }
//
// private void checkXMLRepresentationRootElementAttributes(Element root) {
// assertEquals(2, root.getAttributes().size());
// Attribute singleOptionModeAttribute = root.getAttribute("singleOptionMode");
// try {
// assertEquals(multipleOptionModeQuestion.isSingleOptionMode(), singleOptionModeAttribute.getBooleanValue());
// } catch (DataConversionException e) {
// fail("Couldn't convert 'boolean' value");
// }
// Attribute shufflableAttribute = root.getAttribute("shufflable");
// try {
// assertEquals(multipleOptionModeQuestion.isShufflable(), shufflableAttribute.getBooleanValue());
// } catch (DataConversionException e) {
// fail("Couldn't convert 'boolean' value");
// }
// }
//
// @Test
// public void toXmlAndBackAgainShouldResultInSameQuestion() throws Exception {
// Question multipleQuestionAgain = new MultipleChoiceQuestion(multipleOptionModeQuestion.asXML());
// assertEquals(multipleOptionModeQuestion, multipleQuestionAgain);
// Question singleQuestionAgain = new MultipleChoiceQuestion(singleOptionModeQuestion.asXML());
// assertEquals(singleOptionModeQuestion, singleQuestionAgain);
// }
//
// @Test
// public void shouldThrowParseExceptionsAtDodgyXml() throws Exception {
// // Some extra or missing stuff in the XML can be ignored, but the following really need
// // to be present
// Element questionElement = createXmlQuestion(EnumSet.of(OPTIONS, INNER_OPTIONS));
// checkDodgyXmlThrowsParseException(questionElement);
// questionElement = createXmlQuestion(EnumSet.of(QUESTION_TEXT));
// checkDodgyXmlThrowsParseException(questionElement);
// questionElement = createXmlQuestion(EnumSet.of(QUESTION_TEXT, OPTIONS));
// checkDodgyXmlThrowsParseException(questionElement);
// }
//
// private void checkDodgyXmlThrowsParseException(Element questionElement) {
// try {
// new MultipleChoiceQuestion(questionElement);
// fail("Should throw ParseException because of missing XML elements");
// } catch (ParseException e) {
// // Exception expected from test
// }
// }
//
// private Element createXmlQuestion(EnumSet<MultipleChoiceQuestionComponent> components) throws JDOMException,
// IOException {
// String questionText = components.contains(QUESTION_TEXT) ? "<QuestionText>Question</QuestionText>" : "";
// String innerOptions = components.contains(INNER_OPTIONS) ? "<Option correct='true' id='a'>Foo</Option>"
// + "<Option correct='false' id='b'>Bar</Option>" : "";
// String options = components.contains(OPTIONS) ? "<Options>" + innerOptions + "</Options>" : "";
// String questionXML = "<MultipleChoiceQuestion shufflable='true' singleOptionMode='false'>" + questionText
// + "<ExplanationText>Explanation</ExplanationText>" + options + "</MultipleChoiceQuestion>";
// return Utils.makeXMLFragment(questionXML);
// }
//
// @Test(expected = ParseException.class)
// public void shouldFailIfRootOfXmlHasWrongName() throws Exception {
// String questionXML = "<SomeOtherQuestion shufflable='true' singleOptionMode='false'>"
// + "<QuestionText>Question</QuestionText>" + "<ExplanationText>Explanation</ExplanationText>"
// + "<Options>" + "<Option correct='true' id='a'>Foo</Option>" + "</Options>" + "</SomeOtherQuestion>";
// Element questionRoot = Utils.makeXMLFragment(questionXML);
// new MultipleChoiceQuestion(questionRoot);
// }
//
// @Before
// public void setUp() throws Exception {
// xmlQuestionSetParser = new XmlQuestionSetParser();
// }
//
// }
//
//
//}