Skip to content

Commit e1a12ca

Browse files
Hendrik Schmitzdrik98
authored andcommitted
fix(ts-model-api): new single childs can have correct concept
1 parent 87b73e4 commit e1a12ca

File tree

6 files changed

+75
-24
lines changed

6 files changed

+75
-24
lines changed

model-api-gen-gradle-test/typescript-generation/package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Note: Ideally, this test should be placed in the ts-model-api module.
3+
* However, due to the complexity of testing the code without the context
4+
* of the generated languages, we will conduct the test here for now.
5+
*/
6+
7+
import {
8+
BaseCommentAttribute,
9+
C_BaseCommentAttribute,
10+
C_BaseConcept,
11+
C_TypeAnnotated,
12+
isOfConcept_BaseConcept,
13+
isOfConcept_TypeAnnotated,
14+
} from "../build/typescript_src/L_jetbrains_mps_lang_core";
15+
import { useFakeNode } from "./test-helpers";
16+
17+
const NODE_DATA_WITH_SINGLE_CHILD_ACCESSOR = {
18+
root: {
19+
children: [
20+
{
21+
concept: C_BaseCommentAttribute.getUID(),
22+
role: "withSingleChildAccessor",
23+
properties: {
24+
name: "aName",
25+
},
26+
},
27+
],
28+
},
29+
};
30+
31+
test("new element can be added to SingleChildAccessor when provided the correct base concept", () => {
32+
const { typedNode } = useFakeNode<BaseCommentAttribute>(
33+
"withSingleChildAccessor",
34+
NODE_DATA_WITH_SINGLE_CHILD_ACCESSOR
35+
);
36+
const childNode = typedNode.commentedNode.setNew(C_BaseConcept);
37+
expect(isOfConcept_BaseConcept(childNode)).toBeTruthy();
38+
});
39+
40+
test("new element can be added to SingleChildAccessor when provided a sub concept", () => {
41+
const { typedNode } = useFakeNode<BaseCommentAttribute>(
42+
"withSingleChildAccessor",
43+
NODE_DATA_WITH_SINGLE_CHILD_ACCESSOR
44+
);
45+
const childNode = typedNode.commentedNode.setNew(C_TypeAnnotated);
46+
expect(isOfConcept_TypeAnnotated(childNode)).toBeTruthy();
47+
expect(isOfConcept_BaseConcept(childNode)).toBeTruthy();
48+
});

model-api-gen-gradle-test/typescript-generation/src/test-helpers.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { org } from "@modelix/model-client";
2-
import { LanguageRegistry } from "@modelix/ts-model-api";
2+
import { ITypedNode, LanguageRegistry } from "@modelix/ts-model-api";
33
import { registerLanguages } from "../build/typescript_src";
44

55
const DEFAULT_NODE_DATA = {
@@ -31,8 +31,8 @@ export function useFakeRootNode(nodeData: object = DEFAULT_NODE_DATA) {
3131
return rootNode.getChildren(role)[0];
3232
}
3333

34-
function getTypedNode(role?: string) {
35-
return LanguageRegistry.INSTANCE.wrapNode(getUntypedNode(role));
34+
function getTypedNode<T extends ITypedNode>(role?: string) {
35+
return LanguageRegistry.INSTANCE.wrapNode(getUntypedNode(role)) as T;
3636
}
3737

3838
return {
@@ -42,11 +42,14 @@ export function useFakeRootNode(nodeData: object = DEFAULT_NODE_DATA) {
4242
};
4343
}
4444

45-
export function useFakeNode(role?: string, nodeData?: object) {
45+
export function useFakeNode<T extends ITypedNode>(
46+
role?: string,
47+
nodeData?: object
48+
) {
4649
const { getUntypedNode, getTypedNode, rootNode } = useFakeRootNode(nodeData);
4750
return {
4851
rootNode,
4952
untypedNode: getUntypedNode(role),
50-
typedNode: getTypedNode(role),
53+
typedNode: getTypedNode<T>(role),
5154
};
5255
}

model-api-gen-gradle-test/vue-integration/package-lock.json

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ts-model-api/src/ChildrenAccessor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ export class SingleChildAccessor<ChildT extends ITypedNode> extends ChildrenAcce
4444
return children.length === 0 ? undefined : children[0]
4545
}
4646

47-
public setNew(): ChildT {
47+
public setNew(subconcept?: IConceptJS | undefined): ChildT {
4848
const existing = this.get();
4949
if (existing !== undefined) {
5050
existing.remove();
5151
}
52-
return this.wrapChild(this.parentNode.addNewChild(this.role, 0, undefined))
52+
return this.wrapChild(this.parentNode.addNewChild(this.role, 0, subconcept))
5353
}
5454
}

vue-model-api/package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)