| use strict; |
| use warnings; |
| use Test::More tests => 7; |
| BEGIN { use_ok('cpp11_rvalue_reference_move') } |
| require_ok('cpp11_rvalue_reference_move'); |
| |
| { |
| # Function containing rvalue reference parameter |
| cpp11_rvalue_reference_move::Counter::reset_counts(); |
| my $mo = new cpp11_rvalue_reference_move::MovableCopyable(222); |
| cpp11_rvalue_reference_move::Counter::check_counts(1, 0, 0, 0, 0, 0); |
| cpp11_rvalue_reference_move::MovableCopyable::movein($mo); |
| cpp11_rvalue_reference_move::Counter::check_counts(1, 0, 0, 1, 0, 2); |
| is(cpp11_rvalue_reference_move::MovableCopyable::is_nullptr($mo), 1, "is_nullptr check"); |
| undef $mo; |
| cpp11_rvalue_reference_move::Counter::check_counts(1, 0, 0, 1, 0, 2); |
| } |
| |
| { |
| # Move constructor test |
| cpp11_rvalue_reference_move::Counter::reset_counts(); |
| my $mo = new cpp11_rvalue_reference_move::MovableCopyable(222); |
| cpp11_rvalue_reference_move::Counter::check_counts(1, 0, 0, 0, 0, 0); |
| my $mo_moved = new cpp11_rvalue_reference_move::MovableCopyable($mo); |
| cpp11_rvalue_reference_move::Counter::check_counts(1, 0, 0, 1, 0, 1); |
| is(cpp11_rvalue_reference_move::MovableCopyable::is_nullptr($mo), 1, "is_nullptr check"); |
| undef $mo; |
| cpp11_rvalue_reference_move::Counter::check_counts(1, 0, 0, 1, 0, 1); |
| undef $mo_moved; |
| cpp11_rvalue_reference_move::Counter::check_counts(1, 0, 0, 1, 0, 2); |
| } |
| |
| { |
| # Move assignment operator test |
| cpp11_rvalue_reference_move::Counter::reset_counts(); |
| my $mo111 = new cpp11_rvalue_reference_move::MovableCopyable(111); |
| my $mo222 = new cpp11_rvalue_reference_move::MovableCopyable(222); |
| cpp11_rvalue_reference_move::Counter::check_counts(2, 0, 0, 0, 0, 0); |
| $mo111->MoveAssign($mo222); |
| cpp11_rvalue_reference_move::Counter::check_counts(2, 0, 0, 0, 1, 1); |
| is(cpp11_rvalue_reference_move::MovableCopyable::is_nullptr($mo222), 1, "is_nullptr check"); |
| undef $mo222; |
| cpp11_rvalue_reference_move::Counter::check_counts(2, 0, 0, 0, 1, 1); |
| undef $mo111; |
| cpp11_rvalue_reference_move::Counter::check_counts(2, 0, 0, 0, 1, 2); |
| } |
| |
| { |
| # null check |
| cpp11_rvalue_reference_move::Counter::reset_counts(); |
| eval { |
| cpp11_rvalue_reference_move::MovableCopyable::movein(undef); |
| }; |
| like($@, qr/\binvalid null reference/, "Should have thrown null error"); |
| cpp11_rvalue_reference_move::Counter::check_counts(0, 0, 0, 0, 0, 0); |
| } |
| |
| { |
| # output |
| cpp11_rvalue_reference_move::Counter::reset_counts(); |
| my $mc = cpp11_rvalue_reference_move::MovableCopyable::moveout(1234); |
| cpp11_rvalue_reference_move::Counter::check_counts(2, 0, 0, 0, 1, 1); |
| cpp11_rvalue_reference_move::MovableCopyable::check_numbers_match($mc, 1234); |
| |
| eval { |
| cpp11_rvalue_reference_move::MovableCopyable::movein($mc); |
| }; |
| like($@, qr/\bcannot release ownership as memory is not owned\b/, "Should have thrown 'Cannot release ownership as memory is not owned' error"); |
| cpp11_rvalue_reference_move::Counter::check_counts(2, 0, 0, 0, 1, 1); |
| } |