Skip to content

Commit

Permalink
Implement source code model copy functionality (#125)
Browse files Browse the repository at this point in the history
* develop tests for go method modifiers

* Fix test

* Implement code model copy function

* Bump version

---------

Co-authored-by: Muntazir Fadhel <mfadhel@hadii.ca>
  • Loading branch information
Zir0-93 and Muntazir Fadhel authored Nov 23, 2024
1 parent 33b1ec5 commit 73e5193
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 14 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<groupId>com.github.hadii-tech</groupId>
<artifactId>clarpse</artifactId>
<version>7.1.2</version>
<version>7.1.3</version>
<packaging>jar</packaging>

<name>${project.groupId}:${project.artifactId}</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,14 @@ public class OOPSourceCodeModel implements Serializable {

private static final long serialVersionUID = 1L;
private static final Logger LOGGER = LogManager.getLogger(OOPSourceCodeModel.class);
private Map<String, Component> components = new HashMap<>();

public OOPSourceCodeModel() {
}

private final Map<String, Component> components = new HashMap<>();
public OOPSourceCodeModel(Map<String, Component> components) {
this.components = new HashMap<String, Component>(components);
}

private Map<String, Component> getComponents() {
return components;
Expand Down Expand Up @@ -62,4 +65,26 @@ public void removeComponent(String cmpUniqueName) {
public Stream<Component> components() {
return components.values().stream();
}

public OOPSourceCodeModel copy() {
return new OOPSourceCodeModel(this.components);
}

/**
* Fetches the current component's parent base component if it exists. This may
* not be the component's direct parent.
*/
public Component parentBaseCmp(String cmpUniqueName) throws IllegalArgumentException {
String currParentClassName = cmpUniqueName;
Optional<Component> parent;
for (parent = this.getComponent(currParentClassName); parent.isPresent()
&& !parent.get().componentType().isBaseComponent(); parent = this.getComponent(currParentClassName)) {
currParentClassName = parent.get().parentUniqueName();
}
if (parent.isPresent()) {
return parent.get();
} else {
throw new IllegalArgumentException("No parent exists for given component: " + cmpUniqueName);
}
}
}
68 changes: 68 additions & 0 deletions src/test/java/com/hadii/test/OOPSourceCodeModelTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.hadii.test;

import static junit.framework.TestCase.assertEquals;

import org.junit.Test;

import com.hadii.clarpse.sourcemodel.Component;
import com.hadii.clarpse.sourcemodel.OOPSourceCodeModel;
import com.hadii.clarpse.sourcemodel.OOPSourceModelConstants.ComponentType;

public class OOPSourceCodeModelTest {

@Test
public void codeModelCopyTest() {
OOPSourceCodeModel original = new OOPSourceCodeModel();
Component component = new Component();
component.setComponentName("Test");
original.insertComponent(component);
OOPSourceCodeModel copy = original.copy();
assertEquals(true, copy.size() == original.size());
assertEquals(1, copy.size());
}

@Test
public void codeModelTrueCopyTest() {
OOPSourceCodeModel original = new OOPSourceCodeModel();
Component component = new Component();
component.setComponentName("Test");
original.insertComponent(component);
OOPSourceCodeModel copy = original.copy();
copy.removeComponent(component.uniqueName());
assertEquals(false, copy.size() == original.size());
assertEquals(1, original.size());
assertEquals(0, copy.size());
}

@Test
public void parentBaseCmpTest() {
OOPSourceCodeModel codeModel = new OOPSourceCodeModel();
Component testComponent = new Component();
testComponent.setComponentName("Test");
testComponent.insertChildComponent("ChildA");
testComponent.setComponentType(ComponentType.CLASS);

Component componentA = new Component();
componentA.setComponentName("Test.ChildA");
componentA.insertChildComponent("ChildB");
componentA.setComponentType(ComponentType.METHOD);

Component componentB = new Component();
componentB.setComponentName("Test.ChildA.ChildB");
componentB.setComponentType(ComponentType.LOCAL);

codeModel.insertComponent(testComponent);
codeModel.insertComponent(componentA);
codeModel.insertComponent(componentB);

assertEquals(testComponent, codeModel.parentBaseCmp(componentB.uniqueName()));
}

@Test(expected = IllegalArgumentException.class)
public void parentBaseCmpTestTThrows() {
OOPSourceCodeModel childCmp = new OOPSourceCodeModel();
Component component = new Component();
component.setComponentName("Test");
childCmp.parentBaseCmp("Test");
}
}
16 changes: 7 additions & 9 deletions src/test/java/com/hadii/test/UtilsTest.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
package com.hadii.test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;

import org.junit.Test;

import com.hadii.clarpse.CommonDir;
import com.hadii.clarpse.ResolvedRelativePath;
import com.hadii.clarpse.compiler.ProjectFile;
import com.hadii.clarpse.reference.SimpleTypeReference;
import com.hadii.clarpse.sourcemodel.Component;
import com.hadii.clarpse.sourcemodel.OOPSourceModelConstants;
import com.hadii.clarpse.sourcemodel.Package;
import org.junit.Test;

import java.io.FileNotFoundException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;

public class UtilsTest {

Expand Down Expand Up @@ -121,7 +119,7 @@ public void testCommonDirWithRootDirProvided() throws Exception {
public void testCommonDirWithEmptyDirProvided() throws Exception {
String dirA = "";
String dirB = "/test/src/cuppy";
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
assertThrows(IllegalArgumentException.class, () -> {
new CommonDir(dirA, dirB).value();
});
}
Expand All @@ -134,7 +132,7 @@ public void testCommonDirWithSingleFilePath() throws Exception {

@Test
public void testProjectFileThrowsOnAbsolutePath() {
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
assertThrows(IllegalArgumentException.class, () -> {
new ProjectFile("../src/test", "");
});
}
Expand Down
1 change: 0 additions & 1 deletion src/test/java/com/hadii/test/go/AccessModifiersTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.hadii.clarpse.compiler.ClarpseProject;
import com.hadii.clarpse.compiler.Lang;
import com.hadii.clarpse.compiler.ProjectFile;
import com.hadii.clarpse.compiler.ProjectFiles;
import com.hadii.clarpse.sourcemodel.OOPSourceCodeModel;
import org.junit.Test;

Expand Down
1 change: 0 additions & 1 deletion src/test/java/com/hadii/test/go/GoTestBase.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.hadii.test.go;

import com.hadii.clarpse.compiler.Lang;
import com.hadii.clarpse.compiler.ProjectFile;
import com.hadii.clarpse.compiler.ProjectFiles;
import org.junit.Before;
Expand Down
1 change: 0 additions & 1 deletion src/test/java/com/hadii/test/java/CodeFragmentTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class CodeFragmentTest {

Expand Down

0 comments on commit 73e5193

Please sign in to comment.