public function test_xml_import()
    {
        $xml = '<!-- question: 0  -->
  <question type="stack">
    <name>
      <text>test-0</text>
    </name>
    <questiontext format="html">
      <text>What is $1+1$? [[input:ans1]] [[validation:ans1]]</text>
    </questiontext>
    <generalfeedback format="html">
      <text></text>
    </generalfeedback>
    <defaultgrade>1</defaultgrade>
    <penalty>0.3333333</penalty>
    <hidden>0</hidden>
    <questionvariables>
      <text></text>
    </questionvariables>
    <specificfeedback format="html">
      <text>[[feedback:firsttree]]</text>
    </specificfeedback>
    <questionnote>
      <text></text>
    </questionnote>
    <questionsimplify>1</questionsimplify>
    <assumepositive>0</assumepositive>
    <prtcorrect format="html">
      <text><![CDATA[<p>Correct answer, well done.</p>]]></text>
    </prtcorrect>
    <prtpartiallycorrect format="html">
      <text><![CDATA[<p>Your answer is partially correct.</p>]]></text>
    </prtpartiallycorrect>
    <prtincorrect format="html">
      <text><![CDATA[<p>Incorrect answer.</p>]]></text>
    </prtincorrect>
    <multiplicationsign>dot</multiplicationsign>
    <sqrtsign>1</sqrtsign>
    <complexno>i</complexno>
    <inversetrig>cos-1</inversetrig>
    <matrixparens>[</matrixparens>
    <variantsselectionseed></variantsselectionseed>
    <input>
      <name>ans1</name>
      <type>algebraic</type>
      <tans>2</tans>
      <boxsize>5</boxsize>
      <strictsyntax>1</strictsyntax>
      <insertstars>0</insertstars>
      <syntaxhint></syntaxhint>
      <forbidwords></forbidwords>
      <allowwords></allowwords>
      <forbidfloat>1</forbidfloat>
      <requirelowestterms>0</requirelowestterms>
      <checkanswertype>0</checkanswertype>
      <mustverify>1</mustverify>
      <showvalidation>1</showvalidation>
      <options></options>
    </input>
    <prt>
      <name>firsttree</name>
      <value>1</value>
      <autosimplify>1</autosimplify>
      <feedbackvariables>
        <text></text>
      </feedbackvariables>
      <node>
        <name>0</name>
        <answertest>EqualComAss</answertest>
        <sans>ans1</sans>
        <tans>2</tans>
        <testoptions></testoptions>
        <quiet>0</quiet>
        <truescoremode>=</truescoremode>
        <truescore>1</truescore>
        <truepenalty>0</truepenalty>
        <truenextnode>-1</truenextnode>
        <trueanswernote>firsttree-1-T</trueanswernote>
        <truefeedback format="html">
          <text></text>
        </truefeedback>
        <falsescoremode>=</falsescoremode>
        <falsescore>0</falsescore>
        <falsepenalty>0</falsepenalty>
        <falsenextnode>-1</falsenextnode>
        <falseanswernote>firsttree-1-F</falseanswernote>
        <falsefeedback format="html">
          <text></text>
        </falsefeedback>
      </node>
    </prt>
    <deployedseed>12345</deployedseed>
    <qtest>
      <testcase>1</testcase>
      <testinput>
        <name>ans1</name>
        <value>2</value>
      </testinput>
      <expected>
        <name>firsttree</name>
        <expectedscore>1</expectedscore>
        <expectedpenalty>0</expectedpenalty>
        <expectedanswernote>firsttree-1-T</expectedanswernote>
      </expected>
    </qtest>
  </question>
';
        $xmldata = xmlize($xml);
        $importer = new qformat_xml();
        $q = $importer->try_importing_using_qtypes($xmldata['question'], null, null, 'stack');
        $expectedq = new stdClass();
        $expectedq->qtype = 'stack';
        $expectedq->name = 'test-0';
        $expectedq->questiontext = 'What is $1+1$? [[input:ans1]] [[validation:ans1]]';
        $expectedq->questiontextformat = FORMAT_HTML;
        $expectedq->generalfeedback = '';
        $expectedq->generalfeedbackformat = FORMAT_HTML;
        $expectedq->defaultmark = 1;
        $expectedq->length = 1;
        $expectedq->penalty = 0.3333333;
        $expectedq->questionvariables = '';
        $expectedq->specificfeedback = array('text' => '[[feedback:firsttree]]', 'format' => FORMAT_HTML, 'files' => array());
        $expectedq->questionnote = '';
        $expectedq->questionsimplify = 1;
        $expectedq->assumepositive = 0;
        $expectedq->prtcorrect = array('text' => '<p>Correct answer, well done.</p>', 'format' => FORMAT_HTML, 'files' => array());
        $expectedq->prtpartiallycorrect = array('text' => '<p>Your answer is partially correct.</p>', 'format' => FORMAT_HTML, 'files' => array());
        $expectedq->prtincorrect = array('text' => '<p>Incorrect answer.</p>', 'format' => FORMAT_HTML, 'files' => array());
        $expectedq->multiplicationsign = 'dot';
        $expectedq->sqrtsign = 1;
        $expectedq->complexno = 'i';
        $expectedq->inversetrig = 'cos-1';
        $expectedq->matrixparens = '[';
        $expectedq->variantsselectionseed = '';
        $expectedq->ans1type = 'algebraic';
        $expectedq->ans1modelans = 2;
        $expectedq->ans1boxsize = 5;
        $expectedq->ans1strictsyntax = 1;
        $expectedq->ans1insertstars = 0;
        $expectedq->ans1syntaxhint = '';
        $expectedq->ans1forbidwords = '';
        $expectedq->ans1allowwords = '';
        $expectedq->ans1forbidfloat = 1;
        $expectedq->ans1requirelowestterms = 0;
        $expectedq->ans1checkanswertype = 0;
        $expectedq->ans1mustverify = 1;
        $expectedq->ans1showvalidation = 1;
        $expectedq->ans1options = '';
        $expectedq->firsttreevalue = 1;
        $expectedq->firsttreeautosimplify = 1;
        $expectedq->firsttreefeedbackvariables = '';
        $expectedq->firsttreeanswertest[0] = 'EqualComAss';
        $expectedq->firsttreesans[0] = 'ans1';
        $expectedq->firsttreetans[0] = '2';
        $expectedq->firsttreetestoptions[0] = '';
        $expectedq->firsttreequiet[0] = 0;
        $expectedq->firsttreetruescoremode[0] = '=';
        $expectedq->firsttreetruescore[0] = 1;
        $expectedq->firsttreetruepenalty[0] = 0;
        $expectedq->firsttreetruenextnode[0] = -1;
        $expectedq->firsttreetrueanswernote[0] = 'firsttree-1-T';
        $expectedq->firsttreetruefeedback[0] = array('text' => '', 'format' => FORMAT_HTML, 'files' => array());
        $expectedq->firsttreefalsescoremode[0] = '=';
        $expectedq->firsttreefalsescore[0] = 0;
        $expectedq->firsttreefalsepenalty[0] = 0;
        $expectedq->firsttreefalsenextnode[0] = -1;
        $expectedq->firsttreefalseanswernote[0] = 'firsttree-1-F';
        $expectedq->firsttreefalsefeedback[0] = array('text' => '', 'format' => FORMAT_HTML, 'files' => array());
        $expectedq->deployedseeds = array('12345');
        $qtest = new stack_question_test(array('ans1' => '2'));
        $qtest->add_expected_result('firsttree', new stack_potentialresponse_tree_state(1, true, 1, 0, '', array('firsttree-1-T')));
        $expectedq->testcases[1] = $qtest;
        $this->assert(new question_check_specified_fields_expectation($expectedq), $q);
        $this->assertEquals($expectedq->deployedseeds, $q->deployedseeds);
        // Redundant, but gives better fail messages.
        $this->assertEquals($expectedq->testcases, $q->testcases);
        // Redundant, but gives better fail messages.
    }
   public function test_xml_import_legacy()
   {
       $xml = '  <question type="ddwtos">
   <name>
     <text>QDandD1 Base definition</text>
   </name>
   <questiontext format="html">
     <text>&lt;p&gt;Drag and drop the words from the list below to fill the blank spaces ' . 'and correctly complete the sentence.&lt;/p&gt; &lt;p&gt;At 25°C all aqueous basic ' . 'solutions have [[1]]&#160;ion concentrations less than [[8]]&lt;br /&gt;mol ' . 'litre&lt;sup&gt;-1&lt;/sup&gt; and pH values [[9]] than [[6]].&lt;/p&gt; ' . '&lt;!--DONOTCLEAN--&gt;</text>
   </questiontext>
   <image></image>
   <generalfeedback>
     <text>&lt;p&gt;At 25 &amp;#xB0;C all aqueous basic solutions have hydrogen ion ' . 'concentrations less than 10&lt;sup&gt;&amp;#x2212;7&lt;/sup&gt; mol ' . 'litre&lt;sup&gt;&amp;#x2212;1&lt;/sup&gt; and pH values greater than 7.&lt;/p&gt; ' . '&lt;p&gt;See Section 9 of S103 &lt;em class="italic"&gt;Discovering ' . 'Science&lt;/em&gt; Block 8.&lt;/p&gt;</text>
   </generalfeedback>
   <defaultgrade>1</defaultgrade>
   <penalty>0.33</penalty>
   <hidden>0</hidden>
   <shuffleanswers>0</shuffleanswers>
   <shuffleanswers>false</shuffleanswers>
   <answer>
     <correctanswer>1</correctanswer>
     <text>hydrogen</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"1";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>0</correctanswer>
     <text>positive</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"1";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>0</correctanswer>
     <text>hydroxide</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"1";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>0</correctanswer>
     <text>negative</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"1";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>0</correctanswer>
     <text>10&lt;sup&gt;7&lt;/sup&gt;</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"2";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>1</correctanswer>
     <text>7</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"2";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>0</correctanswer>
     <text>1</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"2";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>1</correctanswer>
     <text>10&lt;sup&gt;-7&lt;/sup&gt;</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"2";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>1</correctanswer>
     <text>greater</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"3";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <answer>
     <correctanswer>0</correctanswer>
     <text>less</text>
     <feedback>
       <text>O:8:"stdClass":2:{s:9:"draggroup";s:1:"3";s:8:"infinite";i:0;}</text>
     </feedback>
   </answer>
   <correctfeedback>
     <text>Your answer is correct.</text>
   </correctfeedback>
   <correctresponsesfeedback>1</correctresponsesfeedback>
   <partiallycorrectfeedback>
     <text>Your answer is partially correct.</text>
   </partiallycorrectfeedback>
   <incorrectfeedback>
     <text>Your answer is incorrect.</text>
   </incorrectfeedback>
   <unlimited>0</unlimited>
   <penalty>0.33</penalty>
   <hint>
     <statenumberofcorrectresponses>1</statenumberofcorrectresponses>
     <clearincorrectresponses>0</clearincorrectresponses>
     <hintcontent>
       <text>You may wish to read&#160;Section 9 of&#160;&lt;em ' . 'class="italic"&gt;Discovering Science&lt;/em&gt; Block 8.</text>
     </hintcontent>
   </hint>
   <hint>
     <statenumberofcorrectresponses>1</statenumberofcorrectresponses>
     <clearincorrectresponses>1</clearincorrectresponses>
     <hintcontent>
       <text>Any incorrect choices&#160;will be removed before your final try.</text>
     </hintcontent>
   </hint>
 </question>';
       $xmldata = xmlize($xml);
       $importer = new qformat_xml();
       $q = $importer->try_importing_using_qtypes($xmldata['question'], null, null, 'ddwtos');
       $expectedq = new stdClass();
       $expectedq->qtype = 'ddwtos';
       $expectedq->name = 'QDandD1 Base definition';
       $expectedq->questiontext = '<p>Drag and drop the words from the list below ' . 'to fill the blank spaces and correctly complete the sentence.</p>' . '<p>At 25°C all aqueous basic solutions have [[1]] ion concentrations ' . 'less than [[8]]<br />mol litre<sup>-1</sup> and pH values [[9]] than [[6]].</p>' . '<!--DONOTCLEAN-->';
       $expectedq->questiontextformat = FORMAT_HTML;
       $expectedq->generalfeedback = '<p>At 25 &#xB0;C all aqueous basic solutions ' . 'have hydrogen ion concentrations less than 10<sup>&#x2212;7</sup> ' . 'mol litre<sup>&#x2212;1</sup> and pH values greater than 7.</p><p>See ' . 'Section 9 of S103 <em class="italic">Discovering Science</em> Block 8.</p>';
       $expectedq->defaultmark = 1;
       $expectedq->length = 1;
       $expectedq->penalty = 0.3333333;
       $expectedq->shuffleanswers = 0;
       $expectedq->correctfeedback = array('text' => 'Your answer is correct.', 'format' => FORMAT_HTML);
       $expectedq->partiallycorrectfeedback = array('text' => 'Your answer is partially correct.', 'format' => FORMAT_HTML);
       $expectedq->shownumcorrect = true;
       $expectedq->incorrectfeedback = array('text' => 'Your answer is incorrect.', 'format' => FORMAT_HTML);
       $expectedq->choices = array(array('answer' => array('text' => 'hydrogen', 'format' => FORMAT_PLAIN), 'choicegroup' => 1, 'infinite' => false), array('answer' => array('text' => 'positive', 'format' => FORMAT_PLAIN), 'choicegroup' => 1, 'infinite' => false), array('answer' => array('text' => 'hydroxide', 'format' => FORMAT_PLAIN), 'choicegroup' => 1, 'infinite' => false), array('answer' => array('text' => 'negative', 'format' => FORMAT_PLAIN), 'choicegroup' => 1, 'infinite' => false), array('answer' => array('text' => '10<sup>7</sup>', 'format' => FORMAT_PLAIN), 'choicegroup' => 2, 'infinite' => false), array('answer' => array('text' => '7', 'format' => FORMAT_PLAIN), 'choicegroup' => 2, 'infinite' => false), array('answer' => array('text' => '1', 'format' => FORMAT_PLAIN), 'choicegroup' => 2, 'infinite' => false), array('answer' => array('text' => '10<sup>-7</sup>', 'format' => FORMAT_PLAIN), 'choicegroup' => 2, 'infinite' => false), array('answer' => array('text' => 'greater', 'format' => FORMAT_PLAIN), 'choicegroup' => 3, 'infinite' => false), array('answer' => array('text' => 'less', 'format' => FORMAT_PLAIN), 'choicegroup' => 3, 'infinite' => false));
       $expectedq->hint = array(array('text' => 'You may wish to read Section 9 of ' . '<em class="italic">Discovering Science</em> Block 8.', 'format' => FORMAT_HTML), array('text' => 'Any incorrect choices will be removed before your final try.', 'format' => FORMAT_HTML));
       $expectedq->hintshownumcorrect = array(true, true);
       $expectedq->hintclearwrong = array(false, true);
       $this->assert(new question_check_specified_fields_expectation($expectedq), $q);
       $this->assertEquals($expectedq->choices, $q->choices);
       $this->assertEquals($expectedq->hint, $q->hint);
   }
   public function test_xml_import()
   {
       $xml = '  <question type="gapselect">
   <name>
     <text>A select missing words question</text>
   </name>
   <questiontext format="moodle_auto_format">
     <text>Put these in order: [[1]], [[2]], [[3]].</text>
   </questiontext>
   <generalfeedback>
     <text>The answer is Alpha, Beta, Gamma.</text>
   </generalfeedback>
   <defaultgrade>3</defaultgrade>
   <penalty>0.3333333</penalty>
   <hidden>0</hidden>
   <shuffleanswers>1</shuffleanswers>
   <correctfeedback>
     <text><![CDATA[<p>Your answer is correct.</p>]]></text>
   </correctfeedback>
   <partiallycorrectfeedback>
     <text><![CDATA[<p>Your answer is partially correct.</p>]]></text>
   </partiallycorrectfeedback>
   <incorrectfeedback>
     <text><![CDATA[<p>Your answer is incorrect.</p>]]></text>
   </incorrectfeedback>
   <shownumcorrect/>
   <selectoption>
     <text>Alpha</text>
     <group>1</group>
   </selectoption>
   <selectoption>
     <text>Beta</text>
     <group>1</group>
   </selectoption>
   <selectoption>
     <text>Gamma</text>
     <group>1</group>
   </selectoption>
   <hint format="moodle_auto_format">
     <text>Try again.</text>
     <shownumcorrect />
   </hint>
   <hint format="moodle_auto_format">
     <text>These are the first three letters of the Greek alphabet.</text>
     <shownumcorrect />
     <clearwrong />
   </hint>
 </question>';
       $xmldata = xmlize($xml);
       $importer = new qformat_xml();
       $q = $importer->try_importing_using_qtypes($xmldata['question'], null, null, 'gapselect');
       $expectedq = new stdClass();
       $expectedq->qtype = 'gapselect';
       $expectedq->name = 'A select missing words question';
       $expectedq->questiontext = 'Put these in order: [[1]], [[2]], [[3]].';
       $expectedq->questiontextformat = FORMAT_MOODLE;
       $expectedq->generalfeedback = 'The answer is Alpha, Beta, Gamma.';
       $expectedq->defaultmark = 3;
       $expectedq->length = 1;
       $expectedq->penalty = 0.3333333;
       $expectedq->shuffleanswers = 1;
       $expectedq->correctfeedback = array('text' => '<p>Your answer is correct.</p>', 'format' => FORMAT_MOODLE, 'files' => array());
       $expectedq->partiallycorrectfeedback = array('text' => '<p>Your answer is partially correct.</p>', 'format' => FORMAT_MOODLE, 'files' => array());
       $expectedq->shownumcorrect = true;
       $expectedq->incorrectfeedback = array('text' => '<p>Your answer is incorrect.</p>', 'format' => FORMAT_MOODLE, 'files' => array());
       $expectedq->choices = array(array('answer' => 'Alpha', 'choicegroup' => 1), array('answer' => 'Beta', 'choicegroup' => 1), array('answer' => 'Gamma', 'choicegroup' => 1));
       $expectedq->hint = array(array('text' => 'Try again.', 'format' => FORMAT_MOODLE, 'files' => array()), array('text' => 'These are the first three letters of the Greek alphabet.', 'format' => FORMAT_MOODLE, 'files' => array()));
       $expectedq->hintshownumcorrect = array(true, true);
       $expectedq->hintclearwrong = array(false, true);
       $this->assert(new question_check_specified_fields_expectation($expectedq), $q);
       $this->assertEquals($expectedq->hint, $q->hint);
   }