From 24bbfe49cfb97afe2eccb16b1eab5ca6e24e8a6d Mon Sep 17 00:00:00 2001 From: Tom Harrison Date: Sat, 19 Mar 2016 19:09:55 +1000 Subject: [PATCH] [master] tests for setf-move-init and setf-move-assign (#43) --- t/001basic/109rv-refs-setf-move.t | 51 +++++++++++++++++++++++++++++++ t/src/rv-refs-setf-move.dt | 32 +++++++++++++------ 2 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 t/001basic/109rv-refs-setf-move.t diff --git a/t/001basic/109rv-refs-setf-move.t b/t/001basic/109rv-refs-setf-move.t new file mode 100644 index 00000000..a3470fcb --- /dev/null +++ b/t/001basic/109rv-refs-setf-move.t @@ -0,0 +1,51 @@ +#!/usr/bin/perl + +use warnings; +use strict; +$ENV{"DALE_TEST_ARGS"} ||= ""; +my $test_dir = $ENV{"DALE_TEST_DIR"} || "."; +$ENV{PATH} .= ":."; + +use Data::Dumper; +use Test::More tests => 4; + +my @res = `dalec $ENV{"DALE_TEST_ARGS"} $test_dir/t/src/rv-refs-setf-move.dt -o rv-refs-setf-move`; +is(@res, 4, 'Four compilation statements'); +chomp for @res; +is_deeply(\@res, [ +'setf-copy-init', +'setf-copy-assign', +'setf-move-assign', +'setf-move-assign', +], 'Got expected results'); + +@res = `./rv-refs-setf-move`; +is($?, 0, 'Program executed successfully'); + +chomp for @res; + +is_deeply(\@res, [ +'Previously: two setf-move-inits', +'One setf-move-init', +'setf-move-init', +'One setf-move-assign', +'setf-move-assign', +'One setf-move-init', +'setf-move-init', +'Two setf-move-inits', +'setf-move-init', +'setf-move-init', +'Preswap', +'1 2', +'1 3', +'setf-move-init', +'setf-move-assign', +'setf-move-assign', +'Postswap', +'1 3', +'1 2', +], 'Got expected results'); + +`rm rv-refs-setf-move`; + +1; diff --git a/t/src/rv-refs-setf-move.dt b/t/src/rv-refs-setf-move.dt index 80292d64..d22d7820 100644 --- a/t/src/rv-refs-setf-move.dt +++ b/t/src/rv-refs-setf-move.dt @@ -38,7 +38,14 @@ (b (ref mys))) (let ((temp \ (move (@ a)))) (setf a (move (@ b))) - ;(setf b (move (@ temp))) + (setf b (move temp)) + (return)))) + +; Calling this function should cause no copies to occur. +(def swap (fn extern void ((a (rv-ref mys)) + (b (rv-ref mys))) + (let ((temp \ (move (@ a)))) + (setf a (move (@ b))) (setf b (move temp)) (return)))) @@ -53,14 +60,17 @@ (def d (var auto mys (move n))) true)) -;(def ga (var intern mys ((a 1) (b 2)))) -;(def gb (var intern mys (move ga))) -;(def gc (var intern mys (move gb))) +(def ga (var intern mys ((a 1) (b 2)))) +(def gb (var intern mys (move ga))) +(def gc (var intern mys (move gb))) (def main (fn extern-c int (void) (def a (var auto mys (init a 1 2))) (def b (var auto mys (init b 1 3))) + (printf "Previously: two setf-move-inits\n") + (printf "One setf-move-init\n") (def c (var auto mys (move a))) + (printf "One setf-move-assign\n") (setv c (move b)) (printf "One setf-move-init\n") (rv-ref-use (move c)) @@ -69,10 +79,12 @@ (printf "Two setf-move-inits\n") (rv-ref-use2 (move e)) -; (printf "Preswap\n") -; (swap a b) -; (printf "Postswap\n") -; (printf "%d %d\n" (@: a a) (@: a b)) -; (printf "%d %d\n" (@: b a) (@: b b)) - 0)) + (printf "Preswap\n") + (printf "%d %d\n" (@: a a) (@: a b)) + (printf "%d %d\n" (@: b a) (@: b b)) + (swap (move a) (move b)) + (printf "Postswap\n") + (printf "%d %d\n" (@: a a) (@: a b)) + (printf "%d %d\n" (@: b a) (@: b b)) + 0))