@alloy-js/csharp 0.1.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/LICENSE.txt +7 -0
- package/api-extractor.json +4 -0
- package/babel.config.cjs +4 -0
- package/dist/src/components/Class.d.ts +33 -0
- package/dist/src/components/Class.d.ts.map +1 -0
- package/dist/src/components/Class.js +170 -0
- package/dist/src/components/Class.js.map +1 -0
- package/dist/src/components/Declaration.d.ts +8 -0
- package/dist/src/components/Declaration.d.ts.map +1 -0
- package/dist/src/components/Declaration.js +18 -0
- package/dist/src/components/Declaration.js.map +1 -0
- package/dist/src/components/Enum.d.ts +13 -0
- package/dist/src/components/Enum.d.ts.map +1 -0
- package/dist/src/components/Enum.js +65 -0
- package/dist/src/components/Enum.js.map +1 -0
- package/dist/src/components/Name.d.ts +2 -0
- package/dist/src/components/Name.d.ts.map +1 -0
- package/dist/src/components/Name.js +12 -0
- package/dist/src/components/Name.js.map +1 -0
- package/dist/src/components/Namespace.d.ts +11 -0
- package/dist/src/components/Namespace.d.ts.map +1 -0
- package/dist/src/components/Namespace.js +35 -0
- package/dist/src/components/Namespace.js.map +1 -0
- package/dist/src/components/Parameters.d.ts +13 -0
- package/dist/src/components/Parameters.d.ts.map +1 -0
- package/dist/src/components/Parameters.js +34 -0
- package/dist/src/components/Parameters.js.map +1 -0
- package/dist/src/components/ProjectDirectory.d.ts +12 -0
- package/dist/src/components/ProjectDirectory.d.ts.map +1 -0
- package/dist/src/components/ProjectDirectory.js +48 -0
- package/dist/src/components/ProjectDirectory.js.map +1 -0
- package/dist/src/components/Reference.d.ts +6 -0
- package/dist/src/components/Reference.d.ts.map +1 -0
- package/dist/src/components/Reference.js +9 -0
- package/dist/src/components/Reference.js.map +1 -0
- package/dist/src/components/SourceFile.d.ts +12 -0
- package/dist/src/components/SourceFile.d.ts.map +1 -0
- package/dist/src/components/SourceFile.js +72 -0
- package/dist/src/components/SourceFile.js.map +1 -0
- package/dist/src/components/UsingDirective.d.ts +5 -0
- package/dist/src/components/UsingDirective.d.ts.map +1 -0
- package/dist/src/components/UsingDirective.js +13 -0
- package/dist/src/components/UsingDirective.js.map +1 -0
- package/dist/src/components/index.d.ts +11 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/index.js +11 -0
- package/dist/src/components/index.js.map +1 -0
- package/dist/src/components/stc/index.d.ts +43 -0
- package/dist/src/components/stc/index.d.ts.map +1 -0
- package/dist/src/components/stc/index.js +13 -0
- package/dist/src/components/stc/index.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/modifiers.d.ts +5 -0
- package/dist/src/modifiers.d.ts.map +1 -0
- package/dist/src/modifiers.js +35 -0
- package/dist/src/modifiers.js.map +1 -0
- package/dist/src/name-policy.d.ts +5 -0
- package/dist/src/name-policy.d.ts.map +1 -0
- package/dist/src/name-policy.js +30 -0
- package/dist/src/name-policy.js.map +1 -0
- package/dist/src/symbols/csharp-output-symbol.d.ts +7 -0
- package/dist/src/symbols/csharp-output-symbol.d.ts.map +1 -0
- package/dist/src/symbols/csharp-output-symbol.js +20 -0
- package/dist/src/symbols/csharp-output-symbol.js.map +1 -0
- package/dist/src/symbols/index.d.ts +4 -0
- package/dist/src/symbols/index.d.ts.map +1 -0
- package/dist/src/symbols/index.js +4 -0
- package/dist/src/symbols/index.js.map +1 -0
- package/dist/src/symbols/reference.d.ts +3 -0
- package/dist/src/symbols/reference.d.ts.map +1 -0
- package/dist/src/symbols/reference.js +55 -0
- package/dist/src/symbols/reference.js.map +1 -0
- package/dist/src/symbols/scopes.d.ts +16 -0
- package/dist/src/symbols/scopes.d.ts.map +1 -0
- package/dist/src/symbols/scopes.js +37 -0
- package/dist/src/symbols/scopes.js.map +1 -0
- package/dist/test/class.test.d.ts +2 -0
- package/dist/test/class.test.d.ts.map +1 -0
- package/dist/test/enum.test.d.ts +2 -0
- package/dist/test/enum.test.d.ts.map +1 -0
- package/dist/test/namespace.test.d.ts +2 -0
- package/dist/test/namespace.test.d.ts.map +1 -0
- package/dist/test/projectdirectory.test.d.ts +2 -0
- package/dist/test/projectdirectory.test.d.ts.map +1 -0
- package/dist/test/sourcefile.test.d.ts +2 -0
- package/dist/test/sourcefile.test.d.ts.map +1 -0
- package/dist/test/using.test.d.ts +2 -0
- package/dist/test/using.test.d.ts.map +1 -0
- package/dist/test/utils.d.ts +6 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +51 -0
- package/src/components/Class.tsx +210 -0
- package/src/components/Declaration.tsx +17 -0
- package/src/components/Enum.tsx +74 -0
- package/src/components/Name.tsx +11 -0
- package/src/components/Namespace.tsx +39 -0
- package/src/components/Parameters.tsx +52 -0
- package/src/components/ProjectDirectory.tsx +54 -0
- package/src/components/Reference.tsx +13 -0
- package/src/components/SourceFile.tsx +69 -0
- package/src/components/UsingDirective.tsx +19 -0
- package/src/components/index.ts +10 -0
- package/src/components/stc/index.ts +13 -0
- package/src/index.ts +4 -0
- package/src/modifiers.ts +45 -0
- package/src/name-policy.ts +41 -0
- package/src/symbols/csharp-output-symbol.ts +26 -0
- package/src/symbols/index.ts +3 -0
- package/src/symbols/reference.ts +65 -0
- package/src/symbols/scopes.ts +60 -0
- package/temp/api.json +3474 -0
- package/test/class.test.tsx +249 -0
- package/test/enum.test.tsx +147 -0
- package/test/namespace.test.tsx +59 -0
- package/test/projectdirectory.test.tsx +106 -0
- package/test/sourcefile.test.tsx +46 -0
- package/test/using.test.tsx +97 -0
- package/test/utils.tsx +69 -0
- package/tsconfig.json +11 -0
- package/tsdoc-metadata.json +11 -0
- package/vitest.config.ts +18 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import * as core from "@alloy-js/core";
|
|
2
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
3
|
+
import { expect, it } from "vitest";
|
|
4
|
+
import * as csharp from "../src/index.js";
|
|
5
|
+
import * as utils from "./utils.js";
|
|
6
|
+
|
|
7
|
+
it("declares class with no members", () => {
|
|
8
|
+
const res = utils.toSourceText(
|
|
9
|
+
<csharp.Class accessModifier='public' name="TestClass" />,
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
expect(res).toBe(coretest.d`
|
|
13
|
+
namespace TestCode
|
|
14
|
+
{
|
|
15
|
+
public class TestClass;
|
|
16
|
+
}
|
|
17
|
+
`);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("declares class with some members", () => {
|
|
21
|
+
const res = utils.toSourceText(
|
|
22
|
+
<csharp.Class accessModifier='public' name="TestClass">
|
|
23
|
+
<csharp.ClassMember accessModifier="public" name="MemberOne" type="string" />
|
|
24
|
+
<csharp.ClassMember accessModifier="private" name="MemberTwo" type="int" />
|
|
25
|
+
</csharp.Class>,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
expect(res).toBe(coretest.d`
|
|
29
|
+
namespace TestCode
|
|
30
|
+
{
|
|
31
|
+
public class TestClass
|
|
32
|
+
{
|
|
33
|
+
public string MemberOne;
|
|
34
|
+
private int memberTwo;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("declares class with some methods", () => {
|
|
41
|
+
const res = utils.toSourceText(
|
|
42
|
+
<csharp.Class accessModifier='public' name="TestClass">
|
|
43
|
+
<csharp.ClassMethod accessModifier="public" name="MethodOne" />
|
|
44
|
+
<csharp.ClassMethod accessModifier="private" methodModifier="virtual" name="MethodTwo" />
|
|
45
|
+
</csharp.Class>,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
expect(res).toBe(coretest.d`
|
|
49
|
+
namespace TestCode
|
|
50
|
+
{
|
|
51
|
+
public class TestClass
|
|
52
|
+
{
|
|
53
|
+
public void MethodOne() {}
|
|
54
|
+
private virtual void MethodTwo() {}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("declares class with params and return type", () => {
|
|
61
|
+
const params = [
|
|
62
|
+
{
|
|
63
|
+
name: "IntParam",
|
|
64
|
+
type: "int",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "StringParam",
|
|
68
|
+
type: "string",
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
const res = utils.toSourceText(
|
|
72
|
+
<csharp.Class accessModifier='public' name="TestClass">
|
|
73
|
+
<csharp.ClassMethod accessModifier="public" name="MethodOne" parameters={params} returns="string" />
|
|
74
|
+
</csharp.Class>,
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
expect(res).toBe(coretest.d`
|
|
78
|
+
namespace TestCode
|
|
79
|
+
{
|
|
80
|
+
public class TestClass
|
|
81
|
+
{
|
|
82
|
+
public string MethodOne(int intParam, string stringParam) {}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
`);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("uses refkeys for members, params, and return type", () => {
|
|
89
|
+
const inputTypeRefkey = core.refkey();
|
|
90
|
+
const testResultTypeRefkey = core.refkey();
|
|
91
|
+
const enumTypeRefkey = core.refkey();
|
|
92
|
+
|
|
93
|
+
const params = [
|
|
94
|
+
{
|
|
95
|
+
name: "IntParam",
|
|
96
|
+
type: "int",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "BodyParam",
|
|
100
|
+
type: inputTypeRefkey,
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
const res = core.render(
|
|
105
|
+
<core.Output namePolicy={csharp.createCSharpNamePolicy()}>
|
|
106
|
+
<csharp.Namespace name='TestCode'>
|
|
107
|
+
<csharp.SourceFile path="Test.cs">
|
|
108
|
+
<csharp.Enum accessModifier='public' name="TestEnum" refkey={enumTypeRefkey}>
|
|
109
|
+
<csharp.EnumMember name="One" />,
|
|
110
|
+
<csharp.EnumMember name="Two" />
|
|
111
|
+
</csharp.Enum>
|
|
112
|
+
<csharp.Class accessModifier="public" name="TestInput" refkey={inputTypeRefkey} />
|
|
113
|
+
<csharp.Class accessModifier="public" name="TestResult" refkey={testResultTypeRefkey} />
|
|
114
|
+
<csharp.Class accessModifier='public' name="TestClass">
|
|
115
|
+
<csharp.ClassMember accessModifier="private" name="MemberOne" type={enumTypeRefkey} />
|
|
116
|
+
<csharp.ClassMethod accessModifier="public" name="MethodOne" parameters={params} returns={testResultTypeRefkey}>
|
|
117
|
+
return new {testResultTypeRefkey}();
|
|
118
|
+
</csharp.ClassMethod>
|
|
119
|
+
</csharp.Class>
|
|
120
|
+
</csharp.SourceFile>
|
|
121
|
+
</csharp.Namespace>
|
|
122
|
+
</core.Output>,
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
126
|
+
namespace TestCode
|
|
127
|
+
{
|
|
128
|
+
public enum TestEnum
|
|
129
|
+
{
|
|
130
|
+
One,
|
|
131
|
+
Two
|
|
132
|
+
}
|
|
133
|
+
public class TestInput;
|
|
134
|
+
public class TestResult;
|
|
135
|
+
public class TestClass
|
|
136
|
+
{
|
|
137
|
+
private TestEnum memberOne;
|
|
138
|
+
public TestResult MethodOne(int intParam, TestInput bodyParam)
|
|
139
|
+
{
|
|
140
|
+
return new TestResult();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
`);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("declares class with generic parameters", () => {
|
|
148
|
+
const typeParameters = {
|
|
149
|
+
T: core.refkey(),
|
|
150
|
+
U: core.refkey(),
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const res = utils.toSourceText(
|
|
154
|
+
<csharp.Class accessModifier='public' name="TestClass" typeParameters={typeParameters}>
|
|
155
|
+
<csharp.ClassMember accessModifier="public" name="memberOne" type={typeParameters.T} />
|
|
156
|
+
<csharp.ClassMember accessModifier="private" name="memberTwo" type={typeParameters.U} />
|
|
157
|
+
</csharp.Class>,
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
expect(res).toBe(coretest.d`
|
|
161
|
+
namespace TestCode
|
|
162
|
+
{
|
|
163
|
+
public class TestClass<T, U>
|
|
164
|
+
{
|
|
165
|
+
public T MemberOne;
|
|
166
|
+
private U memberTwo;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
`);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("declares class with invalid members", () => {
|
|
173
|
+
const decl =
|
|
174
|
+
<csharp.Class accessModifier='public' name="TestClass">
|
|
175
|
+
<csharp.EnumMember name="One" />,
|
|
176
|
+
<csharp.EnumMember name="Two" />
|
|
177
|
+
</csharp.Class>;
|
|
178
|
+
|
|
179
|
+
expect(() => utils.toSourceText(decl)).toThrow(
|
|
180
|
+
"can't define an enum member outside of an enum-decl scope",
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("declares class with constructor", () => {
|
|
185
|
+
const res = utils.toSourceText(
|
|
186
|
+
<csharp.Class accessModifier='public' name="TestClass">
|
|
187
|
+
<csharp.ClassConstructor accessModifier="public" />
|
|
188
|
+
</csharp.Class>,
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
expect(res).toBe(coretest.d`
|
|
192
|
+
namespace TestCode
|
|
193
|
+
{
|
|
194
|
+
public class TestClass
|
|
195
|
+
{
|
|
196
|
+
public TestClass() {}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
`);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it("declares class with constructor params and assigns values to fields", () => {
|
|
203
|
+
const thisNameRefkey = core.refkey();
|
|
204
|
+
const thisSizeRefkey = core.refkey();
|
|
205
|
+
const paramNameRefkey = core.refkey();
|
|
206
|
+
const paramSizeRefkey = core.refkey();
|
|
207
|
+
|
|
208
|
+
const ctorParams = [
|
|
209
|
+
{
|
|
210
|
+
name: "name",
|
|
211
|
+
type: "string",
|
|
212
|
+
refkey: paramNameRefkey,
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: "size",
|
|
216
|
+
type: "int",
|
|
217
|
+
refkey: paramSizeRefkey,
|
|
218
|
+
},
|
|
219
|
+
];
|
|
220
|
+
|
|
221
|
+
const res = utils.toSourceText(
|
|
222
|
+
<csharp.Class accessModifier='public' name="TestClass">
|
|
223
|
+
<csharp.ClassMember accessModifier="private" name="name" type="string" refkey={thisNameRefkey} />
|
|
224
|
+
<csharp.ClassMember accessModifier="private" name="size" type="int" refkey={thisSizeRefkey} />
|
|
225
|
+
<csharp.ClassConstructor accessModifier="public" parameters={ctorParams}>
|
|
226
|
+
{thisNameRefkey} = {paramNameRefkey};
|
|
227
|
+
{thisSizeRefkey} = {paramSizeRefkey};
|
|
228
|
+
</csharp.ClassConstructor>
|
|
229
|
+
</csharp.Class>,
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
// TODO: assignments to members should have this. prefix
|
|
233
|
+
// e.g. this.name = name;
|
|
234
|
+
expect(res).toBe(coretest.d`
|
|
235
|
+
namespace TestCode
|
|
236
|
+
{
|
|
237
|
+
public class TestClass
|
|
238
|
+
{
|
|
239
|
+
private string name;
|
|
240
|
+
private int size;
|
|
241
|
+
public TestClass(string name, int size)
|
|
242
|
+
{
|
|
243
|
+
name = name;
|
|
244
|
+
size = size;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
`);
|
|
249
|
+
});
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import * as core from "@alloy-js/core";
|
|
2
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
3
|
+
import { expect, it } from "vitest";
|
|
4
|
+
import * as csharp from "../src/index.js";
|
|
5
|
+
import * as utils from "./utils.js";
|
|
6
|
+
|
|
7
|
+
it("declares enum with no members", () => {
|
|
8
|
+
const res = utils.toSourceText(
|
|
9
|
+
<csharp.Enum accessModifier='public' name="TestEnum" />,
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
expect(res).toBe(coretest.d`
|
|
13
|
+
namespace TestCode
|
|
14
|
+
{
|
|
15
|
+
public enum TestEnum;
|
|
16
|
+
}
|
|
17
|
+
`);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("declares enum with members", () => {
|
|
21
|
+
const res = utils.toSourceText(
|
|
22
|
+
<csharp.Enum accessModifier='public' name="TestEnum">
|
|
23
|
+
<csharp.EnumMember name="One" />,
|
|
24
|
+
<csharp.EnumMember name="Two" />
|
|
25
|
+
</csharp.Enum>,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
expect(res).toBe(coretest.d`
|
|
29
|
+
namespace TestCode
|
|
30
|
+
{
|
|
31
|
+
public enum TestEnum
|
|
32
|
+
{
|
|
33
|
+
One,
|
|
34
|
+
Two
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("applies naming policy to enum and members", () => {
|
|
41
|
+
const res = utils.toSourceText(
|
|
42
|
+
<csharp.Enum accessModifier='public' name="testEnum">
|
|
43
|
+
<csharp.EnumMember name="one" />,
|
|
44
|
+
<csharp.EnumMember name="two" />
|
|
45
|
+
</csharp.Enum>,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
expect(res).toBe(coretest.d`
|
|
49
|
+
namespace TestCode
|
|
50
|
+
{
|
|
51
|
+
public enum TestEnum
|
|
52
|
+
{
|
|
53
|
+
One,
|
|
54
|
+
Two
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("can reference things by refkey", () => {
|
|
61
|
+
const enumRK = core.refkey();
|
|
62
|
+
const twoRK = core.refkey();
|
|
63
|
+
|
|
64
|
+
const res = core.render(
|
|
65
|
+
<core.Output>
|
|
66
|
+
<csharp.Namespace name='TestCode'>
|
|
67
|
+
<csharp.SourceFile path="Test.cs">
|
|
68
|
+
<csharp.Enum accessModifier='public' name="TestEnum" refkey={enumRK}>
|
|
69
|
+
<csharp.EnumMember name="One" />,
|
|
70
|
+
<csharp.EnumMember name="Two" refkey={twoRK} />
|
|
71
|
+
</csharp.Enum>
|
|
72
|
+
{enumRK};
|
|
73
|
+
{twoRK};
|
|
74
|
+
</csharp.SourceFile>
|
|
75
|
+
</csharp.Namespace>
|
|
76
|
+
</core.Output>,
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
80
|
+
namespace TestCode
|
|
81
|
+
{
|
|
82
|
+
public enum TestEnum
|
|
83
|
+
{
|
|
84
|
+
One,
|
|
85
|
+
Two
|
|
86
|
+
}
|
|
87
|
+
TestEnum;
|
|
88
|
+
TestEnum.Two;
|
|
89
|
+
}
|
|
90
|
+
`);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("can reference things by refkey across files", () => {
|
|
94
|
+
const enumRK = core.refkey();
|
|
95
|
+
const barRK = core.refkey();
|
|
96
|
+
|
|
97
|
+
const res = core.render(
|
|
98
|
+
<core.Output>
|
|
99
|
+
<csharp.Namespace name='TestCode'>
|
|
100
|
+
<csharp.SourceFile path="Test.cs">
|
|
101
|
+
<csharp.Enum accessModifier='public' name="TestEnum">
|
|
102
|
+
<csharp.EnumMember name="One" />,
|
|
103
|
+
<csharp.EnumMember name="Two" />
|
|
104
|
+
</csharp.Enum>
|
|
105
|
+
{enumRK};
|
|
106
|
+
{barRK};
|
|
107
|
+
</csharp.SourceFile>
|
|
108
|
+
<csharp.SourceFile path="Other.cs">
|
|
109
|
+
<csharp.Enum accessModifier='public' name="OtherEnum" refkey={enumRK}>
|
|
110
|
+
<csharp.EnumMember name="Foo" />,
|
|
111
|
+
<csharp.EnumMember name="Bar" refkey={barRK} />
|
|
112
|
+
</csharp.Enum>
|
|
113
|
+
{enumRK};
|
|
114
|
+
{barRK};
|
|
115
|
+
</csharp.SourceFile>
|
|
116
|
+
</csharp.Namespace>
|
|
117
|
+
</core.Output>,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
expect(res.contents[0].path).toBe("Test.cs");
|
|
121
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
122
|
+
namespace TestCode
|
|
123
|
+
{
|
|
124
|
+
public enum TestEnum
|
|
125
|
+
{
|
|
126
|
+
One,
|
|
127
|
+
Two
|
|
128
|
+
}
|
|
129
|
+
OtherEnum;
|
|
130
|
+
OtherEnum.Bar;
|
|
131
|
+
}
|
|
132
|
+
`);
|
|
133
|
+
|
|
134
|
+
expect(res.contents[1].path).toBe("Other.cs");
|
|
135
|
+
expect(res.contents[1].contents).toBe(coretest.d`
|
|
136
|
+
namespace TestCode
|
|
137
|
+
{
|
|
138
|
+
public enum OtherEnum
|
|
139
|
+
{
|
|
140
|
+
Foo,
|
|
141
|
+
Bar
|
|
142
|
+
}
|
|
143
|
+
OtherEnum;
|
|
144
|
+
OtherEnum.Bar;
|
|
145
|
+
}
|
|
146
|
+
`);
|
|
147
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as core from "@alloy-js/core";
|
|
2
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
3
|
+
import { expect, it } from "vitest";
|
|
4
|
+
import * as csharp from "../src/index.js";
|
|
5
|
+
|
|
6
|
+
it("defines multiple namespaces and source files with unique content", () => {
|
|
7
|
+
const res = core.render(
|
|
8
|
+
<core.Output>
|
|
9
|
+
<csharp.Namespace name='Namespace1'>
|
|
10
|
+
<csharp.SourceFile path="Model1.cs">
|
|
11
|
+
<csharp.Class accessModifier='public' name="Model1" />
|
|
12
|
+
</csharp.SourceFile>
|
|
13
|
+
<csharp.SourceFile path="Model2.cs">
|
|
14
|
+
<csharp.Class accessModifier='public' name="Model2" />
|
|
15
|
+
</csharp.SourceFile>
|
|
16
|
+
</csharp.Namespace>
|
|
17
|
+
<csharp.Namespace name='Namespace2'>
|
|
18
|
+
<csharp.SourceFile path="Model3.cs">
|
|
19
|
+
<csharp.Class accessModifier='public' name="Model3" />
|
|
20
|
+
</csharp.SourceFile>
|
|
21
|
+
<csharp.SourceFile path="Model4.cs">
|
|
22
|
+
<csharp.Class accessModifier='public' name="Model4" />
|
|
23
|
+
</csharp.SourceFile>
|
|
24
|
+
</csharp.Namespace>
|
|
25
|
+
</core.Output>,
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
expect(res.contents[0].path).equals("Model1.cs");
|
|
29
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
30
|
+
namespace Namespace1
|
|
31
|
+
{
|
|
32
|
+
public class Model1;
|
|
33
|
+
}
|
|
34
|
+
`);
|
|
35
|
+
|
|
36
|
+
expect(res.contents[1].path).equals("Model2.cs");
|
|
37
|
+
expect(res.contents[1].contents).toBe(coretest.d`
|
|
38
|
+
namespace Namespace1
|
|
39
|
+
{
|
|
40
|
+
public class Model2;
|
|
41
|
+
}
|
|
42
|
+
`);
|
|
43
|
+
|
|
44
|
+
expect(res.contents[2].path).equals("Model3.cs");
|
|
45
|
+
expect(res.contents[2].contents).toBe(coretest.d`
|
|
46
|
+
namespace Namespace2
|
|
47
|
+
{
|
|
48
|
+
public class Model3;
|
|
49
|
+
}
|
|
50
|
+
`);
|
|
51
|
+
|
|
52
|
+
expect(res.contents[3].path).equals("Model4.cs");
|
|
53
|
+
expect(res.contents[3].contents).toBe(coretest.d`
|
|
54
|
+
namespace Namespace2
|
|
55
|
+
{
|
|
56
|
+
public class Model4;
|
|
57
|
+
}
|
|
58
|
+
`);
|
|
59
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as core from "@alloy-js/core";
|
|
2
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
3
|
+
import { expect, it } from "vitest";
|
|
4
|
+
import * as csharp from "../src/index.js";
|
|
5
|
+
|
|
6
|
+
it("defines a project directory file with multiple source files", () => {
|
|
7
|
+
const res = core.render(
|
|
8
|
+
<core.Output>
|
|
9
|
+
<csharp.ProjectDirectory name="TestProject" path="~/projects" version="0.1.0" description="a test project">
|
|
10
|
+
<csharp.Namespace name='TestCode'>
|
|
11
|
+
<csharp.SourceFile path="Test1.cs">
|
|
12
|
+
<csharp.Class accessModifier='public' name="TestClass1" />
|
|
13
|
+
</csharp.SourceFile>
|
|
14
|
+
<csharp.SourceFile path="Test2.cs">
|
|
15
|
+
<csharp.Class accessModifier='public' name="TestClass2" />
|
|
16
|
+
</csharp.SourceFile>
|
|
17
|
+
</csharp.Namespace>
|
|
18
|
+
</csharp.ProjectDirectory>
|
|
19
|
+
</core.Output>,
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const projDir = res.contents[0] as core.OutputDirectory;
|
|
23
|
+
|
|
24
|
+
expect(projDir.path).equals("~/projects/TestProject");
|
|
25
|
+
expect(projDir.contents[0].path).equals(
|
|
26
|
+
"~/projects/TestProject/TestProject.csproj",
|
|
27
|
+
);
|
|
28
|
+
expect(projDir.contents[0].contents).toBe(coretest.d`
|
|
29
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
30
|
+
<PropertyGroup>
|
|
31
|
+
<Version>0.1.0</Version>
|
|
32
|
+
<Description>a test project</Description>
|
|
33
|
+
<TargetFramework>net8.0</TargetFramework>
|
|
34
|
+
</PropertyGroup>
|
|
35
|
+
</Project>
|
|
36
|
+
`);
|
|
37
|
+
|
|
38
|
+
const srcDir = projDir.contents[1] as core.OutputDirectory;
|
|
39
|
+
|
|
40
|
+
expect(srcDir.contents[0].path).equals("~/projects/TestProject/src/Test1.cs");
|
|
41
|
+
expect(srcDir.contents[0].contents).toBe(coretest.d`
|
|
42
|
+
namespace TestCode
|
|
43
|
+
{
|
|
44
|
+
public class TestClass1;
|
|
45
|
+
}
|
|
46
|
+
`);
|
|
47
|
+
|
|
48
|
+
expect(srcDir.contents[1].path).equals("~/projects/TestProject/src/Test2.cs");
|
|
49
|
+
expect(srcDir.contents[1].contents).toBe(coretest.d`
|
|
50
|
+
namespace TestCode
|
|
51
|
+
{
|
|
52
|
+
public class TestClass2;
|
|
53
|
+
}
|
|
54
|
+
`);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("defines a project directory file with multiple source files and a custom TFM", () => {
|
|
58
|
+
const res = core.render(
|
|
59
|
+
<core.Output>
|
|
60
|
+
<csharp.ProjectDirectory name="TestProject" path="~/projects" version="0.1.0" description="a test project" targetFrameworkMoniker="netstandard2.1">
|
|
61
|
+
<csharp.Namespace name='TestCode'>
|
|
62
|
+
<csharp.SourceFile path="Test1.cs">
|
|
63
|
+
<csharp.Class accessModifier='public' name="TestClass1" />
|
|
64
|
+
</csharp.SourceFile>
|
|
65
|
+
<csharp.SourceFile path="Test2.cs">
|
|
66
|
+
<csharp.Class accessModifier='public' name="TestClass2" />
|
|
67
|
+
</csharp.SourceFile>
|
|
68
|
+
</csharp.Namespace>
|
|
69
|
+
</csharp.ProjectDirectory>
|
|
70
|
+
</core.Output>,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const projDir = res.contents[0] as core.OutputDirectory;
|
|
74
|
+
|
|
75
|
+
expect(projDir.path).equals("~/projects/TestProject");
|
|
76
|
+
expect(projDir.contents[0].path).equals(
|
|
77
|
+
"~/projects/TestProject/TestProject.csproj",
|
|
78
|
+
);
|
|
79
|
+
expect(projDir.contents[0].contents).toBe(coretest.d`
|
|
80
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
81
|
+
<PropertyGroup>
|
|
82
|
+
<Version>0.1.0</Version>
|
|
83
|
+
<Description>a test project</Description>
|
|
84
|
+
<TargetFramework>netstandard2.1</TargetFramework>
|
|
85
|
+
</PropertyGroup>
|
|
86
|
+
</Project>
|
|
87
|
+
`);
|
|
88
|
+
|
|
89
|
+
const srcDir = projDir.contents[1] as core.OutputDirectory;
|
|
90
|
+
|
|
91
|
+
expect(srcDir.contents[0].path).equals("~/projects/TestProject/src/Test1.cs");
|
|
92
|
+
expect(srcDir.contents[0].contents).toBe(coretest.d`
|
|
93
|
+
namespace TestCode
|
|
94
|
+
{
|
|
95
|
+
public class TestClass1;
|
|
96
|
+
}
|
|
97
|
+
`);
|
|
98
|
+
|
|
99
|
+
expect(srcDir.contents[1].path).equals("~/projects/TestProject/src/Test2.cs");
|
|
100
|
+
expect(srcDir.contents[1].contents).toBe(coretest.d`
|
|
101
|
+
namespace TestCode
|
|
102
|
+
{
|
|
103
|
+
public class TestClass2;
|
|
104
|
+
}
|
|
105
|
+
`);
|
|
106
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as core from "@alloy-js/core";
|
|
2
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
3
|
+
import { expect, it } from "vitest";
|
|
4
|
+
import * as csharp from "../src/index.js";
|
|
5
|
+
|
|
6
|
+
it("defines multiple source files with unique content", () => {
|
|
7
|
+
const res = core.render(
|
|
8
|
+
<core.Output>
|
|
9
|
+
<csharp.Namespace name='TestCode'>
|
|
10
|
+
<csharp.SourceFile path="Test1.cs">
|
|
11
|
+
<csharp.Class accessModifier='public' name="TestClass1" />
|
|
12
|
+
</csharp.SourceFile>
|
|
13
|
+
<csharp.SourceFile path="Test2.cs">
|
|
14
|
+
<csharp.Class accessModifier='public' name="TestClass2" />
|
|
15
|
+
</csharp.SourceFile>
|
|
16
|
+
</csharp.Namespace>
|
|
17
|
+
</core.Output>,
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
expect(res.contents[0].path).equals("Test1.cs");
|
|
21
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
22
|
+
namespace TestCode
|
|
23
|
+
{
|
|
24
|
+
public class TestClass1;
|
|
25
|
+
}
|
|
26
|
+
`);
|
|
27
|
+
|
|
28
|
+
expect(res.contents[1].path).equals("Test2.cs");
|
|
29
|
+
expect(res.contents[1].contents).toBe(coretest.d`
|
|
30
|
+
namespace TestCode
|
|
31
|
+
{
|
|
32
|
+
public class TestClass2;
|
|
33
|
+
}
|
|
34
|
+
`);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("throws when declaring a source file outside a namespace", () => {
|
|
38
|
+
const decl =
|
|
39
|
+
<core.Output>
|
|
40
|
+
<csharp.SourceFile path="Test.cs" />
|
|
41
|
+
</core.Output>;
|
|
42
|
+
|
|
43
|
+
expect(() => core.render(decl)).toThrow(
|
|
44
|
+
"SourceFile must be declared inside a namespace",
|
|
45
|
+
);
|
|
46
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as core from "@alloy-js/core";
|
|
2
|
+
import * as coretest from "@alloy-js/core/testing";
|
|
3
|
+
import { expect, it } from "vitest";
|
|
4
|
+
import * as csharp from "../src/index.js";
|
|
5
|
+
|
|
6
|
+
it("uses a single namespace", () => {
|
|
7
|
+
const res = core.render(
|
|
8
|
+
<core.Output>
|
|
9
|
+
<csharp.Namespace name='TestCode'>
|
|
10
|
+
<csharp.SourceFile path="Test1.cs" using={["Foo"]} />
|
|
11
|
+
</csharp.Namespace>
|
|
12
|
+
</core.Output>,
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
16
|
+
using Foo;
|
|
17
|
+
namespace TestCode {}
|
|
18
|
+
`);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("uses multiple namespaces", () => {
|
|
22
|
+
const res = core.render(
|
|
23
|
+
<core.Output>
|
|
24
|
+
<csharp.Namespace name='TestCode'>
|
|
25
|
+
<csharp.SourceFile path="Test1.cs" using={["Foo", "Bar.Baz"]} />
|
|
26
|
+
</csharp.Namespace>
|
|
27
|
+
</core.Output>,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
31
|
+
using Bar.Baz;
|
|
32
|
+
using Foo;
|
|
33
|
+
namespace TestCode {}
|
|
34
|
+
`);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("adds using statement across namespaces", () => {
|
|
38
|
+
const inputTypeRefkey = core.refkey();
|
|
39
|
+
const outputTypeRefkey = core.refkey();
|
|
40
|
+
const twoValRefkey = core.refkey();
|
|
41
|
+
|
|
42
|
+
const params = [
|
|
43
|
+
{
|
|
44
|
+
name: "BodyParam",
|
|
45
|
+
type: inputTypeRefkey,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
const res = core.render(
|
|
50
|
+
<core.Output namePolicy={csharp.createCSharpNamePolicy()}>
|
|
51
|
+
<csharp.Namespace name='Models'>
|
|
52
|
+
<csharp.SourceFile path="Models.cs">
|
|
53
|
+
<csharp.Class accessModifier='public' name="Input" refkey={inputTypeRefkey} />
|
|
54
|
+
<csharp.Class accessModifier='public' name="Output" refkey={outputTypeRefkey} />
|
|
55
|
+
<csharp.Enum accessModifier='public' name="TestEnum">
|
|
56
|
+
<csharp.EnumMember name="One" />,
|
|
57
|
+
<csharp.EnumMember name="Two" refkey={twoValRefkey} />
|
|
58
|
+
</csharp.Enum>
|
|
59
|
+
</csharp.SourceFile>
|
|
60
|
+
</csharp.Namespace>
|
|
61
|
+
<csharp.Namespace name='Client'>
|
|
62
|
+
<csharp.SourceFile path="Client.cs" using={["System"]}>
|
|
63
|
+
<csharp.Class accessModifier='public' name="Client">
|
|
64
|
+
<csharp.ClassMethod accessModifier="public" name="MethodOne" parameters={params} returns={outputTypeRefkey} />
|
|
65
|
+
</csharp.Class>
|
|
66
|
+
{twoValRefkey};
|
|
67
|
+
</csharp.SourceFile>
|
|
68
|
+
</csharp.Namespace>
|
|
69
|
+
</core.Output>,
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
expect(res.contents[0].contents).toBe(coretest.d`
|
|
73
|
+
namespace Models
|
|
74
|
+
{
|
|
75
|
+
public class Input;
|
|
76
|
+
public class Output;
|
|
77
|
+
public enum TestEnum
|
|
78
|
+
{
|
|
79
|
+
One,
|
|
80
|
+
Two
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
`);
|
|
84
|
+
|
|
85
|
+
expect(res.contents[1].contents).toBe(coretest.d`
|
|
86
|
+
using Models;
|
|
87
|
+
using System;
|
|
88
|
+
namespace Client
|
|
89
|
+
{
|
|
90
|
+
public class Client
|
|
91
|
+
{
|
|
92
|
+
public Output MethodOne(Input bodyParam) {}
|
|
93
|
+
}
|
|
94
|
+
TestEnum.Two;
|
|
95
|
+
}
|
|
96
|
+
`);
|
|
97
|
+
});
|