Re[7]: Создание тестов для компилятора и стандартной библиот
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.02.10 17:17
Оценка: 21 (1)
#Имя: FAQ.nemerle.CompilerTests
Здравствуйте, hardcase, Вы писали:

H>Ты не мог бы кратко объяснить, как нужно писать юнит тесты для компилятора (positive/negative)?

H>Без них как-то стрёмно коммитить

Там довольно просто. Погляди примеры и сам все поймешь:
http://nemerle.googlecode.com/svn/nemerle/trunk/ncc/testsuite/positive/
http://nemerle.googlecode.com/svn/nemerle/trunk/ncc/testsuite/negative/

Вот пример "позитивного" теста:
http://nemerle.googlecode.com/svn/nemerle/trunk/ncc/testsuite/positive/array-prop.n
module M {
  Main () : void {
    def x = array [1,2,3];
    when (x.Length == 3) 
      System.Console.WriteLine ("OK");
  }
}

/*
BEGIN-OUTPUT
OK
END-OUTPUT
*/


Смысл очень простой. То что код скомпилировался без ошибок, запустился и выдал ожидаемый консольный вывод является положительным утверждать (assert-ом).
Ожидаемый консольный вывод помещается в коментарий идущий в конце исходного файла между BEGIN-OUTPUT и END-OUTPUT.
Если нужно подключить какие-то ссылки на сборки (в том числе и макросыне) то добавляешь комментарий следующего вида:
// REFERENCE: ИмяСборки

Например, следующий тест использует макрос из внешней сборки:
http://nemerle.googlecode.com/svn/nemerle/trunk/ncc/testsuite/positive/bug-1166.n
// REFERENCE: bug-1166-lib

System.Console.WriteLine (testMacro ())

/*
BEGIN-OUTPUT
test4
END-OUTPUT
*/

Сборка (макросная, в данном случае) на которую производится ссылка так же собирается из отдельного исходника лежащего там же:
http://nemerle.googlecode.com/svn/nemerle/trunk/ncc/testsuite/positive/bug-1166-lib.n
// REFERENCE: Nemerle.Compiler

macro testMacro () {<[
  def x = 4;
  Nemerle.IO.sprint ("test$x")
]>}

Кстате, в ней производится ссылка на сборку компилятора. Так же можно ссылаться на сборки из состава дотнета.
Имена тестовым файлам принято давать мелкими буквами разделяя слова подчеркиванием. Если тест сделан для бага, то формат должен быть как выше приведенных тестах: bug-четырезначый-номер-бага-в-мантисе.n

В негативных тестах вместо ожидаемого консолькного вывода описываются ожидаемые сообщения компилятора. Например:
http://nemerle.googlecode.com/svn/nemerle/trunk/ncc/testsuite/negative/block2.n
module M {
  bar3 () : int
  {
    brk : { 
      def qfoo () {
        brk (42) // E: non local goto
      }
      qfoo();
      qfoo();
      1
    }
  }

  Main () : void
  {
  }
  
}


Если сообщение произошло, то все ОК. Иначе, тест не пройдет.
Варианты префиксов:
E: — сообщение об ошибке (error)
W: — предупреждение (warning)
H: — подсказка (hint)

За двоеточим должна идти подстрока которая попоставляется с сообщением. Это не просто строка, а регулярное выражение. Синтаксис донтеный. Например, чтобы распознать любой символ нужно поставить точку, а для распознавания любого количества символов ".*". Это удобно использовать если в сообщении есть нинамическая часть которая может меняться или изобилует разными символами которые в регулярных выражениях являются специальными (скобки, точки и т.п.). Строку не обязательно задавать целиком. Если текст из коментария сопоставится хотя бы с частью сообщения, то уже будет "зачет".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.