Yaffs site version 1.1
[yaffs-website] / vendor / gabordemooij / redbean / testing / RedUNIT / Base / Xnull.php
diff --git a/vendor/gabordemooij/redbean/testing/RedUNIT/Base/Xnull.php b/vendor/gabordemooij/redbean/testing/RedUNIT/Base/Xnull.php
new file mode 100644 (file)
index 0000000..153fbd9
--- /dev/null
@@ -0,0 +1,256 @@
+<?php
+
+namespace RedUNIT\Base;
+
+use RedUNIT\Base as Base;
+use RedBeanPHP\Facade as R;
+use RedBeanPHP\OODBBean as OODBBean;
+
+/**
+ * Null
+ *
+ * Tests NULL handling.
+ *
+ * @file    RedUNIT/Base/Xnull.php
+ * @desc    Tests handling of NULL values.
+ * @author  Gabor de Mooij and the RedBeanPHP Community
+ * @license New BSD/GPLv2
+ *
+ * (c) G.J.G.T. (Gabor) de Mooij and the RedBeanPHP Community.
+ * This source file is subject to the New BSD/GPLv2 License that is bundled
+ * with this source code in the file license.txt.
+ */
+class Xnull extends Base
+{
+       /**
+        * Test Null bindings.
+        */
+       public function testBindings()
+       {
+               R::nuke();
+               $book = R::dispense( 'book' );
+               $book->content = NULL;
+               //can we store a NULL?
+               asrt( is_null( $book->content ), TRUE );
+               R::store( $book );
+               //did we really store the NULL value ?
+               $book = R::findOne( 'book', ' content IS NULL ' );
+               asrt( ( $book instanceof OODBBean ), TRUE );
+               //still NULL, not empty STRING ?
+               asrt( is_null( $book->content ), TRUE );
+               $book->pages = 100;
+               R::store( $book );
+               //did we save it once again as NULL?
+               $book = R::findOne( 'book', ' content IS NULL ' );
+               asrt( ( $book instanceof OODBBean ), TRUE );
+               asrt( is_null( $book->content ), TRUE );
+               asrt( gettype( $book->pages ), 'string' );
+               $otherBook = R::dispense( 'book' );
+               $otherBook->pages = 99;
+               //also if the column is VARCHAR-like?
+               $otherBook->content = 'blah blah';
+               R::store( $otherBook );
+               $book = R::findOne( 'book', ' content IS NULL ' );
+               asrt( ( $book instanceof OODBBean ), TRUE );
+               asrt( is_null( $book->content ), TRUE );
+               asrt( intval( $book->pages ), 100 );
+               //can we query not NULL as well?
+               $book = R::findOne( 'book', ' content IS NOT NULL ' );
+               asrt( ( $book instanceof OODBBean ), TRUE );
+               asrt( is_null( $book->content ), FALSE );
+               asrt( intval( $book->pages ), 99 );
+               asrt( $book->content, 'blah blah' );
+               //Can we bind NULL directly?
+               $book->isGood = FALSE;
+               //Is NULL the default? And... no confusion with boolean FALSE?
+               R::store( $book );
+               $book = R::findOne( 'book', ' is_good IS NULL' );
+               asrt( ( $book instanceof OODBBean ), TRUE );
+               asrt( is_null( $book->content ), TRUE );
+               asrt( intval( $book->pages ), 100 );
+               $book = R::findOne( 'book', ' is_good = ?', array( 0 ) );
+               asrt( ( $book instanceof OODBBean ), TRUE );
+               asrt( is_null( $book->content ), FALSE );
+               asrt( intval( $book->pages ), 99 );
+       }
+
+       /**
+        * Tests whether we can NULLify a parent bean
+        * page->book if the parent (book) is already
+        * NULL. (isset vs array_key_exists bug).
+        *
+        * @return void
+        */
+       public function testUnsetParent()
+       {
+               R::nuke();
+               $book = R::dispense( 'book' );
+               $book->title = 'My Book';
+               $page = R::dispense( 'page' );
+               $page->text = 'Lorem Ipsum';
+               $book->ownPage[] = $page;
+               R::store( $book );
+               $page = $page->fresh();
+               R::freeze( TRUE );
+               asrt( (int) $page->book->id, (int) $book->id );
+               unset( $page->book );
+               R::store( $page );
+               $page = $page->fresh();
+               asrt( (int) $page->book->id, (int) $book->id );
+               $page->book = NULL;
+               R::store( $page );
+               $page = $page->fresh();
+               asrt( $page->book, NULL );
+               asrt( $page->book_id, NULL );
+               asrt( $page->bookID, NULL );
+               asrt( $page->bookId, NULL );
+               $page = R::dispense( 'page' );
+               $page->text = 'Another Page';
+               $page->book = NULL;
+               try {
+                       R::store( $page );
+                       fail();
+               } catch( \Exception $exception ) {
+                       pass();
+               }
+               unset($page->book);
+               R::store($page);
+               $page = $page->fresh();
+               $page->book = NULL; //this must set field id to NULL not ADD column!
+               try {
+                       R::store($page);
+                       pass();
+               } catch( \Exception $exception ) {
+                       fail();
+               }
+               $page = $page->fresh();
+               $page->book = NULL;
+               R::store( $page );
+               $page = $page->fresh();
+               asrt( is_null( $page->book_id ), TRUE );
+               $page->book = $book;
+               R::store( $page );
+               $page = $page->fresh();
+               asrt( (int) $page->book->id, (int) $book->id );
+               $page->book = NULL;
+               R::store( $page );
+               asrt( is_null( $page->book_id ), TRUE );
+               asrt( is_null( $page->book ), TRUE );
+               R::freeze( FALSE );
+       }
+
+       /**
+        * Test nullifying aliased parent.
+        *
+        * @return void
+        */
+       public function testUnsetAliasedParent()
+       {
+               R::nuke();
+               $book = R::dispense( 'book' );
+               $author = R::dispense( 'author' );
+               $book->coauthor = $author;
+               R::store( $book );
+               $book = $book->fresh();
+               asrt( is_null( $book->fetchAs('author')->coauthor ), FALSE );
+               unset( $book->coauthor );
+               R::store( $book );
+               $book = $book->fresh();
+               asrt( is_null( $book->fetchAs('author')->coauthor ), FALSE );
+               $book->coauthor = NULL;
+               R::store( $book );
+               $book = $book->fresh();
+               asrt( is_null( $book->fetchAs('author')->coauthor ), TRUE );
+               R::trash( $book );
+               R::trash( $author );
+               R::freeze( TRUE );
+               $book = R::dispense( 'book' );
+               $author = R::dispense( 'author' );
+               $book->coauthor = $author;
+               R::store( $book );
+               $book = $book->fresh();
+               asrt( is_null( $book->fetchAs('author')->coauthor ), FALSE );
+               unset( $book->coauthor );
+               R::store( $book );
+               $book = $book->fresh();
+               asrt( is_null( $book->fetchAs('author')->coauthor ), FALSE );
+               $book->coauthor = NULL;
+               R::store( $book );
+               $book = $book->fresh();
+               asrt( is_null( $book->fetchAs('author')->coauthor ), TRUE );
+               R::trash( $book );
+               R::trash( $author );
+               R::freeze( FALSE );
+       }
+
+       /**
+        * Test NULL handling, setting a property to NULL must
+        * cause a change.
+        *
+        * @return void
+        */
+       public function testBasicNullHandling()
+       {
+               // NULL can change bean
+               $bean      = R::dispense( 'bean' );
+               $bean->bla = 'a';
+               R::store( $bean );
+               $bean = $bean->fresh();
+               asrt( $bean->hasChanged( 'bla' ), FALSE );
+               $bean->bla = NULL;
+               asrt( $bean->hasChanged( 'bla' ), TRUE );
+               // NULL test
+               $page = R::dispense( 'page' );
+               $book = R::dispense( 'book' );
+               $page->title = 'a NULL page';
+               $page->book  = $book;
+               $book->title = 'Why NUll is painful..';
+               R::store( $page );
+               $bookid = $page->book->id;
+               unset( $page->book );
+               $id = R::store( $page );
+               $page = R::load( 'page', $id );
+               $page->title = 'another title';
+               R::store( $page );
+               pass();
+               $page = R::load( 'page', $id );
+               $page->title   = 'another title';
+               $page->book_id = NULL;
+               R::store( $page );
+               pass();
+       }
+
+       /**
+        * Here we test whether the column type is set correctly.
+        * Normally if you store NULL, the smallest type (bool/set) will
+        * be selected. However in case of a foreign key type INT should
+        * be selected because fks columns require matching types.
+        *
+        * @return void
+        */
+       public function ColumnType()
+       {
+
+               $book = R::dispense( 'book' );
+               $page = R::dispense( 'page' );
+               $book->ownPage[] = $page;
+               R::store( $book );
+               pass();
+               asrt( $page->getMeta( 'cast.book_id' ), 'id' );
+       }
+
+       /**
+        * Test meta column type.
+        *
+        * @return void
+        */
+       public function TypeColumn()
+       {
+               $book = R::dispense( 'book' );
+               $page = R::dispense( 'page' );
+               $page->book = $book;
+               R::store( $page );
+               pass();
+               asrt( $page->getMeta( 'cast.book_id' ), 'id' );
+       }
+}