// 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"; }
}