From 2a22efc0d86b8835867a5c54b96c2ddcc9bd70ae Mon Sep 17 00:00:00 2001
From: lfrenot <lfrenot@LAPTOP-2HO88BUG.localdomain>
Date: Thu, 23 Jun 2022 17:50:04 +0200
Subject: [PATCH] premier commit branche mutation

---
 .../mutation/AddAttributeMutation.java        | 36 +++++++++++
 .../mutation/AddMutation.java                 |  9 +++
 .../mutation/AttributeMutation.java           | 54 ++++++++++++++++
 .../mutation/AvatarMutation.java              |  8 +++
 .../mutation/BlockStructMutation.java         | 16 +++++
 .../mutation/MdAttributeMutation.java         | 23 +++++++
 .../avatartranslator/mutation/MdMutation.java |  9 +++
 .../mutation/RmAttributeMutation.java         | 25 ++++++++
 .../avatartranslator/mutation/RmMutation.java |  9 +++
 .../avatartranslator/AvatarMutationTests.java | 62 +++++++++++++++++++
 10 files changed, 251 insertions(+)
 create mode 100644 src/main/java/avatartranslator/mutation/AddAttributeMutation.java
 create mode 100644 src/main/java/avatartranslator/mutation/AddMutation.java
 create mode 100644 src/main/java/avatartranslator/mutation/AttributeMutation.java
 create mode 100644 src/main/java/avatartranslator/mutation/AvatarMutation.java
 create mode 100644 src/main/java/avatartranslator/mutation/BlockStructMutation.java
 create mode 100644 src/main/java/avatartranslator/mutation/MdAttributeMutation.java
 create mode 100644 src/main/java/avatartranslator/mutation/MdMutation.java
 create mode 100644 src/main/java/avatartranslator/mutation/RmAttributeMutation.java
 create mode 100644 src/main/java/avatartranslator/mutation/RmMutation.java
 create mode 100644 ttool/src/test/java/avatartranslator/AvatarMutationTests.java

