Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ jobs:
run: ./gradlew clean build

- name: Archive test results
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
if: always() # run even if build failed
with:
name: test-results
path: build/reports

- name: Archive libs
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: libs
path: build/libs
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ jobs:
run: ./gradlew jreleaserFullRelease

- name: Archive artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: artifacts
path: |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class DictionaryProcessor implements MergingProcessor {

@Override
public void process(Node target, Node source, NodeProvider nodeProvider, NodeResolver nodeResolver) {
if ((source.getKeyType() != null || source.getValueType() != null) && !Types.isDictionaryType(source.getType())) {
if ((source.getKeyType() != null || source.getValueType() != null) && !Types.isDictionaryType(source.getType(), nodeProvider)) {
throw new IllegalArgumentException("Source node with keyType or valueType must have a Dictionary type");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class ListProcessor implements MergingProcessor {
@Override
public void process(Node target, Node source, NodeProvider nodeProvider, NodeResolver nodeResolver) {

if (source.getItemType() != null && !Types.isListType(source.getType())) {
if (source.getItemType() != null && !Types.isListType(source.getType(), nodeProvider)) {
throw new IllegalArgumentException("Source node with itemType must have a List type");
}

Expand Down
8 changes: 4 additions & 4 deletions src/main/java/blue/language/utils/Types.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,12 +113,12 @@ public static boolean isBooleanType(Node typeNode, NodeProvider nodeProvider) {
}


public static boolean isListType(Node typeNode) {
return typeNode.getBlueId() != null && LIST_TYPE_BLUE_ID.equals(typeNode.getBlueId());
public static boolean isListType(Node typeNode, NodeProvider nodeProvider) {
return isSubtype(typeNode, new Node().blueId(LIST_TYPE_BLUE_ID), nodeProvider);
}

public static boolean isDictionaryType(Node typeNode) {
return typeNode.getBlueId() != null && DICTIONARY_TYPE_BLUE_ID.equals(typeNode.getBlueId());
public static boolean isDictionaryType(Node typeNode, NodeProvider nodeProvider) {
return isSubtype(typeNode, new Node().blueId(DICTIONARY_TYPE_BLUE_ID), nodeProvider);
}

}
59 changes: 59 additions & 0 deletions src/test/java/blue/language/merge/MergerIntegrationTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package blue.language.merge;

import blue.language.Blue;
import blue.language.model.Node;
import blue.language.provider.BasicNodeProvider;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class MergerIntegrationTest {

private BasicNodeProvider nodeProvider;

@BeforeEach
public void setup() {
nodeProvider = new BasicNodeProvider();
}

@Test
public void shouldBeIdempotentWhenResolvingTheSameNodeTwice() {
nodeProvider.addSingleDocs(
"name: Document Anchor\n" +
"template:\n" +
" description: Optional Blue document template.\n"
);

nodeProvider.addSingleDocs(
"name: Document Anchors\n" +
"type: Dictionary\n" +
"keyType: Text\n" +
"valueType:\n" +
" blueId: " + nodeProvider.getBlueIdByName("Document Anchor") + "\n"
);

nodeProvider.addSingleDocs(
"name: My Entry\n" +
"type:\n" +
" blueId: " + nodeProvider.getBlueIdByName("Document Anchors") + "\n" +
"anchor1:\n" +
" type:\n" +
" blueId: " + nodeProvider.getBlueIdByName("Document Anchor") + "\n" +
"anchor2:\n" +
" type:\n" +
" blueId: " + nodeProvider.getBlueIdByName("Document Anchor") + "\n"
);

Blue blue = new Blue(nodeProvider);

Node myEntry = nodeProvider.getNodeByName("My Entry");

Node resolvedNode = blue.resolve(myEntry);
Node resolvedNode2 = blue.resolve(resolvedNode);

assertEquals(blue.nodeToJson(resolvedNode), blue.nodeToJson(resolvedNode2));
}
}


Loading