@typespec/emitter-framework 0.11.0-dev.6 → 0.11.0-dev.8

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 (173) hide show
  1. package/dist/src/core/components/index.js +2 -1
  2. package/dist/src/core/components/index.js.map +1 -0
  3. package/dist/src/core/components/output.js +2 -1
  4. package/dist/src/core/components/output.js.map +1 -0
  5. package/dist/src/core/components/overrides/component-overrides.js +2 -1
  6. package/dist/src/core/components/overrides/component-overrides.js.map +1 -0
  7. package/dist/src/core/components/overrides/config.js +2 -1
  8. package/dist/src/core/components/overrides/config.js.map +1 -0
  9. package/dist/src/core/components/overrides/context.js +2 -1
  10. package/dist/src/core/components/overrides/context.js.map +1 -0
  11. package/dist/src/core/context/index.js +2 -1
  12. package/dist/src/core/context/index.js.map +1 -0
  13. package/dist/src/core/context/name-policy-context.js +2 -1
  14. package/dist/src/core/context/name-policy-context.js.map +1 -0
  15. package/dist/src/core/context/tsp-context.js +2 -1
  16. package/dist/src/core/context/tsp-context.js.map +1 -0
  17. package/dist/src/core/index.js +2 -1
  18. package/dist/src/core/index.js.map +1 -0
  19. package/dist/src/core/transport-name-policy.js +2 -1
  20. package/dist/src/core/transport-name-policy.js.map +1 -0
  21. package/dist/src/core/write-output.js +2 -1
  22. package/dist/src/core/write-output.js.map +1 -0
  23. package/dist/src/csharp/components/class/declaration.d.ts.map +1 -1
  24. package/dist/src/csharp/components/class/declaration.js +9 -1
  25. package/dist/src/csharp/components/class/declaration.js.map +1 -0
  26. package/dist/src/csharp/components/class/declaration.test.js +62 -105
  27. package/dist/src/csharp/components/class/declaration.test.js.map +1 -0
  28. package/dist/src/csharp/components/enum/declaration.js +2 -1
  29. package/dist/src/csharp/components/enum/declaration.js.map +1 -0
  30. package/dist/src/csharp/components/enum/declaration.test.js +52 -88
  31. package/dist/src/csharp/components/enum/declaration.test.js.map +1 -0
  32. package/dist/src/csharp/components/index.js +2 -1
  33. package/dist/src/csharp/components/index.js.map +1 -0
  34. package/dist/src/csharp/components/property/property.d.ts.map +1 -1
  35. package/dist/src/csharp/components/property/property.js +31 -2
  36. package/dist/src/csharp/components/property/property.js.map +1 -0
  37. package/dist/src/csharp/components/property/property.test.js +91 -39
  38. package/dist/src/csharp/components/property/property.test.js.map +1 -0
  39. package/dist/src/csharp/components/type-expression.js +2 -1
  40. package/dist/src/csharp/components/type-expression.js.map +1 -0
  41. package/dist/src/csharp/components/type-expression.test.js +43 -74
  42. package/dist/src/csharp/components/type-expression.test.js.map +1 -0
  43. package/dist/src/csharp/components/utils/doc-comments.js +2 -1
  44. package/dist/src/csharp/components/utils/doc-comments.js.map +1 -0
  45. package/dist/src/csharp/components/utils/nullable-util.js +2 -1
  46. package/dist/src/csharp/components/utils/nullable-util.js.map +1 -0
  47. package/dist/src/csharp/components/utils/refkey.js +2 -1
  48. package/dist/src/csharp/components/utils/refkey.js.map +1 -0
  49. package/dist/src/csharp/index.js +2 -1
  50. package/dist/src/csharp/index.js.map +1 -0
  51. package/dist/src/lib.js +2 -1
  52. package/dist/src/lib.js.map +1 -0
  53. package/dist/src/testing/index.js +2 -1
  54. package/dist/src/testing/index.js.map +1 -0
  55. package/dist/src/testing/scenario-test/code-block-expectation.js +2 -1
  56. package/dist/src/testing/scenario-test/code-block-expectation.js.map +1 -0
  57. package/dist/src/testing/scenario-test/code-block-expectation.test.js +2 -1
  58. package/dist/src/testing/scenario-test/code-block-expectation.test.js.map +1 -0
  59. package/dist/src/testing/scenario-test/harness.js +2 -1
  60. package/dist/src/testing/scenario-test/harness.js.map +1 -0
  61. package/dist/src/testing/scenario-test/index.js +2 -1
  62. package/dist/src/testing/scenario-test/index.js.map +1 -0
  63. package/dist/src/testing/scenario-test/snippet-extractor.js +2 -1
  64. package/dist/src/testing/scenario-test/snippet-extractor.js.map +1 -0
  65. package/dist/src/typescript/components/array-expression.js +2 -1
  66. package/dist/src/typescript/components/array-expression.js.map +1 -0
  67. package/dist/src/typescript/components/arrow-function.js +2 -1
  68. package/dist/src/typescript/components/arrow-function.js.map +1 -0
  69. package/dist/src/typescript/components/class-method.js +2 -1
  70. package/dist/src/typescript/components/class-method.js.map +1 -0
  71. package/dist/src/typescript/components/enum-declaration.js +2 -1
  72. package/dist/src/typescript/components/enum-declaration.js.map +1 -0
  73. package/dist/src/typescript/components/function-declaration.js +2 -1
  74. package/dist/src/typescript/components/function-declaration.js.map +1 -0
  75. package/dist/src/typescript/components/function-expression.js +2 -1
  76. package/dist/src/typescript/components/function-expression.js.map +1 -0
  77. package/dist/src/typescript/components/function-type.js +2 -1
  78. package/dist/src/typescript/components/function-type.js.map +1 -0
  79. package/dist/src/typescript/components/index.js +2 -1
  80. package/dist/src/typescript/components/index.js.map +1 -0
  81. package/dist/src/typescript/components/interface-declaration.js +2 -1
  82. package/dist/src/typescript/components/interface-declaration.js.map +1 -0
  83. package/dist/src/typescript/components/interface-member.js +2 -1
  84. package/dist/src/typescript/components/interface-member.js.map +1 -0
  85. package/dist/src/typescript/components/interface-method.js +2 -1
  86. package/dist/src/typescript/components/interface-method.js.map +1 -0
  87. package/dist/src/typescript/components/record-expression.js +2 -1
  88. package/dist/src/typescript/components/record-expression.js.map +1 -0
  89. package/dist/src/typescript/components/static-serializers.js +2 -1
  90. package/dist/src/typescript/components/static-serializers.js.map +1 -0
  91. package/dist/src/typescript/components/type-alias-declaration.js +2 -1
  92. package/dist/src/typescript/components/type-alias-declaration.js.map +1 -0
  93. package/dist/src/typescript/components/type-declaration.js +2 -1
  94. package/dist/src/typescript/components/type-declaration.js.map +1 -0
  95. package/dist/src/typescript/components/type-expression.js +2 -1
  96. package/dist/src/typescript/components/type-expression.js.map +1 -0
  97. package/dist/src/typescript/components/type-transform.js +2 -1
  98. package/dist/src/typescript/components/type-transform.js.map +1 -0
  99. package/dist/src/typescript/components/union/declaration.js +2 -1
  100. package/dist/src/typescript/components/union/declaration.js.map +1 -0
  101. package/dist/src/typescript/components/union/declaration.test.js +2 -1
  102. package/dist/src/typescript/components/union/declaration.test.js.map +1 -0
  103. package/dist/src/typescript/components/union/expression.js +2 -1
  104. package/dist/src/typescript/components/union/expression.js.map +1 -0
  105. package/dist/src/typescript/components/union/expression.test.js +2 -1
  106. package/dist/src/typescript/components/union/expression.test.js.map +1 -0
  107. package/dist/src/typescript/components/value-expression.js +2 -1
  108. package/dist/src/typescript/components/value-expression.js.map +1 -0
  109. package/dist/src/typescript/index.js +2 -1
  110. package/dist/src/typescript/index.js.map +1 -0
  111. package/dist/src/typescript/lib.js +2 -1
  112. package/dist/src/typescript/lib.js.map +1 -0
  113. package/dist/src/typescript/utils/index.js +2 -1
  114. package/dist/src/typescript/utils/index.js.map +1 -0
  115. package/dist/src/typescript/utils/operation.js +2 -1
  116. package/dist/src/typescript/utils/operation.js.map +1 -0
  117. package/dist/src/typescript/utils/refkey.js +2 -1
  118. package/dist/src/typescript/utils/refkey.js.map +1 -0
  119. package/dist/test/test-host.js +2 -1
  120. package/dist/test/test-host.js.map +1 -0
  121. package/dist/test/testing/snippet-extractor-csharp.test.js +2 -1
  122. package/dist/test/testing/snippet-extractor-csharp.test.js.map +1 -0
  123. package/dist/test/testing/snippet-extractor-java.test.js +2 -1
  124. package/dist/test/testing/snippet-extractor-java.test.js.map +1 -0
  125. package/dist/test/testing/snippet-extractor-python.test.js +2 -1
  126. package/dist/test/testing/snippet-extractor-python.test.js.map +1 -0
  127. package/dist/test/testing/snippet-extractor-typescript.test.js +2 -1
  128. package/dist/test/testing/snippet-extractor-typescript.test.js.map +1 -0
  129. package/dist/test/typescript/components/arrow-function.test.js +9 -14
  130. package/dist/test/typescript/components/arrow-function.test.js.map +1 -0
  131. package/dist/test/typescript/components/component-override.test.js +2 -1
  132. package/dist/test/typescript/components/component-override.test.js.map +1 -0
  133. package/dist/test/typescript/components/enum-declaration.test.js +2 -1
  134. package/dist/test/typescript/components/enum-declaration.test.js.map +1 -0
  135. package/dist/test/typescript/components/function-declaration.test.js +2 -1
  136. package/dist/test/typescript/components/function-declaration.test.js.map +1 -0
  137. package/dist/test/typescript/components/function-expression.test.js +9 -14
  138. package/dist/test/typescript/components/function-expression.test.js.map +1 -0
  139. package/dist/test/typescript/components/function-type.test.js +9 -14
  140. package/dist/test/typescript/components/function-type.test.js.map +1 -0
  141. package/dist/test/typescript/components/interface-declaration.test.js +2 -1
  142. package/dist/test/typescript/components/interface-declaration.test.js.map +1 -0
  143. package/dist/test/typescript/components/interface-method.test.js +19 -29
  144. package/dist/test/typescript/components/interface-method.test.js.map +1 -0
  145. package/dist/test/typescript/components/member-expression.test.js +2 -1
  146. package/dist/test/typescript/components/member-expression.test.js.map +1 -0
  147. package/dist/test/typescript/components/type-alias-declaration.test.js +2 -1
  148. package/dist/test/typescript/components/type-alias-declaration.test.js.map +1 -0
  149. package/dist/test/typescript/components/type-transform.test.js +2 -1
  150. package/dist/test/typescript/components/type-transform.test.js.map +1 -0
  151. package/dist/test/typescript/components/value-expression.test.js +2 -1
  152. package/dist/test/typescript/components/value-expression.test.js.map +1 -0
  153. package/dist/test/typescript/test-host.js +2 -1
  154. package/dist/test/typescript/test-host.js.map +1 -0
  155. package/dist/test/typescript/utils.js +2 -1
  156. package/dist/test/typescript/utils.js.map +1 -0
  157. package/dist/test/utils.d.ts.map +1 -1
  158. package/dist/test/utils.js +5 -2
  159. package/dist/test/utils.js.map +1 -0
  160. package/dist/test/vitest.setup.js +2 -1
  161. package/dist/test/vitest.setup.js.map +1 -0
  162. package/package.json +7 -7
  163. package/src/csharp/components/class/declaration.test.tsx +61 -102
  164. package/src/csharp/components/class/declaration.tsx +6 -0
  165. package/src/csharp/components/enum/declaration.test.tsx +47 -78
  166. package/src/csharp/components/property/property.test.tsx +74 -35
  167. package/src/csharp/components/property/property.tsx +34 -1
  168. package/src/csharp/components/type-expression.test.tsx +41 -93
  169. package/test/typescript/components/arrow-function.test.tsx +10 -28
  170. package/test/typescript/components/function-expression.test.tsx +10 -28
  171. package/test/typescript/components/function-type.test.tsx +10 -28
  172. package/test/typescript/components/interface-method.test.tsx +25 -68
  173. package/test/utils.ts +3 -1