diff --git a/src/main/java/avatartranslator/mutation/AddAttributeMutation.java b/src/main/java/avatartranslator/mutation/AddAttributeMutation.java
new file mode 100644
index 0000000000..0d5214e4e4
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/AddAttributeMutation.java
@@ -0,0 +1,36 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+
+
+/**
+ * Class AddAttributeMutation
+ * Mutation that adds an attribute to a block
+ * Creation: 23/06/2022
+ *
+ * @author Léon FRENOT
+ * @version 1.0 23/06/2022
+ */
+public class AddAttributeMutation extends AttributeMutation implements AddMutation {
+
+    public AddAttributeMutation(String _name, String _type, String _blockName) {
+        setType(_type);
+        setName(_name);
+        setBlockName(_blockName);
+    }
+
+    public AvatarAttribute createElement(AvatarSpecification _avspec) {
+        AvatarType type = getType();
+        AvatarBlock block = getBlock(_avspec);
+        AvatarAttribute aa = new AvatarAttribute(getName(), type, block, null);
+        if(hasInitialValue()) aa.setInitialValue(getInitialValue());
+        return aa;
+    }
+
+    public void apply(AvatarSpecification _avspec) {
+        AvatarAttribute aa = createElement(_avspec);
+        AvatarBlock block = getBlock(_avspec);
+        block.addAttribute(aa);
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/mutation/AddMutation.java b/src/main/java/avatartranslator/mutation/AddMutation.java
new file mode 100644
index 0000000000..93af5b2009
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/AddMutation.java
@@ -0,0 +1,9 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+
+public interface AddMutation {
+
+    AvatarElement createElement(AvatarSpecification _avspec);
+
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/mutation/AttributeMutation.java b/src/main/java/avatartranslator/mutation/AttributeMutation.java
new file mode 100644
index 0000000000..7a6516e81c
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/AttributeMutation.java
@@ -0,0 +1,54 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+import java.util.List;
+
+public abstract class AttributeMutation extends BlockStructMutation {
+
+    private String type;
+
+    private String name;
+
+    private String initialValue;
+
+    private Boolean hasInitialValue = false;
+
+    public void setName(String _name) {
+        name = _name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setType(String _type) {
+        type = _type;
+    }
+
+    public AvatarType getType() {
+        return AvatarType.getType(type);
+    }
+
+    public void setInitialValue(String _initialValue) {
+        hasInitialValue = true;
+        initialValue = _initialValue;
+    }
+
+    public Boolean hasInitialValue() {
+        return hasInitialValue;
+    }
+
+    public String getInitialValue() {
+        if(hasInitialValue()) return initialValue;
+        return null;
+    }
+
+    public AvatarAttribute findElement(AvatarSpecification _avspec) {
+        AvatarBlock block = getBlock(_avspec);
+        List<AvatarAttribute> attr = block.getAttributes();
+        for(AvatarAttribute aa : attr) {
+            if(aa.getName().equals(this.getName())) return aa;
+        }
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/mutation/AvatarMutation.java b/src/main/java/avatartranslator/mutation/AvatarMutation.java
new file mode 100644
index 0000000000..d77b2360e1
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/AvatarMutation.java
@@ -0,0 +1,8 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+
+public abstract class AvatarMutation {
+
+    public abstract void apply(AvatarSpecification _avspec);
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/mutation/BlockStructMutation.java b/src/main/java/avatartranslator/mutation/BlockStructMutation.java
new file mode 100644
index 0000000000..3afb66c96c
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/BlockStructMutation.java
@@ -0,0 +1,16 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+
+public abstract class BlockStructMutation extends AvatarMutation {
+
+    private String blockName;
+
+    public void setBlockName(String _blockName) {
+        blockName = _blockName;
+    }
+
+    public AvatarBlock getBlock(AvatarSpecification _avspec) {
+        return _avspec.getBlockWithName(blockName);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/mutation/MdAttributeMutation.java b/src/main/java/avatartranslator/mutation/MdAttributeMutation.java
new file mode 100644
index 0000000000..eb157a4db7
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/MdAttributeMutation.java
@@ -0,0 +1,23 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+
+import myutil.TraceManager;
+
+public class MdAttributeMutation extends AttributeMutation implements MdMutation {
+
+    public MdAttributeMutation(String _name, String _initialValue, String _blockName) {
+        setName(_name);
+        setInitialValue(_initialValue);
+        setBlockName(_blockName);
+    }
+
+    public void apply(AvatarSpecification _avspec) {
+        AvatarAttribute aa = findElement(_avspec);
+        if(aa == null) {
+            TraceManager.addDev("Attribut inexistant");
+            return;
+        }
+        aa.setInitialValue(this.getInitialValue());
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/mutation/MdMutation.java b/src/main/java/avatartranslator/mutation/MdMutation.java
new file mode 100644
index 0000000000..bb61796c94
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/MdMutation.java
@@ -0,0 +1,9 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+
+public interface MdMutation {
+
+    AvatarElement findElement(AvatarSpecification _avspec);
+
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/mutation/RmAttributeMutation.java b/src/main/java/avatartranslator/mutation/RmAttributeMutation.java
new file mode 100644
index 0000000000..703b42a905
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/RmAttributeMutation.java
@@ -0,0 +1,25 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+import java.util.List;
+
+import myutil.TraceManager;
+
+public class RmAttributeMutation extends AttributeMutation implements RmMutation {
+
+    public RmAttributeMutation(String _name, String _blockName) {
+        setName(_name);
+        setBlockName(_blockName);
+    }
+
+    public void apply(AvatarSpecification _avspec) {
+        AvatarBlock block = getBlock(_avspec);
+        List<AvatarAttribute> attr = block.getAttributes();
+        AvatarAttribute aa = findElement(_avspec);
+        if(aa == null) {
+            TraceManager.addDev("Attribut inexistant");
+            return;
+        }
+        attr.remove(aa);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/avatartranslator/mutation/RmMutation.java b/src/main/java/avatartranslator/mutation/RmMutation.java
new file mode 100644
index 0000000000..9f647ec4b6
--- /dev/null
+++ b/src/main/java/avatartranslator/mutation/RmMutation.java
@@ -0,0 +1,9 @@
+package avatartranslator.mutation;
+
+import avatartranslator.*;
+
+public interface RmMutation {
+
+    AvatarElement findElement(AvatarSpecification _avspec);
+
+}
\ No newline at end of file
diff --git a/ttool/src/test/java/avatartranslator/AvatarMutationTests.java b/ttool/src/test/java/avatartranslator/AvatarMutationTests.java
new file mode 100644
index 0000000000..75e30f0efe
--- /dev/null
+++ b/ttool/src/test/java/avatartranslator/AvatarMutationTests.java
@@ -0,0 +1,62 @@
+package avatartranslator;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertTrue;
+
+import myutil.TraceManager;
+import org.junit.Before;
+import org.junit.Test;
+
+import avatartranslator.*;
+import avatartranslator.mutation.*;
+import java.util.List;
+
+public class AvatarMutationTests {
+
+    private AvatarSpecification as;
+    private AvatarBlock block;
+
+    @Before
+    public void test() {
+        as = new AvatarSpecification("avatarspecification", null);
+        block = new AvatarBlock("block", as, null);
+        as.addBlock(block);
+        AvatarAttribute x1 = new AvatarAttribute("x", AvatarType.INTEGER, block, null);
+        block.addAttribute(x1);
+        x1.setInitialValue("10");
+    }
+
+    @Test
+    public void testAddAttribute() {
+        AddAttributeMutation mutation = new AddAttributeMutation("y", "bool", "block");
+        assertTrue(mutation.getType() == AvatarType.BOOLEAN);
+        assertTrue(mutation.getName().equals("y"));
+        assertTrue(mutation.getBlock(as) == block);
+
+        AttributeMutation mutation2 = new AddAttributeMutation("z", "int", "block");
+        mutation2.setInitialValue("5");
+        mutation.apply(as);
+        mutation2.apply(as);
+        assertTrue(block.getAttributes().size() == 3);
+        AvatarAttribute attr1 = block.getAttribute(1);
+        AvatarAttribute attr2 = block.getAttribute(2);
+        assertTrue(attr2.getInitialValueInInt() == 5);
+    }
+
+    @Test
+    public void testRmAttribute() {
+        AttributeMutation mutation = new RmAttributeMutation("x", "block");
+        mutation.apply(as);
+        assertTrue(block.getAttributes().size() == 0);
+        AttributeMutation mutation2 = new RmAttributeMutation("x", "block");
+        mutation.apply(as);
+    }
+
+    @Test
+    public void testMdAttribute() {
+        assertTrue(block.getAttribute(0).getInitialValue().equals("10"));
+        AttributeMutation mutation = new MdAttributeMutation("x", "42", "block");
+        mutation.apply(as);
+        assertTrue(block.getAttribute(0).getInitialValue().equals("42"));
+    }
+}
\ No newline at end of file
-- 
GitLab