Тестовые примеры синтаксиса 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. Это лучший инструмент проверки, который я знаю, но я не уверен, насколько хорошо он будет проверять, если код сломан. :(

надеюсь, это поможет.