@alloy-js/csharp 0.17.0 → 0.18.0-dev.11

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.
Files changed (117) hide show
  1. package/dist/src/components/ClassDeclaration.d.ts +57 -0
  2. package/dist/src/components/ClassDeclaration.d.ts.map +1 -0
  3. package/dist/src/components/{Class.js → ClassDeclaration.js} +42 -53
  4. package/dist/src/components/ClassMethod.d.ts +25 -0
  5. package/dist/src/components/ClassMethod.d.ts.map +1 -0
  6. package/dist/src/components/ClassMethod.js +60 -0
  7. package/dist/src/components/EnumDeclaration.d.ts +34 -0
  8. package/dist/src/components/EnumDeclaration.d.ts.map +1 -0
  9. package/dist/src/components/{Enum.js → EnumDeclaration.js} +25 -5
  10. package/dist/src/components/class/property.d.ts +55 -0
  11. package/dist/src/components/class/property.d.ts.map +1 -0
  12. package/dist/src/components/class/property.js +67 -0
  13. package/dist/src/components/class/property.test.d.ts +2 -0
  14. package/dist/src/components/class/property.test.d.ts.map +1 -0
  15. package/dist/src/components/class/property.test.js +201 -0
  16. package/dist/src/components/doc/comment.d.ts +70 -0
  17. package/dist/src/components/doc/comment.d.ts.map +1 -0
  18. package/dist/src/components/doc/comment.js +88 -0
  19. package/dist/src/components/doc/comment.test.d.ts +2 -0
  20. package/dist/src/components/doc/comment.test.d.ts.map +1 -0
  21. package/dist/src/components/doc/comment.test.js +348 -0
  22. package/dist/src/components/doc/from-markdown.d.ts +6 -0
  23. package/dist/src/components/doc/from-markdown.d.ts.map +1 -0
  24. package/dist/src/components/doc/from-markdown.js +58 -0
  25. package/dist/src/components/doc/from-markdown.test.d.ts +2 -0
  26. package/dist/src/components/doc/from-markdown.test.d.ts.map +1 -0
  27. package/dist/src/components/doc/from-markdown.test.js +83 -0
  28. package/dist/src/components/index.d.ts +9 -2
  29. package/dist/src/components/index.d.ts.map +1 -1
  30. package/dist/src/components/index.js +9 -2
  31. package/dist/src/components/interface/declaration.d.ts +34 -0
  32. package/dist/src/components/interface/declaration.d.ts.map +1 -0
  33. package/dist/src/components/interface/declaration.js +90 -0
  34. package/dist/src/components/interface/declaration.test.d.ts +2 -0
  35. package/dist/src/components/interface/declaration.test.d.ts.map +1 -0
  36. package/dist/src/components/interface/declaration.test.js +69 -0
  37. package/dist/src/components/interface/method.d.ts +18 -0
  38. package/dist/src/components/interface/method.d.ts.map +1 -0
  39. package/dist/src/components/interface/method.js +59 -0
  40. package/dist/src/components/interface/method.test.d.ts +2 -0
  41. package/dist/src/components/interface/method.test.d.ts.map +1 -0
  42. package/dist/src/components/interface/method.test.js +131 -0
  43. package/dist/src/components/interface/property.d.ts +38 -0
  44. package/dist/src/components/interface/property.d.ts.map +1 -0
  45. package/dist/src/components/interface/property.js +67 -0
  46. package/dist/src/components/interface/property.test.d.ts +2 -0
  47. package/dist/src/components/interface/property.test.d.ts.map +1 -0
  48. package/dist/src/components/interface/property.test.js +165 -0
  49. package/dist/src/components/stc/index.d.ts +2 -2
  50. package/dist/src/components/stc/index.d.ts.map +1 -1
  51. package/dist/src/components/stc/index.js +2 -2
  52. package/dist/src/modifiers.d.ts +13 -4
  53. package/dist/src/modifiers.d.ts.map +1 -1
  54. package/dist/src/modifiers.js +13 -27
  55. package/dist/src/name-policy.d.ts +1 -1
  56. package/dist/src/name-policy.d.ts.map +1 -1
  57. package/dist/src/name-policy.js +1 -0
  58. package/dist/test/class-declaration.test.d.ts +2 -0
  59. package/dist/test/class-declaration.test.d.ts.map +1 -0
  60. package/dist/test/{class.test.js → class-declaration.test.js} +123 -73
  61. package/dist/test/class-method.test.d.ts +2 -0
  62. package/dist/test/class-method.test.d.ts.map +1 -0
  63. package/dist/test/class-method.test.js +161 -0
  64. package/dist/test/enum.test.js +12 -12
  65. package/dist/test/namespace.test.js +8 -8
  66. package/dist/test/project-directory.test.d.ts +2 -0
  67. package/dist/test/project-directory.test.d.ts.map +1 -0
  68. package/dist/test/{projectdirectory.test.js → project-directory.test.js} +8 -8
  69. package/dist/test/sourcefile.test.js +4 -4
  70. package/dist/test/using.test.js +9 -9
  71. package/dist/test/utils.d.ts +3 -0
  72. package/dist/test/utils.d.ts.map +1 -1
  73. package/dist/test/utils.js +15 -0
  74. package/dist/test/vitest.setup.d.ts +2 -0
  75. package/dist/test/vitest.setup.d.ts.map +1 -0
  76. package/dist/test/vitest.setup.js +1 -0
  77. package/dist/tsconfig.tsbuildinfo +1 -1
  78. package/package.json +7 -6
  79. package/src/components/{Class.tsx → ClassDeclaration.tsx} +68 -66
  80. package/src/components/ClassMethod.tsx +94 -0
  81. package/src/components/{Enum.tsx → EnumDeclaration.tsx} +30 -6
  82. package/src/components/class/property.test.tsx +180 -0
  83. package/src/components/class/property.tsx +135 -0
  84. package/src/components/doc/comment.test.tsx +337 -0
  85. package/src/components/doc/comment.tsx +152 -0
  86. package/src/components/doc/from-markdown.test.tsx +103 -0
  87. package/src/components/doc/from-markdown.tsx +58 -0
  88. package/src/components/index.ts +9 -2
  89. package/src/components/interface/declaration.test.tsx +56 -0
  90. package/src/components/interface/declaration.tsx +109 -0
  91. package/src/components/interface/method.test.tsx +120 -0
  92. package/src/components/interface/method.tsx +82 -0
  93. package/src/components/interface/property.test.tsx +144 -0
  94. package/src/components/interface/property.tsx +107 -0
  95. package/src/components/stc/index.ts +2 -2
  96. package/src/modifiers.ts +32 -37
  97. package/src/name-policy.ts +2 -0
  98. package/temp/api.json +4419 -567
  99. package/test/{class.test.tsx → class-declaration.test.tsx} +103 -99
  100. package/test/class-method.test.tsx +147 -0
  101. package/test/enum.test.tsx +11 -11
  102. package/test/namespace.test.tsx +4 -4
  103. package/test/{projectdirectory.test.tsx → project-directory.test.tsx} +4 -4
  104. package/test/sourcefile.test.tsx +2 -2
  105. package/test/using.test.tsx +9 -9
  106. package/test/utils.tsx +9 -0
  107. package/test/vitest.setup.ts +1 -0
  108. package/tsconfig.json +2 -1
  109. package/vitest.config.ts +3 -0
  110. package/dist/src/components/Class.d.ts +0 -36
  111. package/dist/src/components/Class.d.ts.map +0 -1
  112. package/dist/src/components/Enum.d.ts +0 -15
  113. package/dist/src/components/Enum.d.ts.map +0 -1
  114. package/dist/test/class.test.d.ts +0 -2
  115. package/dist/test/class.test.d.ts.map +0 -1
  116. package/dist/test/projectdirectory.test.d.ts +0 -2
  117. package/dist/test/projectdirectory.test.d.ts.map +0 -1
