5 * Tests for ccrm_extensionvalidation.module.
9 * Tests version validation/formatting logic
11 class CcrmExtensionValidatationTestCase extends DrupalUnitTestCase {
13 public static function getInfo() {
15 'name' => 'Version Formatting',
16 'description' => 'Tests version validation/formatting logic',
17 'group' => 'ccrm_extensionvalidation',
21 public function setUp() {
23 module_load_include('version.inc', 'ccrm_extensionvalidation');
26 public function testIsValid() {
47 '123456789', // exceeds padding limit
48 '20120101', // exceeds padding limit
49 '20120101124556', // exceeds padding limit
54 foreach ($valids as $valid) {
57 ccrm_extensionvalidation_version_isValid($valid),
58 "Expected that '$valid' is valid"
61 foreach ($invalids as $invalid) {
64 ccrm_extensionvalidation_version_isValid($invalid),
65 "Expected that '$invalid' is invalid"
70 public function testSortNormalizedValues() {
72 array('1.alpha1', '1.alpha2', '1.beta', '1.0', '1.0.1', '1.1'),
73 array('1.alpha.1', '1.beta2','1.rc1'),
74 array('4.2.alpha1', '4.2.alpha2', '4.2.beta1', '4.2.beta2', '4.2.0'),
75 array('1.9', '1.9.1', '1.10', '1.10.1'),
76 array('r1', 'r9', 'r10', 'r900', 'r1001'),
77 array('1', '2', '9', '10', '11'),
78 array('1.0', '1.1', '2.0', '2.1', '3.0', '3.1'),
80 foreach ($cases as $case) {
81 $expectedOrder = array();
82 foreach ($case as $ver) {
83 $expectedOrder[] = ccrm_extensionvalidation_version_normalize($ver);
86 // shuffle and sort using MySQL ordering
87 $actualOrder = $expectedOrder;
88 shuffle($actualOrder);
89 //$actualOrder = self::sqlSort($actualOrder);
90 usort($actualOrder, array(__CLASS__, 'cmpSql'));
92 // did we get it right?
93 $this->assertEqual($expectedOrder, $actualOrder);
97 public function testSplit() {
99 '1' => array('z0000001'),
100 '1.1' => array('z0000001', 'z0000001'),
101 '1.2.3.4' => array('z0000001', 'z0000002', 'z0000003', 'z0000004'),
102 '1.2-3' => array('z0000001', 'z0000002', 'z0000003'),
103 '1.2.alpha2' => array('z0000001', 'z0000002', 'pre010', 'z0000002'),
104 '1.2beta2' => array('z0000001', 'z0000002', 'pre020', 'z0000002'),
105 '2012-01-01-1' => array('z0002012', 'z0000001', 'z0000001', 'z0000001'),
106 '20120101' => array('invalid'),
107 'r456' => array('z0000456'),
108 'r5000' => array('z0005000'),
109 'whiz' => array('whiz'),
111 foreach ($cases as $input => $expect) {
112 $actual = ccrm_extensionvalidation_version_split($input, CCRM_VALIDATEEXTRELEASE_PAD);
113 $this->assertEqual($actual, $expect, sprintf("input=[%s] expect=[%s] actual=[%s]",
115 implode('/', $expect),
116 implode('/', $actual)
123 * Sort a list using MySQL's default sort for VARCHARs
125 static protected function sqlSort($values) {
126 db_query("CREATE TEMPORARY TABLE tmp_sort (value VARCHAR(128)) ENGINE=MEMORY")->execute();
128 foreach ($values as $value) {
129 db_query("INSERT INTO tmp_sort (value) VALUES ('$value')");
130 //db_query("INSERT INTO tmp_sort (value) VALUES (:value)", array(
131 // ':value' => $value,
135 $q = db_query("SELECT value FROM tmp_sort ORDER BY value");
137 while ($row = $q->fetchAssoc()) {
138 $result[] = $row['value'];
141 db_query("DROP TEMPORARY TABLE tmp_sort")->execute();
146 * Compare two values using MySQL string comparison
148 * Note: SQL injection because WTF but doesn't matter because inputs are controlled test data
150 static protected function cmpSql($a, $b) {
151 // Note: SQL injection from test data
152 $q = db_query("SELECT IF('$a' < '$b', 'lt','gte') as lt, IF('$a' = '$b', 'eq','ne') as eq");
154 $q = db_query("SELECT IF(:a < :b,'lt','gte') as lt, IF(:a = :b,'eq','ne') as eq", array(
160 $res = $q->fetchAssoc();
162 if ($res['eq'] == 'eq') {
164 } elseif ($res['lt'] == 'lt') {