Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
"autoload": {
"psr-0": { "Malarzm\\Collections\\": "lib/" }
},
"autoload-dev": {
"psr-4": { "Malarzm\\Collections\\Tests\\": "tests/" }
},
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
Expand Down
46 changes: 46 additions & 0 deletions lib/Malarzm/Collections/Mixin/ReadOnly.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace Malarzm\Collections\Mixin;

trait ReadOnly
{
/**
* @throws \LogicException
*/
public function clear()
{
throw new \LogicException('You can not modify a read only collection.');
}

/**
* @throws \LogicException
*/
public function add($element)
{
throw new \LogicException('You can not modify a read only collection.');
}

/**
* @throws \LogicException
*/
public function remove($key)
{
throw new \LogicException('You can not modify a read only collection.');
}

/**
* @throws \LogicException
*/
public function removeElement($element)
{
throw new \LogicException('You can not modify a read only collection.');
}

/**
* @throws \LogicException
*/
public function set($key, $value)
{
throw new \LogicException('You can not modify a read only collection.');
}
}
11 changes: 11 additions & 0 deletions lib/Malarzm/Collections/ReadOnly/ReadOnlyArrayCollection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Malarzm\Collections\ReadOnly;

use Malarzm\Collections\ArrayCollection;
use Malarzm\Collections\Mixin\ReadOnly;

class ReadOnlyArrayCollection extends ArrayCollection
{
use ReadOnly;
}
11 changes: 11 additions & 0 deletions lib/Malarzm/Collections/ReadOnly/ReadOnlyListArray.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Malarzm\Collections\ReadOnly;

use Malarzm\Collections\ListArray;
use Malarzm\Collections\Mixin\ReadOnly;

class ReadOnlyListArray extends ListArray
{
use ReadOnly;
}
11 changes: 11 additions & 0 deletions lib/Malarzm/Collections/ReadOnly/ReadOnlyObjectSet.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Malarzm\Collections\ReadOnly;

use Malarzm\Collections\Mixin\ReadOnly;
use Malarzm\Collections\ObjectSet;

class ReadOnlyObjectSet extends ObjectSet
{
use ReadOnly;
}
11 changes: 11 additions & 0 deletions lib/Malarzm/Collections/ReadOnly/ReadOnlySet.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Malarzm\Collections\ReadOnly;

use Malarzm\Collections\Mixin\ReadOnly;
use Malarzm\Collections\Set;

abstract class ReadOnlySet extends Set
{
use ReadOnly;
}
11 changes: 11 additions & 0 deletions lib/Malarzm/Collections/ReadOnly/ReadOnlySortedCollection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Malarzm\Collections\ReadOnly;

use Malarzm\Collections\Mixin\ReadOnly;
use Malarzm\Collections\SortedCollection;

abstract class ReadOnlySortedCollection extends SortedCollection
{
use ReadOnly;
}
11 changes: 11 additions & 0 deletions lib/Malarzm/Collections/ReadOnly/ReadOnlySortedList.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Malarzm\Collections\ReadOnly;

use Malarzm\Collections\Mixin\ReadOnly;
use Malarzm\Collections\SortedList;

abstract class ReadOnlySortedList extends SortedList
{
use ReadOnly;
}
2 changes: 1 addition & 1 deletion phpunit.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
>
<testsuites>
<testsuite name="Malarzm CollectionsTest Suite">
<directory>./tests/Malarzm/</directory>
<directory>./tests//</directory>
</testsuite>
</testsuites>
</phpunit>
72 changes: 72 additions & 0 deletions tests/BaseReadOnlyTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?php

namespace Malarzm\Collections\Tests;

use Doctrine\Common\Collections\Collection;

abstract class BaseReadOnlyTest extends BaseTest
{
/**
* @dataProvider provideCollection
*/
public function testClearAndIsEmpty(Collection $coll)
{
$this->setExpectedException('\LogicException', 'You can not modify a read only collection.');
parent::testClearAndIsEmpty($coll);
}


/**
* @dataProvider provideCollection
*/
public function testAddIsProhibited(Collection $coll, array $elements)
{
$this->setExpectedException('\LogicException', 'You can not modify a read only collection.');
$coll->add(reset($elements));
}

/**
* @dataProvider provideCollection
*/
public function testRemoveIsProhibited(Collection $coll, array $elements)
{
$this->setExpectedException('\LogicException', 'You can not modify a read only collection.');
$coll->remove(array_keys($elements)[0]);
}

/**
* @dataProvider provideCollection
*/
public function testRemoveElementIsProhibited(Collection $coll, array $elements)
{
$this->setExpectedException('\LogicException', 'You can not modify a read only collection.');
$coll->remove(reset($elements));
}

/**
* @dataProvider provideCollection
*/
public function testSetIsProhibited(Collection $coll, array $elements)
{
$this->setExpectedException('\LogicException', 'You can not modify a read only collection.');
$coll->set(array_keys($elements)[0], reset($elements));
}

/**
* @dataProvider provideCollection
*/
public function testOffsetSetIsProhibited(Collection $coll, array $elements)
{
$this->setExpectedException('\LogicException', 'You can not modify a read only collection.');
$coll[array_keys($elements)[0]] = reset($elements);
}

/**
* @dataProvider provideCollection
*/
public function testOffsetRemoveIsProhibited(Collection $coll, array $elements)
{
$this->setExpectedException('\LogicException', 'You can not modify a read only collection.');
unset($coll[array_keys($elements)[0]]);
}
}
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
<?php

