diff --git a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java
index 8613467602476d7429b0085881ba871cfac2c9dd..2ae6f8ef46d06a72f0da156f1c350c180a2f7b57 100644
--- a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java
+++ b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java
@@ -77,8 +77,8 @@ public class ViewUtil {
 
         String[] colorsString = colors.keySet().toArray(new String[0]);
         for(int i = 0 ; i < colorsString.length ; i+= 7) {
-            for(int j = 0 ; i+j < colorsString.length && j < i+7 ; j++) {
-                if(j%7 == 0 && i != 0 ) {
+            for (int j = 0; i + j < colorsString.length && j < i + 7; j++) {
+                if (j % 7 == 0 && i != 0) {
                     legend.getChildren().add(line);
                     line = new HBox();
                     line.setSpacing(10);
@@ -86,28 +86,28 @@ public class ViewUtil {
                 }
 
                 tempHBox = new HBox();
-                label = new Label(colorsString[i+j]);
+                label = new Label(colorsString[i + j]);
                 rectangle = new Rectangle(10, 10);
-                rectangle.setFill(colors.get(colorsString[i+j]));
+                rectangle.setFill(colors.get(colorsString[i + j]));
                 tempHBox.getChildren().addAll(rectangle, label);
                 line.getChildren().add(tempHBox);
 
-
-        if(colorsString.length < 7) legend.getChildren().add(line);
+            }}
+                if (colorsString.length < 7) legend.getChildren().add(line);
 
 /**
-        for(String s : colors.keySet()) {
-            Circle c = new Circle(5);
-            c.setFill(colors.get(s));
-            label = new Label(s);
-            tempHBox = new HBox();
-            tempHBox.getChildren().addAll(c, label);
-
-            hbox.getChildren().add(tempHBox);
-        }
+ for(String s : colors.keySet()) {
+ Circle c = new Circle(5);
+ c.setFill(colors.get(s));
+ label = new Label(s);
+ tempHBox = new HBox();
+ tempHBox.getChildren().addAll(c, label);
+
+ hbox.getChildren().add(tempHBox);
+ }
  */
 
-        return legend;
-    }
+                return legend;
+            }
 
-}
+        }
diff --git a/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneNormaliseeTest.java b/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneNormaliseeTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..63314320f48ea293bd7ba74e072aaddbc486b9a9
--- /dev/null
+++ b/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneNormaliseeTest.java
@@ -0,0 +1,341 @@
+package fr.univlille.sae.classification.knn.distance;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import fr.univlille.sae.classification.knn.MethodKNN;
+import javafx.scene.paint.Color;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import fr.univlille.sae.classification.model.LoadableData;
+
+public class DistanceEuclidienneNormaliseeTest {
+
+    @BeforeAll
+    public static void setupMethodKNN() {
+        MethodKNN.minData = new double[]{0.0, 2.0, 4.0};
+        MethodKNN.amplitude = new double[]{10.0, 3.0, 2.0}; // Assurez-vous que toutes les amplitudes sont non nulles
+    }
+
+    @Test
+    public void testDistanceMatchingAttributes() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{2.0, 3.0, 6.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{8.0, 5.0, 8.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        DistanceEuclidienneNormalisee distance = new DistanceEuclidienneNormalisee();
+        double result = distance.distance(data1, data2);
+        assertEquals(1.2093, result, 0.0001);
+    }
+
+    @Test
+    public void testDistanceDifferentStringAttributes() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{2.0, 3.0, 6.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{8.0, 5.0, 8.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "C"};
+            }
+        };
+
+        DistanceEuclidienneNormalisee distance = new DistanceEuclidienneNormalisee();
+        double result = distance.distance(data1, data2);
+        assertEquals(1.6093, result, 0.0001);
+    }
+
+    @Test
+    public void testDistanceDifferentAttributeLengths() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{2.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{8.0, 5.0, 8.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A"};
+            }
+        };
+
+        DistanceEuclidienneNormalisee distance = new DistanceEuclidienneNormalisee();
+        assertThrows(IllegalArgumentException.class, () -> distance.distance(data1, data2));
+    }
+
+    @Test
+    public void testDistanceDifferentStringAttributeLengths() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{2.0, 3.0, 6.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{8.0, 5.0, 8.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        DistanceEuclidienneNormalisee distance = new DistanceEuclidienneNormalisee();
+        assertThrows(IllegalArgumentException.class, () -> distance.distance(data1, data2));
+    }
+}
+
diff --git a/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneTest.java b/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..808a444b9bfd4eb2f9c0fad86d6963555a4976c1
--- /dev/null
+++ b/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceEuclidienneTest.java
@@ -0,0 +1,340 @@
+package fr.univlille.sae.classification.knn.distance;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import javafx.scene.paint.Color;
+import org.junit.jupiter.api.Test;
+import fr.univlille.sae.classification.model.LoadableData;
+
+public class DistanceEuclidienneTest {
+
+    @Test
+    public void testDistanceMatchingAttributes() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{1.0, 2.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{4.0, 6.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        DistanceEuclidienne distance = new DistanceEuclidienne();
+        double result = distance.distance(data1, data2);
+
+        assertEquals(5.0, result, 0.0001); // Distance euclidienne entre les deux points
+    }
+
+    @Test
+    public void testDistanceDifferentStringAttributes() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{1.0, 2.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{1.0, 2.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "C"};
+            }
+        };
+
+        DistanceEuclidienne distance = new DistanceEuclidienne();
+        double result = distance.distance(data1, data2);
+
+        assertEquals(1.0, result, 0.0001); // Une différence dans les attributs string
+    }
+
+    @Test
+    public void testDistanceDifferentAttributeLengths() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{1.0, 2.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{1.0, 2.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A"};
+            }
+        };
+
+        DistanceEuclidienne distance = new DistanceEuclidienne();
+
+        assertThrows(IllegalArgumentException.class, () -> {
+            distance.distance(data1, data2);
+        });
+    }
+
+    @Test
+    public void testDistanceDifferentStringAttributeLengths() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{1.0, 2.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{1.0, 2.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        DistanceEuclidienne distance = new DistanceEuclidienne();
+
+        assertThrows(IllegalArgumentException.class, () -> {
+            distance.distance(data1, data2);
+        });
+    }
+}
diff --git "a/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanNormalis\303\251eTest.java" "b/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanNormalis\303\251eTest.java"
new file mode 100644
index 0000000000000000000000000000000000000000..f9265dea407ae1d348c79cafa95c632a8c39ad09
--- /dev/null
+++ "b/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanNormalis\303\251eTest.java"
@@ -0,0 +1,91 @@
+package fr.univlille.sae.classification.knn.distance;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+import fr.univlille.sae.classification.model.LoadableData;
+import fr.univlille.sae.classification.knn.MethodKNN;
+import fr.univlille.sae.classification.knn.distance.DistanceManhattanNormalisée;
+import org.junit.jupiter.api.BeforeEach;
+
+public class DistanceManhattanNormaliséeTest {
+
+    private DistanceManhattanNormalisée distanceManhattan;
+
+    @BeforeEach
+    public void setUp() {
+        // Initialisation de l'objet DistanceManhattanNormalisée avant chaque test
+        distanceManhattan = new DistanceManhattanNormalisée();
+
+        // Définition des valeurs de normalisation dans MethodKNN (à ajuster selon votre logique)
+        MethodKNN.minData = new double[] {0.0, 0.0};  // Valeurs minimales pour les attributs
+        MethodKNN.amplitude = new double[] {1.0, 1.0};  // Amplitude pour la normalisation
+    }
+
+    @Test
+    public void testDistanceSimple() {
+        // Création de deux objets LoadableData avec des attributs simples
+        LoadableData data1 = new LoadableData(new double[] {1.0, 2.0});
+        LoadableData data2 = new LoadableData(new double[] {3.0, 5.0});
+
+        // Calcul de la distance manhattan normalisée
+        double result = distanceManhattan.distance(data1, data2);
+
+        // Calcul attendu : (|1.0 - 3.0| / 1.0) + (|2.0 - 5.0| / 1.0)
+        double expected = (Math.abs(1.0 - 3.0) / 1.0) + (Math.abs(2.0 - 5.0) / 1.0);
+
+        // Vérification du résultat
+        assertEquals(expected, result, 0.001);
+    }
+
+    @Test
+    public void testDistanceZero() {
+        // Deux objets avec les mêmes attributs (la distance devrait être 0)
+        LoadableData data1 = new LoadableData(new double[] {1.0, 2.0});
+        LoadableData data2 = new LoadableData(new double[] {1.0, 2.0});
+
+        // Vérification que la distance est bien 0
+        double result = distanceManhattan.distance(data1, data2);
+        assertEquals(0.0, result, 0.001);
+    }
+
+    @Test
+    public void testDistanceAvecValeursExtremes() {
+        // Test avec des valeurs maximales ou minimales (hypothétiques dans ce cas)
+        LoadableData data1 = new LoadableData(new double[] {Double.MAX_VALUE, Double.MIN_VALUE});
+        LoadableData data2 = new LoadableData(new double[] {Double.MIN_VALUE, Double.MAX_VALUE});
+
+        double result = distanceManhattan.distance(data1, data2);
+
+        // Calcul de la distance, ici l'effet de normalisation devrait être pris en compte
+        double expected = (Math.abs(Double.MAX_VALUE - Double.MIN_VALUE) / 1.0) +
+                (Math.abs(Double.MIN_VALUE - Double.MAX_VALUE) / 1.0);
+
+        assertEquals(expected, result, 0.001);
+    }
+
+    @Test
+    public void testDistanceAvecDonneesNulles() {
+        // Test avec des données nulles
+        LoadableData data1 = new LoadableData(new double[] {1.0, 2.0});
+        LoadableData data2 = null;
+
+        try {
+            distanceManhattan.distance(data1, data2);
+            fail("La méthode devrait lever une exception quand l'un des objets est nul");
+        } catch (NullPointerException e) {
+            // Vérification qu'une exception est lancée
+        }
+    }
+
+    @Test
+    public void testDistanceAvecDonneesVides() {
+        // Test avec des données vides (tous les attributs sont 0 ou absents)
+        LoadableData data1 = new LoadableData(new double[] {});
+        LoadableData data2 = new LoadableData(new double[] {});
+
+        // La distance devrait être 0 car il n'y a aucune différence d'attribut
+        double result = distanceManhattan.distance(data1, data2);
+        assertEquals(0.0, result, 0.001);
+    }
+}
diff --git a/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanTest.java b/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee21bd98dd5e4cd33f9cdca083a1acb020ff2fd0
--- /dev/null
+++ b/src/test/java/fr/univlille/sae/classification/knn/distance/DistanceManhattanTest.java
@@ -0,0 +1,414 @@
+package fr.univlille.sae.classification.knn.distance;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import javafx.scene.paint.Color;
+import org.junit.jupiter.api.Test;
+import fr.univlille.sae.classification.model.LoadableData;
+
+public class DistanceManhattanTest {
+
+    @Test
+    public void testDistanceMatchingAttributes() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{2.0, 3.0, 6.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{5.0, 8.0, 3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        DistanceManhattan distance = new DistanceManhattan();
+        double result = distance.distance(data1, data2);
+        assertEquals(11.0, result, 0.0001);
+    }
+
+    @Test
+    public void testDistanceWithZeros() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{0.0, 0.0, 0.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{0.0, 0.0, 0.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        DistanceManhattan distance = new DistanceManhattan();
+        double result = distance.distance(data1, data2);
+        assertEquals(0.0, result, 0.0001);
+    }
+
+    @Test
+    public void testDistanceWithNegativeValues() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{-2.0, -3.0, -6.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{2.0, 3.0, 6.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A", "B"};
+            }
+        };
+
+        DistanceManhattan distance = new DistanceManhattan();
+        double result = distance.distance(data1, data2);
+        assertEquals(22.0, result, 0.0001);
+    }
+
+    @Test
+    public void testDistanceWithDifferentAttributeLengths() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{1.0, 2.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A"};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{3.0};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{"A"};
+            }
+        };
+
+        DistanceManhattan distance = new DistanceManhattan();
+        assertThrows(ArrayIndexOutOfBoundsException.class, () -> distance.distance(data1, data2));
+    }
+
+    @Test
+    public void testDistanceEmptyAttributes() {
+        LoadableData data1 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{};
+            }
+        };
+
+        LoadableData data2 = new LoadableData() {
+            @Override
+            public String getClassification() {
+                return "";
+            }
+
+            @Override
+            public void setClassification(String classification) {
+
+            }
+
+            @Override
+            public String[] getAttributesName() {
+                return new String[0];
+            }
+
+            @Override
+            public Color getColor() {
+                return null;
+            }
+
+            @Override
+            public double getDataType(String axes) {
+                return 0;
+            }
+
+            @Override
+            public double[] getAttributes() {
+                return new double[]{};
+            }
+
+            @Override
+            public String[] getStringAttributes() {
+                return new String[]{};
+            }
+        };
+
+        DistanceManhattan distance = new DistanceManhattan();
+        double result = distance.distance(data1, data2);
+        assertEquals(0.0, result, 0.0001);
+    }
+}
\ No newline at end of file