@@ -5,7 +5,7 @@ import {
5
5
  import { Tester } from "#test/test-host.js";
6
6
  import { List, type Children } from "@alloy-js/core";
7
7
  import { d } from "@alloy-js/core/testing";
8
- import { createCSharpNamePolicy, Namespace, SourceFile } from "@alloy-js/csharp";
8
+ import { createCSharpNamePolicy, SourceFile } from "@alloy-js/csharp";
9
9
  import { t, type TesterInstance } from "@typespec/compiler/testing";
10
10
  import { beforeEach, describe, expect, it } from "vitest";
11
11
  import { Output } from "../../../core/index.js";
@@ -21,9 +21,7 @@ function Wrapper(props: { children: Children }) {
21
21
  const policy = createCSharpNamePolicy();
22
22
  return (
23
23
  <Output program={runner.program} namePolicy={policy}>
24
- <Namespace name="TestNamespace">
25
- <SourceFile path="test.cs">{props.children}</SourceFile>
26
- </Namespace>
24
+ <SourceFile path="test.cs">{props.children}</SourceFile>
27
25
  </Output>
28
26
  );
29
27
  }
@@ -38,12 +36,9 @@ it("renders an empty class declaration", async () => {
38
36
  <ClassDeclaration type={TestModel} />
39
37
  </Wrapper>,
40
38
  ).toRenderTo(`
41
- namespace TestNamespace
39
+ class TestModel
42
40
  {
43
- class TestModel
44
- {
45
41
 
46
- }
47
42
  }
48
43
  `);
49
44
  });
