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