The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use String::Replace::Safe ':all';
use Test::Subs;


my @repl = ('$test' => 'quoi', 'âccènt' => 'aïŷŷ');
my %repl = @repl;

test {
	replace('$test', @repl) eq 'quoi';
};

test {
	replace('test âccènt', @repl) eq 'test aïŷŷ';
};

test {
	replace('$test', \%repl) eq 'quoi';
};

test {
	unreplace(replace('$test', @repl),@repl) eq '$test';
};

test {
	unreplace(replace('$test', \%repl),\%repl) eq '$test';
};

my $r = String::Replace::Safe->new(@repl);
my $u = String::Replace::Safe->new_unreplace(@repl);
my $r2 = String::Replace::Safe->new(\%repl);
my $u2 = String::Replace::Safe->new_unreplace(\%repl);

test {
	$r->replace('$test') eq 'quoi';
};

test {
	$r2->replace('$test') eq 'quoi';
};

test {
	$u->unreplace($r->replace('$test')) eq '$test';
};

test {
	$u2->unreplace($r2->replace('$test')) eq '$test';
};


test {
	$r->replace('$test', '$test') ~~ ['quoi', 'quoi'];
};

test {
	my @l = ('$test', '$test');
	my @m = $r->replace(@l);
	@m ~~ ['quoi', 'quoi'];
};

test {
	my @l = ('$test', '$test');
	my @m = $r->replace(@l);
	@l ~~ ['$test', '$test'];
};

test {
	my @l = ('$test', '$test');
	$r->replace(@l);
	@l ~~ ['quoi', 'quoi'];
};

{
	package
		FailedScalar;
	use parent 'Tie::Scalar';

	sub TIESCALAR { my $a = 0; return bless \$a, __PACKAGE__ }
}

test {
	tie my $a, 'FailedScalar';
	$r->replace('$test', $a) eq 'quoi';
};

failwith {
	tie my $a, 'FailedScalar';
	my @l = $r->replace('$test', $a);
	1
} 'FailedScalar';

test {
	replace('test', 'test' => 'quoi', 'quoi' => 'test') eq 'quoi'
};

test {
	replace('test', 'quoi' => 'test', 'test' => 'quoi') eq 'quoi'
};