Шрифт:
ln.move(i–5,i–5);
ln.draw;
}
if (point(0)!=Point(10,10))
cerr << "Неправильная точка 1 после перемещения";
if (point(1)!=Point(100,100))
cerr << "Неправильная точка 2 после перемещения";
for (int i = 0; i<100; ++i) { // смотрим, правильно ли изменяются
// цвета
ln.set_color(Color(i*100));
if (ln.color != Color(i*100))
cerr << "Неправильное значение set_color";
ln.draw;
}
for (int i = 0; i<100; ++i) { // смотрим, правильно ли изменяется
// стиль
ln.set_style(Line_style(i*5));
if (ln.style != Line_style(i*5))
cerr << "Неправильное значение set_style";
ln.draw;
}
В принципе эта программа тестирует создание, перемещение, цвет и стиль. На практике мы должны учесть много больше факторов (с учетом отклонений от сценария), как мы это делали при тестировании функции
binary_search
. И снова мы, скорее всего, убедимся в том, что считывать описание тестов из файла намного удобнее, а заодно придумаем более информативные сообщения об ошибках. Кроме того, мы выясним, что совершенно не обязательно усаживать перед экраном компьютера человека, который отслеживал бы изменения состояния объектов класса
Shape
. Итак, у нас появляются две альтернативы: • замедлить работу программы, чтобы за ней мог следить наблюдатель;
• найти такое представление класса
Shape
, чтобы мы могли читать и анализировать его с помощью программы. Отметим, что мы еще не тестировали функцию
add(Point)
. Для того чтобы проверить ее, мы, вероятно, должны были бы использовать класс Open_polyline
. 26.3.6. Поиск предположений, которые не выполняются
Спецификация класса
binary_search
ясно указывает на то, что последовательность, в которой выполняется поиск, должна быть упорядоченной. Это не позволяет нам создавать многие изощренные модульные тесты. Однако очевидно, что существует возможность написать неправильный код, для которого мы не сможем изобрести тест, идентифицирующий ошибки (за исключением системных тестов). Можем ли мы использовать свое знание системных модулей (функций, классов и т.п.) для того, чтобы изобрести более хорошие тесты?
Рассмотрим функцию
binary_search
еще раз: мы не можем проверить, что входная последовательность [first:last]
действительно является последовательностью и что она была упорядочена (см. раздел 26.3.2.2). Однако можем написать функцию, которая выполняет эту проверку.
template<class Iter, class T>
bool b2(Iter first, Iter last, const T& value)
{
// проверяем, является ли диапазон [first:last)
// последовательностью:
if (last<first) throw Bad_sequence;
// проверяем, является ли последовательность упорядоченной :
for (Iter p = first+1; p<last; ++p)
if (*p<*(p–1)) throw Not_ordered;
// все хорошо, вызываем функцию binary_search:
return binary_search(first,last,value);
}