@alloy-js/python 0.5.0-dev.1 → 0.5.0-dev.2

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 (166) hide show
  1. package/dist/dev/src/components/SourceFile.js +44 -32
  2. package/dist/dev/src/components/SourceFile.js.map +1 -1
  3. package/dist/dev/test/callsignatures.test.js +471 -297
  4. package/dist/dev/test/callsignatures.test.js.map +1 -1
  5. package/dist/dev/test/class-method-declaration.test.js +21 -10
  6. package/dist/dev/test/class-method-declaration.test.js.map +1 -1
  7. package/dist/dev/test/classdeclarations.test.js +459 -393
  8. package/dist/dev/test/classdeclarations.test.js.map +1 -1
  9. package/dist/dev/test/classinstantiations.test.js +201 -168
  10. package/dist/dev/test/classinstantiations.test.js.map +1 -1
  11. package/dist/dev/test/constructordeclaration.test.js +22 -11
  12. package/dist/dev/test/constructordeclaration.test.js.map +1 -1
  13. package/dist/dev/test/dataclassdeclarations.test.js +322 -368
  14. package/dist/dev/test/dataclassdeclarations.test.js.map +1 -1
  15. package/dist/dev/test/decoratorlist.test.js +96 -49
  16. package/dist/dev/test/decoratorlist.test.js.map +1 -1
  17. package/dist/dev/test/dundermethoddeclaration.test.js +22 -11
  18. package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -1
  19. package/dist/dev/test/enums.test.js +218 -184
  20. package/dist/dev/test/enums.test.js.map +1 -1
  21. package/dist/dev/test/externals.test.js +57 -45
  22. package/dist/dev/test/externals.test.js.map +1 -1
  23. package/dist/dev/test/factories.test.js +124 -50
  24. package/dist/dev/test/factories.test.js.map +1 -1
  25. package/dist/dev/test/functioncallexpressions.test.js +199 -164
  26. package/dist/dev/test/functioncallexpressions.test.js.map +1 -1
  27. package/dist/dev/test/functiondeclaration.test.js +439 -272
  28. package/dist/dev/test/functiondeclaration.test.js.map +1 -1
  29. package/dist/dev/test/imports.test.js +273 -221
  30. package/dist/dev/test/imports.test.js.map +1 -1
  31. package/dist/dev/test/memberexpressions.test.js +1237 -972
  32. package/dist/dev/test/memberexpressions.test.js.map +1 -1
  33. package/dist/dev/test/methoddeclaration.test.js +142 -78
  34. package/dist/dev/test/methoddeclaration.test.js.map +1 -1
  35. package/dist/dev/test/namepolicies.test.js +130 -94
  36. package/dist/dev/test/namepolicies.test.js.map +1 -1
  37. package/dist/dev/test/propertydeclaration.test.js +88 -59
  38. package/dist/dev/test/propertydeclaration.test.js.map +1 -1
  39. package/dist/dev/test/pydanticclassdeclarations.test.js +299 -347
  40. package/dist/dev/test/pydanticclassdeclarations.test.js.map +1 -1
  41. package/dist/dev/test/pydocs.test.js +888 -715
  42. package/dist/dev/test/pydocs.test.js.map +1 -1
  43. package/dist/dev/test/references.test.js +42 -35
  44. package/dist/dev/test/references.test.js.map +1 -1
  45. package/dist/dev/test/sourcefiles.test.js +1109 -841
  46. package/dist/dev/test/sourcefiles.test.js.map +1 -1
  47. package/dist/dev/test/staticmethoddeclaration.test.js +21 -10
  48. package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -1
  49. package/dist/dev/test/type-checking-imports.test.js +408 -359
  50. package/dist/dev/test/type-checking-imports.test.js.map +1 -1
  51. package/dist/dev/test/typereference.test.js +55 -40
  52. package/dist/dev/test/typereference.test.js.map +1 -1
  53. package/dist/dev/test/uniontypeexpression.test.js +222 -146
  54. package/dist/dev/test/uniontypeexpression.test.js.map +1 -1
  55. package/dist/dev/test/utils.js +39 -77
  56. package/dist/dev/test/utils.js.map +1 -1
  57. package/dist/dev/test/values.test.js +237 -101
  58. package/dist/dev/test/values.test.js.map +1 -1
  59. package/dist/dev/test/variables.test.js +321 -203
  60. package/dist/dev/test/variables.test.js.map +1 -1
  61. package/dist/dev/test/vitest.setup.js +2 -0
  62. package/dist/dev/test/vitest.setup.js.map +1 -0
  63. package/dist/src/components/SourceFile.d.ts +2 -2
  64. package/dist/src/components/SourceFile.d.ts.map +1 -1
  65. package/dist/src/components/SourceFile.js +12 -0
  66. package/dist/src/components/SourceFile.js.map +1 -1
  67. package/dist/test/callsignatures.test.js +346 -272
  68. package/dist/test/callsignatures.test.js.map +1 -1
  69. package/dist/test/class-method-declaration.test.js +7 -4
  70. package/dist/test/class-method-declaration.test.js.map +1 -1
  71. package/dist/test/classdeclarations.test.js +302 -288
  72. package/dist/test/classdeclarations.test.js.map +1 -1
  73. package/dist/test/classinstantiations.test.js +112 -103
  74. package/dist/test/classinstantiations.test.js.map +1 -1
  75. package/dist/test/constructordeclaration.test.js +7 -4
  76. package/dist/test/constructordeclaration.test.js.map +1 -1
  77. package/dist/test/dataclassdeclarations.test.js +134 -184
  78. package/dist/test/dataclassdeclarations.test.js.map +1 -1
  79. package/dist/test/decoratorlist.test.js +59 -36
  80. package/dist/test/decoratorlist.test.js.map +1 -1
  81. package/dist/test/dundermethoddeclaration.test.js +7 -4
  82. package/dist/test/dundermethoddeclaration.test.js.map +1 -1
  83. package/dist/test/enums.test.js +161 -159
  84. package/dist/test/enums.test.js.map +1 -1
  85. package/dist/test/externals.test.js +24 -24
  86. package/dist/test/externals.test.js.map +1 -1
  87. package/dist/test/factories.test.js +75 -33
  88. package/dist/test/factories.test.js.map +1 -1
  89. package/dist/test/functioncallexpressions.test.js +117 -106
  90. package/dist/test/functioncallexpressions.test.js.map +1 -1
  91. package/dist/test/functiondeclaration.test.js +247 -180
  92. package/dist/test/functiondeclaration.test.js.map +1 -1
  93. package/dist/test/imports.test.js +171 -143
  94. package/dist/test/imports.test.js.map +1 -1
  95. package/dist/test/memberexpressions.test.js +582 -453
  96. package/dist/test/memberexpressions.test.js.map +1 -1
  97. package/dist/test/methoddeclaration.test.js +66 -46
  98. package/dist/test/methoddeclaration.test.js.map +1 -1
  99. package/dist/test/namepolicies.test.js +90 -78
  100. package/dist/test/namepolicies.test.js.map +1 -1
  101. package/dist/test/propertydeclaration.test.js +25 -20
  102. package/dist/test/propertydeclaration.test.js.map +1 -1
  103. package/dist/test/pydanticclassdeclarations.test.js +134 -190
  104. package/dist/test/pydanticclassdeclarations.test.js.map +1 -1
  105. package/dist/test/pydocs.test.js +573 -532
  106. package/dist/test/pydocs.test.js.map +1 -1
  107. package/dist/test/references.test.js +31 -28
  108. package/dist/test/references.test.js.map +1 -1
  109. package/dist/test/sourcefiles.test.js +700 -580
  110. package/dist/test/sourcefiles.test.js.map +1 -1
  111. package/dist/test/staticmethoddeclaration.test.js +7 -4
  112. package/dist/test/staticmethoddeclaration.test.js.map +1 -1
  113. package/dist/test/type-checking-imports.test.js +297 -284
  114. package/dist/test/type-checking-imports.test.js.map +1 -1
  115. package/dist/test/typereference.test.js +29 -22
  116. package/dist/test/typereference.test.js.map +1 -1
  117. package/dist/test/uniontypeexpression.test.js +124 -88
  118. package/dist/test/uniontypeexpression.test.js.map +1 -1
  119. package/dist/test/utils.d.ts +10 -17
  120. package/dist/test/utils.d.ts.map +1 -1
  121. package/dist/test/utils.js +32 -74
  122. package/dist/test/utils.js.map +1 -1
  123. package/dist/test/values.test.js +135 -67
  124. package/dist/test/values.test.js.map +1 -1
  125. package/dist/test/variables.test.js +201 -151
  126. package/dist/test/variables.test.js.map +1 -1
  127. package/dist/test/vitest.setup.d.ts +2 -0
  128. package/dist/test/vitest.setup.d.ts.map +1 -0
  129. package/dist/test/vitest.setup.js +2 -0
  130. package/dist/test/vitest.setup.js.map +1 -0
  131. package/dist/tsconfig.tsbuildinfo +1 -1
  132. package/docs/api/components/SourceFile.md +20 -8
  133. package/package.json +2 -2
  134. package/src/components/SourceFile.tsx +6 -1
  135. package/temp/api.json +16 -2
  136. package/test/callsignatures.test.tsx +309 -283
  137. package/test/class-method-declaration.test.tsx +3 -4
  138. package/test/classdeclarations.test.tsx +263 -248
  139. package/test/classinstantiations.test.tsx +115 -109
  140. package/test/constructordeclaration.test.tsx +9 -6
  141. package/test/dataclassdeclarations.test.tsx +243 -361
  142. package/test/decoratorlist.test.tsx +78 -59
  143. package/test/dundermethoddeclaration.test.tsx +3 -4
  144. package/test/enums.test.tsx +65 -81
  145. package/test/externals.test.tsx +25 -25
  146. package/test/factories.test.tsx +64 -22
  147. package/test/functioncallexpressions.test.tsx +123 -109
  148. package/test/functiondeclaration.test.tsx +209 -148
  149. package/test/imports.test.tsx +119 -91
  150. package/test/memberexpressions.test.tsx +265 -207
  151. package/test/methoddeclaration.test.tsx +84 -63
  152. package/test/namepolicies.test.tsx +69 -69
  153. package/test/propertydeclaration.test.tsx +7 -8
  154. package/test/pydanticclassdeclarations.test.tsx +355 -487
  155. package/test/pydocs.test.tsx +531 -579
  156. package/test/references.test.tsx +24 -23
  157. package/test/sourcefiles.test.tsx +527 -492
  158. package/test/staticmethoddeclaration.test.tsx +3 -4
  159. package/test/type-checking-imports.test.tsx +206 -218
  160. package/test/typereference.test.tsx +15 -12
  161. package/test/uniontypeexpression.test.tsx +74 -61
  162. package/test/utils.tsx +26 -110
  163. package/test/values.test.tsx +82 -32
  164. package/test/variables.test.tsx +162 -142
  165. package/test/vitest.setup.ts +1 -0
  166. package/vitest.config.ts +3 -0