@@ -61,13 +56,10 @@ it("renders a class declaration with properties", async () => {
61
56
  <ClassDeclaration type={TestModel} />
62
57
  </Wrapper>,
63
58
  ).toRenderTo(`
64
- namespace TestNamespace
59
+ class TestModel
65
60
  {
66
- class TestModel
67
- {
68
- public required string Prop1 { get; set; }
69
- public required int Prop2 { get; set; }
70
- }
61
+ public required string Prop1 { get; set; }
62
+ public required int Prop2 { get; set; }
71
63
  }
72
64
  `);
73
65
  });
@@ -94,22 +86,19 @@ it("renders a class declaration with properties using component override", async
94
86
  </TestClientOverrides>
95
87
  </Wrapper>,
96
88
  ).toRenderTo(d`
97
- namespace TestNamespace
89
+ class Foo
98
90
  {
99
- class Foo
100
- {
101
-
102
- }
103
- class Bar
104
- {
105
-
106
- }
107
- class TestModel
108
- {
109
- public required string Prop1 { get; set; }
110
- public required int Prop2 { get; set; }
111
- public Bar? Prop3 { get; set; }
112
- }
91
+
92
+ }
93
+ class Bar
94
+ {
95
+
96
+ }
97
+ class TestModel
98
+ {
99
+ public required string Prop1 { get; set; }
100
+ public required int Prop2 { get; set; }
101
+ public Bar? Prop3 { get; set; }
113
102
  }
114
103
  `);
