/*
 * Copyright 2010 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

eval("@_jscript_version");

var tmp;

/*@ */
//@cc_on @*/

@_jscript_version;

@cc_on
@*/

// Standard predefined variabled
if(isWin64) {
    ok(@_win64 === true, "@_win64 = " + @_win64);
    ok(@_amd64 === true, "@_amd64 = " + @_amd64);
    ok(isNaN(@_win32), "@_win32 = " + @_win32);
    ok(isNaN(@_x86), "@_x86 = " + @_x86);
}else {
    ok(@_win32 === true, "@_win32 = " + @_win32);
    ok(@_x86 === true, "@_x86 = " + @_x86);
    ok(isNaN(@_win64), "@_win64 = " + @_win64);
    ok(isNaN(@_amd64), "@_amd64 = " + @_amd64);
}

ok(@_jscript === true, "@_jscript = " + @_jscript);
ok(@_jscript_build === ScriptEngineBuildVersion(),
   "@_jscript_build = " + @_jscript_build + " expected " + ScriptEngineBuildVersion());
tmp = ScriptEngineMajorVersion() + ScriptEngineMinorVersion()/10;
ok(@_jscript_version === tmp, "@_jscript_version = " + @_jscript_version + " expected " + tmp);
ok(isNaN(@_win16), "@_win16 = " + @_win16);
ok(isNaN(@_mac), "@_mac = " + @_mac);
ok(isNaN(@_alpha), "@_alpha = " + @_alpha);
ok(isNaN(@_mc680x0), "@_mc680x0 = " + @_mc680x0);
ok(isNaN(@_PowerPC), "@_PowerPC = " + @_PowerPC);

// Undefined variable
ok(isNaN(@xxx), "@xxx = " + @xxx);
ok(isNaN(@x$_xx), "@x$_xx = " + @x$_xx);

tmp = false;
try {
    eval("/*@cc_on */");
}catch(e) {
    tmp = true;
}
ok(tmp, "expected syntax exception");

tmp = false;
try {
    eval("/*@_jscript_version */");
}catch(e) {
    tmp = true;
}
ok(tmp, "expected syntax exception");

ok(isNaN(@test), "@test = " + @test);

@set @test = 1
ok(@test === 1, "@test = " + @test);

@set @test = 0
ok(@test === 0, "@test = " + @test);

tmp = false
@set @test = @test tmp=true
ok(@test === 0, "@test = " + @test);
ok(tmp, "expr after @set not evaluated");

@set @test = !@test
ok(@test === true, "@test = " + @test);

@set @test = (@test+1+true)
ok(@test === 3, "@test = " + @test);

@set
 @test
 =
 2
ok(@test === 2, "@test = " + @test);

@set
 @test
 =
 (
 2
 +
 2
 )
ok(@test === 4, "@test = " + @test);

@set @test = 2.5
ok(@test === 2.5, "@test = " + @test);

@set @test = 0x4
ok(@test === 4, "@test = " + @test);

@set @test = (2 + 2/2)
ok(@test === 3, "@test = " + @test);

@set @test = (false+false)
ok(@test === 0, "@test = " + @test);

@set @test = ((1+1)*((3)+1))
ok(@test === 8, "@test = " + @test);

@set @_test = true
ok(@_test === true, "@_test = " + @_test);

@set @$test = true
ok(@$test === true, "@$test = " + @$test);

@set @newtest = (@newtest != @newtest)
ok(@newtest === true, "@newtest = " + @newtest);

@set @test = (false != 0)
ok(@test === false, "@test = " + @test);

@set @test = (1 != true)
ok(@test === false, "@test = " + @test);

@set @test = (0 != true)
ok(@test === true, "@test = " + @test);

@set @test = (true-2)
ok(@test === -1, "@test = " + @test);

@set @test = (true-@_jscript)
ok(@test === 0, "@test = " + @test);

@set @test = (true==1)
ok(@test === true, "@test = " + @test);

