|
1 | | -import type { Model } from "@typespec/compiler"; |
| 1 | +import type { Enum, Model } from "@typespec/compiler"; |
2 | 2 | import { t } from "@typespec/compiler/testing"; |
3 | 3 | import { $, type Typekit } from "@typespec/compiler/typekit"; |
4 | 4 | import { expect, it } from "vitest"; |
5 | 5 | import { Tester } from "../../test/test-host.js"; |
6 | 6 | import type { MutationSubgraph } from "../mutation-node/mutation-subgraph.js"; |
| 7 | +import { EnumMemberMutation } from "./enum-member.js"; |
| 8 | +import { EnumMutation } from "./enum.js"; |
7 | 9 | import { ModelPropertyMutation } from "./model-property.js"; |
8 | 10 | import { ModelMutation } from "./model.js"; |
9 | 11 | import { MutationEngine, MutationOptions } from "./mutation-engine.js"; |
@@ -200,3 +202,70 @@ it("mutates model properties into unions", async () => { |
200 | 202 | const mutatedFoo = fooMutation.unionified; |
201 | 203 | expect(tk.union.is(mutatedFoo.properties.get("prop")!.type)).toBe(true); |
202 | 204 | }); |
| 205 | + |
| 206 | +interface RenameEnumMutations { |
| 207 | + Enum: RenameEnumMutation; |
| 208 | + EnumMember: RenameEnumMemberMutation; |
| 209 | +} |
| 210 | + |
| 211 | +class RenameEnumMutation extends EnumMutation< |
| 212 | + RenameMutationOptions, |
| 213 | + RenameEnumMutations, |
| 214 | + MutationEngine<RenameEnumMutations> |
| 215 | +> { |
| 216 | + get withPrefix() { |
| 217 | + return this.getMutatedType(); |
| 218 | + } |
| 219 | + |
| 220 | + mutate() { |
| 221 | + this.mutateType((e) => (e.name = `${this.options.prefix}${this.sourceType.name}`)); |
| 222 | + super.mutate(); |
| 223 | + } |
| 224 | +} |
| 225 | + |
| 226 | +class RenameEnumMemberMutation extends EnumMemberMutation< |
| 227 | + RenameMutationOptions, |
| 228 | + RenameEnumMutations, |
| 229 | + MutationEngine<RenameEnumMutations> |
| 230 | +> { |
| 231 | + get withPrefix() { |
| 232 | + return this.getMutatedType(); |
| 233 | + } |
| 234 | + |
| 235 | + mutate() { |
| 236 | + this.mutateType((m) => (m.name = `${this.options.prefix}${this.sourceType.name}`)); |
| 237 | + super.mutate(); |
| 238 | + } |
| 239 | +} |
| 240 | + |
| 241 | +it("mutates enums and enum members", async () => { |
| 242 | + const runner = await Tester.createInstance(); |
| 243 | + const { Status, program } = await runner.compile(t.code` |
| 244 | + enum ${t.enum("Status")} { |
| 245 | + Active, |
| 246 | + Inactive, |
| 247 | + } |
| 248 | + `); |
| 249 | + |
| 250 | + const tk = $(program); |
| 251 | + const engine = new SimpleMutationEngine(tk, { |
| 252 | + Enum: RenameEnumMutation, |
| 253 | + EnumMember: RenameEnumMemberMutation, |
| 254 | + }); |
| 255 | + |
| 256 | + const options = new RenameMutationOptions("Pre", "Suf"); |
| 257 | + const enumMutation = engine.mutate(Status, options) as RenameEnumMutation; |
| 258 | + |
| 259 | + // Verify the enum and its members are mutated |
| 260 | + expect(enumMutation.withPrefix.name).toBe("PreStatus"); |
| 261 | + |
| 262 | + const activeMutation = enumMutation.members.get("Active") as RenameEnumMemberMutation; |
| 263 | + expect(activeMutation.withPrefix.name).toBe("PreActive"); |
| 264 | + |
| 265 | + // Verify the mutated enum has the renamed members |
| 266 | + const mutatedEnum = enumMutation.withPrefix as Enum; |
| 267 | + expect(mutatedEnum.members.has("PreActive")).toBe(true); |
| 268 | + expect(mutatedEnum.members.has("PreInactive")).toBe(true); |
| 269 | + expect(mutatedEnum.members.has("Active")).toBe(false); |
| 270 | + expect(mutatedEnum.members.has("Inactive")).toBe(false); |
| 271 | +}); |
0 commit comments