115
104
  });
@@ -141,12 +130,9 @@ it("can override class name", async () => {
141
130
  <ClassDeclaration type={TestModel} name="CustomClassName" />
142
131
  </Wrapper>,
143
132
  ).toRenderTo(`
144
- namespace TestNamespace
133
+ class CustomClassName
145
134
  {
146
- class CustomClassName
147
- {
148
135
 
149
- }
150
136
  }
151
137
  `);
152
138
  });
@@ -162,12 +148,9 @@ it("renders a class with access modifiers", async () => {
162
148
  <ClassDeclaration type={TestModel} protected />
163
149
  </Wrapper>,
164
150
  ).toRenderTo(`
165
- namespace TestNamespace
151
+ protected class TestModel
166
152
  {
167
- protected class TestModel
168
- {
169
153
 
170
- }
171
154
  }
172
155
  `);
173
156
  });
@@ -184,12 +167,9 @@ describe("from an interface", () => {
184
167
  <ClassDeclaration type={TestInterface} />
185
168
  </Wrapper>,
186
169
  ).toRenderTo(`
187
- namespace TestNamespace
170
+ class TestInterface
188
171
  {
189
- class TestInterface
190
- {
191
172
 
192
- }
193
173
  }
194
174
  `);
195
175
  });
@@ -206,12 +186,9 @@ describe("from an interface", () => {
206
186
  <ClassDeclaration type={TestInterface} />
207
187
  </Wrapper>,
208
188
  ).toRenderTo(`
209
- namespace TestNamespace
189
+ class TestInterface
210
190
  {
211
- class TestInterface
212
- {
213
- public abstract string GetName(string id);
214
- }
191
+ public abstract string GetName(string id);
215
192
  }
216
193
  `);
217
194
  });
