//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

Object.defineProperty(Object.getPrototypeOf({}), "echo", { value: function () { WScript.Echo(this); } });
Object.defineProperty(Object.getPrototypeOf({}), "echos", { value: function () { WScript.Echo(JSON.stringify(this)); } });
Object.defineProperty(Object.getPrototypeOf({}), "echoChars", {
    value: function () {
        var chars = [];
        var that = String(this);
        for (var i = 0; i < that.length; i++) {
            chars.push(that.charCodeAt(i));
        }
        chars.echos();
    }
});
Object.defineProperty(Object.getPrototypeOf({}), "echoCP", {
    value: function () {
        var chars = [];
        var that = String(this);
        for (var i = 0; i < that.length;) {
            var cp = that.codePointAt(i);
            chars.push(cp);
            i += cp > 0x10000 ? 2 : 1;
        }
        chars.echos();
    }
});

// Exceptions expected
try {
    eval('/./\\u0069'); //Bug 165551; before this was allowed because \u0069 is 'i'
} catch (e) {
    e.echo();
}
try {
    eval('var test = "\\u{0}"'); //Valid 11/20/2013
} catch (e) {
    e.echo();
}
try {
    eval('var test = "\\u{00}"'); //Valid 11/20/2013
} catch (e) {
    e.echo();
}

try {
    eval('var test = "\\u{000}"');//Valid 11/20/2013
} catch (e) {
    e.echo();
}

try {
    eval('var test = "\\u{0000000}"');//Valid 11/20/2013
} catch (e) {
    e.echo();
}

try {
    eval('var test = "\\u{200000}"'); 
} catch (e) {
    e.echo();
}

try {
    new RegExp("[\u{0}-\u{1}]"); //Valid 11/20/2013
} catch (e) {
    e.echo();
}

try {
    new RegExp("[\u{10000}-\u{10001}]"); 
} catch (e) {
    e.echo();
}

try {
    new RegExp("[\u{10000}-\u{10001}]", "u"); 
} catch (e) {
    e.echo();
}

// Shouldn't throw From here onwards.
eval('var test = "\\u{0000}"');

// Regex doesn't throw in these cases, however, it will try matching \u and then {1} instead of the actual value of \u0001.
// Should print false(11/11/2014) '/u' option not supplied
/\u{1}/.test("\u0001").echo();
/\u{01}/.test("\u0001").echo();
/\u{001}/.test("\u0001").echo();
/\u{0000001}/.test("\u0001").echo();

/\u{1}/.test("\u{0001}").echo();
/\u{01}/.test("\u{0001}").echo();
/\u{001}/.test("\u{0001}").echo();
/\u{0000001}/.test("\u{0001}").echo();

// Should print true
/\u{0001}/.test("\u0001").echo();
/\u{00001}/.test("\u0001").echo();
// Should print true
/\u{0001}/.test("\u{0001}").echo();
/\u{00001}/.test("\u{0001}").echo();

try{
    new RegExp("[\\u{1000}-\\u{1001}]").test("\u{1001}").echo();
} catch (ex) {
    ex.echo();
}
try{
    eval("/[\\u{1000}-\\u{1001}]/").test("\u{1001}").echo(); //invalid (11/11/2014)
} catch (ex) {
    ex.echo();
}

//This should print true
/\u{1}/u.test("\u0001").echo();
/\u{01}/u.test("\u0001").echo();
/\u{001}/u.test("\u0001").echo();
/\u{0000001}/u.test("\u0001").echo();

/\u{1}/u.test("\u{0001}").echo();
/\u{01}/u.test("\u{0001}").echo();
/\u{001}/u.test("\u{0001}").echo();
/\u{0000001}/u.test("\u{0001}").echo();

// Should print true
/\u{0001}/u.test("\u0001").echo();
/\u{00001}/u.test("\u0001").echo();
// Should print true
/\u{0001}/u.test("\u{0001}").echo();
/\u{00001}/u.test("\u{0001}").echo();

////Valid
var validStrings = [ "\u{1}", "\u{10}", "\u{100}", "\u{1000}", "\u{10000}", "\u{100000}", "\u{10FFFF}", "\u{00000001000}", "\u{00000000000000000000000000000}"];
var validIDs = [ "\u{41}", "\u{0041}", "\u{00041}", "\u{20BB7}", "\u{0000000020BB7}" ];
validStrings.forEach(function (str) {
    eval("/" + str + "/.test('" + str + "').echo()");
});

validIDs.forEach(function (str) {
    eval("/" + str + "/.test('" + str + "').echo()");
});

var invalidStrings = ["\\u\{\}", "\\u\{1000000000\}", "\\u\{110000\}"];

invalidStrings.forEach(function (str){
    try{
        eval(invalidStrings + ".echo()");
    } catch(ex){
        ex.echo();
    }
});

/a\u{}b/.test("au\{\}b").echo();
/a\u{1}b/.test("a\u0001b").echo();
/a\u{1.1}b/.test("au\{1.1\}b").echo();
/a\u{110000}b/.test("a" + (Array(110001).join('u')) +"b").echo();
/a\u{11FFFF}b/.test("au\{11FFFF\}b").echo();
/a\u{10FFFF}b/.test("a\uDBFF\uDFFFb").echo();

/a\u{1000000}b/.test("au\{1000000\}b").echo();
/a\u{1.1}b/.test("a\u0001b").echo();
/a\u{1}b/.test("a\\ub").echo();
/a\u{1}b/.test("aub").echo();
/a\u{}b/.test("a\u{0}b").echo();

/a\u{}b/u.test("au\{\}b").echo();
/a\u{1}b/u.test("a\u0001b").echo();
/a\u{1.1}b/u.test("au\{1.1\}b").echo();
/a\u{110000}b/u.test("a" + (Array(110001).join('u')) +"b").echo();
/a\u{11FFFF}b/u.test("au\{11FFFF\}b").echo();
/a\u{10FFFF}b/.test("a\uDBFF\uDFFFb").echo();

/a\u{1000000}b/u.test("au\{1000000\}b").echo();
/a\u{1.1}b/u.test("a\u0001b").echo();
/a\u{1}b/u.test("a\\ub").echo();
/a\u{1}b/u.test("aub").echo();
/a\u{}b/u.test("a\u{0}b").echo();


try {
  eval("var do\u0061 = 5;");//Shouldn't throw a syntax error
} catch(e) {
  e.echo();
}