From 36abdfd0f8db89c1475f74513cbeaaaf9463cb1c Mon Sep 17 00:00:00 2001
From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de>
Date: Thu, 9 Feb 2023 08:21:02 +0100
Subject: [PATCH] Proper testing using Juniper, Java17 and Xtext.

---
 .../core/arff/io/ArffPropertiesReader.java    | 14 +++++
 .../core/arff/ArffPropertiesReaderTest.java   | 52 +++++++++++++++++--
 .../evoal/core/arff/utils/LanguageUtils.java  |  3 +-
 .../src/test/resources/simple/input.arff      |  8 +--
 .../test/resources/simple/specification.ddl   |  6 +++
 src/core/de.evoal.core.main/pom.xml           |  4 +-
 src/core/de.evoal.core.plugin/pom.xml         |  9 +---
 src/core/de.evoal.releng.parent/pom.xml       |  2 +-
 8 files changed, 74 insertions(+), 24 deletions(-)

diff --git a/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/io/ArffPropertiesReader.java b/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/io/ArffPropertiesReader.java
index ac6580d2..d30a2b96 100644
--- a/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/io/ArffPropertiesReader.java
+++ b/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/io/ArffPropertiesReader.java
@@ -104,6 +104,20 @@ public class ArffPropertiesReader implements PropertiesReader {
                     properties.put(pSpec, (int)instance.toDoubleArray()[index]);
                     return properties;
                 };
+            } else if(RepresentationType.STRING.equals(rType)) {
+                toProperties = (instance, template, builder) -> {
+                    if(instance.isMissing(index)) {
+                        return decoratee.apply(instance, template, builder);
+                    }
+
+                    // add current specification to builder and let the chain complete it
+                    builder.add(pSpec);
+                    final Properties properties = decoratee.apply(instance, template, builder);
+
+                    // set value and return
+                    properties.put(pSpec, instance.stringValue(index));
+                    return properties;
+                };
             } else {
                 throw new RuntimeException("Not yet supported: " + rType);
             }
diff --git a/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/ArffPropertiesReaderTest.java b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/ArffPropertiesReaderTest.java
index 96632998..6d543b36 100644
--- a/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/ArffPropertiesReaderTest.java
+++ b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/ArffPropertiesReaderTest.java
@@ -1,10 +1,14 @@
 package de.evoal.core.arff;
 
+import de.evoal.core.api.properties.Properties;
 import de.evoal.core.api.properties.PropertiesSpecification;
+import de.evoal.core.api.properties.PropertySpecification;
 import de.evoal.core.api.properties.io.PropertiesReader;
 import de.evoal.core.api.utils.EvoalIOException;
+import de.evoal.core.arff.io.ArffPropertiesReader;
 import de.evoal.core.arff.utils.LanguageUtils;
 import de.evoal.core.arff.utils.ResourceUtils;