@@ -232,16 +209,13 @@ it("renders a class with model members", async () => {
232
209
  <ClassDeclaration type={TestModel} />
233
210
  </Wrapper>,
234
211
  ).toRenderTo(`
235
- namespace TestNamespace
212
+ class TestReference
236
213
  {
237
- class TestReference
238
- {
239
-
240
- }
241
- class TestModel
242
- {
243
- public required TestReference Prop1 { get; set; }
244
- }
214
+
215
+ }
216
+ class TestModel
217
+ {
218
+ public required TestReference Prop1 { get; set; }
245
219
  }
246
220
  `);
247
221
  });
@@ -264,17 +238,14 @@ it("renders a class with enum members", async () => {
264
238
  <ClassDeclaration type={TestModel} />
265
239
  </Wrapper>,
266
240
  ).toRenderTo(`
267
- namespace TestNamespace
241
+ enum TestEnum
242
+ {
243
+ Value1,
244
+ Value2
245
+ }
246
+ class TestModel
268
247
  {
269
- enum TestEnum
270
- {
271
- Value1,
272
- Value2
273
- }
274
- class TestModel
275
- {
276
- public required TestEnum Prop1 { get; set; }
277
- }
248
+ public required TestEnum Prop1 { get; set; }
278
249
  }
279
250
  `);
280
251
  });
@@ -291,12 +262,9 @@ it("maps prop: string | null to nullable property", async () => {
291
262
  <ClassDeclaration type={TestModel} />
292
263
  </Wrapper>,
293
264
  ).toRenderTo(`
294
- namespace TestNamespace
265
+ class TestModel
295
266
  {
296
- class TestModel
297
- {
298
- public required string? Prop1 { get; set; }
299
- }
267
+ public required string? Prop1 { get; set; }
300
268
  }
301
269
  `);
302
270
  });
@@ -319,17 +287,14 @@ it("renders a class with string enums", async () => {
319
287
  <ClassDeclaration type={TestModel} />
320
288
  </Wrapper>,
321
289
  ).toRenderTo(`
322
- namespace TestNamespace
290
+ enum TestEnum
291
+ {
292
+ Value1,
293
+ Value2
294
+ }
295
+ class TestModel
323
296
  {
324
- enum TestEnum
325
- {
326
- Value1,
327
- Value2
328
- }
329
- class TestModel
330
- {
331
- public required TestEnum Prop1 { get; set; }
332
- }
297
+ public required TestEnum Prop1 { get; set; }
333
298
  }
334
299
  `);
335
300
  });
@@ -350,18 +315,15 @@ describe("with doc comments", () => {
350
315
  <ClassDeclaration type={TestModel} />
351
316
  </Wrapper>,
352
317
  ).toRenderTo(`
353
- namespace TestNamespace
318
+ /// <summary>
319
+ /// This is a test model
320
+ /// </summary>
321
+ class TestModel
354
322
  {
355
323
  /// <summary>
356
- /// This is a test model
324
+ /// This is a test property
357
325
  /// </summary>
358
- class TestModel
359
- {
360
- /// <summary>
361
- /// This is a test property
362
- /// </summary>
363
- public required string Prop1 { get; set; }
364
- }
326
+ public required string Prop1 { get; set; }
365
327
  }
366
328
  `);
367
329
  });
@@ -381,22 +343,19 @@ describe("with doc comments", () => {
381
343
  <ClassDeclaration type={TestInterface} />
382
344
  </Wrapper>,
383
345
  ).toRenderTo(`
384
- namespace TestNamespace
346
+ /// <summary>
347
+ /// This is a test interface
348
+ /// </summary>
349
+ class TestInterface
385
350
  {
386
351
  /// <summary>
387
- /// This is a test interface
352
+ /// This is a test operation
388
353
  /// </summary>
389
- class TestInterface
390
- {
391
- /// <summary>
392
- /// This is a test operation
393
- /// </summary>
394
- ///
395
- /// <returns>
396
- /// The name of the item
397
- /// </returns>
398
- public abstract string GetName(string id);
399
- }
354
+ ///
355
+ /// <returns>
356
+ /// The name of the item
357
+ /// </returns>
358
+ public abstract string GetName(string id);
400
359
  }
401
360
  `);
402
361
  });
