View source
<?php
class QuestionsExportTestCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => t('Question Exporting'),
'description' => t('Test exporting of questions in various formats.'),
'group' => t('Quiz'),
);
}
function setUp() {
parent::setUp('taxonomy', 'quiz', 'views', 'autoload', 'multichoice', 'quiz_directions', 'quiz_question', 'querypath', 'questions_import', 'short_answer', 'long_answer', 'truefalse', 'matching', 'questions_export');
$permission = array(
'administer site configuration',
'access administration pages',
'administer quiz',
'access quiz',
'administer blocks',
'import questions',
'create quiz',
'administer quiz configuration',
'use PHP for block visibility',
'administer blocks',
'create multichoice',
'edit any multichoice',
'administer taxonomy',
'allow multiple correct answers',
'allow any number of answers',
'export questions',
);
$user = $this
->drupalCreateUser($permission);
$this
->drupalLogin($user);
$quiz_settings = array();
$quiz_settings['title'] = $this
->randomName(64);
$quiz_settings['body'] = $this
->randomName(255);
$msg = $this
->drupalPost('node/add/quiz', $quiz_settings, 'Save');
}
function writeImport($input_type, $question) {
$char = array(
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
);
switch ($input_type) {
case "aiken":
switch ($question->type) {
case "multichoice":
$write = $question->type . "\r\n" . $question->question . "\r\n";
for ($i = 0; $i < count($question->answers); $i++) {
$write .= "{$char[$i]}: {$question->answers[$i]}\r\n nil \r\n";
}
$write .= "ANSWER: {$char[$question->answer]} \r\n \r\n";
break;
case "true_false":
$write = $question->type . "\r\n" . $question->question . "\r\n" . $question->answer . "\r\n" . $question->feedback . "\r\n \r\n";
break;
case "short_answer":
$write = $question->type . "\r\n" . $question->question . "\r\n" . $question->answer . "\r\n" . $question->value . "\r\n" . $question->shortanswertype . "\r\n \r\n";
break;
case "long_answer":
$write = $question->type . "\r\n" . $question->question . "\r\n" . $question->value . "\r\n \r\n";
break;
}
break;
case "csv":
switch ($question->type) {
case "multichoice":
$write = $question->type . ', ' . $question->question . ', ';
for ($i = 0; $i < count($question->answers); $i++) {
$write .= $question->answers[$i] . ', nil, ';
}
$write .= $question->answers[$question->answer] . "\r\n";
break;
case "true_false":
$write = $question->type . ', ' . $question->question . ', ' . $question->answer . ', ' . $question->feedback . "\r\n";
break;
case "short_answer":
$write = $question->type . ', ' . $question->question . ', ' . $question->answer . ', ' . $question->value . ', ' . $question->shortanswertype . "\r\n";
break;
case "matching":
$write = $question->type . ', ' . $question->question . ', ';
for ($i = 0; $i < count($question->matches); $i++) {
$write .= $question->matches[$i] . ', ' . ($write .= $question->answers[$i] . ', nil, ');
}
$write .= "\r\n";
break;
case "long_answer":
$write = $question->type . ', ' . $question->question . ', ' . $question->value . "\r\n";
break;
}
break;
}
return $write;
}
function writeExport($export_type, $qid = 1) {
$export_settings['export_format'] = $export_type;
$export_settings['quiz_node'] = $qid;
$this
->drupalPost('admin/quiz/questions_export', $export_settings, 'Export');
$file = file(file_directory_path() . '/Quiz.txt');
$this
->assertNotEqual(0, count($file), '[Export] Checking at least something was put into export file');
}
function medlyHelper($import_type) {
switch ($import_type) {
case 'aiken':
$import_settings['import_type'] = 'native_aiken';
$filetype = '.txt';
break;
case 'csv':
$import_settings['import_type'] = 'native_csv';
$filetype = '.csv';
break;
}
$import_questions = array();
$filepath = file_create_filename($import_type . '_medly' . $filetype, file_directory_temp());
$handle = fopen($filepath, "w+");
for ($i = 0; $i < 30; $i++) {
$question_type = mt_rand(0, 2);
$question = new stdClass();
switch ($question_type) {
case 0:
$question->num_options = mt_rand(1, 10);
$question->answer = mt_rand(0, $question->num_options - 1);
$question->question = "Question #{$i}:";
$question->type = "multichoice";
$question->answers = array();
$write = $question->type . "\r\n" . $question->question . "\r\n";
for ($j = 0; $j < $question->num_options; $j++) {
$question->answers[$j] = "Option #{$j}";
}
break;
case 1:
$question->answer = mt_rand(0, 1) == 0 ? "true" : "false";
$question->question = "Question #{$i}:";
$question->type = "true_false";
$question->feedback = "Feedback on question #{$i}";
break;
case 2:
$question->answer = "The answer is {$i}.";
$question->question = "Question #{$i}:";
$question->type = "short_answer";
$question->value = mt_rand(1, 5);
$question->sat = mt_rand(0, 3);
switch ($question->sat) {
case 1:
$question->shortanswertype = "case insensitive match";
break;
case 2:
$question->shortanswertype = "case sensitive match";
break;
case 3:
$question->shortanswertype = "regular expression match";
break;
case 4:
$question->shortanswertype = "manually score match";
break;
}
break;
}
$write = $this
->writeImport($import_type, $question);
fwrite($handle, $write);
$import_questions[] = $question;
}
$import_settings['quiz_node'] = '1';
$import_settings['field_separator'] = ',';
$import_settings['files[upload]'] = $filepath;
$this
->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
$this
->assertPattern('/30 questions were imported successfully/', t('Checking import success message'));
}
function multichoiceHelper($import_type) {
$import_questions = array();
switch ($import_type) {
case 'aiken':
$import_settings['import_type'] = 'native_aiken';
$filetype = '.txt';
break;
case 'csv':
$import_settings['import_type'] = 'native_csv';
$filetype = '.csv';
break;
}
$filepath = file_create_filename($import_type . '_multichoice' . $filetype, file_directory_temp());
$handle = fopen($filepath, "w+");
for ($i = 0; $i < 30; $i++) {
$question = new stdClass();
$question->num_options = mt_rand(2, 6);
$question->answer = mt_rand(0, $question->num_options - 1);
$question->question = "Question #{$i}:";
$question->type = "multichoice";
$question->answers = array();
for ($j = 0; $j < $question->num_options; $j++) {
$question->answers[$j] = "Option #{$j}";
}
$write = $this
->writeImport($import_type, $question);
fwrite($handle, $write);
$import_questions[] = $question;
}
fclose($handle);
$import_settings['quiz_node'] = '1';
$import_settings['field_separator'] = ',';
$import_settings['files[upload]'] = $filepath;
$msg = $this
->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
$this
->assertPattern('/30 questions were imported successfully/', t('[Multichoice] Checking import success message'));
}
function matchingHelper($import_type) {
$import_questions = array();
switch ($import_type) {
case 'aiken':
$this
->assertEqual(0, 1, "Aiken does not support matching import questions");
return;
break;
case 'csv':
$import_settings['import_type'] = 'native_csv';
$filetype = '.csv';
break;
}
$filepath = file_create_filename($import_type . '_matching' . $filetype, file_directory_temp());
$handle = fopen($filepath, "w+");
for ($i = 0; $i < 30; $i++) {
$question = new stdClass();
$question->num_options = mt_rand(1, 10);
$question->question = "Question #{$i}:";
$question->type = "matching";
$question->matches = array();
$question->answers = array();
for ($j = 0; $j < $question->num_options; $j++) {
$question->matches[] = "Match #{$j}";
$question->answers[] = "Answer #{$j}";
}
$write = $this
->writeImport($import_type, $question);
fwrite($handle, $write);
$import_questions[] = $question;
}
fclose($handle);
$import_settings['quiz_node'] = '1';
$import_settings['field_separator'] = ',';
$import_settings['files[upload]'] = $filepath;
$this
->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
$this
->assertPattern('/30 questions were imported successfully/', t('[Matching] Checking import success message'));
}
function truefalseHelper($import_type) {
$import_questions = array();
switch ($import_type) {
case 'aiken':
$import_settings['import_type'] = 'native_aiken';
$filetype = '.txt';
break;
case 'csv':
$import_settings['import_type'] = 'native_csv';
$filetype = '.csv';
break;
}
$filepath = file_create_filename($import_type . '_truefalse' . $filetype, file_directory_temp());
$handle = fopen($filepath, "w+");
for ($i = 0; $i < 50; $i++) {
$question = new stdClass();
$question->answer = mt_rand(0, 1) == 0 ? "true" : "false";
$question->question = "Question #{$i}:";
$question->type = "true_false";
$question->feedback = "Feedback on question #{$i}";
$write = $this
->writeImport($import_type, $question);
fwrite($handle, $write);
$import_questions[] = $question;
}
fclose($handle);
$import_settings['quiz_node'] = '1';
$import_settings['field_separator'] = ',';
$import_settings['files[upload]'] = $filepath;
$msg = $this
->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
$this
->assertPattern('/50 questions were imported successfully/', t('[True_False] Checking import success message'));
}
function shortanswerHelper($import_type) {
$import_questions = array();
switch ($import_type) {
case 'aiken':
$import_settings['import_type'] = 'native_aiken';
$filetype = '.txt';
break;
case 'csv':
$import_settings['import_type'] = 'native_csv';
$filetype = '.csv';
break;
}
$filepath = file_create_filename($import_type . '_shortanswer' . $filetype, file_directory_temp());
$handle = fopen($filepath, "w+");
for ($i = 0; $i < 20; $i++) {
$question = new stdClass();
$question->answer = "The answer is {$i}.";
$question->question = "Question #{$i}:";
$question->type = "short_answer";
$question->value = mt_rand(1, 5);
$question->sat = mt_rand(0, 3);
switch ($question->sat) {
case 0:
$question->shortanswertype = "case insensitive match";
break;
case 1:
$question->shortanswertype = "case sensitive match";
break;
case 2:
$question->shortanswertype = "regular expression match";
break;
case 3:
$question->shortanswertype = "manually score match";
break;
}
$write = $this
->writeImport($import_type, $question);
fwrite($handle, $write);
$import_questions[] = $question;
}
fclose($handle);
$import_settings['quiz_node'] = '1';
$import_settings['field_separator'] = ',';
$import_settings['files[upload]'] = $filepath;
$msg = $this
->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
$this
->assertPattern('/20 questions were imported successfully/', t('[Short_Answer] Checking import success message'));
}
function multiloadHelper($import_type) {
$import_settings['quiz_node'] = '1';
switch ($import_type) {
case 'aiken':
$import_settings['import_type'] = 'native_aiken';
$filetype = '.txt';
break;
case 'csv':
$import_settings['import_type'] = 'native_csv';
$filetype = '.csv';
break;
}
$import_settings['field_separator'] = ',';
$import_questions = array();
for ($i = 0; $i < 6; $i++) {
$filepath = file_create_filename($import_type . '_multi_' . $i . $filetype, file_directory_temp());
$handle = fopen($filepath, "w+");
for ($j = $i * 5; $j < ($i + 1) * 5; $j++) {
$question = new stdClass();
$question->num_options = mt_rand(2, 5);
$question->answer = mt_rand(0, $question->num_options - 1);
$question->question = "Question #{$j}:";
$question->type = "multichoice";
$question->answers = array(
"true",
"false",
);
for ($k = 0; $k < $question->num_options; $k++) {
$question->answers[$k] = "Option #{$k}";
}
$write = $this
->writeImport($import_type, $question);
fwrite($handle, $write);
$import_questions[] = $question;
}
fclose($handle);
$import_settings['files[upload]'] = $filepath;
$this
->drupalPost('admin/quiz/questions_import', $import_settings, 'Import');
$this
->assertPattern('/5 questions were imported successfully/', t('Checking import success message'));
}
}
function testAikenMedly() {
$this
->medlyHelper('aiken');
$this
->writeExport('native_aiken');
}
function testAikenMultichoice() {
$this
->multichoiceHelper('aiken');
$this
->writeExport('native_aiken');
}
function testAikenTrueFalse() {
$this
->truefalseHelper('aiken');
$this
->writeExport('native_aiken');
}
function testAikenShortAnswer() {
$this
->shortanswerHelper('aiken');
$this
->writeExport('native_aiken');
}
function testCsvMedly() {
$this
->medlyHelper('csv');
$this
->writeExport('native_csv');
}
function testCsvMultichoice() {
$this
->multichoiceHelper('csv');
$this
->writeExport('native_csv');
}
function testCsvMatching() {
$this
->matchingHelper('csv');
$this
->writeExport('native_csv');
}
function testCsvTrueFalse() {
$this
->truefalseHelper('csv');
$this
->writeExport('native_csv');
}
function testCsvShortAnswer() {
$this
->shortanswerHelper('csv');
$this
->writeExport('native_csv');
}
}