Синтаксические тесты Javascript - PullRequest
8 голосов
/ 25 мая 2011

Я создаю текстовый редактор, и я только что закончил писать алгоритмы подсветки, чтобы каждый синтаксис отображался в другом цвете и отображался в правильном положении с использованием правильных деревьев разбора.

Мне было интересно, может ли кто-нибудь предоставить мне, или местоположение теста или серии тестов, чтобы убедиться, что ничего не сломается. Тестовые сценарии должны охватывать весь синтаксис JavaScript при его использовании в Интернете, в том числе пограничные варианты (т. Е. Синтаксис, такой как throw, хотя он используется редко), создание и манипулирование DOM и т. Д.

Я добавил следующий статический тестовый пример. Он должен охватывать весь синтаксис.

Следует отметить несколько вещей: поскольку код рекурсивно анализируется на уровне грамматики, требуются только базовые случаи. Например, в редактор:

а [1]; и [1] [2] [3] [4] [5]; будет такой же синтаксис . Поскольку вторая строка, просто рекурсивно больше подпрограмм, чем первая строка.

Созданный мной тестовый пример перенесен на ответ ниже.

Ответы [ 4 ]

2 голосов
/ 25 мая 2011

Интересный вопрос. Я думаю, что мой первоначальный подход, за исключением любых других интересных предложений, заключался бы в том, чтобы взять кучу JavaScript из довольно крупных библиотек. Я думаю, jQuery, Mootools, Prototype и т. Д.

Затем, как только вы сделали несколько основных библиотек, сделайте несколько меньших. Я бы оформить заказ Github . Может быть, посмотрите на Подчеркните , HeadJS , и, возможно, некоторые другие на https://github.com/languages/JavaScript.

Я бы также взял пару минифицированных библиотек, пропустил их через JSBeautifier . Не уверен, что у JS может быть слегка измененный синтаксис по сравнению с оригиналом.

Наконец, я хотел бы рассмотреть возможность запуска некоторых из этих библиотек через JSLint , а затем вручную пройтись и изменить исходные коды, чтобы явно выполнить некоторые из «правил», изложенных в JSLint.

РЕДАКТИРОВАТЬ: И под «хит», я имею в виду, что вы должны охватить оба сценария, предлагаемые каждым правилом, а не только «чистую» версию.

1 голос
/ 25 мая 2011

Это пока лучший тестовый пример, который мне удалось придумать.

РЕДАКТИРОВАТЬ: Добавлено регулярное выражение и бросок. Этот случай синтаксически действителен и должен охватывать все случаи 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 */
1 голос
/ 25 мая 2011

Один из возможных подходов: существуют различные приложения, которые генерируют случайные фрагменты кода, начиная с грамматики BNF языка (например, this ), и существуют файлы грамматики Доступен javascript.

Это не даст вам статического тестового примера, с которым вы можете писать сценарии, обязательно с ожидаемыми результатами, но может быть хорошим способом проверить ваш анализатор на наличие неожиданных (но допустимых) строк иубедитесь, что он не сломается.

0 голосов
/ 25 мая 2011

Хороший способ начать - это запустить через JSLint , чтобы убедиться, что ваш JavaScript действителен. Это лучший инструмент для проверки, который я знаю, но я не уверен, насколько хорошо он будет проверять, не нарушен ли код. (

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

...