@@ -41,6 +41,12 @@ export function ClassDeclaration(props: ClassDeclarationProps): Children {
41
41
  {...props}
42
42
  name={className}
43
43
  refkey={refkeys}
44
+ baseType={
45
+ props.baseType ??
46
+ (props.type.kind === "Model" && props.type.baseModel ? (
47
+ <TypeExpression type={props.type.baseModel} />
48
+ ) : undefined)
49
+ }
44
50
  doc={getDocComments($, props.type)}
45
51
  >
46
52
  {props.type.kind === "Model" && (
@@ -1,6 +1,6 @@
1
1
  import { Tester } from "#test/test-host.js";
2
2
  import { type Children } from "@alloy-js/core";
3
- import { createCSharpNamePolicy, Namespace, SourceFile } from "@alloy-js/csharp";
3
+ import { createCSharpNamePolicy, SourceFile } from "@alloy-js/csharp";
4
4
  import { t, type TesterInstance } from "@typespec/compiler/testing";
5
5
  import { beforeEach, expect, it } from "vitest";
6
6
  import { Output } from "../../../core/index.js";
@@ -16,9 +16,7 @@ function Wrapper(props: { children: Children }) {
16
16
  const policy = createCSharpNamePolicy();
17
17
  return (
18
18
  <Output program={runner.program} namePolicy={policy}>
19
- <Namespace name="TestNamespace">
20
- <SourceFile path="test.cs">{props.children}</SourceFile>
21
- </Namespace>
19
+ <SourceFile path="test.cs">{props.children}</SourceFile>
22
20
  </Output>
23
21
  );
24
22
  }
@@ -37,14 +35,11 @@ it("renders a basic enum declaration", async () => {
37
35
  <EnumDeclaration type={TestEnum} />
38
36
  </Wrapper>,
39
37
  ).toRenderTo(`
40
- namespace TestNamespace
38
+ enum TestEnum
41
39
  {
42
- enum TestEnum
43
- {
44
- Value1,
45
- Value2,
46
- Value3
47
- }
40
+ Value1,
41
+ Value2,
42
+ Value3
48
43
  }
49
44
  `);
50
45
  });
@@ -59,12 +54,9 @@ it("renders an empty enum declaration", async () => {
59
54
  <EnumDeclaration type={TestEnum} />
60
55
  </Wrapper>,
61
56
  ).toRenderTo(`
62
- namespace TestNamespace
57
+ enum TestEnum
63
58
  {
64
- enum TestEnum
65
- {
66
59
 
67
- }
68
60
  }
69
61
  `);
70
62
  });
@@ -82,13 +74,10 @@ it("can override enum name", async () => {
82
74
  <EnumDeclaration type={TestEnum} name="CustomEnumName" />
83
75
  </Wrapper>,
84
76
  ).toRenderTo(`
85
- namespace TestNamespace
77
+ enum CustomEnumName
86
78
  {
87
- enum CustomEnumName
88
- {
89
- Value1,
90
- Value2
91
- }
79
+ Value1,
80
+ Value2
92
81
  }
93
82
  `);
94
83
  });
@@ -106,13 +95,10 @@ it("renders an enum with access modifiers", async () => {
106
95
  <EnumDeclaration type={TestEnum} internal />
107
96
  </Wrapper>,
108
97
  ).toRenderTo(`
109
- namespace TestNamespace
98
+ internal enum TestEnum
110
99
  {
111
- internal enum TestEnum
112
- {
113
- Value1,
114
- Value2
115
- }
100
+ Value1,
101
+ Value2
116
102
  }
117
103
  `);
118
104
  });
@@ -128,21 +114,16 @@ it("renders enum with C# naming conventions", async () => {
128
114
 
129
115
  expect(
130
116
  <Output program={runner.program} namePolicy={createCSharpNamePolicy()}>
131
- <Namespace name="TestNamespace">
132
- <SourceFile path="test.cs">
133
- <EnumDeclaration type={TestEnum} />
134
- </SourceFile>
135
- </Namespace>
117
+ <SourceFile path="test.cs">
118
+ <EnumDeclaration type={TestEnum} />
119
+ </SourceFile>
136
120
  </Output>,
137
121
  ).toRenderTo(`
138
- namespace TestNamespace
122
+ enum TestEnum
139
123
  {
140
- enum TestEnum
141
- {
142
- ValueOne,
143
- ValueTwo,
144
- ValueThree
145
- }
124
+ ValueOne,
125
+ ValueTwo,
126
+ ValueThree
146
127
  }
147
128
  `);
148
129
  });
