/mod/quiz/simpletest/testaccessrules.php

https://github.com/viggof/moodle · PHP · 614 lines · 497 code · 66 blank · 51 comment · 2 complexity · 1435aac9347bafdfc4453bbd0a603ce6 MD5 · raw file

  1. <?php
  2. // This file is part of Moodle - http://moodle.org/
  3. //
  4. // Moodle is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // Moodle is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
  16. /**
  17. * Unit tests for (some of) mod/quiz/accessrules.php.
  18. *
  19. * @package mod
  20. * @subpackage quiz
  21. * @copyright 2008 The Open University
  22. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23. */
  24. defined('MOODLE_INTERNAL') || die();
  25. require_once($CFG->dirroot . '/mod/quiz/locallib.php');
  26. /**
  27. * Unit tests for (some of) mod/quiz/accessrules.php.
  28. *
  29. * @copyright 2008 The Open University
  30. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  31. */
  32. class simple_rules_test extends UnitTestCase {
  33. public static $includecoverage = array('mod/quiz/locallib.php');
  34. public function test_num_attempts_access_rule() {
  35. $quiz = new stdClass();
  36. $quiz->attempts = 3;
  37. $quiz->questions = '';
  38. $cm = new stdClass();
  39. $cm->id = 0;
  40. $quizobj = new quiz($quiz, $cm, null);
  41. $rule = new num_attempts_access_rule($quizobj, 0);
  42. $attempt = new stdClass();
  43. $this->assertEqual($rule->description(), get_string('attemptsallowedn', 'quiz', 3));
  44. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  45. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  46. $this->assertEqual($rule->prevent_new_attempt(3, $attempt),
  47. get_string('nomoreattempts', 'quiz'));
  48. $this->assertEqual($rule->prevent_new_attempt(666, $attempt),
  49. get_string('nomoreattempts', 'quiz'));
  50. $this->assertFalse($rule->is_finished(0, $attempt));
  51. $this->assertFalse($rule->is_finished(2, $attempt));
  52. $this->assertTrue($rule->is_finished(3, $attempt));
  53. $this->assertTrue($rule->is_finished(666, $attempt));
  54. $this->assertFalse($rule->prevent_access());
  55. $this->assertFalse($rule->time_left($attempt, 1));
  56. }
  57. public function test_ipaddress_access_rule() {
  58. $quiz = new stdClass();
  59. $attempt = new stdClass();
  60. $cm = new stdClass();
  61. $cm->id = 0;
  62. // Test the allowed case by getting the user's IP address. However, this
  63. // does not always work, for example using the mac install package on my laptop.
  64. $quiz->subnet = getremoteaddr(null);
  65. if (!empty($quiz->subnet)) {
  66. $quiz->questions = '';
  67. $quizobj = new quiz($quiz, $cm, null);
  68. $rule = new ipaddress_access_rule($quizobj, 0);
  69. $this->assertFalse($rule->prevent_access());
  70. $this->assertFalse($rule->description());
  71. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  72. $this->assertFalse($rule->is_finished(0, $attempt));
  73. $this->assertFalse($rule->time_left($attempt, 1));
  74. }
  75. $quiz->subnet = '0.0.0.0';
  76. $quiz->questions = '';
  77. $quizobj = new quiz($quiz, $cm, null);
  78. $rule = new ipaddress_access_rule($quizobj, 0);
  79. $this->assertTrue($rule->prevent_access());
  80. $this->assertFalse($rule->description());
  81. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  82. $this->assertFalse($rule->is_finished(0, $attempt));
  83. $this->assertFalse($rule->time_left($attempt, 1));
  84. }
  85. public function test_time_limit_access_rule() {
  86. $quiz = new stdClass();
  87. $quiz->timelimit = 3600;
  88. $quiz->questions = '';
  89. $cm = new stdClass();
  90. $cm->id = 0;
  91. $quizobj = new quiz($quiz, $cm, null);
  92. $rule = new time_limit_access_rule($quizobj, 10000);
  93. $attempt = new stdClass();
  94. $this->assertEqual($rule->description(),
  95. get_string('quiztimelimit', 'quiz', format_time(3600)));
  96. $attempt->timestart = 10000;
  97. $this->assertEqual($rule->time_left($attempt, 10000), 3600);
  98. $this->assertEqual($rule->time_left($attempt, 12000), 1600);
  99. $this->assertEqual($rule->time_left($attempt, 14000), -400);
  100. $this->assertFalse($rule->prevent_access());
  101. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  102. $this->assertFalse($rule->is_finished(0, $attempt));
  103. }
  104. }
  105. /**
  106. * @copyright 2008 The Open University
  107. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  108. */
  109. class open_close_date_access_rule_test extends UnitTestCase {
  110. public function test_no_dates() {
  111. $quiz = new stdClass();
  112. $quiz->timeopen = 0;
  113. $quiz->timeclose = 0;
  114. $quiz->questions = '';
  115. $cm = new stdClass();
  116. $cm->id = 0;
  117. $quizobj = new quiz($quiz, $cm, null);
  118. $attempt = new stdClass();
  119. $attempt->preview = 0;
  120. $rule = new open_close_date_access_rule($quizobj, 10000);
  121. $this->assertFalse($rule->description());
  122. $this->assertFalse($rule->prevent_access());
  123. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  124. $this->assertFalse($rule->is_finished(0, $attempt));
  125. $this->assertFalse($rule->time_left($attempt, 10000));
  126. $this->assertFalse($rule->time_left($attempt, 0));
  127. $rule = new open_close_date_access_rule($quizobj, 0);
  128. $this->assertFalse($rule->description());
  129. $this->assertFalse($rule->prevent_access());
  130. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  131. $this->assertFalse($rule->is_finished(0, $attempt));
  132. $this->assertFalse($rule->time_left($attempt, 0));
  133. }
  134. public function test_start_date() {
  135. $quiz = new stdClass();
  136. $quiz->timeopen = 10000;
  137. $quiz->timeclose = 0;
  138. $quiz->questions = '';
  139. $cm = new stdClass();
  140. $cm->id = 0;
  141. $quizobj = new quiz($quiz, $cm, null);
  142. $attempt = new stdClass();
  143. $attempt->preview = 0;
  144. $rule = new open_close_date_access_rule($quizobj, 9999);
  145. $this->assertEqual($rule->description(),
  146. array(get_string('quiznotavailable', 'quiz', userdate(10000))));
  147. $this->assertEqual($rule->prevent_access(),
  148. get_string('notavailable', 'quiz'));
  149. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  150. $this->assertFalse($rule->is_finished(0, $attempt));
  151. $this->assertFalse($rule->time_left($attempt, 0));
  152. $rule = new open_close_date_access_rule($quizobj, 10000);
  153. $this->assertEqual($rule->description(),
  154. array(get_string('quizopenedon', 'quiz', userdate(10000))));
  155. $this->assertFalse($rule->prevent_access());
  156. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  157. $this->assertFalse($rule->is_finished(0, $attempt));
  158. $this->assertFalse($rule->time_left($attempt, 0));
  159. }
  160. public function test_close_date() {
  161. $quiz = new stdClass();
  162. $quiz->timeopen = 0;
  163. $quiz->timeclose = 20000;
  164. $quiz->questions = '';
  165. $cm = new stdClass();
  166. $cm->id = 0;
  167. $quizobj = new quiz($quiz, $cm, null);
  168. $attempt = new stdClass();
  169. $attempt->preview = 0;
  170. $rule = new open_close_date_access_rule($quizobj, 20000);
  171. $this->assertEqual($rule->description(),
  172. array(get_string('quizcloseson', 'quiz', userdate(20000))));
  173. $this->assertFalse($rule->prevent_access());
  174. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  175. $this->assertFalse($rule->is_finished(0, $attempt));
  176. $this->assertFalse($rule->time_left($attempt, 20000 - QUIZ_SHOW_TIME_BEFORE_DEADLINE));
  177. $this->assertEqual($rule->time_left($attempt, 19900), 100);
  178. $this->assertEqual($rule->time_left($attempt, 20000), 0);
  179. $this->assertEqual($rule->time_left($attempt, 20100), -100);
  180. $rule = new open_close_date_access_rule($quizobj, 20001);
  181. $this->assertEqual($rule->description(),
  182. array(get_string('quizclosed', 'quiz', userdate(20000))));
  183. $this->assertEqual($rule->prevent_access(),
  184. get_string('notavailable', 'quiz'));
  185. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  186. $this->assertTrue($rule->is_finished(0, $attempt));
  187. $this->assertFalse($rule->time_left($attempt, 20000 - QUIZ_SHOW_TIME_BEFORE_DEADLINE));
  188. $this->assertEqual($rule->time_left($attempt, 19900), 100);
  189. $this->assertEqual($rule->time_left($attempt, 20000), 0);
  190. $this->assertEqual($rule->time_left($attempt, 20100), -100);
  191. }
  192. public function test_both_dates() {
  193. $quiz = new stdClass();
  194. $quiz->timeopen = 10000;
  195. $quiz->timeclose = 20000;
  196. $quiz->questions = '';
  197. $cm = new stdClass();
  198. $cm->id = 0;
  199. $quizobj = new quiz($quiz, $cm, null);
  200. $attempt = new stdClass();
  201. $attempt->preview = 0;
  202. $rule = new open_close_date_access_rule($quizobj, 9999);
  203. $this->assertEqual($rule->description(),
  204. array(get_string('quiznotavailable', 'quiz', userdate(10000))));
  205. $this->assertEqual($rule->prevent_access(),
  206. get_string('notavailable', 'quiz'));
  207. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  208. $this->assertFalse($rule->is_finished(0, $attempt));
  209. $rule = new open_close_date_access_rule($quizobj, 10000);
  210. $this->assertEqual($rule->description(),
  211. array(get_string('quizopenedon', 'quiz', userdate(10000)),
  212. get_string('quizcloseson', 'quiz', userdate(20000))));
  213. $this->assertFalse($rule->prevent_access());
  214. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  215. $this->assertFalse($rule->is_finished(0, $attempt));
  216. $rule = new open_close_date_access_rule($quizobj, 20000);
  217. $this->assertEqual($rule->description(),
  218. array(get_string('quizopenedon', 'quiz', userdate(10000)),
  219. get_string('quizcloseson', 'quiz', userdate(20000))));
  220. $this->assertFalse($rule->prevent_access());
  221. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  222. $this->assertFalse($rule->is_finished(0, $attempt));
  223. $rule = new open_close_date_access_rule($quizobj, 20001);
  224. $this->assertEqual($rule->description(),
  225. array(get_string('quizclosed', 'quiz', userdate(20000))));
  226. $this->assertEqual($rule->prevent_access(),
  227. get_string('notavailable', 'quiz'));
  228. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  229. $this->assertTrue($rule->is_finished(0, $attempt));
  230. $this->assertFalse($rule->time_left($attempt, 20000 - QUIZ_SHOW_TIME_BEFORE_DEADLINE));
  231. $this->assertEqual($rule->time_left($attempt, 19900), 100);
  232. $this->assertEqual($rule->time_left($attempt, 20000), 0);
  233. $this->assertEqual($rule->time_left($attempt, 20100), -100);
  234. }
  235. }
  236. /**
  237. * @copyright 2008 The Open University
  238. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  239. */
  240. class inter_attempt_delay_access_rule_test extends UnitTestCase {
  241. public function test_just_first_delay() {
  242. $quiz = new stdClass();
  243. $quiz->attempts = 3;
  244. $quiz->timelimit = 0;
  245. $quiz->delay1 = 1000;
  246. $quiz->delay2 = 0;
  247. $quiz->timeclose = 0;
  248. $quiz->questions = '';
  249. $cm = new stdClass();
  250. $cm->id = 0;
  251. $quizobj = new quiz($quiz, $cm, null);
  252. $attempt = new stdClass();
  253. $attempt->timefinish = 10000;
  254. $rule = new inter_attempt_delay_access_rule($quizobj, 10000);
  255. $this->assertFalse($rule->description());
  256. $this->assertFalse($rule->prevent_access());
  257. $this->assertFalse($rule->is_finished(0, $attempt));
  258. $this->assertFalse($rule->time_left($attempt, 0));
  259. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  260. $this->assertFalse($rule->prevent_new_attempt(3, $attempt));
  261. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  262. get_string('youmustwait', 'quiz', userdate(11000)));
  263. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  264. $attempt->timefinish = 9000;
  265. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  266. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  267. $attempt->timefinish = 9001;
  268. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  269. get_string('youmustwait', 'quiz', userdate(10001)));
  270. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  271. }
  272. public function test_just_second_delay() {
  273. $quiz = new stdClass();
  274. $quiz->attempts = 5;
  275. $quiz->timelimit = 0;
  276. $quiz->delay1 = 0;
  277. $quiz->delay2 = 1000;
  278. $quiz->timeclose = 0;
  279. $quiz->questions = '';
  280. $cm = new stdClass();
  281. $cm->id = 0;
  282. $quizobj = new quiz($quiz, $cm, null);
  283. $attempt = new stdClass();
  284. $attempt->timefinish = 10000;
  285. $rule = new inter_attempt_delay_access_rule($quizobj, 10000);
  286. $this->assertFalse($rule->description());
  287. $this->assertFalse($rule->prevent_access());
  288. $this->assertFalse($rule->is_finished(0, $attempt));
  289. $this->assertFalse($rule->time_left($attempt, 0));
  290. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  291. $this->assertFalse($rule->prevent_new_attempt(5, $attempt));
  292. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  293. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  294. get_string('youmustwait', 'quiz', userdate(11000)));
  295. $this->assertEqual($rule->prevent_new_attempt(3, $attempt),
  296. get_string('youmustwait', 'quiz', userdate(11000)));
  297. $attempt->timefinish = 9000;
  298. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  299. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  300. $this->assertFalse($rule->prevent_new_attempt(3, $attempt));
  301. $attempt->timefinish = 9001;
  302. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  303. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  304. get_string('youmustwait', 'quiz', userdate(10001)));
  305. $this->assertEqual($rule->prevent_new_attempt(4, $attempt),
  306. get_string('youmustwait', 'quiz', userdate(10001)));
  307. }
  308. public function test_just_both_delays() {
  309. $quiz = new stdClass();
  310. $quiz->attempts = 5;
  311. $quiz->timelimit = 0;
  312. $quiz->delay1 = 2000;
  313. $quiz->delay2 = 1000;
  314. $quiz->timeclose = 0;
  315. $quiz->questions = '';
  316. $cm = new stdClass();
  317. $cm->id = 0;
  318. $quizobj = new quiz($quiz, $cm, null);
  319. $attempt = new stdClass();
  320. $attempt->timefinish = 10000;
  321. $rule = new inter_attempt_delay_access_rule($quizobj, 10000);
  322. $this->assertFalse($rule->description());
  323. $this->assertFalse($rule->prevent_access());
  324. $this->assertFalse($rule->is_finished(0, $attempt));
  325. $this->assertFalse($rule->time_left($attempt, 0));
  326. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  327. $this->assertFalse($rule->prevent_new_attempt(5, $attempt));
  328. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  329. get_string('youmustwait', 'quiz', userdate(12000)));
  330. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  331. get_string('youmustwait', 'quiz', userdate(11000)));
  332. $this->assertEqual($rule->prevent_new_attempt(3, $attempt),
  333. get_string('youmustwait', 'quiz', userdate(11000)));
  334. $attempt->timefinish = 8000;
  335. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  336. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  337. $this->assertFalse($rule->prevent_new_attempt(3, $attempt));
  338. $attempt->timefinish = 8001;
  339. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  340. get_string('youmustwait', 'quiz', userdate(10001)));
  341. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  342. $this->assertFalse($rule->prevent_new_attempt(4, $attempt));
  343. $attempt->timefinish = 9000;
  344. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  345. get_string('youmustwait', 'quiz', userdate(11000)));
  346. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  347. $this->assertFalse($rule->prevent_new_attempt(3, $attempt));
  348. $attempt->timefinish = 9001;
  349. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  350. get_string('youmustwait', 'quiz', userdate(11001)));
  351. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  352. get_string('youmustwait', 'quiz', userdate(10001)));
  353. $this->assertEqual($rule->prevent_new_attempt(4, $attempt),
  354. get_string('youmustwait', 'quiz', userdate(10001)));
  355. }
  356. public function test_with_close_date() {
  357. $quiz = new stdClass();
  358. $quiz->attempts = 5;
  359. $quiz->timelimit = 0;
  360. $quiz->delay1 = 2000;
  361. $quiz->delay2 = 1000;
  362. $quiz->timeclose = 15000;
  363. $quiz->questions = '';
  364. $cm = new stdClass();
  365. $cm->id = 0;
  366. $quizobj = new quiz($quiz, $cm, null);
  367. $attempt = new stdClass();
  368. $attempt->timefinish = 13000;
  369. $rule = new inter_attempt_delay_access_rule($quizobj, 10000);
  370. $this->assertFalse($rule->description());
  371. $this->assertFalse($rule->prevent_access());
  372. $this->assertFalse($rule->is_finished(0, $attempt));
  373. $this->assertFalse($rule->time_left($attempt, 0));
  374. $attempt->timefinish = 13000;
  375. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  376. get_string('youmustwait', 'quiz', userdate(15000)));
  377. $attempt->timefinish = 13001;
  378. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  379. get_string('youcannotwait', 'quiz'));
  380. $attempt->timefinish = 14000;
  381. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  382. get_string('youmustwait', 'quiz', userdate(15000)));
  383. $attempt->timefinish = 14001;
  384. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  385. get_string('youcannotwait', 'quiz'));
  386. $rule = new inter_attempt_delay_access_rule($quizobj, 15000);
  387. $attempt->timefinish = 13000;
  388. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  389. $attempt->timefinish = 13001;
  390. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  391. get_string('youcannotwait', 'quiz'));
  392. $attempt->timefinish = 14000;
  393. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  394. $attempt->timefinish = 14001;
  395. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  396. get_string('youcannotwait', 'quiz'));
  397. $rule = new inter_attempt_delay_access_rule($quizobj, 15001);
  398. $attempt->timefinish = 13000;
  399. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  400. $attempt->timefinish = 13001;
  401. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  402. $attempt->timefinish = 14000;
  403. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  404. $attempt->timefinish = 14001;
  405. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  406. }
  407. public function test_time_limit_and_overdue() {
  408. $quiz = new stdClass();
  409. $quiz->attempts = 5;
  410. $quiz->timelimit = 100;
  411. $quiz->delay1 = 2000;
  412. $quiz->delay2 = 1000;
  413. $quiz->timeclose = 0;
  414. $quiz->questions = '';
  415. $cm = new stdClass();
  416. $cm->id = 0;
  417. $quizobj = new quiz($quiz, $cm, null);
  418. $attempt = new stdClass();
  419. $attempt->timestart = 9900;
  420. $attempt->timefinish = 10100;
  421. $rule = new inter_attempt_delay_access_rule($quizobj, 10000);
  422. $this->assertFalse($rule->description());
  423. $this->assertFalse($rule->prevent_access());
  424. $this->assertFalse($rule->is_finished(0, $attempt));
  425. $this->assertFalse($rule->time_left($attempt, 0));
  426. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  427. $this->assertFalse($rule->prevent_new_attempt(5, $attempt));
  428. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  429. get_string('youmustwait', 'quiz', userdate(12000)));
  430. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  431. get_string('youmustwait', 'quiz', userdate(11000)));
  432. $this->assertEqual($rule->prevent_new_attempt(3, $attempt),
  433. get_string('youmustwait', 'quiz', userdate(11000)));
  434. $attempt->timestart = 7950;
  435. $attempt->timefinish = 8000;
  436. $this->assertFalse($rule->prevent_new_attempt(1, $attempt));
  437. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  438. $this->assertFalse($rule->prevent_new_attempt(3, $attempt));
  439. $attempt->timestart = 7950;
  440. $attempt->timefinish = 8001;
  441. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  442. get_string('youmustwait', 'quiz', userdate(10001)));
  443. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  444. $this->assertFalse($rule->prevent_new_attempt(4, $attempt));
  445. $attempt->timestart = 8950;
  446. $attempt->timefinish = 9000;
  447. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  448. get_string('youmustwait', 'quiz', userdate(11000)));
  449. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  450. $this->assertFalse($rule->prevent_new_attempt(3, $attempt));
  451. $attempt->timestart = 8950;
  452. $attempt->timefinish = 9001;
  453. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  454. get_string('youmustwait', 'quiz', userdate(11001)));
  455. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  456. get_string('youmustwait', 'quiz', userdate(10001)));
  457. $this->assertEqual($rule->prevent_new_attempt(4, $attempt),
  458. get_string('youmustwait', 'quiz', userdate(10001)));
  459. $attempt->timestart = 8900;
  460. $attempt->timefinish = 9100;
  461. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  462. get_string('youmustwait', 'quiz', userdate(11000)));
  463. $this->assertFalse($rule->prevent_new_attempt(2, $attempt));
  464. $this->assertFalse($rule->prevent_new_attempt(3, $attempt));
  465. $attempt->timestart = 8901;
  466. $attempt->timefinish = 9100;
  467. $this->assertEqual($rule->prevent_new_attempt(1, $attempt),
  468. get_string('youmustwait', 'quiz', userdate(11001)));
  469. $this->assertEqual($rule->prevent_new_attempt(2, $attempt),
  470. get_string('youmustwait', 'quiz', userdate(10001)));
  471. $this->assertEqual($rule->prevent_new_attempt(4, $attempt),
  472. get_string('youmustwait', 'quiz', userdate(10001)));
  473. }
  474. }
  475. /**
  476. * @copyright 2008 The Open University
  477. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  478. */
  479. class password_access_rule_test extends UnitTestCase {
  480. public function test_password_access_rule() {
  481. $quiz = new stdClass();
  482. $quiz->password = 'frog';
  483. $quiz->questions = '';
  484. $cm = new stdClass();
  485. $cm->id = 0;
  486. $quizobj = new quiz($quiz, $cm, null);
  487. $rule = new password_access_rule($quizobj, 0);
  488. $attempt = new stdClass();
  489. $this->assertFalse($rule->prevent_access());
  490. $this->assertEqual($rule->description(), get_string('requirepasswordmessage', 'quiz'));
  491. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  492. $this->assertFalse($rule->is_finished(0, $attempt));
  493. $this->assertFalse($rule->time_left($attempt, 1));
  494. }
  495. }
  496. /**
  497. * @copyright 2008 The Open University
  498. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  499. */
  500. class securewindow_access_rule_test extends UnitTestCase {
  501. // Nothing very testable in this class, just test that it obeys the general access rule contact.
  502. public function test_securewindow_access_rule() {
  503. $quiz = new stdClass();
  504. $quiz->popup = 1;
  505. $quiz->questions = '';
  506. $cm = new stdClass();
  507. $cm->id = 0;
  508. $quizobj = new quiz($quiz, $cm, null);
  509. $rule = new securewindow_access_rule($quizobj, 0);
  510. $attempt = new stdClass();
  511. $this->assertFalse($rule->prevent_access());
  512. $this->assertFalse($rule->description());
  513. $this->assertFalse($rule->prevent_new_attempt(0, $attempt));
  514. $this->assertFalse($rule->is_finished(0, $attempt));
  515. $this->assertFalse($rule->time_left($attempt, 1));
  516. }
  517. }
  518. /**
  519. * @copyright 2008 The Open University
  520. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  521. */
  522. class quiz_access_manager_test extends UnitTestCase {
  523. public function test_cannot_review_message() {
  524. $quiz = new stdClass();
  525. $quiz->reviewattempt = 0x10010;
  526. $quiz->timeclose = 0;
  527. $quiz->attempts = 0;
  528. $quiz->questions = '1,2,0,3,4,0';
  529. $cm = new stdClass();
  530. $cm->id = 123;
  531. $quizobj = new quiz($quiz, $cm, new stdClass(), false);
  532. $am = new quiz_access_manager($quizobj, time(), false);
  533. $this->assertEqual('',
  534. $am->cannot_review_message(mod_quiz_display_options::DURING));
  535. $this->assertEqual('',
  536. $am->cannot_review_message(mod_quiz_display_options::IMMEDIATELY_AFTER));
  537. $this->assertEqual(get_string('noreview', 'quiz'),
  538. $am->cannot_review_message(mod_quiz_display_options::LATER_WHILE_OPEN));
  539. $this->assertEqual(get_string('noreview', 'quiz'),
  540. $am->cannot_review_message(mod_quiz_display_options::AFTER_CLOSE));
  541. $closetime = time() + 10000;
  542. $quiz->timeclose = $closetime;
  543. $quizobj = new quiz($quiz, $cm, new stdClass(), false);
  544. $am = new quiz_access_manager($quizobj, time(), false);
  545. $this->assertEqual(get_string('noreviewuntil', 'quiz', userdate($closetime)),
  546. $am->cannot_review_message(mod_quiz_display_options::LATER_WHILE_OPEN));
  547. }
  548. }