// Test type decoration enforcement
using namespace oadl;

var g : Float;

class foo {
    public var s : String;
}

foo bar {}

proc fact(i : Int)
{
    if( i < 2 ) return 1;
    return i * fact(i - 1);
}

proc main()
{
    var i : Int;

    // Test OK assignments
    i = 0;
    g = 1.0;
    fact(3);
    bar.s = "hi";
    typecheck(Int, i);

    // Test conversion assignments
    i = "123";
    g = 1;
    fact(3.1);
    bar.s = 100;

    // Test bad assignments
    try { i = nil; } catch(e) { if(e == TypeCheck) "TypeCheck #1\n"; }
    try { g = bar; } catch(e) { if(e == TypeCheck) "TypeCheck #2\n"; }
    try { fact("hi"); } catch(e) { if(e == TypeCheck) "TypeCheck #3\n"; }
    try { bar.s = {nil,nil}; } catch(e) { if(e == TypeCheck) "TypeCheck #4\n"; }
    try { typecheck(Float, i); } catch(e) { if(e == TypeCheck) "TypeCheck #5\n"; }
}