@@ -159,13 +140,10 @@ it("renders enum with single value", async () => {
159
140
  <EnumDeclaration type={TestEnum} />
160
141
  </Wrapper>,
161
142
  ).toRenderTo(`
162
- namespace TestNamespace
163
- {
164
- enum TestEnum
165
- {
166
- OnlyValue
167
- }
168
- }
143
+ enum TestEnum
144
+ {
145
+ OnlyValue
146
+ }
169
147
  `);
170
148
  });
171
149
 
@@ -184,15 +162,12 @@ it("renders enum with numeric-like member names", async () => {
184
162
  <EnumDeclaration type={TestEnum} />
185
163
  </Wrapper>,
186
164
  ).toRenderTo(`
187
- namespace TestNamespace
165
+ enum TestEnum
188
166
  {
189
- enum TestEnum
190
- {
191
- Value0,
192
- Value1,
193
- Value10,
194
- Value100
195
- }
167
+ Value0,
168
+ Value1,
169
+ Value10,
170
+ Value100
196
171
  }
197
172
  `);
198
173
  });
@@ -217,19 +192,16 @@ it("renders multiple enums in the same namespace", async () => {
217
192
  <EnumDeclaration type={TestEnum2} />
218
193
  </Wrapper>,
219
194
  ).toRenderTo(`
220
- namespace TestNamespace
195
+ enum TestEnum1
196
+ {
197
+ Value1,
198
+ Value2
199
+ }
200
+ enum TestEnum2
221
201
  {
222
- enum TestEnum1
223
- {
224
- Value1,
225
- Value2
226
- }
227
- enum TestEnum2
228
- {
229
- OptionA,
230
- OptionB,
231
- OptionC
232
- }
202
+ OptionA,
203
+ OptionB,
204
+ OptionC
233
205
  }
234
206
  `);
235
207
  });
@@ -249,19 +221,16 @@ it("renders an enum with doc comments", async () => {
249
221
  <EnumDeclaration type={TestEnum} />
250
222
  </Wrapper>,
251
223
  ).toRenderTo(`
252
- namespace TestNamespace
224
+ enum TestEnum
253
225
  {
254
- enum TestEnum
255
- {
256
- /// <summary>
257
- /// This is value one
258
- /// </summary>
259
- Value1,
260
- /// <summary>
261
- /// This is value two
262
- /// </summary>
263
- Value2
264
- }
226
+ /// <summary>
227
+ /// This is value one
228
+ /// </summary>
229
+ Value1,
230
+ /// <summary>
231
+ /// This is value two
232
+ /// </summary>
233
+ Value2
265
234
  }
266
235
  `);
267
236
  });
@@ -1,6 +1,6 @@
1
1
  import { Tester } from "#test/test-host.js";
2
- import { type Children } from "@alloy-js/core";
3
- import { ClassDeclaration, createCSharpNamePolicy, Namespace, SourceFile } from "@alloy-js/csharp";
2
+ import { List, type Children } from "@alloy-js/core";
3
+ import { ClassDeclaration, createCSharpNamePolicy, SourceFile } from "@alloy-js/csharp";
4
4
  import { t, type TesterInstance } from "@typespec/compiler/testing";
5
5
  import { beforeEach, describe, expect, it } from "vitest";
6
6
  import { Output } from "../../../core/components/output.jsx";
@@ -16,11 +16,9 @@ function Wrapper(props: { children: Children }) {
16
16
  const policy = createCSharpNamePolicy();
17
17
  return (
18
18
  <Output program={tester.program} namePolicy={policy}>
19
- <Namespace name="TestNamespace">
20
- <SourceFile path="test.cs">
21
- <ClassDeclaration name="Test">{props.children}</ClassDeclaration>
22
- </SourceFile>
23
- </Namespace>
19
+ <SourceFile path="test.cs">
20
+ <ClassDeclaration name="Test">{props.children}</ClassDeclaration>
21
+ </SourceFile>
24
22
  </Output>
25
23
  );
26
24
  }
