Skip to content

Commit 6de6283

Browse files
authored
fix enum idx (#131)
1 parent d594dc1 commit 6de6283

File tree

6 files changed

+36
-6
lines changed

6 files changed

+36
-6
lines changed

src/cs/Bootsharp.Publish.Test/Pack/BindingTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,4 +307,20 @@ public void ExportedEnumsAreDeclaredInJS ()
307307
};
308308
""");
309309
}
310+
311+
[Fact]
312+
public void CustomEnumIndexesArePreservedInJS ()
313+
{
314+
AddAssembly(
315+
WithClass("n", "public enum Foo { A = 1, B = 6 }"),
316+
WithClass("n", "[JSInvokable] public static Foo GetFoo () => default;"));
317+
Execute();
318+
Contains(
319+
"""
320+
export const n = {
321+
getFoo: () => deserialize(getExports().n_MockClass.GetFoo()),
322+
Foo: { "1": "A", "6": "B", "A": 1, "B": 6 }
323+
};
324+
""");
325+
}
310326
}

src/cs/Bootsharp.Publish/Pack/BindingGenerator/BindingGenerator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,10 @@ private void EmitEvent (MethodMeta method)
125125

126126
private void EmitEnum (Type @enum)
127127
{
128-
var values = Enum.GetNames(@enum);
129-
var fields = string.Join(", ",
130-
values.Select((v, i) => $"\"{i}\": \"{v}\"")
131-
.Concat(values.Select((v, i) => $"\"{v}\": {i}")));
128+
var values = Enum.GetValuesAsUnderlyingType(@enum).Cast<object>().ToArray();
129+
var fields = string.Join(", ", values
130+
.Select(v => $"\"{v}\": \"{Enum.GetName(@enum, v)}\"")
131+
.Concat(values.Select(v => $"\"{Enum.GetName(@enum, v)}\": {v}")));
132132
builder.Append($"{Comma()}\n{Pad(level + 1)}{@enum.Name}: {{ {fields} }}");
133133
}
134134

src/js/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
},
99
"devDependencies": {
1010
"typescript": "^5.3.3",
11-
"vitest": "^1.1.1",
12-
"@vitest/coverage-v8": "^1.1.1",
11+
"vitest": "^1.1.3",
12+
"@vitest/coverage-v8": "^1.1.3",
1313
"@types/node": "^20.10.6",
1414
"ws": "^8.16.0"
1515
}

src/js/test/cs/Test/IdxEnum.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Test;
2+
3+
public enum IdxEnum
4+
{
5+
One = 1,
6+
Two = 2
7+
}

src/js/test/cs/Test/Invokable.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,7 @@ public static async Task<string> JoinStringsAsync (string a, string b)
2828

2929
[JSInvokable]
3030
public static string BytesToString (byte[] bytes) => Encoding.UTF8.GetString(bytes);
31+
32+
[JSInvokable]
33+
public static IdxEnum GetIdxEnumOne () => IdxEnum.One;
3134
}

src/js/test/spec/interop.spec.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,8 @@ describe("while bootsharp is booted", () => {
154154
expect(TrackType[TrackType.Rubber]).toStrictEqual("Rubber");
155155
expect(TrackType[TrackType.Chain]).toStrictEqual("Chain");
156156
});
157+
it("can compare indexed enums", () => {
158+
expect(Test.getIdxEnumOne() === Test.IdxEnum.One).toBeTruthy();
159+
expect(Test.getIdxEnumOne() === Test.IdxEnum.Two).not.toBeTruthy();
160+
});
157161
});

0 commit comments

Comments
 (0)