напиши юнит тесты для методов 

package com.cgvsu.model;

import com.cgvsu.math.Vector2f;
import com.cgvsu.math.Vector3f;

import java.util.ArrayList;
import java.util.List;

public class Model {
    public ArrayList<Vector2f> textureVertices = new ArrayList<Vector2f>();
    public ArrayList<Vector3f> vertices = new ArrayList<>();
    public ArrayList<Vector3f> normals = new ArrayList<>();
    public ArrayList<Polygon> polygons = new ArrayList<>();

    /**
     * Разбивает многоугольники модели на треугольники.
     * При необходимости вызывает алгоритм триангуляции, если количество вершин > 3.
     */
    public void triangulate() {
        ArrayList<Polygon> triangulatedPolygons = new ArrayList<>();

        for (Polygon polygon : polygons) {
            if (polygon.isTriangle()) {
                triangulatedPolygons.add(polygon);
            } else {
                List<Integer> vertexIndices = polygon.getVertexIndices();

                // Алгоритм "ушного отсечения" для триангуляции многоугольника
                for (int i = 1; i < vertexIndices.size() - 1; i++) {
                    Polygon triangle = new Polygon();
                    triangle.addVertexIndex(vertexIndices.get(0));
                    triangle.addVertexIndex(vertexIndices.get(i));
                    triangle.addVertexIndex(vertexIndices.get(i + 1));

                    // Копируем индексы текстурных вершин и нормалей, если они заданы
                    if (!polygon.getTextureVertexIndices().isEmpty()) {
                        triangle.addTextureVertexIndex(polygon.getTextureVertexIndices().get(0));
                        triangle.addTextureVertexIndex(polygon.getTextureVertexIndices().get(i));
                        triangle.addTextureVertexIndex(polygon.getTextureVertexIndices().get(i + 1));
                    }
                    if (!polygon.getNormalIndices().isEmpty()) {
                        triangle.addNormalIndex(polygon.getNormalIndices().get(0));
                        triangle.addNormalIndex(polygon.getNormalIndices().get(i));
                        triangle.addNormalIndex(polygon.getNormalIndices().get(i + 1));
                    }

                    triangulatedPolygons.add(triangle);
                }
            }
        }

        // Заменяем полигоны модели триангулированными многоугольниками
        polygons = triangulatedPolygons;
    }

    /**
     * Вычисление нормалей для каждого полигона и усреднение для каждой вершины.
     */
    public void calculateNormals() {
        // Инициализация массива для нормалей вершин, если они еще не инициализированы
        normals = new ArrayList<>(vertices.size());
        for (int i = 0; i < vertices.size(); i++) {
            normals.add(new Vector3f(0, 0, 0));
        }

        // Вычисление нормалей для каждого полигона
        for (Polygon polygon : polygons) {
            List<Integer> vertexIndices = polygon.getVertexIndices();

            // Берем первые три вершины многоугольника для расчета нормали
            Vector3f v0 = vertices.get(vertexIndices.get(0));
            Vector3f v1 = vertices.get(vertexIndices.get(1));
            Vector3f v2 = vertices.get(vertexIndices.get(2));

            // Вычисляем два вектора грани
            Vector3f edge1 = v1.subtract(v0);
            Vector3f edge2 = v2.subtract(v0);

            // Находим нормаль грани через векторное произведение
            Vector3f faceNormal = edge1.cross(edge2);
            faceNormal.normalize(); // нормализуем нормаль

            // Добавляем нормаль грани к нормалям вершин полигона
            for (int index : vertexIndices) {
                normals.set(index, normals.get(index).add(faceNormal));
            }
        }

        // Усредняем нормали для каждой вершины
        for (int i = 0; i < normals.size(); i++) {
            normals.get(i).normalize(); // нормализуем усредненную нормаль
        }
    }

}