diff --git a/.scrutinizer.yml b/.scrutinizer.yml
new file mode 100644
index 0000000..3f15f1a
--- /dev/null
+++ b/.scrutinizer.yml
@@ -0,0 +1,3 @@
+tools:
+ external_code_coverage:
+ timeout: 2100
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..c8ca24c
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,32 @@
+language: php
+
+php:
+ - 5.4
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+
+matrix:
+ allow_failures:
+ - php: 7.0
+
+sudo: false
+
+install:
+ - composer self-update
+ - composer global require fxp/composer-asset-plugin:~1.0
+ - composer install
+
+before_script:
+ - mysql --version
+ - psql --version
+ - mysql -e 'create database test;'
+ - psql -U postgres -c 'CREATE DATABASE test;';
+
+script:
+ - vendor/bin/phpunit --coverage-clover=coverage.clover
+
+after_script:
+ - wget https://scrutinizer-ci.com/ocular.phar
+ - php ocular.phar code-coverage:upload --format=php-clover coverage.clover
diff --git a/README.md b/README.md
index 0593e3b..73f06b5 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,11 @@
# Yii2 Nested Sets Behavior
-Implementation of nested sets algorithm for storing the trees in DB tables.
+Implementation of nested sets algorithm for storing the trees in DB tables.
+
+[![Packagist Version](https://img.shields.io/packagist/v/paulzi/yii2-nested-sets.svg)](https://packagist.org/packages/paulzi/yii2-nested-sets)
+[![Code Coverage](https://img.shields.io/scrutinizer/coverage/g/paulzi/yii2-nested-sets/master.svg)](https://scrutinizer-ci.com/g/paulzi/yii2-nested-sets/?branch=master)
+[![Build Status](https://img.shields.io/travis/paulzi/yii2-nested-sets/master.svg)](https://travis-ci.org/paulzi/yii2-nested-sets)
+[![Total Downloads](https://img.shields.io/packagist/dt/paulzi/yii2-nested-sets.svg)](https://packagist.org/packages/paulzi/yii2-nested-sets)
## Install
diff --git a/composer.json b/composer.json
index e4573d7..020c959 100644
--- a/composer.json
+++ b/composer.json
@@ -23,6 +23,10 @@
"php": ">=5.4.0",
"yiisoft/yii2": "~2.0.0"
},
+ "require-dev": {
+ "phpunit/phpunit": "~4.0",
+ "phpunit/dbunit": "~1.0"
+ },
"autoload": {
"psr-4": {
"paulzi\\nestedsets\\": ""
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000..4e4090a
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,13 @@
+
+
+
+
+ ./tests
+
+
+
\ No newline at end of file
diff --git a/tests/.gitignore b/tests/.gitignore
new file mode 100644
index 0000000..fb20661
--- /dev/null
+++ b/tests/.gitignore
@@ -0,0 +1 @@
+/data/config.local.php
\ No newline at end of file
diff --git a/tests/ArrayDataSet.php b/tests/ArrayDataSet.php
new file mode 100644
index 0000000..79118e5
--- /dev/null
+++ b/tests/ArrayDataSet.php
@@ -0,0 +1,35 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests;
+
+/**
+ * @author PaulZi
+ */
+class ArrayDataSet extends \PHPUnit_Extensions_Database_DataSet_ArrayDataSet
+{
+ public function __construct(array $data)
+ {
+ foreach ($data as $tableName => $rows) {
+ $columns = array();
+ if (isset($rows['columns'])) {
+ $columns = $rows['columns'];
+ unset($rows['columns']);
+ } elseif (isset($rows[0])) {
+ $columns = array_keys($rows[0]);
+ }
+
+ $metaData = new \PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($tableName, $columns);
+ $table = new \PHPUnit_Extensions_Database_DataSet_DefaultTable($metaData);
+
+ foreach ($rows AS $row) {
+ $table->addRow($row);
+ }
+ $this->tables[$tableName] = $table;
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/BaseTestCase.php b/tests/BaseTestCase.php
new file mode 100644
index 0000000..7f85e81
--- /dev/null
+++ b/tests/BaseTestCase.php
@@ -0,0 +1,70 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests;
+
+use paulzi\nestedsets\tests\migrations\TestMigration;
+use Yii;
+use yii\db\Connection;
+
+/**
+ * @author PaulZi
+ */
+class BaseTestCase extends \PHPUnit_Extensions_Database_TestCase
+{
+ protected static $driverName = 'sqlite';
+
+
+ /**
+ * @inheritdoc
+ */
+ public function getConnection()
+ {
+ return $this->createDefaultDBConnection(Yii::$app->getDb()->pdo);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getDataSet()
+ {
+ return new \PHPUnit_Extensions_Database_DataSet_ArrayDataSet(require(__DIR__ . '/data/data.php'));
+ }
+
+ /**
+ * @inheritdoc
+ */
+ protected function setUp()
+ {
+ if (Yii::$app->get('db', false) === null) {
+ $this->markTestSkipped();
+ } else {
+ (new TestMigration())->up();
+ if (Yii::$app->db->driverName === 'pgsql') {
+ Yii::$app->db->createCommand("SELECT setval(pg_get_serial_sequence('tree', 'id'), 25)")->execute();
+ Yii::$app->db->createCommand("SELECT setval(pg_get_serial_sequence('multiple_tree', 'id'), 39)")->execute();
+ }
+ parent::setUp();
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public static function setUpBeforeClass()
+ {
+ $config = require(__DIR__ . '/data/config.php');
+ $config = $config[static::$driverName];
+ $config['class'] = Connection::className();
+ try {
+ Yii::$app->set('db', $config);
+ Yii::$app->getDb()->open();
+ } catch (\Exception $e) {
+ Yii::$app->clear('db');
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/NestedSetsBehaviorTestCase.php b/tests/NestedSetsBehaviorTestCase.php
new file mode 100644
index 0000000..d0d34d7
--- /dev/null
+++ b/tests/NestedSetsBehaviorTestCase.php
@@ -0,0 +1,750 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests;
+
+use paulzi\nestedsets\tests\migrations\TestMigration;
+use paulzi\nestedsets\tests\models\MultipleTreeNode;
+use paulzi\nestedsets\tests\models\Node;
+use Yii;
+
+/**
+ * @author PaulZi
+ */
+class NestedSetsBehaviorTestCase extends BaseTestCase
+{
+ public function testGetParents()
+ {
+ $data = [1, 4, 9];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(21)->parents));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(21)->parents));
+
+ $data = [];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(1)->parents));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(1)->parents));
+
+ $data = [2, 7];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(17)->getParents(2)->all()));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(17)->getParents(2)->all()));
+
+ $data = [26, 30];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(38)->parents));
+ }
+
+ public function testGetParent()
+ {
+ $this->assertEquals(5, Node::findOne(12)->parent->id);
+ $this->assertEquals(5, MultipleTreeNode::findOne(12)->parent->id);
+
+ $this->assertEquals(1, Node::findOne(4)->getParent()->one()->getAttribute('id'));
+ $this->assertEquals(26, MultipleTreeNode::findOne(29)->getParent()->one()->getAttribute('id'));
+
+ $this->assertEquals(null, Node::findOne(1)->parent);
+ $this->assertEquals(null, MultipleTreeNode::findOne(1)->parent);
+ }
+
+ public function testGetRoot()
+ {
+ $this->assertEquals(1, Node::findOne(16)->root->id);
+ $this->assertEquals(26, MultipleTreeNode::findOne(28)->root->id);
+
+ $this->assertEquals(1, Node::findOne(1)->getRoot()->one()->getAttribute('id'));
+ $this->assertEquals(26, MultipleTreeNode::findOne(26)->getRoot()->one()->getAttribute('id'));
+ }
+
+ public function testGetDescendants()
+ {
+ $data = [8, 9, 20, 21, 22, 10, 23, 24, 25];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(4)->descendants));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(4)->descendants));
+
+ $data = [2, 5, 6, 7];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(2)->getDescendants(1, true)->all()));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(2)->getDescendants(1, true)->all()));
+
+ $data = [10, 25, 24, 23, 9, 22, 21, 20, 8];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(4)->getDescendants(3, false, true)->all()));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(4)->getDescendants(3, false, true)->all()));
+
+ $data = [];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(8)->descendants));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(8)->descendants));
+ }
+
+ public function testGetChildren()
+ {
+ $data = [8, 9, 10];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(4)->children));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(4)->children));
+
+ $data = [];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(3)->getChildren()->all()));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(28)->getChildren()->all()));
+ }
+
+ public function testGetLeaves()
+ {
+ $data = [8, 20, 21, 22, 23, 24, 25];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(4)->leaves));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(4)->leaves));
+
+ $data = [3, 8];
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, Node::findOne(1)->getLeaves(2)->all()));
+ $this->assertEquals($data, array_map(function ($value) { return $value->id; }, MultipleTreeNode::findOne(1)->getLeaves(2)->all()));
+ }
+
+ public function testGetPrev()
+ {
+ $this->assertEquals(11, Node::findOne(12)->prev->id);
+ $this->assertEquals(11, MultipleTreeNode::findOne(12)->prev->id);
+
+ $this->assertEquals(null, Node::findOne(20)->getPrev()->one());
+ $this->assertEquals(null, MultipleTreeNode::findOne(20)->getPrev()->one());
+ }
+
+ public function testGetNext()
+ {
+ $this->assertEquals(13, Node::findOne(12)->next->id);
+ $this->assertEquals(13, MultipleTreeNode::findOne(12)->next->id);
+
+ $this->assertEquals(null, Node::findOne(19)->getNext()->one());
+ $this->assertEquals(null, MultipleTreeNode::findOne(19)->getNext()->one());
+ }
+
+ public function testIsRoot()
+ {
+ $this->assertTrue(Node::findOne(1)->isRoot());
+ $this->assertTrue(MultipleTreeNode::findOne(1)->isRoot());
+ $this->assertTrue(MultipleTreeNode::findOne(26)->isRoot());
+
+ $this->assertFalse(Node::findOne(3)->isRoot());
+ $this->assertFalse(MultipleTreeNode::findOne(3)->isRoot());
+ $this->assertFalse(MultipleTreeNode::findOne(37)->isRoot());
+ }
+
+ public function testIsChildOf()
+ {
+ $this->assertTrue(Node::findOne(10)->isChildOf(Node::findOne(1)));
+ $this->assertTrue(MultipleTreeNode::findOne(10)->isChildOf(MultipleTreeNode::findOne(1)));
+
+ $this->assertTrue(Node::findOne(9)->isChildOf(Node::findOne(4)));
+ $this->assertTrue(MultipleTreeNode::findOne(9)->isChildOf(MultipleTreeNode::findOne(4)));
+
+ $this->assertFalse(Node::findOne(12)->isChildOf(Node::findOne(15)));
+ $this->assertFalse(MultipleTreeNode::findOne(12)->isChildOf(MultipleTreeNode::findOne(15)));
+
+ $this->assertFalse(Node::findOne(21)->isChildOf(Node::findOne(22)));
+ $this->assertFalse(MultipleTreeNode::findOne(21)->isChildOf(MultipleTreeNode::findOne(22)));
+
+ $this->assertFalse(Node::findOne(8)->isChildOf(Node::findOne(8)));
+ $this->assertFalse(MultipleTreeNode::findOne(8)->isChildOf(MultipleTreeNode::findOne(8)));
+
+ $this->assertFalse(MultipleTreeNode::findOne(6)->isChildOf(MultipleTreeNode::findOne(27)));
+ }
+
+ public function testIsLeaf()
+ {
+ $this->assertTrue(Node::findOne(3)->isLeaf());
+ $this->assertTrue(MultipleTreeNode::findOne(3)->isLeaf());
+
+ $this->assertFalse(Node::findOne(4)->isLeaf());
+ $this->assertFalse(MultipleTreeNode::findOne(4)->isLeaf());
+ }
+
+ public function testMakeRootInsert()
+ {
+ (new TestMigration())->up();
+ $dataSet = new ArrayDataSet(require(__DIR__ . '/data/empty.php'));
+ $this->getDatabaseTester()->setDataSet($dataSet);
+ $this->getDatabaseTester()->onSetUp();
+
+ $node = new Node(['slug' => 'r']);
+ $this->assertTrue($node->makeRoot()->save());
+
+ $node = new MultipleTreeNode(['slug' => 'r1']);
+ $this->assertTrue($node->makeRoot()->save());
+
+ $node = new MultipleTreeNode([
+ 'slug' => 'r2',
+ 'tree' => 100,
+ ]);
+ $this->assertTrue($node->makeRoot()->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-make-root-insert.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testMakeRootUpdate()
+ {
+ $node = MultipleTreeNode::findOne(9);
+ $this->assertTrue($node->makeRoot()->save());
+
+ $node = MultipleTreeNode::findOne(27);
+ $node->setAttribute('tree', 100);
+ $this->assertTrue($node->makeRoot()->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-make-root-update.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testMakeRootNewExceptionIsRaisedWhenTreeAttributeIsFalseAndRootIsExists()
+ {
+ $node = new Node(['slug' => 'r']);
+ $node->makeRoot()->save();
+ }
+
+ public function testPrependToInsertInNoEmpty()
+ {
+ $node = new Node(['slug' => 'new']);
+ $this->assertTrue($node->prependTo(Node::findOne(1))->save());
+
+ $node = new MultipleTreeNode(['slug' => 'new']);
+ $this->assertTrue($node->prependTo(MultipleTreeNode::findOne(1))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-insert-in-no-empty.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testPrependToInsertInEmpty()
+ {
+ $node = new Node(['slug' => 'new']);
+ $this->assertTrue($node->prependTo(Node::findOne(15))->save());
+
+ $node = new MultipleTreeNode(['slug' => 'new']);
+ $this->assertTrue($node->prependTo(MultipleTreeNode::findOne(15))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-insert-in-empty.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testPrependToUpdateSameNode()
+ {
+ $node = Node::findOne(4);
+ $this->assertTrue($node->prependTo(Node::findOne(1))->save());
+
+ $node = MultipleTreeNode::findOne(4);
+ $this->assertTrue($node->prependTo(MultipleTreeNode::findOne(1))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-update-same-node.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testPrependToUpdateDeep()
+ {
+ $node = Node::findOne(10);
+ $this->assertTrue($node->prependTo(Node::findOne(18))->save());
+
+ $node = MultipleTreeNode::findOne(10);
+ $this->assertTrue($node->prependTo(MultipleTreeNode::findOne(18))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-update-deep.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testPrependToUpdateOut()
+ {
+ $node = Node::findOne(6);
+ $this->assertTrue($node->prependTo(Node::findOne(1))->save());
+
+ $node = MultipleTreeNode::findOne(6);
+ $this->assertTrue($node->prependTo(MultipleTreeNode::findOne(1))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-update-out.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testPrependToUpdateAnotherTree()
+ {
+ $node = MultipleTreeNode::findOne(30);
+ $this->assertTrue($node->prependTo(MultipleTreeNode::findOne(4))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-prepend-to-update-another-tree.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testPrependToUpdateSelf()
+ {
+ $node = Node::findOne(2);
+ $this->assertTrue($node->prependTo(Node::findOne(1))->save());
+
+ $node = MultipleTreeNode::findOne(2);
+ $this->assertTrue($node->prependTo(MultipleTreeNode::findOne(1))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/data.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testPrependToInsertExceptionIsRaisedWhenTargetIsNewRecord()
+ {
+ $node = new Node(['slug' => 'new']);
+ $node->prependTo(new Node())->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testPrependToUpdateExceptionIsRaisedWhenTargetIsNewRecord()
+ {
+ $node = Node::findOne(2);
+ $node->prependTo(new Node())->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testPrependToUpdateExceptionIsRaisedWhenTargetIsSame()
+ {
+ $node = Node::findOne(3);
+ $node->prependTo(Node::findOne(3))->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testPrependToUpdateExceptionIsRaisedWhenTargetIsChild()
+ {
+ $node = Node::findOne(5);
+ $node->prependTo(Node::findOne(11))->save();
+ }
+
+ public function testAppendToInsertInNoEmpty()
+ {
+ $node = new Node(['slug' => 'new']);
+ $this->assertTrue($node->appendTo(Node::findOne(1))->save());
+
+ $node = new MultipleTreeNode(['slug' => 'new']);
+ $this->assertTrue($node->appendTo(MultipleTreeNode::findOne(1))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-insert-in-no-empty.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testAppendToInsertInEmpty()
+ {
+ $node = new Node(['slug' => 'new']);
+ $this->assertTrue($node->appendTo(Node::findOne(15))->save());
+
+ $node = new MultipleTreeNode(['slug' => 'new']);
+ $this->assertTrue($node->appendTo(MultipleTreeNode::findOne(15))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-insert-in-empty.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testAppendToUpdateSameNode()
+ {
+ $node = Node::findOne(2);
+ $this->assertTrue($node->appendTo(Node::findOne(1))->save());
+
+ $node = MultipleTreeNode::findOne(2);
+ $this->assertTrue($node->appendTo(MultipleTreeNode::findOne(1))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-update-same-node.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testAppendToUpdateDeep()
+ {
+ $node = Node::findOne(10);
+ $this->assertTrue($node->appendTo(Node::findOne(18))->save());
+
+ $node = MultipleTreeNode::findOne(10);
+ $this->assertTrue($node->appendTo(MultipleTreeNode::findOne(18))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-update-deep.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testAppendToUpdateOut()
+ {
+ $node = Node::findOne(6);
+ $this->assertTrue($node->appendTo(Node::findOne(1))->save());
+
+ $node = MultipleTreeNode::findOne(6);
+ $this->assertTrue($node->appendTo(MultipleTreeNode::findOne(1))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-update-out.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testAppendToUpdateAnotherTree()
+ {
+ $node = MultipleTreeNode::findOne(30);
+ $this->assertTrue($node->appendTo(MultipleTreeNode::findOne(4))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-append-to-update-another-tree.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testAppendToUpdateSelf()
+ {
+ $node = Node::findOne(4);
+ $this->assertTrue($node->appendTo(Node::findOne(1))->save());
+
+ $node = MultipleTreeNode::findOne(4);
+ $this->assertTrue($node->appendTo(MultipleTreeNode::findOne(1))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/data.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testAppendToInsertExceptionIsRaisedWhenTargetIsNewRecord()
+ {
+ $node = new Node(['slug' => 'new']);
+ $node->appendTo(new Node())->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testAppendToUpdateExceptionIsRaisedWhenTargetIsNewRecord()
+ {
+ $node = Node::findOne(2);
+ $node->appendTo(new Node())->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testAppendToUpdateExceptionIsRaisedWhenTargetIsSame()
+ {
+ $node = Node::findOne(3);
+ $node->appendTo(Node::findOne(3))->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testAppendToUpdateExceptionIsRaisedWhenTargetIsChild()
+ {
+ $node = Node::findOne(5);
+ $node->appendTo(Node::findOne(11))->save();
+ }
+
+ public function testInsertBeforeMiddle()
+ {
+ $node = new Node(['slug' => 'new']);
+ $this->assertTrue($node->insertBefore(Node::findOne(16))->save());
+
+ $node = new MultipleTreeNode(['slug' => 'new']);
+ $this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(33))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-insert-middle.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertBeforeInsertBegin()
+ {
+ $node = new Node(['slug' => 'new']);
+ $this->assertTrue($node->insertBefore(Node::findOne(20))->save());
+
+ $node = new MultipleTreeNode(['slug' => 'new']);
+ $this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(31))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-insert-begin.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertBeforeUpdateSameNode()
+ {
+ $node = Node::findOne(4);
+ $this->assertTrue($node->insertBefore(Node::findOne(2))->save());
+
+ $node = MultipleTreeNode::findOne(38);
+ $this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(37))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-update-same-node.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertBeforeUpdateOtherNode()
+ {
+ $node = Node::findOne(9);
+ $this->assertTrue($node->insertBefore(Node::findOne(16))->save());
+
+ $node = MultipleTreeNode::findOne(35);
+ $this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(28))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-update-other-node.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertBeforeUpdateNext()
+ {
+ $node = Node::findOne(12);
+ $this->assertTrue($node->insertBefore(Node::findOne(13))->save());
+
+ $node = MultipleTreeNode::findOne(33);
+ $this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(34))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/data.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertBeforeUpdateAnotherTree()
+ {
+ $node = MultipleTreeNode::findOne(26);
+ $this->assertTrue($node->insertBefore(MultipleTreeNode::findOne(15))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-before-update-another-tree.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testInsertBeforeInsertExceptionIsRaisedWhenTargetIsNewRecord()
+ {
+ $node = new Node(['slug' => 'new']);
+ $node->insertBefore(new Node())->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testInsertBeforeInsertExceptionIsRaisedWhenTargetIsRoot()
+ {
+ $node = new Node(['name' => 'new']);
+ $node->insertBefore(Node::findOne(1))->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testInsertBeforeUpdateExceptionIsRaisedWhenTargetIsSame()
+ {
+ $node = Node::findOne(3);
+ $node->insertBefore(Node::findOne(3))->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testInsertBeforeUpdateExceptionIsRaisedWhenTargetIsChild()
+ {
+ $node = Node::findOne(10);
+ $node->insertBefore(Node::findOne(23))->save();
+ }
+
+ public function testInsertAfterInsertMiddle()
+ {
+ $node = new Node(['slug' => 'new']);
+ $this->assertTrue($node->insertAfter(Node::findOne(21))->save());
+
+ $node = new MultipleTreeNode(['slug' => 'new']);
+ $this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(37))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-insert-middle.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertAfterInsertEnd()
+ {
+ $node = new Node(['slug' => 'new']);
+ $this->assertTrue($node->insertAfter(Node::findOne(19))->save());
+
+ $node = new MultipleTreeNode(['slug' => 'new']);
+ $this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(33))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-insert-end.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertAfterUpdateSameNode()
+ {
+ $node = Node::findOne(2);
+ $this->assertTrue($node->insertAfter(Node::findOne(4))->save());
+
+ $node = MultipleTreeNode::findOne(36);
+ $this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(37))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-update-same-node.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertAfterUpdateOtherNode()
+ {
+ $node = Node::findOne(6);
+ $this->assertTrue($node->insertAfter(Node::findOne(21))->save());
+
+ $node = MultipleTreeNode::findOne(32);
+ $this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(30))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-update-other-node.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertAfterUpdatePrev()
+ {
+ $node = Node::findOne(16);
+ $this->assertTrue($node->insertAfter(Node::findOne(15))->save());
+
+
+ $node = MultipleTreeNode::findOne(38);
+ $this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(37))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/data.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testInsertAfterUpdateAnotherTree()
+ {
+ $node = MultipleTreeNode::findOne(26);
+ $this->assertTrue($node->insertAfter(MultipleTreeNode::findOne(21))->save());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-insert-after-update-another-tree.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testInsertAfterInsertExceptionIsRaisedWhenTargetIsNewRecord()
+ {
+ $node = new Node(['slug' => 'new']);
+ $node->insertAfter(new Node())->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testInsertAfterInsertExceptionIsRaisedWhenTargetIsRoot()
+ {
+ $node = new Node(['slug' => 'new']);
+ $node->insertAfter(Node::findOne(1))->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testInsertAfterUpdateExceptionIsRaisedWhenTargetIsSame()
+ {
+ $node = Node::findOne(3);
+ $node->insertAfter(Node::findOne(3))->save();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testInsertAfterUpdateExceptionIsRaisedWhenTargetIsChild()
+ {
+ $node = Node::findOne(10);
+ $node->insertAfter(Node::findOne(23))->save();
+ }
+
+ public function testDelete()
+ {
+ $this->assertEquals(1, Node::findOne(2)->delete());
+
+ $this->assertEquals(1, MultipleTreeNode::findOne(30)->delete());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-delete.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testDeleteRoot()
+ {
+ Node::findOne(1)->delete();
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testDeleteExceptionIsRaisedWhenNodeIsNewRecord()
+ {
+ $node = new Node(['slug' => 'new']);
+ $node->delete();
+ }
+
+ public function testDeleteWithChildren()
+ {
+ $this->assertEquals(4, Node::findOne(6)->deleteWithChildren());
+
+ $this->assertEquals(1, MultipleTreeNode::findOne(28)->deleteWithChildren());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-delete-with-children.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ public function testDeleteWithChildrenRoot()
+ {
+ $this->assertEquals(25, Node::findOne(1)->deleteWithChildren());
+
+ $this->assertEquals(14, MultipleTreeNode::findOne(26)->deleteWithChildren());
+
+ $dataSet = $this->getConnection()->createDataSet(['tree', 'multiple_tree']);
+ $expectedDataSet = new ArrayDataSet(require(__DIR__ . '/data/test-delete-with-children-root.php'));
+ $this->assertDataSetsEqual($expectedDataSet, $dataSet);
+ }
+
+ /**
+ * @expectedException \yii\base\Exception
+ */
+ public function testDeleteWithChildrenExceptionIsRaisedWhenNodeIsNewRecord()
+ {
+ $node = new Node(['slug' => 'new']);
+ $node->deleteWithChildren();
+ }
+
+ /**
+ * @expectedException \yii\base\NotSupportedException
+ */
+ public function testExceptionIsRaisedWhenInsertIsCalled()
+ {
+ $node = new Node(['slug' => 'new']);
+ $node->insert();
+ }
+
+ public function testUpdate()
+ {
+ $node = Node::findOne(3);
+ $node->slug = 'update';
+ $this->assertEquals(1, $node->update());
+ }
+}
\ No newline at end of file
diff --git a/tests/NestedSetsQueryTraitTestCase.php b/tests/NestedSetsQueryTraitTestCase.php
new file mode 100644
index 0000000..4be49f5
--- /dev/null
+++ b/tests/NestedSetsQueryTraitTestCase.php
@@ -0,0 +1,24 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests;
+
+use paulzi\nestedsets\tests\models\Node;
+use paulzi\nestedsets\tests\models\MultipleTreeNode;
+use Yii;
+
+/**
+ * @author PaulZi
+ */
+class NestedSetsQueryTraitTestCase extends BaseTestCase
+{
+ public function testRoots()
+ {
+ $this->assertEquals([1], array_map(function ($value) { return $value->id; }, Node::find()->roots()->all()));
+ $this->assertEquals([1, 26], array_map(function ($value) { return $value->id; }, MultipleTreeNode::find()->roots()->all()));
+ }
+}
\ No newline at end of file
diff --git a/tests/README.md b/tests/README.md
new file mode 100644
index 0000000..991e69f
--- /dev/null
+++ b/tests/README.md
@@ -0,0 +1,37 @@
+# Yii2 Materialized Path Behavior unit tests
+
+## How to run the test
+
+Make sure you have PHPUnit installed and that you installed all composer dependencies (run `composer update` in the repo base directory).
+
+Run PHPUnit in the yii repo base directory.
+
+```
+phpunit
+```
+
+You can run tests for specific groups only:
+
+```
+phpunit --group=sqlite,mysql
+```
+
+You can get a list of available groups via `phpunit --list-groups`.
+
+## test configurations
+
+PHPUnit configuration is in `phpunit.xml.dist` in repository root folder.
+You can create your own phpunit.xml to override dist config.
+
+Database and other backend system configuration can be found in `tests/data/config.php`
+adjust them to your needs to allow testing databases and caching in your environment.
+You can override configuration values by creating a `config.local.php` file
+and manipulate the `$config` variable.
+For example to change MySQL username and password your `config.local.php` should
+contain the following:
+
+```php
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+defined('YII_DEBUG') or define('YII_DEBUG', true);
+defined('YII_ENV') or define('YII_ENV', 'test');
+
+require(__DIR__ . '/../vendor/autoload.php');
+require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
+
+Yii::setAlias('@tests', __DIR__);
+
+new \yii\console\Application([
+ 'id' => 'unit',
+ 'basePath' => __DIR__,
+]);
\ No newline at end of file
diff --git a/tests/data/config.php b/tests/data/config.php
new file mode 100644
index 0000000..c7183ef
--- /dev/null
+++ b/tests/data/config.php
@@ -0,0 +1,28 @@
+ [
+ 'dsn' => 'sqlite::memory:',
+ ],
+ 'mysql' => [
+ 'dsn' => 'mysql:host=localhost;dbname=test',
+ 'username' => 'root',
+ 'password' => '',
+ 'charset' => 'utf8',
+ ],
+ 'mssql' => [
+ 'dsn' => 'sqlsrv:Server=localhost;Database=test',
+ 'username' => '',
+ 'password' => '',
+ ],
+ 'pgsql' => [
+ 'dsn' => 'pgsql:host=localhost;dbname=test;port=5432;',
+ 'username' => 'postgres',
+ 'password' => 'postgres',
+ ],
+];
+
+if (is_file(__DIR__ . '/config.local.php')) {
+ include(__DIR__ . '/config.local.php');
+}
+
+return $config;
\ No newline at end of file
diff --git a/tests/data/data.php b/tests/data/data.php
new file mode 100644
index 0000000..333133b
--- /dev/null
+++ b/tests/data/data.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/empty.php b/tests/data/empty.php
new file mode 100644
index 0000000..5c10ce8
--- /dev/null
+++ b/tests/data/empty.php
@@ -0,0 +1,5 @@
+ array(),
+ 'multiple_tree' => array()
+);
\ No newline at end of file
diff --git a/tests/data/test-append-to-insert-in-empty.php b/tests/data/test-append-to-insert-in-empty.php
new file mode 100644
index 0000000..af73a92
--- /dev/null
+++ b/tests/data/test-append-to-insert-in-empty.php
@@ -0,0 +1,75 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '29','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '30','rgt' => '31','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '32','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '20','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '21','rgt' => '28','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '33','rgt' => '34','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '35','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '17','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+ array('id' => '26','lft' => '15','rgt' => '16','depth' => '4','slug' => 'new'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '29','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '30','rgt' => '31','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '32','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '20','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '21','rgt' => '28','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '33','rgt' => '34','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '35','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '17','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+
+ array('id' => '40','tree' => '1','lft' => '15','rgt' => '16','depth' => '4','slug' => 'new'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-append-to-insert-in-no-empty.php b/tests/data/test-append-to-insert-in-no-empty.php
new file mode 100644
index 0000000..902f963
--- /dev/null
+++ b/tests/data/test-append-to-insert-in-no-empty.php
@@ -0,0 +1,76 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','lft' => '50','rgt' => '51','depth' => '1','slug' => 'new'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+
+ array('id' => '40','tree' => '1','lft' => '50','rgt' => '51','depth' => '1','slug' => 'new'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-append-to-update-another-tree.php b/tests/data/test-append-to-update-another-tree.php
new file mode 100644
index 0000000..ef1a200
--- /dev/null
+++ b/tests/data/test-append-to-update-another-tree.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '60','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '59','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '18','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '1','lft' => '49','rgt' => '58','depth' => '2','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '1','lft' => '50','rgt' => '51','depth' => '3','slug' => 'n41'),
+ array('id' => '37','tree' => '1','lft' => '52','rgt' => '53','depth' => '3','slug' => 'n42'),
+ array('id' => '38','tree' => '1','lft' => '54','rgt' => '55','depth' => '3','slug' => 'n43'),
+ array('id' => '39','tree' => '1','lft' => '56','rgt' => '57','depth' => '3','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-append-to-update-deep.php b/tests/data/test-append-to-update-deep.php
new file mode 100644
index 0000000..010f72d
--- /dev/null
+++ b/tests/data/test-append-to-update-deep.php
@@ -0,0 +1,73 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '35','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '36','rgt' => '37','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '38','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '34','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '39','rgt' => '40','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '23','rgt' => '30','depth' => '4','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '31','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '24','rgt' => '25','depth' => '5','slug' => 'n331'),
+ array('id' => '24','lft' => '26','rgt' => '27','depth' => '5','slug' => 'n332'),
+ array('id' => '25','lft' => '28','rgt' => '29','depth' => '5','slug' => 'n333'),
+ ),
+
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '35','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '36','rgt' => '37','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '38','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '34','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '39','rgt' => '40','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '23','rgt' => '30','depth' => '4','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '31','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '24','rgt' => '25','depth' => '5','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '26','rgt' => '27','depth' => '5','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '28','rgt' => '29','depth' => '5','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-append-to-update-out.php b/tests/data/test-append-to-update-out.php
new file mode 100644
index 0000000..939459b
--- /dev/null
+++ b/tests/data/test-append-to-update-out.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '19','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '20','rgt' => '21','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '22','rgt' => '41','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '42','rgt' => '49','depth' => '1','slug' => 'n12'),
+ array('id' => '7','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '25','rgt' => '32','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '43','rgt' => '44','depth' => '2','slug' => 'n121'),
+ array('id' => '15','lft' => '45','rgt' => '46','depth' => '2','slug' => 'n122'),
+ array('id' => '16','lft' => '47','rgt' => '48','depth' => '2','slug' => 'n123'),
+ array('id' => '17','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '30','rgt' => '31','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '19','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '20','rgt' => '21','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '22','rgt' => '41','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '42','rgt' => '49','depth' => '1','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '25','rgt' => '32','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '43','rgt' => '44','depth' => '2','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '45','rgt' => '46','depth' => '2','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '47','rgt' => '48','depth' => '2','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '30','rgt' => '31','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-append-to-update-same-node.php b/tests/data/test-append-to-update-same-node.php
new file mode 100644
index 0000000..1387f50
--- /dev/null
+++ b/tests/data/test-append-to-update-same-node.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '24','rgt' => '49','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '2','rgt' => '3','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '4','rgt' => '23','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '25','rgt' => '32','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '7','rgt' => '14','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '15','rgt' => '22','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '30','rgt' => '31','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '10','rgt' => '11','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '24','rgt' => '49','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '2','rgt' => '3','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '4','rgt' => '23','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '25','rgt' => '32','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '7','rgt' => '14','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '15','rgt' => '22','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '30','rgt' => '31','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '10','rgt' => '11','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-delete-with-children-root.php b/tests/data/test-delete-with-children-root.php
new file mode 100644
index 0000000..814a31f
--- /dev/null
+++ b/tests/data/test-delete-with-children-root.php
@@ -0,0 +1,33 @@
+ array(
+ 'columns' => array('id','lft','rgt','depth','slug'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-delete-with-children.php b/tests/data/test-delete-with-children.php
new file mode 100644
index 0000000..181266b
--- /dev/null
+++ b/tests/data/test-delete-with-children.php
@@ -0,0 +1,67 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '42','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '19','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '20','rgt' => '21','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '22','rgt' => '41','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '7','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '25','rgt' => '32','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '17','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '30','rgt' => '31','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '26','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '29','tree' => '26','lft' => '12','rgt' => '15','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '16','rgt' => '25','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '13','rgt' => '14','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '17','rgt' => '18','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-delete.php b/tests/data/test-delete.php
new file mode 100644
index 0000000..56cdb5e
--- /dev/null
+++ b/tests/data/test-delete.php
@@ -0,0 +1,70 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '48','depth' => '0','slug' => 'r1'),
+ array('id' => '3','lft' => '26','rgt' => '27','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '28','rgt' => '47','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '2','rgt' => '9','depth' => '1','slug' => 'n11'),
+ array('id' => '6','lft' => '10','rgt' => '17','depth' => '1','slug' => 'n12'),
+ array('id' => '7','lft' => '18','rgt' => '25','depth' => '1','slug' => 'n13'),
+ array('id' => '8','lft' => '29','rgt' => '30','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '31','rgt' => '38','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '39','rgt' => '46','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n111'),
+ array('id' => '12','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n112'),
+ array('id' => '13','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n113'),
+ array('id' => '14','lft' => '11','rgt' => '12','depth' => '2','slug' => 'n121'),
+ array('id' => '15','lft' => '13','rgt' => '14','depth' => '2','slug' => 'n122'),
+ array('id' => '16','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n123'),
+ array('id' => '17','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n131'),
+ array('id' => '18','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n132'),
+ array('id' => '19','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n133'),
+ array('id' => '20','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '26','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '18','rgt' => '19','depth' => '1','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '20','rgt' => '21','depth' => '1','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '22','rgt' => '23','depth' => '1','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '24','rgt' => '25','depth' => '1','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-after-insert-end.php b/tests/data/test-insert-after-insert-end.php
new file mode 100644
index 0000000..1e667c6
--- /dev/null
+++ b/tests/data/test-insert-after-insert-end.php
@@ -0,0 +1,76 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '29','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '30','rgt' => '31','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '32','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '28','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '33','rgt' => '34','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '35','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','lft' => '26','rgt' => '27','depth' => '3','slug' => 'new'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '30','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '13','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '14','rgt' => '15','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '16','rgt' => '19','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '20','rgt' => '29','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '11','rgt' => '12','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '17','rgt' => '18','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '27','rgt' => '28','depth' => '2','slug' => 'n44'),
+
+ array('id' => '40','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'new'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-after-insert-middle.php b/tests/data/test-insert-after-insert-middle.php
new file mode 100644
index 0000000..d030d59
--- /dev/null
+++ b/tests/data/test-insert-after-insert-middle.php
@@ -0,0 +1,76 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','lft' => '38','rgt' => '39','depth' => '3','slug' => 'new'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '30','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '29','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '27','rgt' => '28','depth' => '2','slug' => 'n44'),
+
+ array('id' => '40','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'new'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-after-update-another-tree.php b/tests/data/test-insert-after-update-another-tree.php
new file mode 100644
index 0000000..d152d25
--- /dev/null
+++ b/tests/data/test-insert-after-update-another-tree.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '78','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '77','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '68','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '69','rgt' => '76','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '66','rgt' => '67','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '70','rgt' => '71','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '72','rgt' => '73','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '74','rgt' => '75','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '1','lft' => '38','rgt' => '65','depth' => '3','slug' => 'r2'),
+ array('id' => '27','tree' => '1','lft' => '39','rgt' => '48','depth' => '4','slug' => 'n1'),
+ array('id' => '28','tree' => '1','lft' => '49','rgt' => '50','depth' => '4','slug' => 'n2'),
+ array('id' => '29','tree' => '1','lft' => '51','rgt' => '54','depth' => '4','slug' => 'n3'),
+ array('id' => '30','tree' => '1','lft' => '55','rgt' => '64','depth' => '4','slug' => 'n4'),
+ array('id' => '31','tree' => '1','lft' => '40','rgt' => '41','depth' => '5','slug' => 'n11'),
+ array('id' => '32','tree' => '1','lft' => '42','rgt' => '43','depth' => '5','slug' => 'n12'),
+ array('id' => '33','tree' => '1','lft' => '44','rgt' => '45','depth' => '5','slug' => 'n13'),
+ array('id' => '34','tree' => '1','lft' => '46','rgt' => '47','depth' => '5','slug' => 'n14'),
+ array('id' => '35','tree' => '1','lft' => '52','rgt' => '53','depth' => '5','slug' => 'n31'),
+ array('id' => '36','tree' => '1','lft' => '56','rgt' => '57','depth' => '5','slug' => 'n41'),
+ array('id' => '37','tree' => '1','lft' => '58','rgt' => '59','depth' => '5','slug' => 'n42'),
+ array('id' => '38','tree' => '1','lft' => '60','rgt' => '61','depth' => '5','slug' => 'n43'),
+ array('id' => '39','tree' => '1','lft' => '62','rgt' => '63','depth' => '5','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-after-update-other-node.php b/tests/data/test-insert-after-update-other-node.php
new file mode 100644
index 0000000..c4e2119
--- /dev/null
+++ b/tests/data/test-insert-after-update-other-node.php
@@ -0,0 +1,74 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '19','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '20','rgt' => '21','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '22','rgt' => '49','depth' => '1','slug' => 'n3'),
+
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '30','rgt' => '37','depth' => '3','slug' => 'n12'),
+ array('id' => '7','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '25','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '31','rgt' => '32','depth' => '4','slug' => 'n121'),
+ array('id' => '15','lft' => '33','rgt' => '34','depth' => '4','slug' => 'n122'),
+ array('id' => '16','lft' => '35','rgt' => '36','depth' => '4','slug' => 'n123'),
+ array('id' => '17','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '9','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '10','rgt' => '11','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '12','rgt' => '15','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '16','rgt' => '25','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '26','rgt' => '27','depth' => '1','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '13','rgt' => '14','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '17','rgt' => '18','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-after-update-same-node.php b/tests/data/test-insert-after-update-same-node.php
new file mode 100644
index 0000000..9b5460a
--- /dev/null
+++ b/tests/data/test-insert-after-update-same-node.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '24','rgt' => '49','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '2','rgt' => '3','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '4','rgt' => '23','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '25','rgt' => '32','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '7','rgt' => '14','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '15','rgt' => '22','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '30','rgt' => '31','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '10','rgt' => '11','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-before-insert-begin.php b/tests/data/test-insert-before-insert-begin.php
new file mode 100644
index 0000000..9eda359
--- /dev/null
+++ b/tests/data/test-insert-before-insert-begin.php
@@ -0,0 +1,76 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','lft' => '34','rgt' => '35','depth' => '3','slug' => 'new'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '30','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '13','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '14','rgt' => '15','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '16','rgt' => '19','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '20','rgt' => '29','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '11','rgt' => '12','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '17','rgt' => '18','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '27','rgt' => '28','depth' => '2','slug' => 'n44'),
+
+ array('id' => '40','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'new'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-before-insert-middle.php b/tests/data/test-insert-before-insert-middle.php
new file mode 100644
index 0000000..149f3dc
--- /dev/null
+++ b/tests/data/test-insert-before-insert-middle.php
@@ -0,0 +1,76 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '29','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '30','rgt' => '31','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '32','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '20','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '21','rgt' => '28','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '33','rgt' => '34','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '35','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','lft' => '16','rgt' => '17','depth' => '3','slug' => 'new'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '30','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '13','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '14','rgt' => '15','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '16','rgt' => '19','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '20','rgt' => '29','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '11','rgt' => '12','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '17','rgt' => '18','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '27','rgt' => '28','depth' => '2','slug' => 'n44'),
+
+ array('id' => '40','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'new'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-before-update-another-tree.php b/tests/data/test-insert-before-update-another-tree.php
new file mode 100644
index 0000000..8e88915
--- /dev/null
+++ b/tests/data/test-insert-before-update-another-tree.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '78','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '55','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '56','rgt' => '57','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '58','rgt' => '77','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '46','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '47','rgt' => '54','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '59','rgt' => '60','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '61','rgt' => '68','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '69','rgt' => '76','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '50','rgt' => '51','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '52','rgt' => '53','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '62','rgt' => '63','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '64','rgt' => '65','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '66','rgt' => '67','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '70','rgt' => '71','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '72','rgt' => '73','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '74','rgt' => '75','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '1','lft' => '14','rgt' => '41','depth' => '3','slug' => 'r2'),
+ array('id' => '27','tree' => '1','lft' => '15','rgt' => '24','depth' => '4','slug' => 'n1'),
+ array('id' => '28','tree' => '1','lft' => '25','rgt' => '26','depth' => '4','slug' => 'n2'),
+ array('id' => '29','tree' => '1','lft' => '27','rgt' => '30','depth' => '4','slug' => 'n3'),
+ array('id' => '30','tree' => '1','lft' => '31','rgt' => '40','depth' => '4','slug' => 'n4'),
+ array('id' => '31','tree' => '1','lft' => '16','rgt' => '17','depth' => '5','slug' => 'n11'),
+ array('id' => '32','tree' => '1','lft' => '18','rgt' => '19','depth' => '5','slug' => 'n12'),
+ array('id' => '33','tree' => '1','lft' => '20','rgt' => '21','depth' => '5','slug' => 'n13'),
+ array('id' => '34','tree' => '1','lft' => '22','rgt' => '23','depth' => '5','slug' => 'n14'),
+ array('id' => '35','tree' => '1','lft' => '28','rgt' => '29','depth' => '5','slug' => 'n31'),
+ array('id' => '36','tree' => '1','lft' => '32','rgt' => '33','depth' => '5','slug' => 'n41'),
+ array('id' => '37','tree' => '1','lft' => '34','rgt' => '35','depth' => '5','slug' => 'n42'),
+ array('id' => '38','tree' => '1','lft' => '36','rgt' => '37','depth' => '5','slug' => 'n43'),
+ array('id' => '39','tree' => '1','lft' => '38','rgt' => '39','depth' => '5','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-before-update-other-node.php b/tests/data/test-insert-before-update-other-node.php
new file mode 100644
index 0000000..6448355
--- /dev/null
+++ b/tests/data/test-insert-before-update-other-node.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '35','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '36','rgt' => '37','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '38','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '26','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '27','rgt' => '34','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '39','rgt' => '40','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '16','rgt' => '23','depth' => '3','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '30','rgt' => '31','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '17','rgt' => '18','depth' => '4','slug' => 'n321'),
+ array('id' => '21','lft' => '19','rgt' => '20','depth' => '4','slug' => 'n322'),
+ array('id' => '22','lft' => '21','rgt' => '22','depth' => '4','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '14','rgt' => '15','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '16','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-insert-before-update-same-node.php b/tests/data/test-insert-before-update-same-node.php
new file mode 100644
index 0000000..4706497
--- /dev/null
+++ b/tests/data/test-insert-before-update-same-node.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '22','rgt' => '47','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '48','rgt' => '49','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '2','rgt' => '21','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '23','rgt' => '30','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '31','rgt' => '38','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '39','rgt' => '46','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '5','rgt' => '12','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '13','rgt' => '20','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '10','rgt' => '11','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-make-root-insert.php b/tests/data/test-make-root-insert.php
new file mode 100644
index 0000000..8b06f9a
--- /dev/null
+++ b/tests/data/test-make-root-insert.php
@@ -0,0 +1,10 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '2','depth' => '0','slug' => 'r'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '2','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '100','lft' => '1','rgt' => '2','depth' => '0','slug' => 'r2'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-make-root-update.php b/tests/data/test-make-root-update.php
new file mode 100644
index 0000000..b19ad2d
--- /dev/null
+++ b/tests/data/test-make-root-update.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '42','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '41','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '9','lft' => '1','rgt' => '8','depth' => '0','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '9','lft' => '2','rgt' => '3','depth' => '1','slug' => 'n321'),
+ array('id' => '21','tree' => '9','lft' => '4','rgt' => '5','depth' => '1','slug' => 'n322'),
+ array('id' => '22','tree' => '9','lft' => '6','rgt' => '7','depth' => '1','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '18','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '100','lft' => '1','rgt' => '10','depth' => '0','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '2','rgt' => '3','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '4','rgt' => '7','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '8','rgt' => '17','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '100','lft' => '2','rgt' => '3','depth' => '1','slug' => 'n11'),
+ array('id' => '32','tree' => '100','lft' => '4','rgt' => '5','depth' => '1','slug' => 'n12'),
+ array('id' => '33','tree' => '100','lft' => '6','rgt' => '7','depth' => '1','slug' => 'n13'),
+ array('id' => '34','tree' => '100','lft' => '8','rgt' => '9','depth' => '1','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '11','rgt' => '12','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '13','rgt' => '14','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-prepend-to-insert-in-empty.php b/tests/data/test-prepend-to-insert-in-empty.php
new file mode 100644
index 0000000..b737834
--- /dev/null
+++ b/tests/data/test-prepend-to-insert-in-empty.php
@@ -0,0 +1,77 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '29','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '30','rgt' => '31','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '32','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '20','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '21','rgt' => '28','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '33','rgt' => '34','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '35','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '17','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','lft' => '15','rgt' => '16','depth' => '4','slug' => 'new'),
+ ),
+
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '29','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '30','rgt' => '31','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '32','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '20','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '21','rgt' => '28','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '33','rgt' => '34','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '35','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '17','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+
+ array('id' => '40','tree' => '1','lft' => '15','rgt' => '16','depth' => '4','slug' => 'new'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-prepend-to-insert-in-no-empty.php b/tests/data/test-prepend-to-insert-in-no-empty.php
new file mode 100644
index 0000000..75e849c
--- /dev/null
+++ b/tests/data/test-prepend-to-insert-in-no-empty.php
@@ -0,0 +1,77 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '4','rgt' => '29','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '30','rgt' => '31','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '32','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '5','rgt' => '12','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '13','rgt' => '20','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '21','rgt' => '28','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '33','rgt' => '34','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '35','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '10','rgt' => '11','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','lft' => '2','rgt' => '3','depth' => '1','slug' => 'new'),
+ ),
+
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '52','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '4','rgt' => '29','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '30','rgt' => '31','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '32','rgt' => '51','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '5','rgt' => '12','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '13','rgt' => '20','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '21','rgt' => '28','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '33','rgt' => '34','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '35','rgt' => '42','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '10','rgt' => '11','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+
+ array('id' => '40','tree' => 1,'lft' => '2','rgt' => '3','depth' => '1','slug' => 'new'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-prepend-to-update-another-tree.php b/tests/data/test-prepend-to-update-another-tree.php
new file mode 100644
index 0000000..c1aca89
--- /dev/null
+++ b/tests/data/test-prepend-to-update-another-tree.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '60','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '59','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '41','rgt' => '42','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '43','rgt' => '50','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '51','rgt' => '58','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '48','rgt' => '49','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '52','rgt' => '53','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '54','rgt' => '55','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '56','rgt' => '57','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '18','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '1','lft' => '31','rgt' => '40','depth' => '2','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '1','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n41'),
+ array('id' => '37','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n42'),
+ array('id' => '38','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n43'),
+ array('id' => '39','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-prepend-to-update-deep.php b/tests/data/test-prepend-to-update-deep.php
new file mode 100644
index 0000000..010f72d
--- /dev/null
+++ b/tests/data/test-prepend-to-update-deep.php
@@ -0,0 +1,73 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '2','rgt' => '35','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '36','rgt' => '37','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '38','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '34','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '39','rgt' => '40','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '23','rgt' => '30','depth' => '4','slug' => 'n33'),
+ array('id' => '11','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '31','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '24','rgt' => '25','depth' => '5','slug' => 'n331'),
+ array('id' => '24','lft' => '26','rgt' => '27','depth' => '5','slug' => 'n332'),
+ array('id' => '25','lft' => '28','rgt' => '29','depth' => '5','slug' => 'n333'),
+ ),
+
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '2','rgt' => '35','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '36','rgt' => '37','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '38','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '3','rgt' => '10','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '34','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '39','rgt' => '40','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '23','rgt' => '30','depth' => '4','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '4','rgt' => '5','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '31','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '24','rgt' => '25','depth' => '5','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '26','rgt' => '27','depth' => '5','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '28','rgt' => '29','depth' => '5','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-prepend-to-update-out.php b/tests/data/test-prepend-to-update-out.php
new file mode 100644
index 0000000..ea5e611
--- /dev/null
+++ b/tests/data/test-prepend-to-update-out.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '10','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '2','rgt' => '9','depth' => '1','slug' => 'n12'),
+ array('id' => '7','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n121'),
+ array('id' => '15','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n122'),
+ array('id' => '16','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n123'),
+ array('id' => '17','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '10','rgt' => '27','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '28','rgt' => '29','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '30','rgt' => '49','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '11','rgt' => '18','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '2','rgt' => '9','depth' => '1','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '19','rgt' => '26','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '31','rgt' => '32','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '33','rgt' => '40','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '41','rgt' => '48','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '12','rgt' => '13','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '20','rgt' => '21','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '22','rgt' => '23','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '38','rgt' => '39','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '46','rgt' => '47','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/data/test-prepend-to-update-same-node.php b/tests/data/test-prepend-to-update-same-node.php
new file mode 100644
index 0000000..4c6cebb
--- /dev/null
+++ b/tests/data/test-prepend-to-update-same-node.php
@@ -0,0 +1,72 @@
+ array(
+ array('id' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','lft' => '22','rgt' => '47','depth' => '1','slug' => 'n1'),
+ array('id' => '3','lft' => '48','rgt' => '49','depth' => '1','slug' => 'n2'),
+ array('id' => '4','lft' => '2','rgt' => '21','depth' => '1','slug' => 'n3'),
+ array('id' => '5','lft' => '23','rgt' => '30','depth' => '2','slug' => 'n11'),
+ array('id' => '6','lft' => '31','rgt' => '38','depth' => '2','slug' => 'n12'),
+ array('id' => '7','lft' => '39','rgt' => '46','depth' => '2','slug' => 'n13'),
+ array('id' => '8','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n31'),
+ array('id' => '9','lft' => '5','rgt' => '12','depth' => '2','slug' => 'n32'),
+ array('id' => '10','lft' => '13','rgt' => '20','depth' => '2','slug' => 'n33'),
+ array('id' => '11','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n111'),
+ array('id' => '12','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n112'),
+ array('id' => '13','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n113'),
+ array('id' => '14','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n121'),
+ array('id' => '15','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n122'),
+ array('id' => '16','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n123'),
+ array('id' => '17','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n131'),
+ array('id' => '18','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n132'),
+ array('id' => '19','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n133'),
+ array('id' => '20','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n321'),
+ array('id' => '21','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n322'),
+ array('id' => '22','lft' => '10','rgt' => '11','depth' => '3','slug' => 'n323'),
+ array('id' => '23','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n331'),
+ array('id' => '24','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n332'),
+ array('id' => '25','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n333'),
+ ),
+ 'multiple_tree' => array(
+ array('id' => '1','tree' => '1','lft' => '1','rgt' => '50','depth' => '0','slug' => 'r1'),
+ array('id' => '2','tree' => '1','lft' => '22','rgt' => '47','depth' => '1','slug' => 'n1'),
+ array('id' => '3','tree' => '1','lft' => '48','rgt' => '49','depth' => '1','slug' => 'n2'),
+ array('id' => '4','tree' => '1','lft' => '2','rgt' => '21','depth' => '1','slug' => 'n3'),
+ array('id' => '5','tree' => '1','lft' => '23','rgt' => '30','depth' => '2','slug' => 'n11'),
+ array('id' => '6','tree' => '1','lft' => '31','rgt' => '38','depth' => '2','slug' => 'n12'),
+ array('id' => '7','tree' => '1','lft' => '39','rgt' => '46','depth' => '2','slug' => 'n13'),
+ array('id' => '8','tree' => '1','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n31'),
+ array('id' => '9','tree' => '1','lft' => '5','rgt' => '12','depth' => '2','slug' => 'n32'),
+ array('id' => '10','tree' => '1','lft' => '13','rgt' => '20','depth' => '2','slug' => 'n33'),
+ array('id' => '11','tree' => '1','lft' => '24','rgt' => '25','depth' => '3','slug' => 'n111'),
+ array('id' => '12','tree' => '1','lft' => '26','rgt' => '27','depth' => '3','slug' => 'n112'),
+ array('id' => '13','tree' => '1','lft' => '28','rgt' => '29','depth' => '3','slug' => 'n113'),
+ array('id' => '14','tree' => '1','lft' => '32','rgt' => '33','depth' => '3','slug' => 'n121'),
+ array('id' => '15','tree' => '1','lft' => '34','rgt' => '35','depth' => '3','slug' => 'n122'),
+ array('id' => '16','tree' => '1','lft' => '36','rgt' => '37','depth' => '3','slug' => 'n123'),
+ array('id' => '17','tree' => '1','lft' => '40','rgt' => '41','depth' => '3','slug' => 'n131'),
+ array('id' => '18','tree' => '1','lft' => '42','rgt' => '43','depth' => '3','slug' => 'n132'),
+ array('id' => '19','tree' => '1','lft' => '44','rgt' => '45','depth' => '3','slug' => 'n133'),
+ array('id' => '20','tree' => '1','lft' => '6','rgt' => '7','depth' => '3','slug' => 'n321'),
+ array('id' => '21','tree' => '1','lft' => '8','rgt' => '9','depth' => '3','slug' => 'n322'),
+ array('id' => '22','tree' => '1','lft' => '10','rgt' => '11','depth' => '3','slug' => 'n323'),
+ array('id' => '23','tree' => '1','lft' => '14','rgt' => '15','depth' => '3','slug' => 'n331'),
+ array('id' => '24','tree' => '1','lft' => '16','rgt' => '17','depth' => '3','slug' => 'n332'),
+ array('id' => '25','tree' => '1','lft' => '18','rgt' => '19','depth' => '3','slug' => 'n333'),
+
+ array('id' => '26','tree' => '26','lft' => '1','rgt' => '28','depth' => '0','slug' => 'r2'),
+ array('id' => '27','tree' => '26','lft' => '2','rgt' => '11','depth' => '1','slug' => 'n1'),
+ array('id' => '28','tree' => '26','lft' => '12','rgt' => '13','depth' => '1','slug' => 'n2'),
+ array('id' => '29','tree' => '26','lft' => '14','rgt' => '17','depth' => '1','slug' => 'n3'),
+ array('id' => '30','tree' => '26','lft' => '18','rgt' => '27','depth' => '1','slug' => 'n4'),
+ array('id' => '31','tree' => '26','lft' => '3','rgt' => '4','depth' => '2','slug' => 'n11'),
+ array('id' => '32','tree' => '26','lft' => '5','rgt' => '6','depth' => '2','slug' => 'n12'),
+ array('id' => '33','tree' => '26','lft' => '7','rgt' => '8','depth' => '2','slug' => 'n13'),
+ array('id' => '34','tree' => '26','lft' => '9','rgt' => '10','depth' => '2','slug' => 'n14'),
+ array('id' => '35','tree' => '26','lft' => '15','rgt' => '16','depth' => '2','slug' => 'n31'),
+ array('id' => '36','tree' => '26','lft' => '19','rgt' => '20','depth' => '2','slug' => 'n41'),
+ array('id' => '37','tree' => '26','lft' => '21','rgt' => '22','depth' => '2','slug' => 'n42'),
+ array('id' => '38','tree' => '26','lft' => '23','rgt' => '24','depth' => '2','slug' => 'n43'),
+ array('id' => '39','tree' => '26','lft' => '25','rgt' => '26','depth' => '2','slug' => 'n44'),
+ )
+);
\ No newline at end of file
diff --git a/tests/migrations/TestMigration.php b/tests/migrations/TestMigration.php
new file mode 100644
index 0000000..b213d8c
--- /dev/null
+++ b/tests/migrations/TestMigration.php
@@ -0,0 +1,61 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\migrations;
+
+use yii\db\Schema;
+use yii\db\Migration;
+
+/**
+ * @author PaulZi
+ */
+class TestMigration extends Migration
+{
+ public function up()
+ {
+ ob_start();
+ $tableOptions = null;
+ if ($this->db->driverName === 'mysql') {
+ // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
+ $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
+ }
+
+ // tree
+ if ($this->db->getTableSchema('{{%tree}}', true) !== null) {
+ $this->dropTable('{{%tree}}');
+ }
+ $this->createTable('{{%tree}}', [
+ 'id' => Schema::TYPE_PK,
+ 'lft' => Schema::TYPE_INTEGER . ' NOT NULL',
+ 'rgt' => Schema::TYPE_INTEGER . ' NOT NULL',
+ 'depth' => Schema::TYPE_INTEGER . ' NOT NULL',
+ 'slug' => Schema::TYPE_STRING . ' NOT NULL',
+ ], $tableOptions);
+ $this->createIndex('lft1', '{{%tree}}', ['lft', 'rgt']);
+ $this->createIndex('rgt1', '{{%tree}}', ['rgt']);
+
+ // multiple tree
+ if ($this->db->getTableSchema('{{%multiple_tree}}', true) !== null) {
+ $this->dropTable('{{%multiple_tree}}');
+ }
+ $this->createTable('{{%multiple_tree}}', [
+ 'id' => Schema::TYPE_PK,
+ 'tree' => Schema::TYPE_INTEGER . ' NULL',
+ 'lft' => Schema::TYPE_INTEGER . ' NOT NULL',
+ 'rgt' => Schema::TYPE_INTEGER . ' NOT NULL',
+ 'depth' => Schema::TYPE_INTEGER . ' NOT NULL',
+ 'slug' => Schema::TYPE_STRING . ' NOT NULL',
+ ], $tableOptions);
+ $this->createIndex('lft2', '{{%multiple_tree}}', ['tree', 'lft', 'rgt']);
+ $this->createIndex('rgt2', '{{%multiple_tree}}', ['tree', 'rgt']);
+
+ // update cache (sqlite bug)
+ $this->db->getSchema()->getTableSchema('{{%tree}}', true);
+ $this->db->getSchema()->getTableSchema('{{%multiple_tree}}', true);
+ ob_end_clean();
+ }
+}
diff --git a/tests/models/MultipleTreeNode.php b/tests/models/MultipleTreeNode.php
new file mode 100644
index 0000000..2736ce6
--- /dev/null
+++ b/tests/models/MultipleTreeNode.php
@@ -0,0 +1,74 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\models;
+
+use paulzi\nestedsets\NestedSetsBehavior;
+
+/**
+ * @author PaulZi
+ *
+ * @property integer $id
+ * @property integer $tree
+ * @property integer $lft
+ * @property integer $rgt
+ * @property integer $depth
+ * @property string $slug
+ *
+ * @property Node[] $parents
+ * @property Node $parent
+ * @property Node $root
+ * @property Node[] $descendants
+ * @property Node[] $children
+ * @property Node[] $leaves
+ * @property Node $prev
+ * @property Node $next
+ *
+ * @method static MultipleTreeNode|null findOne() findOne($condition)
+ *
+ * @mixin NestedSetsBehavior
+ */
+class MultipleTreeNode extends \yii\db\ActiveRecord
+{
+ /**
+ * @inheritdoc
+ */
+ public static function tableName()
+ {
+ return '{{%multiple_tree}}';
+ }
+ /**
+ * @inheritdoc
+ */
+ public function behaviors()
+ {
+ return [
+ [
+ 'class' => NestedSetsBehavior::className(),
+ 'treeAttribute' => 'tree',
+ ],
+ ];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function transactions()
+ {
+ return [
+ self::SCENARIO_DEFAULT => self::OP_ALL,
+ ];
+ }
+
+ /**
+ * @return NodeQuery
+ */
+ public static function find()
+ {
+ return new NodeQuery(get_called_class());
+ }
+}
\ No newline at end of file
diff --git a/tests/models/Node.php b/tests/models/Node.php
new file mode 100644
index 0000000..3673a02
--- /dev/null
+++ b/tests/models/Node.php
@@ -0,0 +1,72 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\models;
+
+use paulzi\nestedsets\NestedSetsBehavior;
+
+/**
+ * @author PaulZi
+ *
+ * @property integer $id
+ * @property integer $lft
+ * @property integer $rgt
+ * @property integer $depth
+ * @property string $slug
+ *
+ * @property Node[] $parents
+ * @property Node $parent
+ * @property Node $root
+ * @property Node[] $descendants
+ * @property Node[] $children
+ * @property Node[] $leaves
+ * @property Node $prev
+ * @property Node $next
+ *
+ * @method static Node|null findOne() findOne($condition)
+ *
+ * @mixin NestedSetsBehavior
+ */
+class Node extends \yii\db\ActiveRecord
+{
+ /**
+ * @inheritdoc
+ */
+ public static function tableName()
+ {
+ return '{{%tree}}';
+ }
+ /**
+ * @inheritdoc
+ */
+ public function behaviors()
+ {
+ return [
+ [
+ 'class' => NestedSetsBehavior::className(),
+ ],
+ ];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function transactions()
+ {
+ return [
+ self::SCENARIO_DEFAULT => self::OP_ALL,
+ ];
+ }
+
+ /**
+ * @return NodeQuery
+ */
+ public static function find()
+ {
+ return new NodeQuery(get_called_class());
+ }
+}
\ No newline at end of file
diff --git a/tests/models/NodeQuery.php b/tests/models/NodeQuery.php
new file mode 100644
index 0000000..2fa5df4
--- /dev/null
+++ b/tests/models/NodeQuery.php
@@ -0,0 +1,18 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\models;
+
+use paulzi\nestedsets\NestedSetsQueryTrait;
+
+/**
+ * @author PaulZi
+ */
+class NodeQuery extends \yii\db\ActiveQuery
+{
+ use NestedSetsQueryTrait;
+}
\ No newline at end of file
diff --git a/tests/mysql/NestedSetsBehaviorTest.php b/tests/mysql/NestedSetsBehaviorTest.php
new file mode 100644
index 0000000..7a8351e
--- /dev/null
+++ b/tests/mysql/NestedSetsBehaviorTest.php
@@ -0,0 +1,20 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\mysql;
+
+use paulzi\nestedsets\tests\NestedSetsBehaviorTestCase;
+
+/**
+ * @group mysql
+ *
+ * @author PaulZi
+ */
+class NestedSetsBehaviorTest extends NestedSetsBehaviorTestCase
+{
+ protected static $driverName = 'mysql';
+}
\ No newline at end of file
diff --git a/tests/mysql/NestedSetsQueryTraitTest.php b/tests/mysql/NestedSetsQueryTraitTest.php
new file mode 100644
index 0000000..b71cddc
--- /dev/null
+++ b/tests/mysql/NestedSetsQueryTraitTest.php
@@ -0,0 +1,20 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\mysql;
+
+use paulzi\nestedsets\tests\NestedSetsQueryTraitTestCase;
+
+/**
+ * @group mysql
+ *
+ * @author PaulZi
+ */
+class NestedSetsQueryTraitTest extends NestedSetsQueryTraitTestCase
+{
+ protected static $driverName = 'mysql';
+}
\ No newline at end of file
diff --git a/tests/pgsql/NestedSetsBehaviorTest.php b/tests/pgsql/NestedSetsBehaviorTest.php
new file mode 100644
index 0000000..570006f
--- /dev/null
+++ b/tests/pgsql/NestedSetsBehaviorTest.php
@@ -0,0 +1,20 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\pgsql;
+
+use paulzi\nestedsets\tests\NestedSetsBehaviorTestCase;
+
+/**
+ * @group pgsql
+ *
+ * @author PaulZi
+ */
+class NestedSetsBehaviorTest extends NestedSetsBehaviorTestCase
+{
+ protected static $driverName = 'pgsql';
+}
\ No newline at end of file
diff --git a/tests/pgsql/NestedSetsQueryTraitTest.php b/tests/pgsql/NestedSetsQueryTraitTest.php
new file mode 100644
index 0000000..6e04344
--- /dev/null
+++ b/tests/pgsql/NestedSetsQueryTraitTest.php
@@ -0,0 +1,20 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\pgsql;
+
+use paulzi\nestedsets\tests\NestedSetsQueryTraitTestCase;
+
+/**
+ * @group pgsql
+ *
+ * @author PaulZi
+ */
+class NestedSetsQueryTraitTest extends NestedSetsQueryTraitTestCase
+{
+ protected static $driverName = 'pgsql';
+}
\ No newline at end of file
diff --git a/tests/sqlite/NestedSetsBehaviorTest.php b/tests/sqlite/NestedSetsBehaviorTest.php
new file mode 100644
index 0000000..a91808f
--- /dev/null
+++ b/tests/sqlite/NestedSetsBehaviorTest.php
@@ -0,0 +1,20 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\sqlite;
+
+use paulzi\nestedsets\tests\NestedSetsBehaviorTestCase;
+
+/**
+ * @group sqlite
+ *
+ * @author PaulZi
+ */
+class NestedSetsBehaviorTest extends NestedSetsBehaviorTestCase
+{
+ protected static $driverName = 'sqlite';
+}
\ No newline at end of file
diff --git a/tests/sqlite/NestedSetsQueryTraitTest.php b/tests/sqlite/NestedSetsQueryTraitTest.php
new file mode 100644
index 0000000..6de4692
--- /dev/null
+++ b/tests/sqlite/NestedSetsQueryTraitTest.php
@@ -0,0 +1,20 @@
+
+ * @license MIT (https://github.com/paulzi/yii2-nested-sets/blob/master/LICENSE)
+ */
+
+namespace paulzi\nestedsets\tests\sqlite;
+
+use paulzi\nestedsets\tests\NestedSetsQueryTraitTestCase;
+
+/**
+ * @group sqlite
+ *
+ * @author PaulZi
+ */
+class NestedSetsQueryTraitTest extends NestedSetsQueryTraitTestCase
+{
+ protected static $driverName = 'sqlite';
+}
\ No newline at end of file