| <?php | |
| require "tests.php"; | |
| # Function containing rvalue reference parameter | |
| Counter::reset_counts(); | |
| $mo = new MovableCopyable(222); | |
| Counter::check_counts(1, 0, 0, 0, 0, 0); | |
| MovableCopyable::movein($mo); | |
| Counter::check_counts(1, 0, 0, 1, 0, 2); | |
| try { | |
| MovableCopyable::is_nullptr($mo); | |
| check::fail("is_nullptr check"); | |
| } catch (TypeError $e) { | |
| } | |
| $mo = NULL; | |
| Counter::check_counts(1, 0, 0, 1, 0, 2); | |
| # Move constructor test | |
| Counter::reset_counts(); | |
| $mo = new MovableCopyable(222); | |
| Counter::check_counts(1, 0, 0, 0, 0, 0); | |
| $mo_moved = new MovableCopyable($mo); | |
| Counter::check_counts(1, 0, 0, 1, 0, 1); | |
| try { | |
| MovableCopyable::is_nullptr($mo); | |
| check::fail("is_nullptr check"); | |
| } catch (TypeError $e) { | |
| } | |
| $mo = NULL; | |
| Counter::check_counts(1, 0, 0, 1, 0, 1); | |
| $mo_moved = NULL; | |
| Counter::check_counts(1, 0, 0, 1, 0, 2); | |
| # Move assignment operator test | |
| Counter::reset_counts(); | |
| $mo111 = new MovableCopyable(111); | |
| $mo222 = new MovableCopyable(222); | |
| Counter::check_counts(2, 0, 0, 0, 0, 0); | |
| $mo111->MoveAssign($mo222); | |
| Counter::check_counts(2, 0, 0, 0, 1, 1); | |
| try { | |
| MovableCopyable::is_nullptr($mo222); | |
| check::fail("is_nullptr check"); | |
| } catch (TypeError $e) { | |
| } | |
| $mo222 = NULL; | |
| Counter::check_counts(2, 0, 0, 0, 1, 1); | |
| $mo111 = NULL; | |
| Counter::check_counts(2, 0, 0, 0, 1, 2); | |
| # null check | |
| Counter::reset_counts(); | |
| $exception_thrown = false; | |
| try { | |
| MovableCopyable::movein(NULL); | |
| } catch (TypeError $e) { | |
| check::str_contains($e->getMessage(), "Invalid null reference", "incorrect exception message: {$e->getMessage()}"); | |
| $exception_thrown = true; | |
| } | |
| check::equal($exception_thrown, true, "Should have thrown null error"); | |
| Counter::check_counts(0, 0, 0, 0, 0, 0); | |
| # output | |
| Counter::reset_counts(); | |
| $mc = MovableCopyable::moveout(1234); | |
| Counter::check_counts(2, 0, 0, 0, 1, 1); | |
| MovableCopyable::check_numbers_match($mc, 1234); | |
| $exception_thrown = false; | |
| try { | |
| MovableCopyable::movein($mc); | |
| } catch (TypeError $e) { | |
| check::str_contains($e->getMessage(), "Cannot release ownership as memory is not owned", "incorrect exception message: {$e->getMessage()}"); | |
| $exception_thrown = true; | |
| } | |
| check::equal($exception_thrown, true, "Should have thrown 'Cannot release ownership as memory is not owned' error"); | |
| Counter::check_counts(2, 0, 0, 0, 1, 1); | |
| check::done(); |