Skip to content

Commit 13145ef

Browse files
committed
Added /App/Support/Collection and unit test
1 parent ae659c3 commit 13145ef

File tree

3 files changed

+170
-1
lines changed

3 files changed

+170
-1
lines changed

.phpunit.result.cache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
C:37:"PHPUnit\Runner\DefaultTestResultCache":1182:{a:2:{s:7:"defects";a:9:{s:7:"Warning";i:6;s:33:"SampleTest::testTrueAssertsToTrue";i:3;s:38:"UserTest::testThatWeCanGetTheFirstName";i:3;s:37:"UserTest::testThatWeCanGetTheLastName";i:4;s:36:"UserTest::testThatFullNameIsReturned";i:4;s:40:"UserTest::testFirstAndLastNameAreTrimmed";i:3;s:34:"UserTest::testEmailAddressCanBeSet";i:4;s:48:"UserTest::testEmailVariablesContainCorrectValues";i:4;s:40:"UserTest::that_we_can_get_the_first_name";i:3;}s:5:"times";a:14:{s:7:"Warning";d:0.607;s:33:"SampleTest::testTrueAssertsToTrue";d:0.005;s:38:"UserTest::testThatWeCanGetTheFirstName";d:0.001;s:37:"UserTest::testThatWeCanGetTheLastName";d:0;s:36:"UserTest::testThatFullNameIsReturned";d:0;s:40:"UserTest::testFirstAndLastNameAreTrimmed";d:0;s:34:"UserTest::testEmailAddressCanBeSet";d:0;s:48:"UserTest::testEmailVariablesContainCorrectValues";d:0.001;s:40:"UserTest::that_we_can_get_the_first_name";d:0.004;s:39:"UserTest::that_we_can_get_the_last_name";d:0;s:36:"UserTest::that_full_name_is_returned";d:0;s:46:"UserTest::that_first_and_last_name_are_trimmed";d:0;s:39:"UserTest::that_email_address_can_be_set";d:0;s:53:"UserTest::that_email_variables_contain_correct_values";d:0.001;}}}
1+
C:37:"PHPUnit\Runner\DefaultTestResultCache":2367:{a:2:{s:7:"defects";a:18:{s:7:"Warning";i:6;s:33:"SampleTest::testTrueAssertsToTrue";i:3;s:38:"UserTest::testThatWeCanGetTheFirstName";i:3;s:37:"UserTest::testThatWeCanGetTheLastName";i:4;s:36:"UserTest::testThatFullNameIsReturned";i:4;s:40:"UserTest::testFirstAndLastNameAreTrimmed";i:3;s:34:"UserTest::testEmailAddressCanBeSet";i:4;s:48:"UserTest::testEmailVariablesContainCorrectValues";i:4;s:40:"UserTest::that_we_can_get_the_first_name";i:3;s:62:"CollectionTest::empty_instantiated_collection_returns_no_items";i:4;s:52:"CollectionTest::count_is_correct_for_items_passed_in";i:3;s:52:"CollectionTest::items_returned_match_items_passed_in";i:4;s:60:"CollectionTest::collection_is_instance_of_iterator_aggregate";i:3;s:42:"CollectionTest::collection_can_be_iterated";i:4;s:64:"CollectionTest::collection_can_be_merged_with_another_collection";i:4;s:46:"CollectionTest::can_add_to_existing_collection";i:4;s:42:"CollectionTest::returns_json_encoded_items";i:6;s:62:"CollectionTest::json_encoding_a_collection_object_returns_json";i:3;}s:5:"times";a:23:{s:7:"Warning";d:0.607;s:33:"SampleTest::testTrueAssertsToTrue";d:0;s:38:"UserTest::testThatWeCanGetTheFirstName";d:0.001;s:37:"UserTest::testThatWeCanGetTheLastName";d:0;s:36:"UserTest::testThatFullNameIsReturned";d:0;s:40:"UserTest::testFirstAndLastNameAreTrimmed";d:0;s:34:"UserTest::testEmailAddressCanBeSet";d:0;s:48:"UserTest::testEmailVariablesContainCorrectValues";d:0.001;s:40:"UserTest::that_we_can_get_the_first_name";d:0;s:39:"UserTest::that_we_can_get_the_last_name";d:0;s:36:"UserTest::that_full_name_is_returned";d:0;s:46:"UserTest::that_first_and_last_name_are_trimmed";d:0;s:39:"UserTest::that_email_address_can_be_set";d:0;s:53:"UserTest::that_email_variables_contain_correct_values";d:0;s:62:"CollectionTest::empty_instantiated_collection_returns_no_items";d:0.012;s:52:"CollectionTest::count_is_correct_for_items_passed_in";d:0.001;s:52:"CollectionTest::items_returned_match_items_passed_in";d:0.001;s:60:"CollectionTest::collection_is_instance_of_iterator_aggregate";d:0;s:42:"CollectionTest::collection_can_be_iterated";d:0;s:64:"CollectionTest::collection_can_be_merged_with_another_collection";d:0;s:46:"CollectionTest::can_add_to_existing_collection";d:0;s:42:"CollectionTest::returns_json_encoded_items";d:0;s:62:"CollectionTest::json_encoding_a_collection_object_returns_json";d:0.001;}}}