namespace Malarzm\Collections\Tests;
namespace Malarzm\Collections\Tests\Collections;

use Malarzm\Collections\ArrayCollection;
use Malarzm\Collections\Tests\BaseTest;

class ArrayCollectionTest extends BaseTest
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
<?php

namespace Malarzm\Collections\Tests;
namespace Malarzm\Collections\Tests\Collections;

use Malarzm\Collections\Diffable;
use Malarzm\Collections\Tests\BaseTest;

class DiffableTest extends BaseTest
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
<?php

namespace Malarzm\Collections\Tests;
namespace Malarzm\Collections\Tests\Collections;

use Malarzm\Collections\ListArray;
use Malarzm\Collections\Tests\BaseTest;

class ListArrayTest extends BaseTest
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
<?php

namespace Malarzm\Collections\Tests;
namespace Malarzm\Collections\Tests\Collections;

use Doctrine\Common\Collections\Collection;
use Malarzm\Collections\ObjectSet;
use Malarzm\Collections\Tests\BaseTest;

class ObjectSetTest extends BaseTest
{
Expand Down
19 changes: 19 additions & 0 deletions tests/Collections/ReadOnly/ReadOnlyArrayCollectionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php


namespace Malarzm\Collections\Tests\Collections\ReadOnly;

use Malarzm\Collections\ReadOnly\ReadOnlyArrayCollection;
use Malarzm\Collections\Tests\BaseReadOnlyTest;

class ReadOnlyArrayCollectionTest extends BaseReadOnlyTest
{
public function provideCollection()
{
$associative = [ 'foo' => 1, 'bar' => 2, 7 ];
return [
[ new ReadOnlyArrayCollection([ 5, 7, 9 ]), [ 5, 7, 9] ],
[ new ReadOnlyArrayCollection($associative), $associative ],
];
}
}
22 changes: 22 additions & 0 deletions tests/Collections/ReadOnly/ReadOnlyListArrayTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Malarzm\Collections\Tests\Collections\ReadOnly;

use Malarzm\Collections\ReadOnly\ReadOnlyListArray;
use Malarzm\Collections\Tests\BaseReadOnlyTest;

class ReadOnlyListArrayTest extends BaseReadOnlyTest
{
public function provideCollection()
{
return [
[ new ReadOnlyListArray([1, 2, 3]), [1, 2, 3] ],
];
}

public function testConstructFixesElements()
{
$coll = new ReadOnlyListArray([ 3 => 1]);
$this->assertSame([ 1 ], $coll->toArray());
}
}
27 changes: 27 additions & 0 deletions tests/Collections/ReadOnly/ReadOnlyObjectSetTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Malarzm\Collections\Tests\Collections\ReadOnly;

use Doctrine\Common\Collections\Collection;
use Malarzm\Collections\ReadOnly\ReadOnlyObjectSet;
use Malarzm\Collections\Tests\BaseReadOnlyTest;

class ReadOnlyObjectSetTest extends BaseReadOnlyTest
{
public function provideCollection()
{
$elements = [ new \stdClass(), new \stdClass(), new \stdClass() ];
return [
[ new ReadOnlyObjectSet($elements), $elements ],
];
}

/**
* @dataProvider provideCollection
*/
public function testContains(Collection $coll, array $elements)
{
$this->assertTrue($coll->contains($coll->first()));
$this->assertFalse($coll->contains(new \stdClass()));
}
}
32 changes: 32 additions & 0 deletions tests/Collections/ReadOnly/ReadOnlySetTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Malarzm\Collections\Tests\Collections\ReadOnly;

use Malarzm\Collections\ReadOnly\ReadOnlySet;
use Malarzm\Collections\Tests\BaseReadOnlyTest;

class ReadOnlySetTest extends BaseReadOnlyTest
{
public function provideCollection()
{
$associative = [ 'foo' => 1, 'bar' => 2, 7 ];
return [
[ new ReadOnlyIntSet([ 5, 7, 9 ]), [ 5, 7, 9] ],
[ new ReadOnlyIntSet($associative), $associative ],
];
}
}

class ReadOnlyIntSet extends ReadOnlySet
{
public function compare($a, $b)
{
if ($a > $b) {
return 1;
} elseif ($a === $b) {
return 0;
} else {
return -1;
}
}
}
Loading