// Test class type decorations
class foo {
    public var v = "foo";
}

class bar {
    public var v : foo;
}

class bletch(foo) {
    public var v = "bletch";
}

var g : foo;

foo oFoo {}
bar oBar {}
bletch oBletch {}

proc ack(o : foo)
{
    "", o.v, '\n';
}

proc check(e, num)
{
    if (e == oadl::TypeCheck) "TypeCheck #", num, '\n';
}

proc main()
{
    var x : foo;

    // Test OK assignments
    x = oFoo;
    g = oFoo;
    ack(oFoo);
    oBar.v = oFoo;
    oadl::typecheck(foo, x);

    // Test more OK assignments
    x = oBletch;
    g = oBletch;
    ack(oBletch);
    oBar.v = oBletch;
    oadl::typecheck(foo, x);

    // Test bad assignments
    try { x = oBar; }                catch(e) { check(e, 1); }
    try { g = oBar; }                catch(e) { check(e, 2); }
    try { ack(oBar); }               catch(e) { check(e, 3); }
    try { oBar.v = oBar; }           catch(e) { check(e, 4); }
    try { oadl::typecheck(bar, x); } catch(e) { check(e, 5); }
}