Тестовые примеры синтаксиса Javascript
Я создаю текстовый редактор, и я только что закончил писать алгоритмы выделения, чтобы каждый синтаксис отображался в другом цвете и отображался в правильном положении, используя правильные деревья синтаксического анализа.
мне было интересно, может ли кто-нибудь предоставить мне или местоположение теста или серии тестовых случаев, чтобы убедиться, что ничего не сломается. Тестовый случай(ы) должен охватывать весь синтаксис JavaScript, как он используется в интернете, включая крайние случаи (т. е., включая синтаксис, такой как throw
хотя он редко используется), создание и манипуляция DOM и т. д.
Я добавил следующий статический тест. Это должны охватывают весь синтаксис.
есть несколько вещей, чтобы отметить: поскольку код анализируется рекурсивно на уровне грамматики, требуются только основные случаи. Например, редактору:
a[1]; и a[1][2][3][4][5]; будет то же самое синтаксис. Так как вторая строка просто рекурсивно больше subs, то первая строка.
тестовый случай, который я создал, был перемещен в ответ ниже.
4 ответов
интересный вопрос. Я думаю, что мой первоначальный подход, исключая любые другие интересные предложения, можно было бы захватить кучу JavaScript из довольно крупных библиотек. Я думаю, jQuery, Mootools, прототип и т. д.
затем, как только вы сделали несколько крупных либов, сделайте несколько меньших. Я бы проверил Github. Может быть, посмотрите на подчеркивание, HeadJS, и, возможно, некоторые другие по https://github.com/languages/JavaScript.
Я бы также взял пару мини-библиотек, прогнал их через JSBeautifier. Не уверен, что украшенный JS может немного изменить синтаксис из оригинала.
наконец, я бы рассмотрел возможность запуска некоторых из этих библиотек через JSLint, а затем вручную перейдите и измените источники, чтобы явно поразить некоторые из "правил", которые выложил JSLint.
изменить: И под "ударом" я имею в виду, что вы должны охватить оба сценария, предлагаемые каждым правилом, а не только "чистую" версию.
один возможный подход: существуют различные приложения, которые будут генерировать случайные фрагменты кода, начиная с грамматики BNF языка (например,этот) и грамматика файлы для javascript доступен.
Это не даст вам статический тестовый случай, с которым вы можете писать тесты с известными ожидаемыми результатами, обязательно, но может быть хорошим способом проверить ваш парсер против неожиданных (но законных) строк и убедиться, что это не так ломать.
Это пока лучший тестовый случай, который я смог придумать.
EDIT: добавлено регулярное выражение и бросок. Этот случай синтаксически допустим и должен охватывать все случаи JS. Пожалуйста, сообщите мне напрямую, если вы найдете что-то недостающее, чтобы я мог добавить его здесь.
a = 1;
b = { 'a' : a };
c = 'a';
d = this;
var patt1=/w3ghouls/i;
throw "Err3";
function e(a,b,c){
d += a + b + c++;
return d;
}
this.xy.z = function(a, b){
var x = null;
}
var f = function(a,b){
if(a == b || (b === a && a)){
var f = [a,b];
try{
f = f.slice(0);
}catch(e){
console.log(e * e + '');
}
}else if(a){
a = null;
a = undefined;
b = typeof a;
b = true;
b = false;
}else{
switch(c){
case 'c':
break;
default:
null;
break;
}
}
}
for(var i =0; i <= a.length; i++){
do{
continue;
null;
}while(a != b);
}
if(a == b)
(a) ? null : null;
/* This is a finished
test case */
хорошим способом начать было бы запустить это через JSLint чтобы узнать, действителен ли ваш JavaScript. Это лучший инструмент проверки, который я знаю, но я не уверен, насколько хорошо он будет проверять, если код сломан. :(
надеюсь, это поможет.