@@ -1,182 +1,201 @@
1
- import { code, namekey, refkey } from "@alloy-js/core";
2
- import { d } from "@alloy-js/core/testing";
1
+ import { code, namekey, refkey, render } from "@alloy-js/core";
3
2
  import { describe, expect, it } from "vitest";
4
3
  import * as py from "../src/index.js";
5
4
  import { abcModule } from "../src/index.js";
6
- import {
7
- assertFileContents,
8
- toSourceText,
9
- toSourceTextMultiple,
10
- } from "./utils.js";
5
+ import { TestOutput, TestOutputDirectory } from "./utils.js";
11
6
 
12
7
  describe("Function Declaration", () => {
13
8
  it("renders multiple decorators above def without blank lines", () => {
14
- const result = toSourceText([
15
- <py.FunctionDeclaration name="f" decorators={["@a", "@b", "@c"]}>
16
- pass
17
- </py.FunctionDeclaration>,
18
- ]);
19
- expect(result).toRenderTo(d`
9
+ expect(
10
+ <TestOutput>
11
+ <py.FunctionDeclaration name="f" decorators={["@a", "@b", "@c"]}>
12
+ pass
13
+ </py.FunctionDeclaration>
14
+ </TestOutput>,
15
+ ).toRenderTo(
16
+ `
20
17
  @a
21
18
  @b
22
19
  @c
23
20
  def f():
24
21
  pass
25
22
 
26
-
27
- `);
23
+ `,
24
+ );
28
25
  });
29
26
 
30
27
  it("renders a function with no body as 'pass'", () => {
31
- const result = toSourceText([<py.FunctionDeclaration name="foo" />]);
32
- expect(result).toRenderTo(d`
28
+ expect(
29
+ <TestOutput>
30
+ <py.FunctionDeclaration name="foo" />
31
+ </TestOutput>,
32
+ ).toRenderTo(
33
+ `
33
34
  def foo():
34
35
  pass
35
36
 
36
-
37
- `);
37
+ `,
38
+ );
38
39
  });
39
40
 
40
41
  it("takes a namekey", () => {
41
- const result = toSourceText([
42
- <py.FunctionDeclaration name={namekey("foo-bar")} />,
43
- ]);
44
- expect(result).toRenderTo(d`
42
+ expect(
43
+ <TestOutput>
44
+ <py.FunctionDeclaration name={namekey("foo-bar")} />
45
+ </TestOutput>,
46
+ ).toRenderTo(
47
+ `
45
48
  def foo_bar():
46
49
  pass
47
50
 
48
-
49
- `);
51
+ `,
52
+ );
50
53
  });
51
54
 
52
55
  it("renders a function with no body as 'pass' with return type", () => {
53
- const result = toSourceText([
54
- <py.FunctionDeclaration name="foo" returnType="int" />,
55
- ]);
56
- expect(result).toRenderTo(d`
56
+ expect(
57
+ <TestOutput>
58
+ <py.FunctionDeclaration name="foo" returnType="int" />
59
+ </TestOutput>,
60
+ ).toRenderTo(
61
+ `
57
62
  def foo() -> int:
58
63
  pass
59
64
 
60
-
61
- `);
65
+ `,
66
+ );
62
67
  });
63
68
 
64
69
  it("renders a function that calls another function", () => {
65
70
  const refkeyFoo = refkey();
66
- const result = toSourceText([
67
- <py.StatementList>
68
- <py.FunctionDeclaration
69
- name="foo"
70
- returnType="int"
71
- refkey={refkeyFoo}
72
- />
73
- <py.FunctionDeclaration name="bar" returnType="int">
74
- <py.VariableDeclaration
75
- name="result"
76
- type="int"
77
- initializer={
78
- <py.FunctionCallExpression target={refkeyFoo} args={[]} />
79
- }
71
+ expect(
72
+ <TestOutput>
73
+ <py.StatementList>
74
+ <py.FunctionDeclaration
75
+ name="foo"
76
+ returnType="int"
77
+ refkey={refkeyFoo}
80
78
  />
81
- </py.FunctionDeclaration>
82
- </py.StatementList>,
83
- ]);
84
- expect(result).toRenderTo(d`
79
+ <py.FunctionDeclaration name="bar" returnType="int">
80
+ <py.VariableDeclaration
81
+ name="result"
82
+ type="int"
83
+ initializer={
84
+ <py.FunctionCallExpression target={refkeyFoo} args={[]} />
85
+ }
86
+ />
87
+ </py.FunctionDeclaration>
88
+ </py.StatementList>
89
+ </TestOutput>,
90
+ ).toRenderTo(
91
+ `
85
92
  def foo() -> int:
86
93
  pass
87
94
 
88
95
  def bar() -> int:
89
96
  result: int = foo()
90
97
 
91
-
92
- `);
98
+ `,
99
+ );
93
100
  });
94
101
 
95
102
  it("renders a function with parameters", () => {
96
- const result = toSourceText([
97
- <py.FunctionDeclaration
98
- name="baz"
99
- parameters={[
100
- { name: "x", type: "int" },
101
- { name: "y", default: 0 },
102
- { name: "z", type: "int", default: 42 },
103
- ]}
104
- args={true}
105
- kwargs={true}
106
- >
107
- print(x, y)
108
- </py.FunctionDeclaration>,
109
- ]);
110
- expect(result).toRenderTo(
111
- d`
103
+ expect(
104
+ <TestOutput>
105
+ <py.FunctionDeclaration
106
+ name="baz"
107
+ parameters={[
108
+ { name: "x", type: "int" },
109
+ { name: "y", default: 0 },
110
+ { name: "z", type: "int", default: 42 },
111
+ ]}
112
+ args={true}
113
+ kwargs={true}
114
+ >
115
+ print(x, y)
116
+ </py.FunctionDeclaration>
117
+ </TestOutput>,
118
+ ).toRenderTo(
119
+ `
112
120
  def baz(x: int, y=0, z: int = 42, *args, **kwargs):
113
121
  print(x, y)
114
122
 
115
-
116
123
  `,
117
124
  );
118
125
  });
119
126
 
120
127
  it("renders an __init__ function with no body as 'pass'", () => {
121
- const result = toSourceText([
122
- <py.ClassDeclaration name="MyClass">
123
- <py.DunderMethodDeclaration
124
- name="__init__"
125
- parameters={[{ name: "x" }]}
126
- />
127
- </py.ClassDeclaration>,
128
- ]);
129
- expect(result).toRenderTo(d`
128
+ expect(
129
+ <TestOutput>
130
+ <py.ClassDeclaration name="MyClass">
131
+ <py.DunderMethodDeclaration
132
+ name="__init__"
133
+ parameters={[{ name: "x" }]}
134
+ />
135
+ </py.ClassDeclaration>
136
+ </TestOutput>,
137
+ ).toRenderTo(
138
+ `
130
139
  class MyClass:
131
140
  def __init__(self, x):
132
141
  pass
133
142
 
134
-
135
-
136
- `);
143
+
144
+ `,
145
+ );
137
146
  });
138
147
 
139
148
  it("can be an async function", () => {
140
- expect(toSourceText([<py.FunctionDeclaration async name="foo" />])).toBe(d`
149
+ expect(
150
+ <TestOutput>
151
+ <py.FunctionDeclaration async name="foo" />
152
+ </TestOutput>,
153
+ ).toRenderTo(
154
+ `
141
155
  async def foo():
142
156
  pass
143
157
 
144
- `);
158
+ `,
159
+ );
145
160
  });
146
161
 
147
162
  it("can be an async function with returnType", () => {
148
163
  expect(
149
- toSourceText([
150
- <py.FunctionDeclaration async name="foo" returnType={"Foo"} />,
151
- ]),
152
- ).toBe(d`
164
+ <TestOutput>
165
+ <py.FunctionDeclaration async name="foo" returnType={"Foo"} />
166
+ </TestOutput>,
167
+ ).toRenderTo(
168
+ `
153
169
  async def foo() -> Foo:
154
170
  pass
155
171
 
156
- `);
172
+ `,
173
+ );
157
174
  });
158
175
 
159
176
  it("can be an async function with returnType element with Reference", () => {
160
177
  expect(
161
- toSourceText([
178
+ <TestOutput>
162
179
  <py.StatementList>
163
180
  <py.ClassDeclaration name="Foo" refkey={refkey("Foo")} />
164
181
  <py.FunctionDeclaration async name="foo" returnType={refkey("Foo")} />
165
- </py.StatementList>,
166
- ]),
167
- ).toBe(d`
182
+ </py.StatementList>
183
+ </TestOutput>,
184
+ ).toRenderTo(
185
+ `
168
186
  class Foo:
169
187
  pass
170
188
 
171
189
  async def foo() -> Foo:
172
190
  pass
173
191
 
174
- `);
192
+ `,
193
+ );
175
194
  });
176
195
 
177
196
  it("can be an async function with returnType element with list of References", () => {
178
197
  expect(
179
- toSourceText([
198
+ <TestOutput>
180
199
  <py.StatementList>
181
200
  <py.ClassDeclaration name="Foo" refkey={refkey("Foo")} />
182
201
  <py.FunctionDeclaration
@@ -184,16 +203,18 @@ describe("Function Declaration", () => {
184
203
  name="foo"
185
204
  returnType={code`list[${refkey("Foo")}]`}
186
205
  />
187
- </py.StatementList>,
188
- ]),
189
- ).toBe(d`
206
+ </py.StatementList>
207
+ </TestOutput>,
208
+ ).toRenderTo(
209
+ `
190
210
  class Foo:
191
211
  pass
192
212
 
193
213
  async def foo() -> list[Foo]:
194
214
  pass
195
215
 
196
- `);
216
+ `,
217
+ );
197
218
  });
198
219
 
199
220
  it("can be an async dunder method", () => {
@@ -213,13 +234,15 @@ describe("Function Declaration", () => {
213
234
  </py.StatementList>
214
235
  );
215
236
 
216
- expect(toSourceText([decl])).toBe(d`
237
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
238
+ `
217
239
  class MyClass:
218
240
  async def __aenter__(self) -> MyClass:
219
241
  return self
220
242
 
221
243
 
222
- `);
244
+ `,
245
+ );
223
246
  });
224
247
 
225
248
  it("can be an async constructor", () => {
@@ -235,13 +258,15 @@ describe("Function Declaration", () => {
235
258
  </py.StatementList>
236
259
  );
237
260
 
238
- expect(toSourceText([decl])).toBe(d`
261
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
262
+ `
239
263
  class MyClass:
240
264
  async def __new__(cls) -> MyClass:
241
265
  return super().__new__(cls)
242
266
 
243
267
 
244
- `);
268
+ `,
269
+ );
245
270
  });
246
271
 
247
272
  it("supports parameters", () => {
@@ -254,12 +279,15 @@ describe("Function Declaration", () => {
254
279
  </py.FunctionDeclaration>
255
280
  );
256
281
 
257
- expect(toSourceText([decl])).toBe(d`
282
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
283
+ `
258
284
  def foo(a, b):
259
285
  return a + b
260
286
 
261
- `);
287
+ `,
288
+ );
262
289
  });
290
+
263
291
  it("supports type parameters", () => {
264
292
  const decl = (
265
293
  <py.FunctionDeclaration
@@ -271,12 +299,15 @@ describe("Function Declaration", () => {
271
299
  </py.FunctionDeclaration>
272
300
  );
273
301
 
274
- expect(toSourceText([decl])).toBe(d`
302
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
303
+ `
275
304
  def foo[T, U](a, b):
276
305
  return a + b
277
306
 
278
- `);
307
+ `,
308
+ );
279
309
  });
310
+
280
311
  it("renders abstract methods", () => {
281
312
  const parameters = [{ name: "x", type: "int" }];
282
313
  const decl = (
@@ -303,7 +334,8 @@ describe("Function Declaration", () => {
303
334
  </py.StatementList>
304
335
  );
305
336
 
306
- expect(toSourceText([decl], { externals: [abcModule] })).toBe(d`
337
+ expect(<TestOutput externals={[abcModule]}>{decl}</TestOutput>).toRenderTo(
338
+ `
307
339
  from abc import abstractmethod
308
340
 
309
341
 
@@ -323,8 +355,10 @@ describe("Function Declaration", () => {
323
355
  pass
324
356
 
325
357
 
326
- `);
358
+ `,
359
+ );
327
360
  });
361
+
328
362
  it("renders dunder methods with parameters", () => {
329
363
  const parameters = [{ name: "x", type: "int" }];
330
364
  const decl = (
@@ -340,7 +374,8 @@ describe("Function Declaration", () => {
340
374
  </py.ClassDeclaration>
341
375
  );
342
376
 
343
- expect(toSourceText([decl])).toBe(d`
377
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
378
+ `
344
379
  class MyClass:
345
380
  def __init__(self, x: int):
346
381
  self.attribute = "value"
@@ -349,7 +384,8 @@ describe("Function Declaration", () => {
349
384
  return "MyClass"
350
385
 
351
386
 
352
- `);
387
+ `,
388
+ );
353
389
  });
354
390
 
355
391
  it("renders dunder methods __new__", () => {
@@ -363,13 +399,15 @@ describe("Function Declaration", () => {
363
399
  </py.ClassDeclaration>
364
400
  );
365
401
 
366
- expect(toSourceText([decl])).toBe(d`
402
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
403
+ `
367
404
  class MyClass:
368
405
  def __new__(cls, *args, **kwargs):
369
406
  pass
370
407
 
371
408
 
372
- `);
409
+ `,
410
+ );
373
411
  });
374
412
 
375
413
  it("renders nested functions", () => {
@@ -411,7 +449,8 @@ describe("Function Declaration", () => {
411
449
  </py.FunctionDeclaration>
412
450
  );
413
451
 
414
- expect(toSourceText([decl])).toBe(d`
452
+ expect(<TestOutput>{decl}</TestOutput>).toRenderTo(
453
+ `
415
454
  def foo(x: int):
416
455
  def bar(y: int):
417
456
  def foobar(z: int):
@@ -419,39 +458,41 @@ describe("Function Declaration", () => {
419
458
  return foobar(2)
420
459
  return bar(3)
421
460
 
422
- `);
461
+ `,
462
+ );
423
463
  });
424
- it("renders complex typing structure", () => {
425
- const res = toSourceTextMultiple([
426
- <py.SourceFile path="mod1.py">
427
- <py.ClassDeclaration name="Foo" refkey={refkey("Foo")} />
428
- </py.SourceFile>,
429
- <py.SourceFile path="mod2.py">
430
- <py.ClassDeclaration name="A" refkey={refkey("A")} />
431
- <py.ClassDeclaration name="B" refkey={refkey("B")} />
432
- </py.SourceFile>,
433
- <py.SourceFile path="usage.py">
434
- <py.FunctionDeclaration
435
- async
436
- name="foo"
437
- parameters={[
438
- {
439
- name: "x",
440
- type: refkey("A"),
441
- },
442
- {
443
- name: "y",
444
- type: refkey("B"),
445
- },
446
- ]}
447
- args={true}
448
- kwargs={true}
449
- returnType={refkey("Foo")}
450
- />
451
- </py.SourceFile>,
452
- ]);
453
464
 
454
- assertFileContents(res, {
465
+ it("renders complex typing structure", () => {
466
+ expect(
467
+ <TestOutputDirectory>
468
+ <py.SourceFile path="mod1.py">
469
+ <py.ClassDeclaration name="Foo" refkey={refkey("Foo")} />
470
+ </py.SourceFile>
471
+ <py.SourceFile path="mod2.py">
472
+ <py.ClassDeclaration name="A" refkey={refkey("A")} />
473
+ <py.ClassDeclaration name="B" refkey={refkey("B")} />
474
+ </py.SourceFile>
475
+ <py.SourceFile path="usage.py">
476
+ <py.FunctionDeclaration
477
+ async
478
+ name="foo"
479
+ parameters={[
480
+ {
481
+ name: "x",
482
+ type: refkey("A"),
483
+ },
484
+ {
485
+ name: "y",
486
+ type: refkey("B"),
487
+ },
488
+ ]}
489
+ args={true}
490
+ kwargs={true}
491
+ returnType={refkey("Foo")}
492
+ />
493
+ </py.SourceFile>
494
+ </TestOutputDirectory>,
495
+ ).toRenderTo({
455
496
  "mod1.py": `