@@ -1,34 +1,20 @@
1
1
  // the possible C# access modifiers
2
2
  // https://learn.microsoft.com/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers
3
3
 
4
- // maps the above access modifier value to its C# syntax.
5
- // note that the C# keyword includes a trailing space
6
- const accessModifierLookup = {
7
- public: "public ",
8
- protected: "protected ",
9
- private: "private ",
10
- internal: "internal ",
11
- "protected-internal": "protected internal ",
12
- "private-protected": "private protected ",
13
- file: "file "
14
- };
4
+ /** Access modifiers. */
15
5
 
16
- // returns the C# syntax for the specified access modifier.
17
- // if no access modifier is specified, the empty string is returned.
18
- export function getAccessModifier(accessModifier) {
19
- return accessModifier ? accessModifierLookup[accessModifier] : "";
6
+ export const getAccessModifier = makeModifiers(["public", "protected", "private", "internal", "file"]);
7
+ export function getAsyncModifier(async) {
8
+ return async ? "async" : "";
20
9
  }
21
- // maps the above method modifier value to its C# syntax.
22
- // note that the C# keyword includes a trailing space
23
- const methodModifierLookup = {
24
- abstract: "abstract ",
25
- sealed: "sealed ",
26
- static: "static ",
27
- virtual: "virtual "
28
- };
29
10
 
30
- // returns the C# syntax for the specified method modifier.
31
- // if no method modifier is specified, the empty string is returned.
32
- export function getMethodModifier(methodModifier) {
33
- return methodModifier ? methodModifierLookup[methodModifier] : "";
11
+ /** Resolve the modifier prefix */
12
+ export function computeModifiersPrefix(modifiers) {
13
+ const resolved = modifiers.filter(x => x);
14
+ return resolved.length > 0 ? resolved.join(" ") + " " : "";
15
+ }
16
+ export function makeModifiers(obj) {
17
+ return data => {
18
+ return obj.map(key => data[key] ? key : undefined).filter(x => x).join(" ");
19
+ };
34
20
  }
@@ -1,5 +1,5 @@
1
1
  import * as core from "@alloy-js/core";
2
- export type CSharpElements = "class" | "constant" | "enum" | "enum-member" | "function" | "interface" | "class-member-private" | "class-member-public" | "class-method" | "parameter" | "type-parameter";
2
+ export type CSharpElements = "class" | "constant" | "enum" | "enum-member" | "function" | "interface" | "class-member-private" | "class-member-public" | "class-method" | "class-property" | "parameter" | "type-parameter";
3
3
  export declare function createCSharpNamePolicy(): core.NamePolicy<CSharpElements>;
4
4
  export declare function useCSharpNamePolicy(): core.NamePolicy<CSharpElements>;
5
5
  //# sourceMappingURL=name-policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"name-policy.d.ts","sourceRoot":"","sources":["../../src/name-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AAIvC,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,UAAU,GACV,MAAM,GACN,aAAa,GACb,UAAU,GACV,WAAW,GACX,sBAAsB,GACtB,qBAAqB,GACrB,cAAc,GACd,WAAW,GACX,gBAAgB,CAAC;AAGrB,wBAAgB,sBAAsB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAiBxE;AAGD,wBAAgB,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAErE"}
1
+ {"version":3,"file":"name-policy.d.ts","sourceRoot":"","sources":["../../src/name-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AAIvC,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,UAAU,GACV,MAAM,GACN,aAAa,GACb,UAAU,GACV,WAAW,GACX,sBAAsB,GACtB,qBAAqB,GACrB,cAAc,GACd,gBAAgB,GAChB,WAAW,GACX,gBAAgB,CAAC;AAGrB,wBAAgB,sBAAsB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAkBxE;AAGD,wBAAgB,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAErE"}
@@ -14,6 +14,7 @@ export function createCSharpNamePolicy() {
14
14
  case "class-member-public":
15
15
  case "class-method":
16
16
  case "type-parameter":
17
+ case "class-property":
17
18
  return changecase.pascalCase(name);
18
19
  case "constant":
19
20
  return changecase.constantCase(name);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=class-declaration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-declaration.test.d.ts","sourceRoot":"","sources":["../../test/class-declaration.test.tsx"],"names":[],"mappings":""}
@@ -1,34 +1,76 @@
1
- import { createComponent as _$createComponent, createIntrinsic as _$createIntrinsic } from "@alloy-js/core/jsx-runtime";
1
+ import { createComponent as _$createComponent, mergeProps as _$mergeProps, createIntrinsic as _$createIntrinsic } from "@alloy-js/core/jsx-runtime";
2
2
  import * as core from "@alloy-js/core";
3
3
  import * as coretest from "@alloy-js/core/testing";
4
- import { expect, it } from "vitest";
4
+ import { describe, expect, it } from "vitest";
5
5
  import * as csharp from "../src/index.js";
6
+ import { ClassDeclaration, ClassMember } from "../src/index.js";
6
7
  import * as utils from "./utils.js";
7
8
  it("declares class with no members", () => {
8
- const res = utils.toSourceText(_$createComponent(csharp.Class, {
9
- accessModifier: "public",
10
- name: "TestClass"
11
- }));
12
- expect(res).toBe(coretest.d`
13
- namespace TestCode
14
- {
15
- public class TestClass;
9
+ expect(_$createComponent(utils.TestNamespace, {
10
+ get children() {
11
+ return _$createComponent(ClassDeclaration, {
12
+ name: "TestClass"
13
+ });
16
14
  }
15
+ })).toRenderTo(`
16
+ class TestClass;
17
17
  `);
18
18
  });
19
+ describe("modifiers", () => {
20
+ it.each(["public", "private"])("%s", mod => {
21
+ expect(_$createComponent(utils.TestNamespace, {
22
+ get children() {
23
+ return _$createComponent(ClassDeclaration, _$mergeProps({
24
+ [mod]: true
25
+ }, {
26
+ name: "TestClass"
27
+ }));
28
+ }
29
+ })).toRenderTo(`
30
+ ${mod} class TestClass;
31
+ `);
32
+ });
33
+ it.each(["partial", "abstract", "static", "sealed"])("%s", mod => {
34
+ expect(_$createComponent(utils.TestNamespace, {
35
+ get children() {
36
+ return _$createComponent(ClassDeclaration, _$mergeProps({
37
+ [mod]: true
38
+ }, {
39
+ name: "TestClass"
40
+ }));
41
+ }
42
+ })).toRenderTo(`
43
+ ${mod} class TestClass;
44
+ `);
45
+ });
46
+ it("combines modifiers", () => {
47
+ expect(_$createComponent(utils.TestNamespace, {
48
+ get children() {
49
+ return _$createComponent(ClassDeclaration, {
50
+ "public": true,
51
+ abstract: true,
52
+ partial: true,
53
+ name: "TestClass"
54
+ });
55
+ }
56
+ })).toRenderTo(`
57
+ public abstract partial class TestClass;
58
+ `);
59
+ });
60
+ });
19
61
  it("declares class with some members", () => {
20
- const res = utils.toSourceText(_$createComponent(csharp.Class, {
21
- accessModifier: "public",
62
+ const res = utils.toSourceText(_$createComponent(csharp.ClassDeclaration, {
63
+ "public": true,
22
64
  name: "TestClass",
23
65
  get children() {
24
66
  return _$createComponent(core.StatementList, {
25
67
  get children() {
26
68
  return [_$createComponent(csharp.ClassMember, {
27
- accessModifier: "public",
69
+ "public": true,
28
70
  name: "MemberOne",
29
71
  type: "string"
30
72
  }), _$createComponent(csharp.ClassMember, {
31
- accessModifier: "private",
73
+ "private": true,
32
74
  name: "MemberTwo",
33
75
  type: "int"
34
76
  })];
@@ -48,18 +90,18 @@ it("declares class with some members", () => {
48
90
  `);
49
91
  });
50
92
  it("declares class with some methods", () => {
51
- const res = utils.toSourceText(_$createComponent(csharp.Class, {
52
- accessModifier: "public",
93
+ const res = utils.toSourceText(_$createComponent(csharp.ClassDeclaration, {
94
+ "public": true,
53
95
  name: "TestClass",
54
96
  get children() {
55
97
  return _$createComponent(core.List, {
56
98
  get children() {
57
99
  return [_$createComponent(csharp.ClassMethod, {
58
- accessModifier: "public",
100
+ "public": true,
59
101
  name: "MethodOne"
60
102
  }), _$createComponent(csharp.ClassMethod, {
61
- accessModifier: "private",
62
- methodModifier: "virtual",
103
+ "private": true,
104
+ virtual: true,
63
105
  name: "MethodTwo"
64
106
  })];
65
107
  }
@@ -77,36 +119,6 @@ it("declares class with some methods", () => {
77
119
  }
78
120
  `);
79
121
  });
80
- it("declares class with params and return type", () => {
81
- const params = [{
82
- name: "IntParam",
83
- type: "int"
84
- }, {
85
- name: "StringParam",
86
- type: "string"
87
- }];
88
- const res = utils.toSourceText(_$createComponent(csharp.Class, {
89
- accessModifier: "public",
90
- name: "TestClass",
91
- get children() {
92
- return _$createComponent(csharp.ClassMethod, {
93
- accessModifier: "public",
94
- name: "MethodOne",
95
- parameters: params,
96
- returns: "string"
97
- });
98
- }
99
- }));
100
- expect(res).toBe(coretest.d`
101
- namespace TestCode
102
- {
103
- public class TestClass
104
- {
105
- public string MethodOne(int intParam, string stringParam) {}
106
- }
107
- }
108
- `);
109
- });
110
122
  it("uses refkeys for members, params, and return type", () => {
111
123
  const inputTypeRefkey = core.refkey();
112
124
  const testResultTypeRefkey = core.refkey();
@@ -129,8 +141,8 @@ it("uses refkeys for members, params, and return type", () => {
129
141
  return _$createComponent(csharp.SourceFile, {
130
142
  path: "Test.cs",
131
143
  get children() {
132
- return [_$createComponent(csharp.Enum, {
133
- accessModifier: "public",
144
+ return [_$createComponent(csharp.EnumDeclaration, {
145
+ "public": true,
134
146
  name: "TestEnum",
135
147
  refkey: enumTypeRefkey,
136
148
  get children() {
@@ -146,24 +158,24 @@ it("uses refkeys for members, params, and return type", () => {
146
158
  }
147
159
  });
148
160
  }
149
- }), _$createIntrinsic("hbr", {}), _$createComponent(csharp.Class, {
150
- accessModifier: "public",
161
+ }), _$createIntrinsic("hbr", {}), _$createComponent(csharp.ClassDeclaration, {
162
+ "public": true,
151
163
  name: "TestInput",
152
164
  refkey: inputTypeRefkey
153
- }), _$createIntrinsic("hbr", {}), _$createComponent(csharp.Class, {
154
- accessModifier: "public",
165
+ }), _$createIntrinsic("hbr", {}), _$createComponent(csharp.ClassDeclaration, {
166
+ "public": true,
155
167
  name: "TestResult",
156
168
  refkey: testResultTypeRefkey
157
- }), _$createIntrinsic("hbr", {}), _$createComponent(csharp.Class, {
158
- accessModifier: "public",
169
+ }), _$createIntrinsic("hbr", {}), _$createComponent(csharp.ClassDeclaration, {
170
+ "public": true,
159
171
  name: "TestClass",
160
172
  get children() {
161
173
  return [_$createComponent(csharp.ClassMember, {
162
- accessModifier: "private",
174
+ "private": true,
163
175
  name: "MemberOne",
164
176
  type: enumTypeRefkey
165
177
  }), ";", _$createIntrinsic("hbr", {}), _$createComponent(csharp.ClassMethod, {
166
- accessModifier: "public",
178
+ "public": true,
167
179
  name: "MethodOne",
168
180
  parameters: params,
169
181
  returns: testResultTypeRefkey,
@@ -205,19 +217,19 @@ it("declares class with generic parameters", () => {
205
217
  T: core.refkey(),
206
218
  U: core.refkey()
207
219
  };
208
- const res = utils.toSourceText(_$createComponent(csharp.Class, {
209
- accessModifier: "public",
220
+ const res = utils.toSourceText(_$createComponent(csharp.ClassDeclaration, {
221
+ "public": true,
210
222
  name: "TestClass",
211
223
  typeParameters: typeParameters,
212
224
  get children() {
213
225
  return [_$createComponent(csharp.ClassMember, {
214
- accessModifier: "public",
226
+ "public": true,
215
227
  name: "memberOne",
216
228
  get type() {
217
229
  return typeParameters.T;
218
230
  }
219
231
  }), ";", _$createIntrinsic("hbr", {}), _$createComponent(csharp.ClassMember, {
220
- accessModifier: "private",
232
+ "private": true,
221
233
  name: "memberTwo",
222
234
  get type() {
223
235
  return typeParameters.U;
@@ -237,8 +249,8 @@ it("declares class with generic parameters", () => {
237
249
  `);
238
250
  });
239
251
  it("declares class with invalid members", () => {
240
- const decl = _$createComponent(csharp.Class, {
241
- accessModifier: "public",
252
+ const decl = _$createComponent(csharp.ClassDeclaration, {
253
+ "public": true,
242
254
  name: "TestClass",
243
255
  get children() {
244
256
  return [_$createComponent(csharp.EnumMember, {
@@ -251,12 +263,12 @@ it("declares class with invalid members", () => {
251
263
  expect(() => utils.toSourceText(decl)).toThrow("can't define an enum member outside of an enum-decl scope");
252
264
  });
253
265
  it("declares class with constructor", () => {
254
- const res = utils.toSourceText(_$createComponent(csharp.Class, {
255
- accessModifier: "public",
266
+ const res = utils.toSourceText(_$createComponent(csharp.ClassDeclaration, {
267
+ "public": true,
256
268
  name: "TestClass",
257
269
  get children() {
258
270
  return _$createComponent(csharp.ClassConstructor, {
259
- accessModifier: "public"
271
+ "public": true
260
272
  });
261
273
  }
262
274
  }));
@@ -284,22 +296,22 @@ it("declares class with constructor params and assigns values to fields", () =>
284
296
  type: "int",
285
297
  refkey: paramSizeRefkey
286
298
  }];
287
- const res = utils.toSourceText(_$createComponent(csharp.Class, {
288
- accessModifier: "public",
299
+ const res = utils.toSourceText(_$createComponent(csharp.ClassDeclaration, {
300
+ "public": true,
289
301
  name: "TestClass",
290
302
  get children() {
291
303
  return [_$createComponent(csharp.ClassMember, {
292
- accessModifier: "private",
304
+ "private": true,
293
305
  name: "name",
294
306
  type: "string",
295
307
  refkey: thisNameRefkey
296
308
  }), ";", _$createIntrinsic("hbr", {}), _$createComponent(csharp.ClassMember, {
297
- accessModifier: "private",
309
+ "private": true,
298
310
  name: "size",
299
311
  type: "int",
300
312
  refkey: thisSizeRefkey
301
313
  }), ";", _$createIntrinsic("hbr", {}), _$createComponent(csharp.ClassConstructor, {
302
- accessModifier: "public",
314
+ "public": true,
303
315
  parameters: ctorParams,
304
316
  get children() {
305
317
  return [thisNameRefkey, " = ", paramNameRefkey, ";", _$createIntrinsic("hbr", {}), thisSizeRefkey, " = ", paramSizeRefkey, ";"];
@@ -325,4 +337,42 @@ it("declares class with constructor params and assigns values to fields", () =>
325
337
  }
326
338
  }
327
339
  `);
340
+ });
341
+ it("specify doc comment", () => {
342
+ expect(_$createComponent(utils.TestNamespace, {
343
+ get children() {
344
+ return _$createComponent(ClassDeclaration, {
345
+ name: "Test",
346
+ doc: "This is a test"
347
+ });
348
+ }
349
+ })).toRenderTo(`
350
+ /// This is a test
351
+ class Test;
352
+ `);
353
+ });
354
+ it("supports class member doc comments", () => {
355
+ expect(_$createComponent(utils.TestNamespace, {
356
+ get children() {
357
+ return _$createComponent(ClassDeclaration, {
358
+ name: "Test",
359
+ doc: "This is a test",
360
+ get children() {
361
+ return _$createComponent(ClassMember, {
362
+ name: "Member",
363
+ "public": true,
364
+ type: "int",
365
+ doc: "This is a member"
366
+ });
367
+ }
368
+ });
369
+ }
370
+ })).toRenderTo(`
371
+ /// This is a test
372
+ class Test
373
+ {
374
+ /// This is a member
375
+ public int Member
376
+ }
377
+ `);
328
378
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=class-method.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-method.test.d.ts","sourceRoot":"","sources":["../../test/class-method.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,161 @@
1
+ import { memo as _$memo, createComponent as _$createComponent, mergeProps as _$mergeProps } from "@alloy-js/core/jsx-runtime";
2
+ import { describe, expect, it } from "vitest";
3
+ import { ClassDeclaration, ClassMethod } from "../src/index.js";
4
+ import { TestNamespace } from "./utils.js";
5
+ const Wrapper = props => _$createComponent(TestNamespace, {
6
+ get children() {
7
+ return _$createComponent(ClassDeclaration, {
8
+ "public": true,
9
+ name: "TestClass",
10
+ get children() {
11
+ return props.children;
12
+ }
13
+ });
14
+ }
15
+ });
16
+ describe("modifiers", () => {
17
+ describe("access modifiers", () => {
18
+ it.each(["public", "private", "protected", "internal"])("%s", accessModifier => {
19
+ expect(_$createComponent(Wrapper, {
20
+ get children() {
21
+ return _$createComponent(ClassMethod, _$mergeProps({
22
+ [accessModifier]: true
23
+ }, {
24
+ name: "MethodOne"
25
+ }));
26
+ }
27
+ })).toRenderTo(`
28
+ public class TestClass
29
+ {
30
+ ${accessModifier} void MethodOne() {}
31
+ }
32
+ `);
33
+ });
34
+ });
35
+ describe("method modifiers", () => {
36
+ it.each(["static", "virtual", "sealed"])("%s", methodModifier => {
37
+ expect(_$createComponent(Wrapper, {
38
+ get children() {
39
+ return _$createComponent(ClassMethod, _$mergeProps({
40
+ [methodModifier]: true
41
+ }, {
42
+ name: "MethodOne"
43
+ }));
44
+ }
45
+ })).toRenderTo(`
46
+ public class TestClass
47
+ {
48
+ ${methodModifier} void MethodOne() {}
49
+ }
50
+ `);
51
+ });
52
+ it("abstract exclude body", () => {
53
+ expect(_$createComponent(Wrapper, {
54
+ get children() {
55
+ return _$createComponent(ClassMethod, {
56
+ abstract: true,
57
+ name: "MethodOne"
58
+ });
59
+ }
60
+ })).toRenderTo(`
61
+ public class TestClass
62
+ {
63
+ abstract void MethodOne();
64
+ }
65
+ `);
66
+ });
67
+ });
68
+ it("mark method async", () => {
69
+ expect(_$createComponent(Wrapper, {
70
+ get children() {
71
+ return _$createComponent(ClassMethod, {
72
+ async: true,
73
+ name: "MethodOne"
74
+ });
75
+ }
76
+ })).toRenderTo(`
77
+ public class TestClass
78
+ {
79
+ async Task MethodOne() {}
80
+ }
81
+ `);
82
+ });
83
+ it("combine modifiers", () => {
84
+ expect(_$createComponent(Wrapper, {
85
+ get children() {
86
+ return _$createComponent(ClassMethod, {
87
+ async: true,
88
+ returns: "Task",
89
+ "public": true,
90
+ abstract: true,
91
+ name: "MethodOne"
92
+ });
93
+ }
94
+ })).toRenderTo(`
95
+ public class TestClass
96
+ {
97
+ public abstract async Task MethodOne();
98
+ }
99
+ `);
100
+ });
101
+ });
102
+ it("applies PascalCase naming policy", () => {
103
+ expect(_$createComponent(Wrapper, {
104
+ get children() {
105
+ return _$createComponent(ClassMethod, {
106
+ name: "method_one"
107
+ });
108
+ }
109
+ })).toRenderTo(`
110
+ public class TestClass
111
+ {
112
+ void MethodOne() {}
113
+ }
114
+ `);
115
+ });
116
+ it("defines params and return type", () => {
117
+ const params = [{
118
+ name: "intParam",
119
+ type: "int"
120
+ }, {
121
+ name: "stringParam",
122
+ type: "string"
123
+ }];
124
+ const res = _$createComponent(Wrapper, {
125
+ get children() {
126
+ return _$createComponent(ClassMethod, {
127
+ "public": true,
128
+ name: "MethodOne",
129
+ parameters: params,
130
+ returns: "string"
131
+ });
132
+ }
133
+ });
134
+ expect(res).toRenderTo(`
135
+ public class TestClass
136
+ {
137
+ public string MethodOne(int intParam, string stringParam) {}
138
+ }
139
+ `);
140
+ });
141
+ it("specify doc comment", () => {
142
+ expect(_$createComponent(TestNamespace, {
143
+ get children() {
144
+ return _$createComponent(ClassDeclaration, {
145
+ name: "Test",
146
+ get children() {
147
+ return _$createComponent(ClassMethod, {
148
+ name: "Method",
149
+ doc: "This is a test"
150
+ });
151
+ }
152
+ });
153
+ }
154
+ })).toRenderTo(`
155
+ class Test
156
+ {
157
+ /// This is a test
158
+ void Method() {}
159
+ }
160
+ `);
161
+ });
@@ -5,8 +5,8 @@ import { expect, it } from "vitest";
5
5
  import * as csharp from "../src/index.js";
6
6
  import * as utils from "./utils.js";
7
7
  it("declares enum with no members", () => {
8
- const res = utils.toSourceText(_$createComponent(csharp.Enum, {
9
- accessModifier: "public",
8
+ const res = utils.toSourceText(_$createComponent(csharp.EnumDeclaration, {
9
+ "public": true,
10
10
  name: "TestEnum"
11
11
  }));
12
12
  expect(res).toBe(coretest.d`
@@ -17,8 +17,8 @@ it("declares enum with no members", () => {
17
17
  `);
18
18
  });
19
19
  it("declares enum with members", () => {
20
- const res = utils.toSourceText(_$createComponent(csharp.Enum, {
21
- accessModifier: "public",
20
+ const res = utils.toSourceText(_$createComponent(csharp.EnumDeclaration, {
21
+ "public": true,
22
22
  name: "TestEnum",
23
23
  get children() {
24
24
  return [_$createComponent(csharp.EnumMember, {
@@ -40,8 +40,8 @@ it("declares enum with members", () => {
40
40
  `);
41
41
  });
42
42
  it("applies naming policy to enum and members", () => {
43
- const res = utils.toSourceText(_$createComponent(csharp.Enum, {
44
- accessModifier: "public",
43
+ const res = utils.toSourceText(_$createComponent(csharp.EnumDeclaration, {
44
+ "public": true,
45
45
  name: "testEnum",
46
46
  get children() {
47
47
  return [_$createComponent(csharp.EnumMember, {
@@ -73,8 +73,8 @@ it("can reference things by refkey", () => {
73
73
  return _$createComponent(csharp.SourceFile, {
74
74
  path: "Test.cs",
75
75
  get children() {
76
- return [_$createComponent(csharp.Enum, {
77
- accessModifier: "public",
76
+ return [_$createComponent(csharp.EnumDeclaration, {
77
+ "public": true,
78
78
  name: "TestEnum",
79
79
  refkey: enumRK,
80
80
  get children() {
@@ -116,8 +116,8 @@ it("can reference things by refkey across files", () => {
116
116
  return [_$createComponent(csharp.SourceFile, {
117
117
  path: "Test.cs",
118
118
  get children() {
119
- return [_$createComponent(csharp.Enum, {
120
- accessModifier: "public",
119
+ return [_$createComponent(csharp.EnumDeclaration, {
120
+ "public": true,
121
121
  name: "TestEnum",
122
122
  get children() {
123
123
  return [_$createComponent(csharp.EnumMember, {
@@ -131,8 +131,8 @@ it("can reference things by refkey across files", () => {
131
131
  }), _$createComponent(csharp.SourceFile, {
132
132
  path: "Other.cs",
133
133
  get children() {
134
- return [_$createComponent(csharp.Enum, {
135
- accessModifier: "public",
134
+ return [_$createComponent(csharp.EnumDeclaration, {
135
+ "public": true,
136
136
  name: "OtherEnum",
137
137
  refkey: enumRK,
138
138
  get children() {
@@ -12,16 +12,16 @@ it("defines multiple namespaces and source files with unique content", () => {
12
12
  return [_$createComponent(csharp.SourceFile, {
13
13
  path: "Model1.cs",
14
14
  get children() {
15
- return _$createComponent(csharp.Class, {
16
- accessModifier: "public",
15
+ return _$createComponent(csharp.ClassDeclaration, {
16
+ "public": true,
17
17
  name: "Model1"
18
18
  });
19
19
  }
20
20
  }), _$createComponent(csharp.SourceFile, {
21
21
  path: "Model2.cs",
22
22
  get children() {
23
- return _$createComponent(csharp.Class, {
24
- accessModifier: "public",
23
+ return _$createComponent(csharp.ClassDeclaration, {
24
+ "public": true,
25
25
  name: "Model2"
26
26
  });
27
27
  }
@@ -33,16 +33,16 @@ it("defines multiple namespaces and source files with unique content", () => {
33
33
  return [_$createComponent(csharp.SourceFile, {
34
34
  path: "Model3.cs",
35
35
  get children() {
36
- return _$createComponent(csharp.Class, {
37
- accessModifier: "public",
36
+ return _$createComponent(csharp.ClassDeclaration, {
37
+ "public": true,
38
38
  name: "Model3"
39
39
  });
40
40
  }
41
41
  }), _$createComponent(csharp.SourceFile, {
42
42
  path: "Model4.cs",
43
43
  get children() {
44
- return _$createComponent(csharp.Class, {
45
- accessModifier: "public",
44
+ return _$createComponent(csharp.ClassDeclaration, {
45
+ "public": true,
46
46
  name: "Model4"
47
47
  });
48
48
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=project-directory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-directory.test.d.ts","sourceRoot":"","sources":["../../test/project-directory.test.tsx"],"names":[],"mappings":""}