Open Journal Systems  3.3.0
ArrayListTest.php
1 <?php
2 
3 /*
4  * Copyright (C) 2016 Sebastian Böttger <seboettg@gmail.com>
5  * You may use, distribute and modify this code under the
6  * terms of the MIT license.
7  *
8  * You should have received a copy of the MIT license with
9  * this file. If not, please visit: https://opensource.org/licenses/mit-license.php
10  */
11 
13 
14 use PHPUnit\Framework\TestCase;
17 
18 class ArrayListTest extends TestCase
19 {
20 
24  private $numeratedArrayList;
25 
29  private $hashMap;
30 
31 
32  public function setUp()
33  {
34  $this->numeratedArrayList = new ArrayList([
35  new Element("a", "aa"),
36  new Element("b", "bb"),
37  new Element("c", "cc"),
38  new Element("k", "kk"),
39  new Element("d", "dd"),
40  ]);
41 
42  $this->hashMap = new ArrayList([
43  "c" => new Element("c"),
44  "a" => new Element("a"),
45  "h" => new Element("h"),
46  ]);
47  }
48 
49  public function testCurrent()
50  {
51  $this->assertTrue($this->numeratedArrayList->current()->getAttr2() === "aa");
52  $arrayList = new ArrayList();
53  $this->assertFalse($arrayList->current());
54  }
55 
56  public function testNext()
57  {
58  $this->assertTrue($this->numeratedArrayList->next()->getAttr2() === "bb");
59  }
60 
61  public function testPrev()
62  {
63  $this->numeratedArrayList->next();
64  $this->assertEquals($this->numeratedArrayList->prev()->getAttr2(), "aa");
65  $this->assertFalse($this->numeratedArrayList->prev());
66  }
67 
68  public function testAppend()
69  {
70  $i = $this->numeratedArrayList->count();
71  $this->numeratedArrayList->append(new Element("3", "33"));
72  $j = $this->numeratedArrayList->count();
73  $this->assertEquals($i + 1, $j);
74  $this->assertEquals("3", $this->numeratedArrayList->toArray()[$i]->getAttr1());
75  }
76 
77  public function testSet()
78  {
79  $this->hashMap->set("c", new Element("ce"));
80  $this->assertEquals("ce", $this->hashMap->toArray()['c']->getAttr1());
81  }
82 
83  public function testCompareTo()
84  {
85  $arr = $this->hashMap->toArray();
86  usort($arr, function (Comparable $a, Comparable $b) {
87  return $a->compareTo($b);
88  });
89 
90  $this->assertEquals("a", $arr[0]->getAttr1());
91  $this->assertEquals("c", $arr[1]->getAttr1());
92  $this->assertEquals("h", $arr[2]->getAttr1());
93  }
94 
95  public function testReplace()
96  {
97  $this->hashMap->replace($this->numeratedArrayList->toArray());
98  $keys = array_keys($this->hashMap->toArray());
99  foreach ($keys as $key) {
100  $this->assertInternalType("int", $key);
101  $this->assertNotEmpty($this->hashMap->get($key));
102  }
103  }
104 
105  public function testClear()
106  {
107  $this->assertTrue($this->hashMap->count() > 0);
108  $this->assertEquals(0, $this->hashMap->clear()->count());
109  }
110 
111  public function testSetArray()
112  {
113  $this->hashMap->setArray($this->numeratedArrayList->toArray());
114  $keys = array_keys($this->hashMap->toArray());
115  foreach ($keys as $key) {
116  $this->assertInternalType("int", $key);
117  $this->assertNotEmpty($this->hashMap->get($key));
118  }
119  }
120 
121  public function testShuffle()
122  {
123  $arr = $this->numeratedArrayList->toArray();
124  usort($arr, function (Comparable $a, Comparable $b) {
125  return $a->compareTo($b);
126  });
127  $this->numeratedArrayList->replace($arr);
128  for ($i = 0; $i < $this->numeratedArrayList->count() - 1; ++$i) {
129  $lte = ($this->numeratedArrayList->get($i)->getAttr1() <= $this->numeratedArrayList->get($i + 1)->getAttr1());
130  if (!$lte) {
131  break;
132  }
133  }
134  //each element on position $i is smaller than or equal to the element on position $i+1
135  $this->assertTrue($lte);
136  $arr1 = $this->numeratedArrayList->toArray();
137 
138  $this->numeratedArrayList->shuffle();
139 
140  $arr2 = $this->numeratedArrayList->toArray();
141 
142  // at least one element has another position as before
143  for ($i = 0; $i < count($arr); ++$i) {
144  $equal = ($arr1[$i]->getAttr1() == $arr2[$i]->getAttr1());
145  if (!$equal) {
146  break;
147  }
148  }
149  $this->assertFalse($equal);
150  }
151 
152 
153  public function testHasKey()
154  {
155  $this->assertTrue($this->numeratedArrayList->hasKey(0));
156  $this->assertTrue($this->hashMap->hasKey("c"));
157  }
158 
159  public function testHasValue()
160  {
161  $list = new ArrayList([
162  "a",
163  "b",
164  "c"
165  ]);
166 
167  $this->assertTrue($list->hasValue("a"));
168  }
169 
170  public function testGetIterator()
171  {
172  $it = $this->numeratedArrayList->getIterator();
173 
174  foreach ($it as $key => $e) {
175  $this->assertTrue(is_int($key));
176  $this->assertInstanceOf("Seboettg\\Collection\\Test\\Element", $e);
177  }
178  }
179 
180  public function testRemove()
181  {
182  $list = new ArrayList([
183  "a",
184  "b",
185  "c"
186  ]);
187 
188  $list->append("d");
189  $this->assertTrue($list->hasValue("d"));
190  $list->remove(0);
191  $this->assertFalse($list->hasValue("a"));
192  }
193 
194  public function testOffsetGet()
195  {
196  $this->assertNotEmpty($this->numeratedArrayList[0]);
197  $this->assertEmpty($this->numeratedArrayList[333]);
198  }
199 
200  public function testOffsetSet()
201  {
202  $pos = $this->numeratedArrayList->count();
203  $this->numeratedArrayList[$pos] = new Element($pos, $pos . $pos);
204  $arr = $this->numeratedArrayList->toArray();
205  $this->assertNotEmpty($arr[$pos]);
206  $this->assertEquals($pos, $arr[$pos]->getAttr1());
207  }
208 
209  public function testOffestExist()
210  {
211  $this->assertTrue(isset($this->hashMap['a']));
212  $this->assertFalse(isset($this->numeratedArrayList[111]));
213  }
214 
215  public function testOffsetUnset()
216  {
217  $list = new ArrayList(['a' => 'aa', 'b' => 'bb']);
218  unset($list['a']);
219  $this->assertFalse($list->hasKey('a'));
220  $this->assertTrue($list->hasKey('b'));
221  }
222 
223  public function testAdd()
224  {
225  $list = new ArrayList(['a' => 'aa', 'b' => 'bb', 'c' => 'cc']);
226  $list->add('d', 'dd');
227  $this->assertEquals('dd', $list->get('d'));
228  $list->add('d', 'ddd');
229 
230  $dl = $list->get('d');
231  $this->assertTrue(is_array($dl));
232  $this->assertEquals('dd', $dl[0]);
233  $this->assertEquals('ddd', $dl[1]);
234  }
235 
236  public function testFilter()
237  {
238  // filter elements that containing values with attr1 'c' or 'h'
239  $arrayList = $this->hashMap->filter(function (Element $elem) {
240  return $elem->getAttr1() === 'c' || $elem->getAttr1() === 'h';
241  });
242 
243  $this->assertTrue($arrayList->hasKey('c'));
244  $this->assertTrue($arrayList->hasKey('h'));
245  $this->assertFalse($arrayList->hasKey('a'));
246  $this->assertEquals($arrayList->get('c')->getAttr1(), 'c');
247  $this->assertEquals($arrayList->get('h')->getAttr1(), 'h');
248  }
249 
250  public function testFilterByKeys()
251  {
252  $arrayList = $this->numeratedArrayList->filterByKeys([0, 3]);
253  $this->assertFalse($arrayList->hasKey(1));
254  $this->assertEquals($arrayList->count(), 2);
255  $this->assertEquals($arrayList->current()->getAttr1(), "a");
256  $this->assertEquals($arrayList->next()->getAttr1(), "k");
257  }
258 
259  public function testMap()
260  {
261  $cubic = function($i) {
262  return $i * $i * $i;
263  };
264  $list = new ArrayList([1, 2, 3, 4, 5]);
265  $cubicList = $list->map($cubic);
266  $this->assertEquals([1, 8, 27, 64, 125], $cubicList->toArray());
267 
268  $list = new ArrayList(['a', 'b', 'c']);
269  $toUpper = $list->map(function($item) {return ucfirst($item);});
270  $this->assertEquals(['A', 'B', 'C'], $toUpper->toArray());
271  }
272 
273  public function testFlatten()
274  {
275  $list = new ArrayList([['a', 'b'], 'c']);
276  $this->assertEquals(['a', 'b', 'c'], $list->flatten()->toArray());
277  $list = new ArrayList(["term" => ['a', 'b'], 'c']);
278  $this->assertEquals(['a', 'b', 'c'], $list->flatten()->toArray());
279  }
280 }
281 
282 class Element implements Comparable
283 {
284 
285  private $attr1;
286 
287  private $attr2;
288 
289  public function __construct($attr1, $attr2 = "")
290  {
291  $this->attr1 = $attr1;
292  $this->attr2 = $attr2;
293  }
294 
298  public function getAttr1()
299  {
300  return $this->attr1;
301  }
302 
306  public function setAttr1($attr1)
307  {
308  $this->attr1 = $attr1;
309  }
310 
314  public function getAttr2()
315  {
316  return $this->attr2;
317  }
318 
322  public function setAttr2($attr2)
323  {
324  $this->attr2 = $attr2;
325  }
326 
336  public function compareTo(Comparable $b)
337  {
338  return strcmp($this->attr1, $b->getAttr1());
339  }
340 }
Seboettg\Collection\Test\ArrayListTest\testOffsetSet
testOffsetSet()
Definition: ArrayListTest.php:206
Seboettg\Collection\Test\Element\getAttr1
getAttr1()
Definition: ArrayListTest.php:304
Seboettg\Collection\Test\ArrayListTest\testRemove
testRemove()
Definition: ArrayListTest.php:186
Seboettg\Collection\Test\ArrayListTest
Definition: ArrayListTest.php:18
Seboettg\Collection\Test\ArrayListTest\testCurrent
testCurrent()
Definition: ArrayListTest.php:55
Seboettg\Collection\Test\ArrayListTest\testOffsetGet
testOffsetGet()
Definition: ArrayListTest.php:200
Seboettg\Collection\Test\ArrayListTest\testNext
testNext()
Definition: ArrayListTest.php:62
Seboettg\Collection\Test\ArrayListTest\testClear
testClear()
Definition: ArrayListTest.php:111
Seboettg\Collection\Test\ArrayListTest\testHasValue
testHasValue()
Definition: ArrayListTest.php:165
Seboettg\Collection\Test\ArrayListTest\testReplace
testReplace()
Definition: ArrayListTest.php:101
Seboettg\Collection\Test\ArrayListTest\testHasKey
testHasKey()
Definition: ArrayListTest.php:159
Seboettg\Collection\Test\ArrayListTest\testSetArray
testSetArray()
Definition: ArrayListTest.php:117
Seboettg\Collection\Test\ArrayListTest\testMap
testMap()
Definition: ArrayListTest.php:265
Seboettg\Collection\Test
Definition: ArrayListTest.php:12
Seboettg\Collection\Test\Element\getAttr2
getAttr2()
Definition: ArrayListTest.php:320
Seboettg\Collection\Test\ArrayListTest\testPrev
testPrev()
Definition: ArrayListTest.php:67
Seboettg\Collection\Test\ArrayListTest\testCompareTo
testCompareTo()
Definition: ArrayListTest.php:89
Seboettg\Collection\Test\ArrayListTest\testOffsetUnset
testOffsetUnset()
Definition: ArrayListTest.php:221
Seboettg\Collection\Test\ArrayListTest\testAdd
testAdd()
Definition: ArrayListTest.php:229
Seboettg\Collection\Comparable
Definition: Comparable.php:24
Seboettg\Collection\Test\Element\compareTo
compareTo(Comparable $b)
Definition: ArrayListTest.php:342
Seboettg\Collection\Test\ArrayListTest\testAppend
testAppend()
Definition: ArrayListTest.php:74
Seboettg\Collection\Test\Element\__construct
__construct($attr1, $attr2="")
Definition: ArrayListTest.php:295
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
Seboettg\Collection\Test\Element
Definition: ArrayListTest.php:288
Seboettg\Collection\Test\ArrayListTest\testFilter
testFilter()
Definition: ArrayListTest.php:242
Seboettg\Collection\Test\ArrayListTest\testFlatten
testFlatten()
Definition: ArrayListTest.php:279
Seboettg\Collection\Test\ArrayListTest\testFilterByKeys
testFilterByKeys()
Definition: ArrayListTest.php:256
Seboettg\Collection\Test\Element\setAttr2
setAttr2($attr2)
Definition: ArrayListTest.php:328
Seboettg\Collection\Test\ArrayListTest\testOffestExist
testOffestExist()
Definition: ArrayListTest.php:215
Seboettg\Collection\Test\ArrayListTest\setUp
setUp()
Definition: ArrayListTest.php:38
Seboettg\Collection\Comparable\compareTo
compareTo(Comparable $b)
Seboettg\Collection\Test\ArrayListTest\testGetIterator
testGetIterator()
Definition: ArrayListTest.php:176
Seboettg\Collection\Test\ArrayListTest\testSet
testSet()
Definition: ArrayListTest.php:83
Seboettg\Collection\ArrayList
Definition: ArrayList.php:20
Seboettg\Collection\Test\ArrayListTest\testShuffle
testShuffle()
Definition: ArrayListTest.php:127
Seboettg\Collection\Test\Element\setAttr1
setAttr1($attr1)
Definition: ArrayListTest.php:312