456
497
  class Foo:
457
498
  pass
@@ -484,13 +525,21 @@ describe("Function Declaration", () => {
484
525
 
485
526
  it("throws error when PropertyDeclaration is used outside of a class", () => {
486
527
  expect(() => {
487
- toSourceText([<py.PropertyDeclaration name="x" />]);
528
+ render(
529
+ <TestOutput>
530
+ <py.PropertyDeclaration name="x" />
531
+ </TestOutput>,
532
+ );
488
533
  }).toThrow('Method "x" must be declared inside a class (member scope)');
489
534
  });
490
535
 
491
536
  it("throws error when MethodDeclaration is used outside of a class", () => {
492
537
  expect(() => {
493
- toSourceText([<py.MethodDeclaration name="my_method" />]);
538
+ render(
539
+ <TestOutput>
540
+ <py.MethodDeclaration name="my_method" />
541
+ </TestOutput>,
542
+ );
494
543
  }).toThrow(
495
544
  'Method "my_method" must be declared inside a class (member scope)',
496
545
  );
@@ -498,7 +547,11 @@ describe("Function Declaration", () => {
498
547
 
499
548
  it("throws error when ClassMethodDeclaration is used outside of a class", () => {
500
549
  expect(() => {
501
- toSourceText([<py.ClassMethodDeclaration name="my_class_method" />]);
550
+ render(
551
+ <TestOutput>
552
+ <py.ClassMethodDeclaration name="my_class_method" />
553
+ </TestOutput>,
554
+ );
502
555
  }).toThrow(
503
556
  'Method "my_class_method" must be declared inside a class (member scope)',
504
557
  );
@@ -506,7 +559,11 @@ describe("Function Declaration", () => {
506
559
 
507
560
  it("throws error when StaticMethodDeclaration is used outside of a class", () => {
508
561
  expect(() => {
509
- toSourceText([<py.StaticMethodDeclaration name="my_static_method" />]);
562
+ render(
563
+ <TestOutput>
564
+ <py.StaticMethodDeclaration name="my_static_method" />
565
+ </TestOutput>,
566
+ );
510
567
  }).toThrow(
511
568
  'Method "my_static_method" must be declared inside a class (member scope)',
512
569
  );
@@ -514,7 +571,11 @@ describe("Function Declaration", () => {
514
571
 
515
572
  it("throws error when DunderMethodDeclaration is used outside of a class", () => {
516
573
  expect(() => {
517
- toSourceText([<py.DunderMethodDeclaration name="__init__" />]);
574
+ render(
575
+ <TestOutput>
576
+ <py.DunderMethodDeclaration name="__init__" />
577
+ </TestOutput>,
578
+ );
518
579
  }).toThrow(
519
580
  'Method "__init__" must be declared inside a class (member scope)',
520
581
  );