//------------------------------------------------------------------------------------------------------- | |
// Copyright (C) Microsoft. All rights reserved. | |
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
//------------------------------------------------------------------------------------------------------- | |
WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js"); | |
var normalTests = [ | |
{ | |
regExp: /[-]/u, | |
acceptedCharacters: ['-'], | |
rejectedCharacters: [',', '.'] | |
}, | |
{ | |
regExp: /[b-]/u, | |
acceptedCharacters: ['b', '-'], | |
rejectedCharacters: ['a', 'c'] | |
}, | |
{ | |
regExp: /[\u{10001}-]/u, | |
acceptedCharacters: ['\u{10001}', '-'], | |
rejectedCharacters: ['\u{10000}', '\u{10002}'] | |
}, | |
{ | |
regExp: /[-b]/u, | |
acceptedCharacters: ['-', 'b'], | |
rejectedCharacters: ['a', 'c'] | |
}, | |
{ | |
regExp: /[-\u{10001}]/u, | |
acceptedCharacters: ['-', '\u{10001}'], | |
rejectedCharacters: ['\u{10000}', '\u{10002}'] | |
}, | |
{ | |
regExp: /[b-d]/u, | |
acceptedCharacters: ['b', 'c', 'd'], | |
rejectedCharacters: ['-', 'a', 'e'] | |
}, | |
{ | |
regExp: /[\u{10001}-\u{10003}]/u, | |
acceptedCharacters: ['\u{10001}', '\u{10002}', '\u{10003}'], | |
rejectedCharacters: ['-', '\u{10000}', '\u{10004}'] | |
}, | |
{ | |
regExp: /[+--]/u, | |
acceptedCharacters: ['+', ',', '-'], | |
rejectedCharacters: ['*', '.'] | |
}, | |
{ | |
regExp: /[--/]/u, | |
acceptedCharacters: ['-', '.', '/'], | |
rejectedCharacters: [',', '0'] | |
}, | |
{ | |
regExp: /[b-d-]/u, | |
acceptedCharacters: ['b', 'c', 'd', '-'], | |
rejectedCharacters: ['a', 'e'] | |
}, | |
{ | |
regExp: /[\u{10001}-\u{10003}-]/u, | |
acceptedCharacters: ['\u{10001}', '\u{10002}', '\u{10003}', '-'], | |
rejectedCharacters: ['\u{10000}', '\u{10004}'] | |
}, | |
{ | |
regExp: /[b-df]/u, | |
acceptedCharacters: ['b', 'c', 'd', 'f'], | |
rejectedCharacters: ['-', 'a', 'e'] | |
}, | |
{ | |
regExp: /[\u{10001}-\u{10003}\u{10005}]/u, | |
acceptedCharacters: ['\u{10001}', '\u{10002}', '\u{10003}', '\u{10005}'], | |
rejectedCharacters: ['-', '\u{10000}', '\u{10004}'] | |
}, | |
{ | |
regExp: /[b-df-]/u, | |
acceptedCharacters: ['b', 'c', 'd', 'f', '-'], | |
rejectedCharacters: ['a', 'e', 'g'] | |
}, | |
{ | |
regExp: /[\u{10001}-\u{10003}\u{10005}-]/u, | |
acceptedCharacters: ['\u{10001}', '\u{10002}', '\u{10003}', '\u{10005}', '-'], | |
rejectedCharacters: ['\u{10000}', '\u{10004}', '\u{10006}'] | |
}, | |
{ | |
// Third non-dash character's mathematical value is higher than the second's | |
regExp: /[b-d-f]/u, | |
acceptedCharacters: ['b', 'c', 'd', '-', 'f'], | |
rejectedCharacters: ['a', 'e'] | |
}, | |
{ | |
// Third non-dash character's mathematical value is higher than the second's | |
regExp: /[\u{10001}-\u{10003}-\u{10005}]/u, | |
acceptedCharacters: ['\u{10001}', '\u{10002}', '\u{10003}', '-', '\u{10005}'], | |
rejectedCharacters: ['\u{10000}', '\u{10004}'] | |
}, | |
{ | |
// Third non-dash character's mathematical value is lower than the second's | |
regExp: /[c-e-a]/u, | |
acceptedCharacters: ['c', 'd', 'e', '-', 'a'], | |
rejectedCharacters: ['b', 'f'] | |
}, | |
{ | |
// Third non-dash character's mathematical value is lower than the second's | |
regExp: /[\u{10002}-\u{10004}-\u{10000}]/u, | |
acceptedCharacters: ['\u{10002}', '\u{10003}', '\u{10004}', '-', '\u{10000}'], | |
rejectedCharacters: ['\u{10001}', '\u{10005}'] | |
}, | |
{ | |
regExp: /[b-df-h]/u, | |
acceptedCharacters: ['b', 'c', 'd', 'f', 'g', 'h'], | |
rejectedCharacters: ['-', 'a', 'e', 'i'] | |
}, | |
{ | |
regExp: /[\u{10001}-\u{10003}\u{10005}-\u{10007}]/u, | |
acceptedCharacters: ['\u{10001}', '\u{10002}', '\u{10003}', '\u{10005}', '\u{10006}', '\u{10007}'], | |
rejectedCharacters: ['-', '\u{10000}', '\u{10004}', '\u{10008}'] | |
}, | |
{ | |
regExp: /[b-d\u{10001}-\u{10003}]/u, | |
acceptedCharacters: ['b', 'c', 'd', '\u{10001}', '\u{10002}', '\u{10003}'], | |
rejectedCharacters: ['-', 'a', 'e', '\u{10000}', '\u{10004}'] | |
}, | |
{ | |
// Make sure we don't omit the \u{10400}-\u{107FF} range | |
regExp: /[\u{10001}-\u{10BFE}]/u, | |
acceptedCharacters: ['\u{10001}', '\u{103FF}', '\u{10400}', '\u{107FF}', '\u{10800}', '\u{10BFE}'] | |
}, | |
{ | |
regExp: /[\u{10000}-\u{107FF}]/u, | |
acceptedCharacters: ['\u{10000}', '\u{103FF}', '\u{10400}', '\u{107FF}'] | |
}, | |
{ | |
// Make sure we don't omit the \u{10400}-\u{107FF} range | |
regExp: /[\u{10000}-\u{10802}]/u, | |
acceptedCharacters: ['\u{10000}', '\u{103FF}', '\u{10400}', '\u{107FF}', '\u{10800}', '\u{10802}'] | |
} | |
]; | |
var testsForRunner = normalTests.map(function (test) { | |
return { | |
name: '' + test.regExp + ' should work correctly', | |
body: function () { | |
function makePrintable(ch) { | |
var charCode = ch.charCodeAt(0); | |
if ('a'.charCodeAt(0) <= charCode && charCode <= 'z'.charCodeAt(0) | |
|| 'A'.charCodeAt(0) <= charCode && charCode <= 'Z'.charCodeAt(0) | |
|| '0'.charCodeAt(0) <= charCode && charCode <= '9'.charCodeAt(0) | |
|| ch === '-') { | |
return ch; | |
} | |
else { | |
var hexString = ch.codePointAt(0).toString(16); | |
return '\\u{' + hexString + '}'; | |
} | |
} | |
function createMessage(ch, result) { | |
return "'" + makePrintable(ch) + "' should be " + result; | |
} | |
test.acceptedCharacters.forEach(function (ch) { | |
assert.isTrue(test.regExp.test(ch), createMessage(ch, 'acceptedCharacters')); | |
}); | |
rejectedCharacters = test.rejectedCharacters || []; | |
rejectedCharacters.forEach(function (ch) { | |
assert.isFalse(test.regExp.test(ch), createMessage(ch, 'rejectedCharacters')); | |
}); | |
} | |
}; | |
}); | |
var disallowedPatterns = [ | |
'/[b-a]/', | |
'/[\\u{10001}-\\u{10000}]/u', | |
]; | |
testsForRunner = testsForRunner.concat(disallowedPatterns.map(function (pattern) { | |
return { | |
name: '' + pattern + ' should throw SyntaxError', | |
body: function () { | |
assert.throws(function () { eval(pattern); }, SyntaxError); | |
} | |
}; | |
})); | |
testRunner.runTests(testsForRunner, { verbose: WScript.Arguments[0] != 'summary' }); |