Merge pull request #2783 from jaapjansma/CRM-14409-master
[civicrm-core.git] / tests / phpunit / CRM / Utils / ArrayTest.php
1 <?php
2 require_once 'CiviTest/CiviUnitTestCase.php';
3 class CRM_Utils_ArrayTest extends CiviUnitTestCase {
4 function testBreakReference() {
5 // Get a reference and make a change
6 $fooRef1 = self::returnByReference();
7 $this->assertEquals('original', $fooRef1['foo']);
8 $fooRef1['foo'] = 'modified';
9
10 // Make sure that the referenced item was actually changed
11 $fooRef2 = self::returnByReference();
12 $this->assertEquals('modified', $fooRef1['foo']);
13 $this->assertEquals('original', $fooRef2['foo']);
14
15 // Get a non-reference, make a change, and make sure the references were unaffected.
16 $fooNonReference = CRM_Utils_Array::breakReference(self::returnByReference());
17 $fooNonReference['foo'] = 'privately-modified';
18 $this->assertEquals('modified', $fooRef1['foo']);
19 $this->assertEquals('original', $fooRef2['foo']);
20 $this->assertEquals('privately-modified', $fooNonReference['foo']);
21 }
22
23 private function &returnByReference() {
24 static $foo;
25 if ($foo === NULL) {
26 $foo['foo'] = 'original';
27 }
28 return $foo;
29 }
30
31 function testIndexArray() {
32 $inputs = array();
33 $inputs[] = array(
34 'lang' => 'en',
35 'msgid' => 'greeting',
36 'familiar' => FALSE,
37 'value' => 'Hello'
38 );
39 $inputs[] = array(
40 'lang' => 'en',
41 'msgid' => 'parting',
42 'value' => 'Goodbye'
43 );
44 $inputs[] = array(
45 'lang' => 'fr',
46 'msgid' => 'greeting',
47 'value' => 'Bon jour'
48 );
49 $inputs[] = array(
50 'lang' => 'fr',
51 'msgid' => 'parting',
52 'value' => 'Au revoir'
53 );
54 $inputs[] = array(
55 'lang' => 'en',
56 'msgid' => 'greeting',
57 'familiar' => TRUE,
58 'value' => 'Hey'
59 );
60
61 $byLangMsgid = CRM_Utils_Array::index(array('lang', 'msgid'), $inputs);
62 $this->assertEquals($inputs[4], $byLangMsgid['en']['greeting']);
63 $this->assertEquals($inputs[1], $byLangMsgid['en']['parting']);
64 $this->assertEquals($inputs[2], $byLangMsgid['fr']['greeting']);
65 $this->assertEquals($inputs[3], $byLangMsgid['fr']['parting']);
66 }
67
68 function testCollect() {
69 $arr = array(
70 array('catWord' => 'cat', 'dogWord' => 'dog'),
71 array('catWord' => 'chat', 'dogWord' => 'chien'),
72 array('catWord' => 'gato'),
73 );
74 $expected = array('cat', 'chat', 'gato');
75 $this->assertEquals($expected, CRM_Utils_Array::collect('catWord', $arr));
76
77 $arr = array();
78 $arr['en']= (object) array('catWord' => 'cat', 'dogWord' => 'dog');
79 $arr['fr']= (object) array('catWord' => 'chat', 'dogWord' => 'chien');
80 $arr['es']= (object) array('catWord' => 'gato');
81 $expected = array('en' => 'cat', 'fr' => 'chat', 'es' => 'gato');
82 $this->assertEquals($expected, CRM_Utils_Array::collect('catWord', $arr));
83 }
84
85 function testProduct0() {
86 $actual = CRM_Utils_Array::product(
87 array(),
88 array('base data' => 1)
89 );
90 $this->assertEquals(array(
91 array('base data' => 1),
92 ), $actual);
93 }
94
95 function testProduct1() {
96 $actual = CRM_Utils_Array::product(
97 array('dim1' => array('a', 'b')),
98 array('base data' => 1)
99 );
100 $this->assertEquals(array(
101 array('base data' => 1, 'dim1' => 'a'),
102 array('base data' => 1, 'dim1' => 'b'),
103 ), $actual);
104 }
105
106 function testProduct3() {
107 $actual = CRM_Utils_Array::product(
108 array('dim1' => array('a', 'b'), 'dim2' => array('alpha', 'beta'), 'dim3' => array('one', 'two')),
109 array('base data' => 1)
110 );
111 $this->assertEquals(array(
112 array('base data' => 1, 'dim1' => 'a', 'dim2' => 'alpha', 'dim3' => 'one'),
113 array('base data' => 1, 'dim1' => 'a', 'dim2' => 'alpha', 'dim3' => 'two'),
114 array('base data' => 1, 'dim1' => 'a', 'dim2' => 'beta', 'dim3' => 'one'),
115 array('base data' => 1, 'dim1' => 'a', 'dim2' => 'beta', 'dim3' => 'two'),
116 array('base data' => 1, 'dim1' => 'b', 'dim2' => 'alpha', 'dim3' => 'one'),
117 array('base data' => 1, 'dim1' => 'b', 'dim2' => 'alpha', 'dim3' => 'two'),
118 array('base data' => 1, 'dim1' => 'b', 'dim2' => 'beta', 'dim3' => 'one'),
119 array('base data' => 1, 'dim1' => 'b', 'dim2' => 'beta', 'dim3' => 'two'),
120 ), $actual);
121 }
122
123 function testIsSubset() {
124 $this->assertTrue(CRM_Utils_Array::isSubset(array(), array()));
125 $this->assertTrue(CRM_Utils_Array::isSubset(array('a'), array('a')));
126 $this->assertTrue(CRM_Utils_Array::isSubset(array('a'), array('b','a','c')));
127 $this->assertTrue(CRM_Utils_Array::isSubset(array('b','d'), array('a','b','c','d')));
128 $this->assertFalse(CRM_Utils_Array::isSubset(array('a'), array()));
129 $this->assertFalse(CRM_Utils_Array::isSubset(array('a'), array('b')));
130 $this->assertFalse(CRM_Utils_Array::isSubset(array('a'), array('b','c','d')));
131 }
132 }