var cpp11_rvalue_reference_move = require("cpp11_rvalue_reference_move"); { // Function containing rvalue reference parameter cpp11_rvalue_reference_move.Counter.reset_counts(); 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); if (!cpp11_rvalue_reference_move.MovableCopyable.is_nullptr(mo)) throw new Error("is_nullptr failed"); delete mo; cpp11_rvalue_reference_move.Counter.check_counts(1, 0, 0, 1, 0, 2); } { // Move constructor test cpp11_rvalue_reference_move.Counter.reset_counts(); mo = new cpp11_rvalue_reference_move.MovableCopyable(222); cpp11_rvalue_reference_move.Counter.check_counts(1, 0, 0, 0, 0, 0); mo_moved = new cpp11_rvalue_reference_move.MovableCopyable(mo); cpp11_rvalue_reference_move.Counter.check_counts(1, 0, 0, 1, 0, 1); if (!cpp11_rvalue_reference_move.MovableCopyable.is_nullptr(mo)) throw new Error("is_nullptr failed"); delete mo; cpp11_rvalue_reference_move.Counter.check_counts(1, 0, 0, 1, 0, 1); // delete mo_moved; // cpp11_rvalue_reference_move.Counter.check_counts(1, 0, 0, 1, 0, 2); // Above not deleting the C++ object(node v12) - can't reliably control GC - use the movein function instead to delete cpp11_rvalue_reference_move.MovableCopyable.movein(mo_moved); cpp11_rvalue_reference_move.Counter.check_counts(1, 0, 0, 2, 0, 3); } { // Move assignment operator test cpp11_rvalue_reference_move.Counter.reset_counts(); mo111 = new cpp11_rvalue_reference_move.MovableCopyable(111); 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); if (!cpp11_rvalue_reference_move.MovableCopyable.is_nullptr(mo222)) throw new Error("is_nullptr failed"); delete mo222; cpp11_rvalue_reference_move.Counter.check_counts(2, 0, 0, 0, 1, 1); // delete mo111; // cpp11_rvalue_reference_move.Counter.check_counts(2, 0, 0, 0, 1, 2); // Above not deleting the C++ object(node v12) - can't reliably control GC - use the movein function instead to delete cpp11_rvalue_reference_move.MovableCopyable.movein(mo111); cpp11_rvalue_reference_move.Counter.check_counts(2, 0, 0, 1, 1, 3); } { // null check cpp11_rvalue_reference_move.Counter.reset_counts(); exception_thrown = false; try { cpp11_rvalue_reference_move.MovableCopyable.movein(null); } catch (e) { if (!e.message.includes("invalid null reference")) throw new Error("incorrect exception message " + e.message); exception_thrown = true; } if (!exception_thrown) throw new Error("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(); var 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); exception_thrown = false; try { cpp11_rvalue_reference_move.MovableCopyable.movein(mc); } catch (e) { if (!e.message.includes("cannot release ownership as memory is not owned")) throw new Error("incorrect exception message " + e.message); exception_thrown = true; } if (!exception_thrown) throw new Error("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); }