#!/usr/bin/ruby

class Foo2 {}
class Foo1 < Foo2 {}
#class Foo2 < Foo2 {}       # not allowed

var data = []

class Foo1 {
    method hi (Foo1 x) {
        data << "Foo1"
        assert_eq(x.class, "Foo1")
    }
}

class Foo2 {
    subset T1 < Foo1, Foo2;

    method hi(x < T1) {
        data << "Foo2"
        assert(x.class ~~ /^Foo[12]\z/)
    }
}

var a = Foo1();
var b = Foo2();

a.hi(a)
a.hi(b)

b.hi(a)
b.hi(b)

assert_eq(data, %w(Foo1 Foo2 Foo2 Foo2))

say "** Test passed!"