Создание ceylon.test.TestRunner

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

Итак, я создаю TestRunner с использованием createTestRunner. Упомянутая функция принимает Sequential из TestSources ('TestSource[]') в качестве первого аргумента. TestSource — псевдоним для этого типа:

Module|Package|ClassDeclaration|FunctionDeclaration|Class<Anything,Nothing>|FunctionModel<Anything,Nothing>|String

В связи с этим возникает вопрос: Как я хочу передать свои тесты средству запуска тестов?

Для начала кажется, что проще всего поместить их в локальные функции, а затем позволить тестировщику каким-то образом получить доступ к этим функциям (дальше не указано). Поскольку длинный список типов, включенных в псевдоним TestSource, похоже, не включает фактические Функции, я попытался найти ближайшего кандидата, который выглядел как правильный: FunctionDeclaration.

Чтобы сделать такое объявление функции, мне сначала нужно было подумать, как на самом деле могут выглядеть мои тестовые функции-оболочки. Возможно, что-то вроде этого?

Anything myTests1 () {
    // assert something!
    return null;
}

void myTests2 () {
    // assert some more things!
}

(эти функции эквивалентны по типу, кстати)

После множества Изучение Ceylon Herd, я решил, что FunctionDeclaration для таких функций может быть записано так:

// function name for function declaration:
LIdentifier funName = LIdentifier("myName");

// type of return value for function declaration:
UIdentifier returnTypeName1 = UIdentifier("Anything");
TypeNameWithTypeArguments returnTypeName2 = TypeNameWithTypeArguments(returnTypeName1);
BaseType returnType = BaseType( returnTypeName2 );

// type of parameters for function declaration:
Sequential<Parameter> parameters1 = [];  // our test wrapper functions takes no arguments
Parameters parameters2 = Parameters( parameters1 );
Sequence<Parameters> parameterLists = [parameters2];

// the actual function declaration:
FunctionDeclaration myFunctionDeclaration = FunctionDeclaration(
    funName,
    returnType,
    parameterLists
);

Так что теперь все, что мне нужно было сделать, это передать это в функцию createTestRunner. Мне просто нужно было вставить myFunctionDeclaration в TestSource[]:

TestSource myTestSource = myFunctionDeclaration;
TestSource[] mySourceList = [myTestSource];
TestRunner myTestRunner = createTestRunner(mySourceList);

Но эта первая строка не работает. myFunctionDeclaration типа 'FunctionDeclaration' просто не проходит как тип TestSource. Почему бы и нет? Является ли FunctionDeclaration неправильным типом TestSource? Глядя на определение псевдонима для TestSource, FunctionDeclaration кажется здесь в списке возможных типов:

Module|Package|ClassDeclaration|FunctionDeclaration|Class<Anything,Nothing>|FunctionModel<Anything,Nothing>|String

Что мне здесь не хватает?


person Community    schedule 10.09.2017    source источник


Ответы (1)


Это литерал FunctionDeclaration:

`function myTests1`

(В отличие от Function, который представляет собой `myTests1` без ключевого слова. Первая — это детипизированная модель в ceylon.language.meta.declaration, вторая — статически типизированная модель в ceylon.language.meta.model. См. Обзор, метамодель.)

Итак, я думаю, что вы должны делать для тестировщиков:

value myTestRunner = createTestRunner([`function myTests1`, `function myTests2`]);

(Но я никогда не делал этого сам.)

В Herd вы нашли ceylon.ast, совершенно не связанный набор модулей, который позволяет вам описать исходный код Ceylon. Ваш myFunctionDeclaration описывает абстрактное синтаксическое дерево функции

Anything myName();

но только на уровне синтаксиса: функция никогда не компилируется. Вам не нужен ceylon.ast для работы с метамоделью. (Обратите также внимание, что это объявление функции, а не определение функции. Оно синтаксически корректно, но не будет принято средством проверки типов, поскольку оно не аннотировано formal.)

В качестве примечания, модуль ceylon.ast.create предлагает гораздо более удобные способы создания экземпляров узлов ceylon.ast.core (вместо прямого использования этого модуля, как вы сделали):

value fun = functionDefinition {
    name = "myName";
    type = baseType("Anything");
};
person Lucas Werkmeister    schedule 10.09.2017
comment
Я получаю Error:(50, 49) ceylon: metamodel reference to local declaration. Если я затем уберу свои два объявления функций (mytTests1 и myTests2), я получу Error:(50, 49) ceylon: function or value is not defined: 'myTests1' - person ; 11.09.2017
comment
Определены ли функции myTests1 и myTests2 внутри другой функции? Вы не можете брать ссылки метамодели таких объявлений («локальные объявления» в сообщении об ошибке), вам придется сделать их функциями верхнего уровня, или методами класса, или чем-то подобным. (Имейте в виду, что в Web IDE есть неявная функция run для всего вашего кода. Установите флажок «Дополнительно», чтобы изменить это.) - person Lucas Werkmeister; 11.09.2017
comment
Переместил их на верхний уровень, и он компилируется! :D - person ; 11.09.2017