Шрифт:
Point point(int i) const; // доступ к точкам без права
// модификации
int number_of_points const;
virtual ~Shape { }
protected:
Shape;
virtual void draw_lines const; // рисует соответствующие точки
void add(Point p); // добавляет точку p
void set_point(int i,Point p); // points[i]=p;
private:
vector<Point> points; // не используется всеми
// фигурами
Color lcolor; // цвет для линий и символов
Line_style ls;
Color fcolor; // цвет заполнения
Shape(const Shape&); // предотвращает копирование
Shape& operator=(const Shape&);
};
Как приступить к тестированию этого класса? Сначала рассмотрим, чем класс
Shape
отличается от функции binary_search
с точки зрения тестирования. • Класс
Shape
имеет несколько функций. • Состояние объекта класса
Shape
может изменяться (мы можем добавлять точки, изменять цвет и т.д.), т.е. одна функция может влиять на другую. • Класс
Shape
имеет виртуальные функции. Другими словами, поведение объекта класса Shape
зависит от того, какой производный класс был создан на его основе (если такой класс существует). • Класс
Shape
не является алгоритмом. • Изменение объекта класса
Shape
может влиять на содержимое экрана.
Shape
. Это не соответствует принципам систематичного, воспроизводимого и доступного тестирования. Как указывалось в разделе 26.3.4.1, мы часто прибегаем к разным уловкам, чтобы избежать этого. Однако пока будем предполагать, что существует наблюдатель, который замечает отклонения изображения от требуемого образца.
Shape
могут считывать точки, но не могут их изменять. С точки зрения тестирования все, что не вносит изменений (или, по крайней мере, не должно вносить), облегчает работу. Что мы можем тестировать, а что не можем? Для того чтобы тестировать класс
Shape
, мы должны попытаться протестировать его как отдельно, так и в сочетании с производными классами. Однако, для того чтобы проверить, что класс Shape
работает правильно с конкретным производным классом, мы должны протестировать этот производный класс. Ранее мы уже отметили, что объект класса
Shape
имеет состояние (значение), определенное четырьмя данными-членами.
vector<Point> points;
Color lcolor; // цвет линий и символов
Line_style ls;
Color fcolor; // цвет заполнения
Все, что мы можем сделать с объектом класса
Shape
, — внести в него изменения и посмотреть, что произойдет. К счастью, изменить данные-члены можно только с помощью интерфейса, определенного функциями-членами. Простейшим объектом класса
Shape
является объект класса Line
, поэтому начнем с создания одного такого объекта и внесем все возможные изменения (используя самый наивный стиль тестирования).
Line ln(Point(10,10), Point(100, 100));
ln.draw; // смотрим, что произошло
// проверка точек:
if (ln.number_of_points != 2)
cerr << "Неправильное количество точек ";
if (ln.point(0)!=Point(10,10)) cerr << "Неправильная точка 1";
if (ln.point(1)!=Point(100,100)) cerr << "Неправильная точка 2";
for (int i=0; i<10; ++i) { // смотрим на перемещения объекта
ln.move(i+5,i+5);
ln.draw;
}
for (int i=0; i<10; ++i) { // проверяем, возвращается ли объект
// в исходное положение