@alloy-js/csharp 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/src/components/Class.js +2 -5
- package/dist/src/components/Declaration.js +1 -2
- package/dist/src/components/Enum.js +2 -4
- package/dist/src/components/Name.js +1 -2
- package/dist/src/components/Namespace.js +1 -2
- package/dist/src/components/Parameters.js +2 -4
- package/dist/src/components/ProjectDirectory.js +2 -4
- package/dist/src/components/Reference.js +1 -2
- package/dist/src/components/SourceFile.js +2 -5
- package/dist/src/components/UsingDirective.js +1 -2
- package/dist/src/components/index.js +1 -2
- package/dist/src/components/stc/index.js +1 -2
- package/dist/src/index.js +1 -2
- package/dist/src/modifiers.js +1 -2
- package/dist/src/name-policy.js +1 -2
- package/dist/src/symbols/csharp-output-symbol.js +1 -2
- package/dist/src/symbols/index.js +1 -2
- package/dist/src/symbols/reference.js +1 -2
- package/dist/src/symbols/scopes.js +1 -2
- package/dist/test/class.test.js +328 -0
- package/dist/test/enum.test.js +179 -0
- package/dist/test/namespace.test.js +82 -0
- package/dist/test/projectdirectory.test.js +132 -0
- package/dist/test/sourcefile.test.js +57 -0
- package/dist/test/using.test.js +139 -0
- package/dist/test/utils.js +64 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -20
- package/temp/api.json +1 -1
- package/tsdoc-metadata.json +1 -1
- package/babel.config.cjs +0 -4
- package/dist/src/components/Class.js.map +0 -1
- package/dist/src/components/Declaration.js.map +0 -1
- package/dist/src/components/Enum.js.map +0 -1
- package/dist/src/components/Name.js.map +0 -1
- package/dist/src/components/Namespace.js.map +0 -1
- package/dist/src/components/Parameters.js.map +0 -1
- package/dist/src/components/ProjectDirectory.js.map +0 -1
- package/dist/src/components/Reference.js.map +0 -1
- package/dist/src/components/SourceFile.js.map +0 -1
- package/dist/src/components/UsingDirective.js.map +0 -1
- package/dist/src/components/index.js.map +0 -1
- package/dist/src/components/stc/index.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/modifiers.js.map +0 -1
- package/dist/src/name-policy.js.map +0 -1
- package/dist/src/symbols/csharp-output-symbol.js.map +0 -1
- package/dist/src/symbols/index.js.map +0 -1
- package/dist/src/symbols/reference.js.map +0 -1
- package/dist/src/symbols/scopes.js.map +0 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { createComponent as _$createComponent, createIntrinsic as _$createIntrinsic } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import * as core from "@alloy-js/core";
|
|
3
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
4
|
+
import { expect, it } from "vitest";
|
|
5
|
+
import * as csharp from "../src/index.js";
|
|
6
|
+
import * as utils from "./utils.js";
|
|
7
|
+
it("declares enum with no members", () => {
|
|
8
|
+
const res = utils.toSourceText(_$createComponent(csharp.Enum, {
|
|
9
|
+
accessModifier: "public",
|
|
10
|
+
name: "TestEnum"
|
|
11
|
+
}));
|
|
12
|
+
expect(res).toBe(coretest.d`
|
|
13
|
+
namespace TestCode
|
|
14
|
+
{
|
|
15
|
+
public enum TestEnum;
|
|
16
|
+
}
|
|
17
|
+
`);
|
|
18
|
+
});
|
|
19
|
+
it("declares enum with members", () => {
|
|
20
|
+
const res = utils.toSourceText(_$createComponent(csharp.Enum, {
|
|
21
|
+
accessModifier: "public",
|
|
22
|
+
name: "TestEnum",
|
|
23
|
+
get children() {
|
|
24
|
+
return [_$createComponent(csharp.EnumMember, {
|
|
25
|
+
name: "One"
|
|
26
|
+
}), ",", _$createIntrinsic("hbr", {}), _$createComponent(csharp.EnumMember, {
|
|
27
|
+
name: "Two"
|
|
28
|
+
})];
|
|
29
|
+
}
|
|
30
|
+
}));
|
|
31
|
+
expect(res).toBe(coretest.d`
|
|
32
|
+
namespace TestCode
|
|
33
|
+
{
|
|
34
|
+
public enum TestEnum
|
|
35
|
+
{
|
|
36
|
+
One,
|
|
37
|
+
Two
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
`);
|
|
41
|
+
});
|
|
42
|
+
it("applies naming policy to enum and members", () => {
|
|
43
|
+
const res = utils.toSourceText(_$createComponent(csharp.Enum, {
|
|
44
|
+
accessModifier: "public",
|
|
45
|
+
name: "testEnum",
|
|
46
|
+
get children() {
|
|
47
|
+
return [_$createComponent(csharp.EnumMember, {
|
|
48
|
+
name: "one"
|
|
49
|
+
}), ",", _$createIntrinsic("hbr", {}), _$createComponent(csharp.EnumMember, {
|
|
50
|
+
name: "two"
|
|
51
|
+
})];
|
|
52
|
+
}
|
|
53
|
+
}));
|
|
54
|
+
expect(res).toBe(coretest.d`
|
|
55
|
+
namespace TestCode
|
|
56
|
+
{
|
|
57
|
+
public enum TestEnum
|
|
58
|
+
{
|
|
59
|
+
One,
|
|
60
|
+
Two
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
`);
|
|
64
|
+
});
|
|
65
|
+
it("can reference things by refkey", () => {
|
|
66
|
+
const enumRK = core.refkey();
|
|
67
|
+
const twoRK = core.refkey();
|
|
68
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
69
|
+
get children() {
|
|
70
|
+
return _$createComponent(csharp.Namespace, {
|
|
71
|
+
name: "TestCode",
|
|
72
|
+
get children() {
|
|
73
|
+
return _$createComponent(csharp.SourceFile, {
|
|
74
|
+
path: "Test.cs",
|
|
75
|
+
get children() {
|
|
76
|
+
return [_$createComponent(csharp.Enum, {
|
|
77
|
+
accessModifier: "public",
|
|
78
|
+
name: "TestEnum",
|
|
79
|
+
refkey: enumRK,
|
|
80
|
+
get children() {
|
|
81
|
+
return [_$createComponent(csharp.EnumMember, {
|
|
82
|
+
name: "One"
|
|
83
|
+
}), ",", _$createIntrinsic("hbr", {}), _$createComponent(csharp.EnumMember, {
|
|
84
|
+
name: "Two",
|
|
85
|
+
refkey: twoRK
|
|
86
|
+
})];
|
|
87
|
+
}
|
|
88
|
+
}), _$createIntrinsic("hbr", {}), enumRK, ";", _$createIntrinsic("hbr", {}), twoRK, ";"];
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}));
|
|
95
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
96
|
+
namespace TestCode
|
|
97
|
+
{
|
|
98
|
+
public enum TestEnum
|
|
99
|
+
{
|
|
100
|
+
One,
|
|
101
|
+
Two
|
|
102
|
+
}
|
|
103
|
+
TestEnum;
|
|
104
|
+
TestEnum.Two;
|
|
105
|
+
}
|
|
106
|
+
`);
|
|
107
|
+
});
|
|
108
|
+
it("can reference things by refkey across files", () => {
|
|
109
|
+
const enumRK = core.refkey();
|
|
110
|
+
const barRK = core.refkey();
|
|
111
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
112
|
+
get children() {
|
|
113
|
+
return _$createComponent(csharp.Namespace, {
|
|
114
|
+
name: "TestCode",
|
|
115
|
+
get children() {
|
|
116
|
+
return [_$createComponent(csharp.SourceFile, {
|
|
117
|
+
path: "Test.cs",
|
|
118
|
+
get children() {
|
|
119
|
+
return [_$createComponent(csharp.Enum, {
|
|
120
|
+
accessModifier: "public",
|
|
121
|
+
name: "TestEnum",
|
|
122
|
+
get children() {
|
|
123
|
+
return [_$createComponent(csharp.EnumMember, {
|
|
124
|
+
name: "One"
|
|
125
|
+
}), ",", _$createIntrinsic("hbr", {}), _$createComponent(csharp.EnumMember, {
|
|
126
|
+
name: "Two"
|
|
127
|
+
})];
|
|
128
|
+
}
|
|
129
|
+
}), _$createIntrinsic("hbr", {}), enumRK, ";", _$createIntrinsic("hbr", {}), barRK, ";"];
|
|
130
|
+
}
|
|
131
|
+
}), _$createComponent(csharp.SourceFile, {
|
|
132
|
+
path: "Other.cs",
|
|
133
|
+
get children() {
|
|
134
|
+
return [_$createComponent(csharp.Enum, {
|
|
135
|
+
accessModifier: "public",
|
|
136
|
+
name: "OtherEnum",
|
|
137
|
+
refkey: enumRK,
|
|
138
|
+
get children() {
|
|
139
|
+
return [_$createComponent(csharp.EnumMember, {
|
|
140
|
+
name: "Foo"
|
|
141
|
+
}), ",", _$createIntrinsic("hbr", {}), _$createComponent(csharp.EnumMember, {
|
|
142
|
+
name: "Bar",
|
|
143
|
+
refkey: barRK
|
|
144
|
+
})];
|
|
145
|
+
}
|
|
146
|
+
}), _$createIntrinsic("hbr", {}), enumRK, ";", _$createIntrinsic("hbr", {}), barRK, ";"];
|
|
147
|
+
}
|
|
148
|
+
})];
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
expect(res.contents[0].path).toBe("Test.cs");
|
|
154
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
155
|
+
namespace TestCode
|
|
156
|
+
{
|
|
157
|
+
public enum TestEnum
|
|
158
|
+
{
|
|
159
|
+
One,
|
|
160
|
+
Two
|
|
161
|
+
}
|
|
162
|
+
OtherEnum;
|
|
163
|
+
OtherEnum.Bar;
|
|
164
|
+
}
|
|
165
|
+
`);
|
|
166
|
+
expect(res.contents[1].path).toBe("Other.cs");
|
|
167
|
+
expect(res.contents[1].contents).toBe(coretest.d`
|
|
168
|
+
namespace TestCode
|
|
169
|
+
{
|
|
170
|
+
public enum OtherEnum
|
|
171
|
+
{
|
|
172
|
+
Foo,
|
|
173
|
+
Bar
|
|
174
|
+
}
|
|
175
|
+
OtherEnum;
|
|
176
|
+
OtherEnum.Bar;
|
|
177
|
+
}
|
|
178
|
+
`);
|
|
179
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import * as core from "@alloy-js/core";
|
|
3
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
4
|
+
import { expect, it } from "vitest";
|
|
5
|
+
import * as csharp from "../src/index.js";
|
|
6
|
+
it("defines multiple namespaces and source files with unique content", () => {
|
|
7
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
8
|
+
get children() {
|
|
9
|
+
return [_$createComponent(csharp.Namespace, {
|
|
10
|
+
name: "Namespace1",
|
|
11
|
+
get children() {
|
|
12
|
+
return [_$createComponent(csharp.SourceFile, {
|
|
13
|
+
path: "Model1.cs",
|
|
14
|
+
get children() {
|
|
15
|
+
return _$createComponent(csharp.Class, {
|
|
16
|
+
accessModifier: "public",
|
|
17
|
+
name: "Model1"
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}), _$createComponent(csharp.SourceFile, {
|
|
21
|
+
path: "Model2.cs",
|
|
22
|
+
get children() {
|
|
23
|
+
return _$createComponent(csharp.Class, {
|
|
24
|
+
accessModifier: "public",
|
|
25
|
+
name: "Model2"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
})];
|
|
29
|
+
}
|
|
30
|
+
}), _$createComponent(csharp.Namespace, {
|
|
31
|
+
name: "Namespace2",
|
|
32
|
+
get children() {
|
|
33
|
+
return [_$createComponent(csharp.SourceFile, {
|
|
34
|
+
path: "Model3.cs",
|
|
35
|
+
get children() {
|
|
36
|
+
return _$createComponent(csharp.Class, {
|
|
37
|
+
accessModifier: "public",
|
|
38
|
+
name: "Model3"
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}), _$createComponent(csharp.SourceFile, {
|
|
42
|
+
path: "Model4.cs",
|
|
43
|
+
get children() {
|
|
44
|
+
return _$createComponent(csharp.Class, {
|
|
45
|
+
accessModifier: "public",
|
|
46
|
+
name: "Model4"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
})];
|
|
50
|
+
}
|
|
51
|
+
})];
|
|
52
|
+
}
|
|
53
|
+
}));
|
|
54
|
+
expect(res.contents[0].path).equals("Model1.cs");
|
|
55
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
56
|
+
namespace Namespace1
|
|
57
|
+
{
|
|
58
|
+
public class Model1;
|
|
59
|
+
}
|
|
60
|
+
`);
|
|
61
|
+
expect(res.contents[1].path).equals("Model2.cs");
|
|
62
|
+
expect(res.contents[1].contents).toBe(coretest.d`
|
|
63
|
+
namespace Namespace1
|
|
64
|
+
{
|
|
65
|
+
public class Model2;
|
|
66
|
+
}
|
|
67
|
+
`);
|
|
68
|
+
expect(res.contents[2].path).equals("Model3.cs");
|
|
69
|
+
expect(res.contents[2].contents).toBe(coretest.d`
|
|
70
|
+
namespace Namespace2
|
|
71
|
+
{
|
|
72
|
+
public class Model3;
|
|
73
|
+
}
|
|
74
|
+
`);
|
|
75
|
+
expect(res.contents[3].path).equals("Model4.cs");
|
|
76
|
+
expect(res.contents[3].contents).toBe(coretest.d`
|
|
77
|
+
namespace Namespace2
|
|
78
|
+
{
|
|
79
|
+
public class Model4;
|
|
80
|
+
}
|
|
81
|
+
`);
|
|
82
|
+
});
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import * as core from "@alloy-js/core";
|
|
3
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
4
|
+
import { expect, it } from "vitest";
|
|
5
|
+
import * as csharp from "../src/index.js";
|
|
6
|
+
it("defines a project directory file with multiple source files", () => {
|
|
7
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
8
|
+
get children() {
|
|
9
|
+
return _$createComponent(csharp.ProjectDirectory, {
|
|
10
|
+
name: "TestProject",
|
|
11
|
+
path: "~/projects",
|
|
12
|
+
version: "0.1.0",
|
|
13
|
+
description: "a test project",
|
|
14
|
+
get children() {
|
|
15
|
+
return _$createComponent(csharp.Namespace, {
|
|
16
|
+
name: "TestCode",
|
|
17
|
+
get children() {
|
|
18
|
+
return [_$createComponent(csharp.SourceFile, {
|
|
19
|
+
path: "Test1.cs",
|
|
20
|
+
get children() {
|
|
21
|
+
return _$createComponent(csharp.Class, {
|
|
22
|
+
accessModifier: "public",
|
|
23
|
+
name: "TestClass1"
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}), _$createComponent(csharp.SourceFile, {
|
|
27
|
+
path: "Test2.cs",
|
|
28
|
+
get children() {
|
|
29
|
+
return _$createComponent(csharp.Class, {
|
|
30
|
+
accessModifier: "public",
|
|
31
|
+
name: "TestClass2"
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
})];
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
const projDir = res.contents[0];
|
|
42
|
+
expect(projDir.path).equals("~/projects/TestProject");
|
|
43
|
+
expect(projDir.contents[0].path).equals("~/projects/TestProject/TestProject.csproj");
|
|
44
|
+
expect(projDir.contents[0].contents).toBe(coretest.d`
|
|
45
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
46
|
+
<PropertyGroup>
|
|
47
|
+
<Version>0.1.0</Version>
|
|
48
|
+
<Description>a test project</Description>
|
|
49
|
+
<TargetFramework>net8.0</TargetFramework>
|
|
50
|
+
</PropertyGroup>
|
|
51
|
+
</Project>
|
|
52
|
+
`);
|
|
53
|
+
const srcDir = projDir.contents[1];
|
|
54
|
+
expect(srcDir.contents[0].path).equals("~/projects/TestProject/src/Test1.cs");
|
|
55
|
+
expect(srcDir.contents[0].contents).toBe(coretest.d`
|
|
56
|
+
namespace TestCode
|
|
57
|
+
{
|
|
58
|
+
public class TestClass1;
|
|
59
|
+
}
|
|
60
|
+
`);
|
|
61
|
+
expect(srcDir.contents[1].path).equals("~/projects/TestProject/src/Test2.cs");
|
|
62
|
+
expect(srcDir.contents[1].contents).toBe(coretest.d`
|
|
63
|
+
namespace TestCode
|
|
64
|
+
{
|
|
65
|
+
public class TestClass2;
|
|
66
|
+
}
|
|
67
|
+
`);
|
|
68
|
+
});
|
|
69
|
+
it("defines a project directory file with multiple source files and a custom TFM", () => {
|
|
70
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
71
|
+
get children() {
|
|
72
|
+
return _$createComponent(csharp.ProjectDirectory, {
|
|
73
|
+
name: "TestProject",
|
|
74
|
+
path: "~/projects",
|
|
75
|
+
version: "0.1.0",
|
|
76
|
+
description: "a test project",
|
|
77
|
+
targetFrameworkMoniker: "netstandard2.1",
|
|
78
|
+
get children() {
|
|
79
|
+
return _$createComponent(csharp.Namespace, {
|
|
80
|
+
name: "TestCode",
|
|
81
|
+
get children() {
|
|
82
|
+
return [_$createComponent(csharp.SourceFile, {
|
|
83
|
+
path: "Test1.cs",
|
|
84
|
+
get children() {
|
|
85
|
+
return _$createComponent(csharp.Class, {
|
|
86
|
+
accessModifier: "public",
|
|
87
|
+
name: "TestClass1"
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}), _$createComponent(csharp.SourceFile, {
|
|
91
|
+
path: "Test2.cs",
|
|
92
|
+
get children() {
|
|
93
|
+
return _$createComponent(csharp.Class, {
|
|
94
|
+
accessModifier: "public",
|
|
95
|
+
name: "TestClass2"
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
})];
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}));
|
|
105
|
+
const projDir = res.contents[0];
|
|
106
|
+
expect(projDir.path).equals("~/projects/TestProject");
|
|
107
|
+
expect(projDir.contents[0].path).equals("~/projects/TestProject/TestProject.csproj");
|
|
108
|
+
expect(projDir.contents[0].contents).toBe(coretest.d`
|
|
109
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
110
|
+
<PropertyGroup>
|
|
111
|
+
<Version>0.1.0</Version>
|
|
112
|
+
<Description>a test project</Description>
|
|
113
|
+
<TargetFramework>netstandard2.1</TargetFramework>
|
|
114
|
+
</PropertyGroup>
|
|
115
|
+
</Project>
|
|
116
|
+
`);
|
|
117
|
+
const srcDir = projDir.contents[1];
|
|
118
|
+
expect(srcDir.contents[0].path).equals("~/projects/TestProject/src/Test1.cs");
|
|
119
|
+
expect(srcDir.contents[0].contents).toBe(coretest.d`
|
|
120
|
+
namespace TestCode
|
|
121
|
+
{
|
|
122
|
+
public class TestClass1;
|
|
123
|
+
}
|
|
124
|
+
`);
|
|
125
|
+
expect(srcDir.contents[1].path).equals("~/projects/TestProject/src/Test2.cs");
|
|
126
|
+
expect(srcDir.contents[1].contents).toBe(coretest.d`
|
|
127
|
+
namespace TestCode
|
|
128
|
+
{
|
|
129
|
+
public class TestClass2;
|
|
130
|
+
}
|
|
131
|
+
`);
|
|
132
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import * as core from "@alloy-js/core";
|
|
3
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
4
|
+
import { expect, it } from "vitest";
|
|
5
|
+
import * as csharp from "../src/index.js";
|
|
6
|
+
it("defines multiple source files with unique content", () => {
|
|
7
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
8
|
+
get children() {
|
|
9
|
+
return _$createComponent(csharp.Namespace, {
|
|
10
|
+
name: "TestCode",
|
|
11
|
+
get children() {
|
|
12
|
+
return [_$createComponent(csharp.SourceFile, {
|
|
13
|
+
path: "Test1.cs",
|
|
14
|
+
get children() {
|
|
15
|
+
return _$createComponent(csharp.Class, {
|
|
16
|
+
accessModifier: "public",
|
|
17
|
+
name: "TestClass1"
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}), _$createComponent(csharp.SourceFile, {
|
|
21
|
+
path: "Test2.cs",
|
|
22
|
+
get children() {
|
|
23
|
+
return _$createComponent(csharp.Class, {
|
|
24
|
+
accessModifier: "public",
|
|
25
|
+
name: "TestClass2"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
})];
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}));
|
|
33
|
+
expect(res.contents[0].path).equals("Test1.cs");
|
|
34
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
35
|
+
namespace TestCode
|
|
36
|
+
{
|
|
37
|
+
public class TestClass1;
|
|
38
|
+
}
|
|
39
|
+
`);
|
|
40
|
+
expect(res.contents[1].path).equals("Test2.cs");
|
|
41
|
+
expect(res.contents[1].contents).toBe(coretest.d`
|
|
42
|
+
namespace TestCode
|
|
43
|
+
{
|
|
44
|
+
public class TestClass2;
|
|
45
|
+
}
|
|
46
|
+
`);
|
|
47
|
+
});
|
|
48
|
+
it("throws when declaring a source file outside a namespace", () => {
|
|
49
|
+
const decl = _$createComponent(core.Output, {
|
|
50
|
+
get children() {
|
|
51
|
+
return _$createComponent(csharp.SourceFile, {
|
|
52
|
+
path: "Test.cs"
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
expect(() => core.render(decl)).toThrow("SourceFile must be declared inside a namespace");
|
|
57
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createComponent as _$createComponent, createIntrinsic as _$createIntrinsic } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import * as core from "@alloy-js/core";
|
|
3
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
4
|
+
import { expect, it } from "vitest";
|
|
5
|
+
import * as csharp from "../src/index.js";
|
|
6
|
+
it("uses a single namespace", () => {
|
|
7
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
8
|
+
get children() {
|
|
9
|
+
return _$createComponent(csharp.Namespace, {
|
|
10
|
+
name: "TestCode",
|
|
11
|
+
get children() {
|
|
12
|
+
return _$createComponent(csharp.SourceFile, {
|
|
13
|
+
path: "Test1.cs",
|
|
14
|
+
using: ["Foo"]
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}));
|
|
20
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
21
|
+
using Foo;
|
|
22
|
+
|
|
23
|
+
namespace TestCode {}
|
|
24
|
+
`);
|
|
25
|
+
});
|
|
26
|
+
it("uses multiple namespaces", () => {
|
|
27
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
28
|
+
get children() {
|
|
29
|
+
return _$createComponent(csharp.Namespace, {
|
|
30
|
+
name: "TestCode",
|
|
31
|
+
get children() {
|
|
32
|
+
return _$createComponent(csharp.SourceFile, {
|
|
33
|
+
path: "Test1.cs",
|
|
34
|
+
using: ["Foo", "Bar.Baz"]
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
41
|
+
using Bar.Baz;
|
|
42
|
+
using Foo;
|
|
43
|
+
|
|
44
|
+
namespace TestCode {}
|
|
45
|
+
`);
|
|
46
|
+
});
|
|
47
|
+
it("adds using statement across namespaces", () => {
|
|
48
|
+
const inputTypeRefkey = core.refkey();
|
|
49
|
+
const outputTypeRefkey = core.refkey();
|
|
50
|
+
const twoValRefkey = core.refkey();
|
|
51
|
+
const params = [{
|
|
52
|
+
name: "BodyParam",
|
|
53
|
+
type: inputTypeRefkey
|
|
54
|
+
}];
|
|
55
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
56
|
+
get namePolicy() {
|
|
57
|
+
return csharp.createCSharpNamePolicy();
|
|
58
|
+
},
|
|
59
|
+
get children() {
|
|
60
|
+
return [_$createComponent(csharp.Namespace, {
|
|
61
|
+
name: "Models",
|
|
62
|
+
get children() {
|
|
63
|
+
return _$createComponent(csharp.SourceFile, {
|
|
64
|
+
path: "Models.cs",
|
|
65
|
+
get children() {
|
|
66
|
+
return [_$createComponent(csharp.Class, {
|
|
67
|
+
accessModifier: "public",
|
|
68
|
+
name: "Input",
|
|
69
|
+
refkey: inputTypeRefkey
|
|
70
|
+
}), _$createIntrinsic("hbr", {}), _$createComponent(csharp.Class, {
|
|
71
|
+
accessModifier: "public",
|
|
72
|
+
name: "Output",
|
|
73
|
+
refkey: outputTypeRefkey
|
|
74
|
+
}), _$createIntrinsic("hbr", {}), _$createComponent(csharp.Enum, {
|
|
75
|
+
accessModifier: "public",
|
|
76
|
+
name: "TestEnum",
|
|
77
|
+
get children() {
|
|
78
|
+
return [_$createComponent(csharp.EnumMember, {
|
|
79
|
+
name: "One"
|
|
80
|
+
}), ",", _$createIntrinsic("hbr", {}), _$createComponent(csharp.EnumMember, {
|
|
81
|
+
name: "Two",
|
|
82
|
+
refkey: twoValRefkey
|
|
83
|
+
})];
|
|
84
|
+
}
|
|
85
|
+
})];
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}), _$createComponent(csharp.Namespace, {
|
|
90
|
+
name: "Client",
|
|
91
|
+
get children() {
|
|
92
|
+
return _$createComponent(csharp.SourceFile, {
|
|
93
|
+
path: "Client.cs",
|
|
94
|
+
using: ["System"],
|
|
95
|
+
get children() {
|
|
96
|
+
return [_$createComponent(csharp.Class, {
|
|
97
|
+
accessModifier: "public",
|
|
98
|
+
name: "Client",
|
|
99
|
+
get children() {
|
|
100
|
+
return _$createComponent(csharp.ClassMethod, {
|
|
101
|
+
accessModifier: "public",
|
|
102
|
+
name: "MethodOne",
|
|
103
|
+
parameters: params,
|
|
104
|
+
returns: outputTypeRefkey
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}), _$createIntrinsic("hbr", {}), twoValRefkey, ";"];
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
})];
|
|
112
|
+
}
|
|
113
|
+
}));
|
|
114
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
115
|
+
namespace Models
|
|
116
|
+
{
|
|
117
|
+
public class Input;
|
|
118
|
+
public class Output;
|
|
119
|
+
public enum TestEnum
|
|
120
|
+
{
|
|
121
|
+
One,
|
|
122
|
+
Two
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
`);
|
|
126
|
+
expect(res.contents[1].contents).toBe(coretest.d`
|
|
127
|
+
using Models;
|
|
128
|
+
using System;
|
|
129
|
+
|
|
130
|
+
namespace Client
|
|
131
|
+
{
|
|
132
|
+
public class Client
|
|
133
|
+
{
|
|
134
|
+
public Output MethodOne(Input bodyParam) {}
|
|
135
|
+
}
|
|
136
|
+
TestEnum.Two;
|
|
137
|
+
}
|
|
138
|
+
`);
|
|
139
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "@alloy-js/core/jsx-runtime";
|
|
2
|
+
import * as core from "@alloy-js/core";
|
|
3
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
4
|
+
import { expect } from "vitest";
|
|
5
|
+
import * as csharp from "../src/index.js";
|
|
6
|
+
export function toSourceText(c) {
|
|
7
|
+
const res = core.render(_$createComponent(core.Output, {
|
|
8
|
+
get namePolicy() {
|
|
9
|
+
return csharp.createCSharpNamePolicy();
|
|
10
|
+
},
|
|
11
|
+
get children() {
|
|
12
|
+
return _$createComponent(csharp.Namespace, {
|
|
13
|
+
name: "TestCode",
|
|
14
|
+
get children() {
|
|
15
|
+
return _$createComponent(csharp.SourceFile, {
|
|
16
|
+
path: "Test.cs",
|
|
17
|
+
children: c
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}));
|
|
23
|
+
const file = findFile(res, "Test.cs");
|
|
24
|
+
return file.contents;
|
|
25
|
+
}
|
|
26
|
+
export function testRender(c) {
|
|
27
|
+
return core.render(_$createComponent(core.Output, {
|
|
28
|
+
get children() {
|
|
29
|
+
return _$createComponent(csharp.Namespace, {
|
|
30
|
+
name: "TestCode",
|
|
31
|
+
children: c
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
export function findFile(res, path) {
|
|
37
|
+
const result = findFileWorker(res, path);
|
|
38
|
+
if (!result) {
|
|
39
|
+
throw new Error("Expected to find file " + path);
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
function findFileWorker(res, path) {
|
|
43
|
+
for (const item of res.contents) {
|
|
44
|
+
if (item.kind === "file") {
|
|
45
|
+
if (item.path.includes(path)) {
|
|
46
|
+
return item;
|
|
47
|
+
}
|
|
48
|
+
continue;
|
|
49
|
+
} else {
|
|
50
|
+
const found = findFileWorker(item, path);
|
|
51
|
+
if (found) {
|
|
52
|
+
return found;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function assertFileContents(res, expectedFiles) {
|
|
60
|
+
for (const [path, contents] of Object.entries(expectedFiles)) {
|
|
61
|
+
const file = findFile(res, path);
|
|
62
|
+
expect(file.contents).toBe(coretest.dedent(contents));
|
|
63
|
+
}
|
|
64
|
+
}
|