The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More tests => 6;

BEGIN {
	package Local::Test::Role1;
	no thanks;
	use Moose::Role;
	use MooseX::ErsatzMethod;
	ersatz foo => sub { 1 };
};

BEGIN {
	package Local::Test::Role2;
	no thanks;
	use Moose::Role;
	use MooseX::ErsatzMethod;
	ersatz foo => sub { 2 };
}

BEGIN {
	package Local::Test::Role3;
	no thanks;
	use Moose::Role;
	with qw(
		Local::Test::Role1
		Local::Test::Role2
	);
}

BEGIN {
	package Local::Test::Class::WithRole1;
	no thanks;
	use Moose;
	with qw(
		Local::Test::Role1
	);
}

BEGIN {
	package Local::Test::Class::WithRole1AndRole2;
	no thanks;
	use Moose;
	with qw(
		Local::Test::Role1
		Local::Test::Role2
	);
}

BEGIN {
	package Local::Test::Class::WithRole1ThenRole2;
	no thanks;
	use Moose;
	with qw(
		Local::Test::Role1
	);
	with qw(
		Local::Test::Role2
	);
}

BEGIN {
	package Local::Test::Class::WithRole3;
	no thanks;
	use Moose;
	with qw(
		Local::Test::Role3
	);
}

BEGIN {
	package Local::Test::Class::WithRole1AndRole3;
	no thanks;
	use Moose;
	with qw(
		Local::Test::Role1
		Local::Test::Role3
	);
}

BEGIN {
	package Local::Test::Class::WithRole1ThenRole3;
	no thanks;
	use Moose;
	with qw(
		Local::Test::Role1
	);
	with qw(
		Local::Test::Role3
	);
}

ok(
	$_->new->foo == 1,
	$_,
) for qw(
	Local::Test::Class::WithRole1
);

ok(
	$_->new->foo == 1 || $_->new->foo == 2,
	$_,
) for qw(
	Local::Test::Class::WithRole1AndRole2
	Local::Test::Class::WithRole1ThenRole2
	Local::Test::Class::WithRole3
	Local::Test::Class::WithRole1AndRole3
	Local::Test::Class::WithRole1ThenRole3
);