$$OUT=-

$$START!

## V. Тестирование | ## V. Testing

### V. 1.Основные положения | ### V. 1. General rules

Класс может содержать особые функции, которые начинаются ключевым словом `TEST` вместо `FUNCTION`. Они предназначены для тестирования и выполняются всегда на этапе компиляции. Если тесты не выполняются для класса успешно, класс должен быть помечен атрибутом `UNTESTED`. Если на этапе тестирования выполнялись не все строки кода, подлежащего тестированию, класс так же должен быть помечен атрибутом `UNTESTED`. Если хотя бы один оператор `ASSERT` не выполняется в тестах класса, класс так же должен быть помечен `UNTESTED`. Если класс должен быть помечен как `UNTESTED`, но он не имеет этого атрибута, это считается ошибкой, и компиляция завершается на этапе тестирования. | Class can contain special functions starting with a keyword `TEST` in place of the `FUNCTION`. Such functions are intended to test and executed always on a compilation stage. If tests are not executed successfully, a class should be marked with an attribute `UNTESTED`. If not all lines of code were executed on a test stage, the class should be marked as `UNTESTED`. If at least one statement `ASSERT` was failed, the class also should be marked as `UNTESTED`. If a class should be marked as `UNTESTED` but it has no such attribute, this concerned as an error, and a project is not compiled.
Тестированию подлежат: Все строки кода. Все условные ветви кода. Тест считается покрывающим, только если все подлежащие тестированию строки кода выполнялись при тестировании класса хотя бы один раз. Если это условие не выполнено, класс должен быть помечен как `UNTESTED`. | Which code should be tested: All the lines of code. All the conditional branches. A set of tests is concerned to be "covering" only if all the lines which should be tested were executed during a class testing at least once. If this condition was not satisfied, the class should be marked as `UNTESTED`.
Все секции функции `TEST` должны иметь операторы `ASSERT`. Компилятор не может проконтролировать качество использования этих операторов, поэтому отсутствие таких операторов в секции вызывает только предупреждение. | All the sections of code in a `TEST` function should have ASSERT statements. The compiler can no control correctness of usage of such statements though, so an absence of `ASSERT` statements leads just to warnings.
Тестированию не подлежат: Нативные функции. Абстрактные классы. Классы, не содержащие методов. Методы, не содержащие операторов. | What is not necessary to test: Native functions. Abstract classes. Classes not having methods. Methods not having statements.
Однако, при тестировании класса, унаследованного от абстрактного, все не переопределённые методы его абстрактного предка должны быть протестированы, чтобы сам класс считался протестированным. Допускается в абстрактном классе поместить тестирующие функции с параметрами, предназначенные для тестирования всех или части функций абстрактного класса. Тесты с параметрами не выполняются автоматически, но могут быть вызваны из других тестирующих функций. В частности, если создать тест(ы) с параметрами внутри абстрактного класса для тестирования его методов, то эти тесты могут быть вызваны в унаследованных классах для упрощения тестирования кода абстрактного предка. | Therefore while testing a class inherited from an abstract class all the not redefined methods of an abstract ancestor should be tested to ensure that a derived class is tested. It is allowed to place in an abstract class some testing functions with parameters, intended to test partially (or totally) functions of an abstract class. Tests with parameters are not called automatically but these can be called from other TEST functions. In part if to create such parameterized tests in an abstract class these can be used to simplify testing the abstract class together with derivatives of it.

### V. 2. Синтаксис | ### V. 2. Syntax
Функция тестирования начинается заголовком, в котором слово `TEST` используется вместо слова `FUN|CTION`. | Testing function starts from a header which differs from a function header by a keyword `FUN|CTION`.
Тестирующие функции могут иметь параметры, но такие тесты не вызываются автоматически: они могут быть вызваны только из других тестирующих функций. | Testing functions can have parameters but such parameterized tests are not called automatically: these can only be called from other tests.
Тестирующая функция может начинаться оператором `IMPORT`, в котором перечисляются классы, дополнительно требующиеся для запуска этой процедуры. | Testing function can start from its individual `IMPORT` statement, where additional classes are listed, necessary for the test to launch it.
Как и другие функции, тестирующая функция разбивается на секции секционными комментариями `-------------- 'текст'` Но для тестирующих функций имеется дополнительное требование: секция должна содержать как минимум один оператор ASSERT. | Like other functions testing function also is separated onto sections with section comment `------------ 'text'` But for testing functions an additional requirement is there: each section should contain at least one ASSERT statement.
Оператор `ASSERT` предназначен для проверки булевского выражения. Если значение выражения в операторе `ASSERT` выражение ложно, утверждение не выполняется. При наличии хотя бы одного проваленного утверждения класс считается не оттестированным. | An `ASSERT` statement is intended to check a Boolean expression value. If a value in an `ASSERT expression` is false, then assertion is failed. When at least one failed assertion is present then the class is concerned untested.

$$STOP!