+import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.ddl.DataDescriptionModel;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -21,14 +25,52 @@ public class ArffPropertiesReaderTest {
         final Path temporary = Files.createTempDirectory("evoal");
         final File temporaryFolder = temporary.toFile();
         ResourceUtils.unpack(getClass().getClassLoader(), temporaryFolder, "simple/input.arff", "simple/specification.ddl");
-//        final DataDescriptionModel model = LanguageUtils.load(new File(temporaryFolder, "simple/specification.ddl"), DataDescriptionModel.class);
-//        final PropertiesSpecification specification = toSpecification(model);
 
+        final File toLoad = new File(temporaryFolder, "simple/specification.ddl");
+        final DataDescriptionModel model = LanguageUtils.load(toLoad, DataDescriptionModel.class);
+        final PropertiesSpecification specification = toSpecification(model);
 
-//        final PropertiesReader testee = new ArffPropertiesReader()
-//                        .init(new File(temporaryFolder, "input.arff"), specification);
+        final PropertiesReader testee = new ArffPropertiesReader()
+                        .init(new File(temporaryFolder, "simple/input.arff"), specification);
 
-//        Assertions.assertTrue(testee.hasNext());
+        {
+            Assertions.assertTrue(testee.hasNext());
+            final Properties p = testee.next();
+            Assertions.assertEquals(5.1, p.get(new PropertySpecification("sepallength", null)));
+            Assertions.assertEquals(3.5, p.get(new PropertySpecification("sepalwidth", null)));
+            Assertions.assertEquals(1.4, p.get(new PropertySpecification("petallength", null)));
+            Assertions.assertEquals(0.2, p.get(new PropertySpecification("petalwidth", null)));
+            Assertions.assertEquals("Iris-setosa", p.get(new PropertySpecification("class", null)));
+        }
+        {
+            Assertions.assertTrue(testee.hasNext());
+            final Properties p = testee.next();
+            Assertions.assertEquals(4.9, p.get(new PropertySpecification("sepallength", null)));
+            Assertions.assertEquals(3.0, p.get(new PropertySpecification("sepalwidth", null)));
+            Assertions.assertEquals(1.4, p.get(new PropertySpecification("petallength", null)));
+            Assertions.assertEquals(0.2, p.get(new PropertySpecification("petalwidth", null)));
+            Assertions.assertEquals("Iris-setosa", p.get(new PropertySpecification("class", null)));
+        }
+        {
+            Assertions.assertTrue(testee.hasNext());
+            final Properties p = testee.next();
+            Assertions.assertEquals(4.7, p.get(new PropertySpecification("sepallength", null)));
+            Assertions.assertEquals(3.2, p.get(new PropertySpecification("sepalwidth", null)));
+            Assertions.assertEquals(1.3, p.get(new PropertySpecification("petallength", null)));
+            Assertions.assertEquals(0.2, p.get(new PropertySpecification("petalwidth", null)));
+            Assertions.assertEquals("Iris-setosa", p.get(new PropertySpecification("class", null)));
+        }
+        {
+            Assertions.assertTrue(testee.hasNext());
+            final Properties p = testee.next();
+            Assertions.assertEquals(4.6, p.get(new PropertySpecification("sepallength", null)));
+            Assertions.assertEquals(3.1, p.get(new PropertySpecification("sepalwidth", null)));
+            Assertions.assertEquals(1.5, p.get(new PropertySpecification("petallength", null)));
+            Assertions.assertEquals(0.2, p.get(new PropertySpecification("petalwidth", null)));
+            Assertions.assertEquals("Iris-setosa", p.get(new PropertySpecification("class", null)));
+        }
+
+        Assertions.assertFalse(testee.hasNext());
     }
 
     private PropertiesSpecification toSpecification(final DataDescriptionModel model) {
diff --git a/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/LanguageUtils.java b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/LanguageUtils.java
index 1d1bd18d..367a2db4 100644
--- a/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/LanguageUtils.java
+++ b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/LanguageUtils.java
@@ -27,11 +27,12 @@ public class LanguageUtils {
     public static <T extends EObject> T load(final @NonNull File path, final Class<T> cl) {
         loadPackages();
         
-        final URI modelURI = URI.createPlatformResourceURI(path.toString(), true);
+        final URI modelURI = URI.createFileURI(path.toString());
         return load(modelURI, cl);
     }
 
     private static void loadPackages() {
+        DdlPackage.eINSTANCE.getName();
         DataDescriptionLanguageStandaloneSetup.doSetup();
     }
 
diff --git a/src/core/de.evoal.core.arff/src/test/resources/simple/input.arff b/src/core/de.evoal.core.arff/src/test/resources/simple/input.arff
index 5d36ac62..5a6239eb 100644
--- a/src/core/de.evoal.core.arff/src/test/resources/simple/input.arff
+++ b/src/core/de.evoal.core.arff/src/test/resources/simple/input.arff
@@ -17,10 +17,4 @@
 5.1,3.5,1.4,0.2,Iris-setosa
 4.9,3.0,1.4,0.2,Iris-setosa
 4.7,3.2,1.3,0.2,Iris-setosa
-4.6,3.1,1.5,0.2,Iris-setosa
-5.0,3.6,1.4,0.2,Iris-setosa
-5.4,3.9,1.7,0.4,Iris-setosa
-4.6,3.4,1.4,0.3,Iris-setosa
-5.0,3.4,1.5,0.2,Iris-setosa
-4.4,2.9,1.4,0.2,Iris-setosa
-4.9,3.1,1.5,0.1,Iris-setosa
\ No newline at end of file
+4.6,3.1,1.5,0.2,Iris-setosa
\ No newline at end of file
diff --git a/src/core/de.evoal.core.arff/src/test/resources/simple/specification.ddl b/src/core/de.evoal.core.arff/src/test/resources/simple/specification.ddl
index e69de29b..03c350f9 100644
--- a/src/core/de.evoal.core.arff/src/test/resources/simple/specification.ddl
+++ b/src/core/de.evoal.core.arff/src/test/resources/simple/specification.ddl
@@ -0,0 +1,6 @@
+data:
+    cardinal real 'sepallength';
+    cardinal real 'sepalwidth';
+    cardinal real 'petallength';
+    cardinal real 'petalwidth';
+    nominal string 'class';
\ No newline at end of file
diff --git a/src/core/de.evoal.core.main/pom.xml b/src/core/de.evoal.core.main/pom.xml
index 9cbf74e5..d9962933 100644
--- a/src/core/de.evoal.core.main/pom.xml
+++ b/src/core/de.evoal.core.main/pom.xml
@@ -335,8 +335,8 @@
 						<arg>io.jenetics.base/io.jenetics.internal.util=de.evoal.core.main</arg>
 						<arg>--add-exports</arg>
 						<arg>io.jenetics.base/io.jenetics.internal.collection=de.evoal.core.main</arg>
-						<arg>--add-exports</arg>
-						<arg>org.eclipse.xtext.util/org.eclipse.xtext.util=de.evoal.core.main</arg>
+						<!--<arg>- -add-exports</arg>
+						<arg>org.eclipse.xtext.util/org.eclipse.xtext.util=de.evoal.core.main</arg>-->
 					</compilerArgs>
 					<forceJavacCompilerUse>true</forceJavacCompilerUse>
 				</configuration>
diff --git a/src/core/de.evoal.core.plugin/pom.xml b/src/core/de.evoal.core.plugin/pom.xml
index d1f4ebb3..1ed2b04c 100644
--- a/src/core/de.evoal.core.plugin/pom.xml
+++ b/src/core/de.evoal.core.plugin/pom.xml
@@ -92,14 +92,7 @@
 		<dependency>
 			<groupId>org.eclipse.xtext</groupId>
 			<artifactId>org.eclipse.xtext</artifactId>
-			<version>2.29.0</version>
-			<scope>provided</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>org.eclipse.xtext</groupId>
-			<artifactId>org.eclipse.xtext.util</artifactId>
-			<version>2.29.0</version>
+			<version>2.29.1</version>
 			<scope>provided</scope>
 		</dependency>
 
diff --git a/src/core/de.evoal.releng.parent/pom.xml b/src/core/de.evoal.releng.parent/pom.xml
index 5b25f12a..3b204f2d 100644
--- a/src/core/de.evoal.releng.parent/pom.xml
+++ b/src/core/de.evoal.releng.parent/pom.xml
@@ -127,7 +127,7 @@
             <dependency>
                 <groupId>org.eclipse.xtext</groupId>
                 <artifactId>org.eclipse.xtext</artifactId>
-                <version>2.29.0</version>
+                <version>2.29.1</version>
                 <scope>provided</scope>
             </dependency>
 
-- 
GitLab