//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

if (this.WScript && this.WScript.LoadScriptFile) {
    this.WScript.LoadScriptFile('..\\UnitTestFramework\\UnitTestFramework.js');
}

var tests = [
    {
        name: '"\\c" should be treated as "\\\\c" outside the character set',
        assertions: [
            [/^\c$/, '\\c'],
        ]
    },
    {
        name: '"\\c" should be treated as "c" inside the character set',
        assertions: [
            [/[\c]/, 'c'],
            [/[\c-]/, 'c']
        ]
    },
    {
        name: 'A non-letter character after "\\c" inside the character set should be the letter\'s mathematical value mod 32',
        assertions: [
            [/[\c1]/, '\x11']
        ]
    },
    {
        name: 'A non-letter character after "\\c" outside the character set should not be treated differently',
        assertions: [
            [/\c1/, '\\c1']
        ]
    },
    {
        name: '"]" should be allowed on its own',
        assertions: [
            [/]/, ']']
        ]
    }
];

var testsForRunner = tests.map(function (test) {
    return {
        name: test.name,
        body: function () {
            test.assertions.forEach(function (assertion) {
                var re = assertion[0];
                var inputString = assertion[1];
                assert.isTrue(re.test(inputString), re.source);
            });
        }
    }
});

testRunner.runTests(testsForRunner, { verbose: WScript.Arguments[0] != 'summary' });
