Skip to content

Commit 75c844f

Browse files
committed
fix(build): tighten BuildTarget enum parsing
1 parent 2ab0b37 commit 75c844f

2 files changed

Lines changed: 26 additions & 6 deletions

File tree

MCPForUnity/Editor/Tools/Build/BuildTargetMapping.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@ public static bool TryResolveBuildTarget(string name, out BuildTarget target)
2828
case "uwp": target = BuildTarget.WSAPlayer; return true;
2929
case "tvos": target = BuildTarget.tvOS; return true;
3030
default:
31-
if (Enum.TryParse(name, true, out target))
31+
if (TryParseDefinedBuildTarget(name, out target))
32+
{
3233
return true;
34+
}
35+
3336
target = default;
3437
return false;
3538
}
@@ -100,7 +103,7 @@ public static string GetUnknownBuildTargetMessage(string name)
100103
private static string GetValidTargetsList()
101104
{
102105
string validTargets = "windows64, osx, linux64, android, ios, webgl, uwp, tvos";
103-
if (Enum.TryParse(VisionOSName, true, out BuildTarget _))
106+
if (TryParseDefinedBuildTarget(VisionOSName, out _))
104107
{
105108
validTargets += ", visionos";
106109
}
@@ -113,6 +116,18 @@ private static bool IsVisionOSTarget(BuildTarget target)
113116
return string.Equals(target.ToString(), VisionOSName, StringComparison.OrdinalIgnoreCase);
114117
}
115118

119+
private static bool TryParseDefinedBuildTarget(string name, out BuildTarget target)
120+
{
121+
target = default;
122+
if (int.TryParse(name, out _))
123+
{
124+
return false;
125+
}
126+
127+
return Enum.TryParse(name, true, out target)
128+
&& Enum.IsDefined(typeof(BuildTarget), target);
129+
}
130+
116131
public static string GetDefaultOutputPath(BuildTarget target, string productName)
117132
{
118133
string basePath = $"Builds/{target}";

TestProjects/UnityMCPTests/Assets/Tests/EditMode/Tools/BuildTargetMappingTests.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ public void TryResolveBuildTarget_KnownAliasesResolve(string name, BuildTarget e
1818
Assert.AreEqual(expected, target);
1919
}
2020

21+
[Test]
22+
public void TryResolveBuildTarget_NumericInputDoesNotResolve()
23+
{
24+
Assert.IsFalse(BuildTargetMapping.TryResolveBuildTarget("5", out _));
25+
}
26+
2127
[Test]
2228
public void TryResolveNamedBuildTarget_UnknownTargetListsOnlyAvailableTargets()
2329
{
@@ -46,10 +52,9 @@ public void TryResolveNamedBuildTarget_VisionOSUnavailableReturnsHelpfulError()
4652
if (visionOSAvailable)
4753
{
4854
Assert.IsTrue(BuildTargetMapping.TryResolveBuildTarget("visionos", out _));
49-
if (error != null)
50-
{
51-
StringAssert.Contains("VisionOS", error);
52-
}
55+
Assert.IsTrue(
56+
error == null || error.Contains("VisionOS"),
57+
$"Expected no error or a VisionOS-specific error, got: {error}");
5358
}
5459
else
5560
{

0 commit comments

Comments
 (0)