app/Support/Collection.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
namespace App\Support;
4+
5+
use IteratorAggregate;
6+
use ArrayIterator;
7+
use JsonSerializable;
8+
9+
class Collection implements IteratorAggregate, JsonSerializable {
10+
11+
protected $items = [];
12+
13+
public function __construct(array $items = []) {
14+
$this->items = $items;
15+
}
16+
17+
public function getIterator() {
18+
return new ArrayIterator($this->items);
19+
}
20+
21+
public function get() {
22+
return $this->items;
23+
}
24+
25+
public function count() {
26+
return count($this->items);
27+
}
28+
29+
public function merge(Collection $collection) {
30+
// return new Collection(
31+
// array_merge(
32+
// $this->get(),
33+
// $collection->get()
34+
// )
35+
// );
36+
37+
return $this->add($collection->get());
38+
}
39+
40+
public function add(array $items) {
41+
$this->items = array_merge(
42+
$this->get(),
43+
$items
44+
);
45+
}
46+
47+
public function toJson() {
48+
return json_encode($this->items);
49+
}
50+
51+
public function jsonSerialize() {
52+
return $this->items;
53+
}
54+
}

tests/unit/CollectionTest.php

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
3+
class CollectionTest extends \PHPUnit\Framework\TestCase
4+
{
5+
/** @test */
6+
public function empty_instantiated_collection_returns_no_items()
7+
{
8+
$collection = new \App\Support\Collection;
9+
10+
$this->assertEmpty($collection->get());
11+
}
12+
13+
/** @test */
14+
public function count_is_correct_for_items_passed_in() {
15+
$collection = new \App\Support\Collection([
16+
'one', 'two', 'three'
17+
]);
18+
19+
$this->assertEquals(
20+
$collection->count(),
21+
3
22+
);
23+
}
24+
25+
/** @test */
26+
public function items_returned_match_items_passed_in() {
27+
$collection = new \App\Support\Collection([
28+
'one', 'two', 'three'
29+
]);
30+
31+
$this->assertCount(3, $collection->get());
32+
$this->assertEquals($collection->get()[0], 'one');
33+
$this->assertEquals($collection->get()[1], 'two');
34+
$this->assertEquals($collection->get()[2], 'three');
35+
}
36+
37+
/** @test */
38+
public function collection_is_instance_of_iterator_aggregate() {
39+
$collection = new \App\Support\Collection;
40+
41+
$this->assertInstanceOf(iteratorAggregate::class, $collection);
42+
}
43+
44+
/** @test */
45+
public function collection_can_be_iterated() {
46+
$collection = new \App\Support\Collection([
47+
'one', 'two', 'three'
48+
]);
49+
50+
$items = [];
51+
52+
foreach($collection as $item) {
53+
$items[] = $item;
54+
}
55+
56+
$this->assertCount(3, $items);
57+
$this->assertInstanceOf(
58+
ArrayIterator::class,
59+
$collection->getIterator()
60+
);
61+
}
62+
63+
/** @test */
64+
public function can_add_to_existing_collection() {
65+
$collection = new \App\Support\Collection(['one', 'two']);
66+
$collection->add(['three']);
67+
68+
$this->assertCount(3, $collection->get());
69+
$this->assertEquals(3, $collection->count());
70+
}
71+
72+
/** @test */
73+
public function collection_can_be_merged_with_another_collection() {
74+
75+
$collection1 = new \App\Support\Collection(['one', 'two']);
76+
$collection2 = new \App\Support\Collection(['three', 'four', 'five']);
77+
78+
$collection1->merge($collection2);
79+
80+
$this->assertCount(5, $collection1->get());
81+
$this->assertEquals(5, $collection1->count());
82+
}
83+
84+
/** @test */
85+
public function returns_json_encoded_items() {
86+
$collection = new \App\Support\Collection([
87+
['username' => 'dino'],
88+
['username' => 'frank']
89+
]);
90+
91+
$this->assertIsString($collection->toJson());
92+
93+
$this->assertEquals(
94+
'[{"username":"dino"},{"username":"frank"}]',
95+
$collection->toJson()
96+
);
97+
}
98+
99+
/** @test */
100+
public function json_encoding_a_collection_object_returns_json() {
101+
$collection = new \App\Support\Collection([
102+
['username' => 'dino'],
103+
['username' => 'jeff']
104+
]);
105+
106+
$encoded = json_encode($collection);
107+
108+
$this->assertIsString($collection->toJson());
109+
110+
$this->assertEquals(
111+
'[{"username":"dino"},{"username":"jeff"}]',
112+
$encoded
113+
);
114+
}
115+
}

0 commit comments

Comments
 (0)