@@ -37,12 +35,9 @@ it("maps prop: string | null to nullable property", async () => {
37
35
  <Property type={prop1} />
38
36
  </Wrapper>,
39
37
  ).toRenderTo(`
40
- namespace TestNamespace
38
+ class Test
41
39
  {
42
- class Test
43
- {
44
- public required string? Prop1 { get; set; }
45
- }
40
+ public required string? Prop1 { get; set; }
46
41
  }
47
42
  `);
48
43
  });
@@ -59,12 +54,9 @@ it("maps optional properties to nullable properties", async () => {
59
54
  <Property type={prop1} />
60
55
  </Wrapper>,
61
56
  ).toRenderTo(`
62
- namespace TestNamespace
57
+ class Test
63
58
  {
64
- class Test
65
- {
66
- public string? Prop1 { get; set; }
67
- }
59
+ public string? Prop1 { get; set; }
68
60
  }
69
61
  `);
70
62
  });
@@ -81,12 +73,9 @@ it("maps optional and nullable properties to nullable properties", async () => {
81
73
  <Property type={prop1} />
82
74
  </Wrapper>,
83
75
  ).toRenderTo(`
84
- namespace TestNamespace
76
+ class Test
85
77
  {
86
- class Test
87
- {
88
- public string? Prop1 { get; set; }
89
- }
78
+ public string? Prop1 { get; set; }
90
79
  }
91
80
  `);
92
81
  });
@@ -104,13 +93,10 @@ describe("jsonAttributes", () => {
104
93
  <Property type={prop1} jsonAttributes />
105
94
  </Wrapper>,
106
95
  ).toRenderTo(`
107
- namespace TestNamespace
96
+ class Test
108
97
  {
109
- class Test
110
- {
111
- [System.Text.Json.JsonPropertyName("prop1")]
112
- public required string Prop1 { get; set; }
113
- }
98
+ [System.Text.Json.JsonPropertyName("prop1")]
99
+ public required string Prop1 { get; set; }
114
100
  }
115
101
  `);
116
102
  });
@@ -128,14 +114,67 @@ describe("jsonAttributes", () => {
128
114
  <Property type={prop1} jsonAttributes />
129
115
  </Wrapper>,
130
116
  ).toRenderTo(`
131
- namespace TestNamespace
117
+ class Test
118
+ {
119
+ [System.Text.Json.JsonPropertyName("prop_1")]
120
+ public required string Prop1 { get; set; }
121
+ }
122
+ `);
123
+ });
124
+
125
+ it("inherit prop: override, new", async () => {
126
+ const r = await tester.compile(t.code`
127
+ model TestModel extends BaseModel {
128
+ ${t.modelProperty("prop1")}: string;
129
+ ${t.modelProperty("prop2")}: string | null;
130
+ }
131
+ model BaseModel {
132
+ prop1: string | null;
133
+ prop2: string | null;
134
+ }
135
+ `);
136
+
137
+ expect(
138
+ <Wrapper>
139
+ <List>
140
+ <Property type={r.prop1} />
141
+ <Property type={r.prop2} />
142
+ </List>
143
+ </Wrapper>,
144
+ ).toRenderTo(`
145
+ class Test
132
146
  {
133
- class Test
134
- {
135
- [System.Text.Json.JsonPropertyName("prop_1")]
136
- public required string Prop1 { get; set; }
137
- }
147
+ public new required string Prop1 { get; set; }
148
+ public override required string? Prop2 { get; set; }
138
149
  }
139
- `);
150
+ `);
151
+ });
152
+
153
+ it("inherit prop: virtual", async () => {
154
+ const r = await tester.compile(t.code`
155
+ model TestModel extends BaseModel {
156
+ prop1: string;
157
+ prop2: string | null;
158
+ }
159
+ model BaseModel {
160
+ ${t.modelProperty("prop1")}: string | null;
161
+ ${t.modelProperty("prop2")}: string | null;
162
+ }
163
+ `);
164
+
165
+ expect(
166
+ <Wrapper>
167
+ <List>
168
+ <Property type={r.prop1} />
169
+ <Property type={r.prop2} />
170
+ </List>
171
+ </Wrapper>,
172
+ ).toRenderTo(`
173
+ class Test
174
+ {
175
+ public required string? Prop1 { get; set; }
176
+ public virtual required string? Prop2 { get; set; }
177
+ }
178
+ `);
140
179
  });
141
180
  });