Skip to content

Commit

Permalink
Merge pull request #772 from vrurg/rework-mro-roles
Browse files Browse the repository at this point in the history
Add tests for :concretizations parameter of .mro
  • Loading branch information
vrurg committed Nov 10, 2021
2 parents b112eb0 + 0446925 commit e8edc8b
Showing 1 changed file with 86 additions and 75 deletions.
161 changes: 86 additions & 75 deletions S12-class/mro-6e.t
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ use Test;

plan 1;

sub rmro-match(Mu \type, @exp, Str:D $msg, :$unhid = 0) is test-assertion {
my @got := ( $unhid ?? type.^mro_unhidden(:roles) !! type.^mro(:roles) )[0..*-3];
sub rmro-match(Mu \type, @exp, Str:D $msg, :$unhid = 0, :$concrete = 0) is test-assertion {
my %mro_params = $concrete ?? :concretizations !! :roles;
my @got := ( $unhid ?? type.^mro_unhidden(|%mro_params) !! type.^mro(|%mro_params) )[0..*-3];
unless @got.elems == @exp.elems {
flunk $msg;
diag "expected: " ~ @exp.elems ~ " elements\n" ~
Expand All @@ -20,7 +21,12 @@ sub rmro-match(Mu \type, @exp, Str:D $msg, :$unhid = 0) is test-assertion {
return;
}
if $exp.HOW.archetypes.composable {
$exp := try $last_class.^concretization($exp, :local);
if $concrete {
$exp := try $last_class.^concretization($exp, :local);
}
elsif $exp.HOW ~~ Metamodel::CurriedRoleHOW {
$exp := try $exp.^curried_role;
}
}
else {
$last_class := $exp;
Expand All @@ -38,87 +44,92 @@ sub rmro-match(Mu \type, @exp, Str:D $msg, :$unhid = 0) is test-assertion {
}

subtest "Rolified MRO", {
plan 10;
{
my class C1 { }
my role R2a { }
my class C2 does R2a is C1 { }
my class C3 is C2 { }
plan 2;
for False, True -> $concrete {
subtest ($concrete ?? "On concretizations" !! "On parametric") => {
plan 10;
{
my class C1 { }
my role R2a { }
my class C2 does R2a is C1 { }
my class C3 is C2 { }

rmro-match C3, (C3, C2, R2a, C1), "basic mro with roles";
}
{
my class C1 { }
my role R2a { }
my role R2a[::T] { }
my class C2 does R2a[Int] is C1 { }
my class C3 is C2 { }
rmro-match C3, :$concrete, (C3, C2, R2a, C1), "basic mro with roles";
}
{
my class C1 { }
my role R2a { }
my role R2a[::T] { }
my class C2 does R2a[Int] is C1 { }
my class C3 is C2 { }

rmro-match C3, (C3, C2, R2a[Int], C1), "basic mro with parameterized roles";
}
{
my class C1 { }
my role R2a is C1 { }
my class C2 does R2a { }
my class C3 is C2 { }
rmro-match C3, :$concrete, (C3, C2, R2a[Int], C1), "basic mro with parameterized roles";
}
{
my class C1 { }
my role R2a is C1 { }
my class C2 does R2a { }
my class C3 is C2 { }

rmro-match C3, (C3, C2, R2a, C1), "mro with roles: parent on a role";
}
{
my class C1 { }
my role R2a is C1 { }
my class C2 does R2a { }
my class C3 hides C2 { }
rmro-match C3, :$concrete, (C3, C2, R2a, C1), "mro with roles: parent on a role";
}
{
my class C1 { }
my role R2a is C1 { }
my class C2 does R2a { }
my class C3 hides C2 { }

rmro-match C3, :unhid, (C3, C1), "mro with roles: hiding a class hides its roles";
rmro-match C3, (C3, C2, R2a, C1), "mro with roles: .^mro method ignores hiding";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b is C2 { }
my role R3a is hidden does R3b { }
my class C3 is R3a { }
rmro-match C3, :$concrete, :unhid, (C3, C1), "mro with roles: hiding a class hides its roles";
rmro-match C3, :$concrete, (C3, C2, R2a, C1), "mro with roles: .^mro method ignores hiding";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b is C2 { }
my role R3a is hidden does R3b { }
my class C3 is R3a { }

rmro-match C3, :unhid, (C3, C2, C1), "mro with roles: puned 'is hidden' role hides its roles too";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b is C2 { }
my role R3a is C2 { }
my role R3a[::T] is hidden does R3b { }
my class C3 is R3a[Str] { }
rmro-match C3, :$concrete, :unhid, (C3, C2, C1), "mro with roles: puned 'is hidden' role hides its roles too";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b is C2 { }
my role R3a is C2 { }
my role R3a[::T] is hidden does R3b { }
my class C3 is R3a[Str] { }

rmro-match C3, :unhid, (C3, C2, C1), "mro with roles: puned parameterized 'is hidden' role hides its roles too";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b is C2 { }
my role R3a does R3b { }
my class C3 hides R3a { }
rmro-match C3, :$concrete, :unhid, (C3, C2, C1), "mro with roles: puned parameterized 'is hidden' role hides its roles too";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b is C2 { }
my role R3a does R3b { }
my class C3 hides R3a { }

rmro-match C3, :unhid, (C3, C2, C1), "mro with roles: 'hides' on a role hides its roles too";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b is C2 { }
my role R3a { }
my role R3a[::T] does R3b { }
my class C3 hides R3a[Str] { }
rmro-match C3, :$concrete, :unhid, (C3, C2, C1), "mro with roles: 'hides' on a role hides its roles too";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b is C2 { }
my role R3a { }
my role R3a[::T] does R3b { }
my class C3 hides R3a[Str] { }

rmro-match C3, :unhid, (C3, C2, C1), "mro with roles: 'hides' on a parameterized role hides its roles too";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b hides C2 { }
my role R3a does R3b { }
my class C3 does R3a { }
rmro-match C3, :$concrete, :unhid, (C3, C2, C1), "mro with roles: 'hides' on a parameterized role hides its roles too";
}
{
my class C1 { }
my class C2 is C1 { }
my role R3b hides C2 { }
my role R3a does R3b { }
my class C3 does R3a { }

rmro-match C3, :unhid, (C3, R3a, R3b, C1), "mro with roles: 'hides' used with a role is preserved";
rmro-match C3, :$concrete, :unhid, (C3, R3a, R3b, C1), "mro with roles: 'hides' used with a role is preserved";
}
}
}
}

Expand Down

0 comments on commit e8edc8b

Please sign in to comment.