@set @test = (1==false+1)
ok(@test === true, "@test = " + @test);

function expect(val, exval) {
    ok(val === exval, "got " + val + " expected " + exval);
}

@set @test = (false < 0.5)
expect(@test, true);

@set @test = (true == 0 < 0.5)
expect(@test, true);

@set @test = (false < 0)
expect(@test, false);

@set @test = (false > 0.5)
expect(@test, false);

@set @test = (1 < true)
expect(@test, false);

@set @test = (1 <= true)
expect(@test, true);

@set @test = (1 >= true)
expect(@test, true);

@set @test = (1 >= true-1)
expect(@test, true);

@if (false)
    this wouldn not parse
"@end

@if (false) "@end

tmp = "@if (false) @end";
ok(tmp.length === 16, "tmp.length = " + tmp.length);

@if(true)
tmp = true
@end
ok(tmp === true, "tmp = " + tmp);

@if(false)
@if this would not CC parse
this will not parse
@elif(true)
this will also not parse
@else
this also will not parse
@if let me complicate things a bit
@end enough
@end
@end

@if(false)
this will not parse
@else
tmp = 2
@else
this will not be parsed
@else
also this
@end
ok(tmp === 2, "tmp = " + tmp);

@if(true)
tmp = 3;
@else
just skip this
@end
ok(tmp === 3, "tmp = " + tmp);

@if(true)
tmp = 4;
@elif(true)
this will not parse
@elif nor this
@else
just skip this
@end
ok(tmp === 4, "tmp = " + tmp);

@if(false)
this will not parse
@elif(false)
nor this would
@elif(true)
tmp = 5;
@elif nor this
@else
just skip this
@end
ok(tmp === 5, "tmp = " + tmp);

@if (!@_jscript)
this would not parse
@if(true)
@else
@if(false)
@end
@end
@elif (@_jscript)
tmp = 6;
@elif (true)
@if xxx
@else
@if @elif @elif @else @end
@end
@else
this would not parse
@end
ok(tmp === 6, "tmp = " + tmp);

@if(true)
@if(false)
@else
tmp = 7;
@end
@else
this would not parse
@end
ok(tmp === 7, "tmp = " + tmp);

var exception_map = {
    JS_E_SYNTAX:               {type: "SyntaxError", number: -2146827286},
    JS_E_MISSING_LBRACKET:     {type: "SyntaxError", number: -2146827283},
    JS_E_EXPECTED_IDENTIFIER:  {type: "SyntaxError", number: -2146827278},
    JS_E_EXPECTED_ASSIGN:      {type: "SyntaxError", number: -2146827277},
    JS_E_EXPECTED_CCEND:       {type: "SyntaxError", number: -2146827259},
    JS_E_EXPECTED_AT:          {type: "SyntaxError", number: -2146827256}
};

function testException(src, id) {
    var ex = exception_map[id];
    var ret = "", num = "";

    try {
        eval(src);
    } catch(e) {
        ret = e.name;
        num = e.number;
    }

    ok(ret === ex.type, "Exception test, ret = " + ret + ", expected " + ex.type +". Executed code: " + src);
    ok(num === ex.number, "Exception test, num = " + num + ", expected " + ex.number + ". Executed function: " + src);
}

testException("@set test=true", "JS_E_EXPECTED_AT");
testException("@set @1=true", "JS_E_EXPECTED_IDENTIFIER");
testException("@set @test x=true", "JS_E_EXPECTED_ASSIGN");
testException("@if false\n@end", "JS_E_MISSING_LBRACKET");
testException("@if (false)\n", "JS_E_EXPECTED_CCEND");
testException("@end\n", "JS_E_SYNTAX");
testException("@elif\n", "JS_E_SYNTAX");
testException("@else\n", "JS_E_SYNTAX");
testException("@if false\n@elif true\n@end", "JS_E_MISSING_LBRACKET");

reportSuccess();
