Для работы с Snap.svg первым шагом является создание SVG-контейнера.
Это делается с помощью функции Snap():
var s = Snap(800, 600); // создаём SVG-контейнер размером 800x600
Можно также привязать контейнер к существующему элементу DOM:
var s = Snap("#svgCanvas"); // элемент с id="svgCanvas" в HTML
Контейнер является базовой областью для всех графических элементов, и все последующие операции выполняются относительно него.
Snap.svg поддерживает разнообразные SVG-элементы: прямоугольники, круги, эллипсы, линии, многоугольники, пути и текст.
Прямоугольник:
var rect = s.rect(50, 50, 200, 100);
rect.attr({
fill: "#3498db",
stroke: "#2980b9",
strokeWidth: 4
});
Круг:
var circle = s.circle(300, 150, 75);
circle.attr({
fill: "#e74c3c",
stroke: "#c0392b",
strokeWidth: 3
});
Тестирование элементов включает проверку их существования, координат, размеров и атрибутов. Например:
console.assert(circle.attr("r") === 75, "Радиус круга должен быть 75");
console.assert(rect.attr("fill") === "#3498db", "Цвет заливки прямоугольника неверен");
Snap.svg позволяет применять трансформации: translate,
rotate, scale. Для тестирования необходимо
убедиться, что трансформация применяется корректно:
rect.transform("t100,50"); // перемещение на 100 по X и 50 по Y
console.assert(rect.getBBox().x === 150, "X координата прямоугольника после трансформации должна быть 150");
console.assert(rect.getBBox().y === 100, "Y координата прямоугольника после трансформации должна быть 100");
Можно комбинировать несколько трансформаций:
circle.transform("t50,0 r45 s1.5,1.5");
При этом проверяется итоговое положение и размер элемента.
Snap.svg предоставляет метод animate() для плавных
изменений атрибутов:
circle.animate({ r: 150, fill: "#2ecc71" }, 1000, mina.easeinout);
Тестирование анимации включает проверку начального и конечного состояния:
console.assert(circle.attr("r") === 75, "Начальный радиус должен быть 75");
setTimeout(() => {
console.assert(circle.attr("r") === 150, "Радиус после анимации должен быть 150");
}, 1100);
Для комплексного тестирования анимаций используется последовательное
применение нескольких animate() и проверка промежуточных
состояний.
Группы позволяют объединять несколько элементов и управлять ими как одним объектом:
var group = s.group(rect, circle);
group.attr({ opacity: 0.5 });
group.transform("t200,0");
Тестирование группы проверяет корректность применения атрибутов и трансформаций ко всем дочерним элементам:
console.assert(rect.attr("opacity") === 0.5, "Прямоугольник должен иметь opacity 0.5");
console.assert(circle.attr("opacity") === 0.5, "Круг должен иметь opacity 0.5");
Snap.svg позволяет назначать обработчики событий на элементы:
rect.click(function() {
this.attr({ fill: "#f1c40f" });
});
Тестирование событий заключается в симуляции действия пользователя и проверке изменения атрибутов:
rect.fire("click");
console.assert(rect.attr("fill") === "#f1c40f", "Цвет прямоугольника после клика должен измениться");
Можно проверять любые события: mouseover,
mouseout, mousedown, mouseup.
Для путей используется метод path():
var path = s.path("M10 80 C 40 10, 65 10, 95 80 S 150 150, 180 80");
path.attr({
fill: "none",
stroke: "#8e44ad",
strokeWidth: 2
});
Тестирование путей включает проверку длины, координат точек и атрибутов:
console.assert(path.getTotalLength() > 0, "Длина пути должна быть больше нуля");
console.assert(path.attr("stroke") === "#8e44ad", "Цвет линии пути неверен");
Snap.svg позволяет получать любую точку пути для тестов:
var point = path.getPointAtLength(50);
console.assert(point.x > 0 && point.y > 0, "Точка на пути должна иметь положительные координаты");
Snap.svg поддерживает SVG-фильтры: размытие, тени, цветовые эффекты.
var blurFilter = s.filter(Snap.filter.blur(5, 5));
circle.attr({ filter: blurFilter });
Тестирование фильтров проверяет корректность назначения и влияние на элементы:
console.assert(circle.node.querySelector("filter") !== null, "Фильтр должен применяться к элементу");
Для комплексного тестирования используется комбинация
console.assert, проверки координат через
getBBox(), проверки атрибутов через attr() и
симуляции событий.
Можно создавать функции-утилиты для повторяющихся проверок:
function testAttr(element, attr, expected) {
console.assert(element.attr(attr) === expected, `${attr} должен быть ${expected}`);
}
function testBBox(element, expectedX, expectedY) {
var box = element.getBBox();
console.assert(box.x === expectedX, `X должен быть ${expectedX}`);
console.assert(box.y === expectedY, `Y должен быть ${expectedY}`);
}
Такой подход позволяет создавать надёжный и повторяемый процесс тестирования SVG-компонентов в Snap.svg.