Skip to content

Commit 4b10ef0

Browse files
authored
Improved argument processing for CIM (#67)
* Fixed MSB4016: An item with the same key has already been added * +KArgs replaces an old args processing for CIM * Both msbuild formats: `/property:` and `-property:`, ... * Fixes support of the: /p:nowarn="1591;1701;1702" key * Includes fixes for MSB4016 (f2a8a27) Added tests * Adds .sln search if no arg for CIM Helps to avoid MSB1029 "We can't detect .sln file in arguments" by default. * CS1572 & CS1573 & CS1587
1 parent 4221261 commit 4b10ef0

File tree

11 files changed

+513
-102
lines changed

11 files changed

+513
-102
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## Specific
22

3+
Appveyor.TestLogger.*
34
/vsSolutionBuildEvent/source.extension.vsixmanifest
45

56
/vsSolutionBuildEvent/Version.cs

Diff for: CI.MSBuild.Test/CI.MSBuild.Test.csproj

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netcoreapp3.1</TargetFramework>
5+
<IsPackable>false</IsPackable>
6+
<SignAssembly>true</SignAssembly>
7+
<AssemblyOriginatorKeyFile>..\com.github.3F.test.snk</AssemblyOriginatorKeyFile>
8+
<Configurations>DBG_SDK10;DBG_SDK15;REL_SDK10;REL_SDK15;DCI_SDK10;DCI_SDK15;RCI_SDK10;RCI_SDK15</Configurations>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
13+
<PackageReference Include="xunit" Version="2.4.0" />
14+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
15+
<PackageReference Include="coverlet.collector" Version="1.2.0" />
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<ProjectReference Include="..\CI.MSBuild\CI.MSBuild.csproj" />
20+
</ItemGroup>
21+
22+
</Project>

Diff for: CI.MSBuild.Test/KArgsTest.cs

+227
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
using System;
2+
using Xunit;
3+
using System.Linq;
4+
using net.r_eg.vsSBE.CI.MSBuild;
5+
using System.Collections.Generic;
6+
7+
namespace CI.MSBuild.Test
8+
{
9+
public class KArgsTest
10+
{
11+
[Fact]
12+
public void ThisTest1()
13+
{
14+
var raw = @"Conari.sln /p:nowarn=1702;NU5119;1591;1701 /l:CI.MSBuild.dll;lib=D:\bin\;cultureUI=en-US /v:m /t:Rebuild;Pub1 /p:Configuration=Debug;Platform=x64 /m:7";
15+
16+
var kargs = new KArgs(raw.Split(' '));
17+
18+
Assert.Equal(3, kargs[KArgType.CIM].Count);
19+
20+
Assert.True(kargs[KArgType.CIM].ContainsKey("CI.MSBuild.dll"));
21+
Assert.Null(kargs[KArgType.CIM]["CI.MSBuild.dll"]);
22+
Assert.Equal(@"D:\bin\", kargs[KArgType.CIM]["lib"]);
23+
Assert.Equal("en-US", kargs[KArgType.CIM]["cultureUI"]);
24+
25+
Assert.Equal(3, kargs[KArgType.Common].Count);
26+
27+
Assert.True(kargs[KArgType.Common].ContainsKey("Conari.sln"));
28+
Assert.Null(kargs[KArgType.Common]["Conari.sln"]);
29+
Assert.True(kargs[KArgType.Common].ContainsKey("/v:m"));
30+
Assert.Null(kargs[KArgType.Common]["/v:m"]);
31+
Assert.True(kargs[KArgType.Common].ContainsKey("/m:7"));
32+
Assert.Null(kargs[KArgType.Common]["/m:7"]);
33+
34+
Assert.Equal(3, kargs[KArgType.Properties].Count);
35+
36+
Assert.True(kargs[KArgType.Properties].ContainsKey("nowarn"));
37+
Assert.Equal("1702;NU5119;1591;1701", kargs[KArgType.Properties]["nowarn"]);
38+
Assert.Equal("Debug", kargs[KArgType.Properties]["Configuration"]);
39+
Assert.Equal("x64", kargs[KArgType.Properties]["Platform"]);
40+
41+
Assert.Equal(1, kargs[KArgType.Targets].Count);
42+
43+
Assert.True(kargs[KArgType.Targets].ContainsKey("Rebuild;Pub1"));
44+
Assert.Null(kargs[KArgType.Targets]["Rebuild;Pub1"]);
45+
}
46+
47+
[Fact]
48+
public void ThisTest2()
49+
{
50+
var raw = @"Conari.sln -property:hello=world -p:nowarn=1702;NU5119;1591;1701 /l:CI.MSBuild.dll /logger:cultureUI=en-US /v:m /t:Rebuild;Pub1 /property:Configuration=Debug /p:Platform=x64 /m:7";
51+
52+
var kargs = new KArgs(raw.Split(' '));
53+
54+
Assert.Equal(4, kargs[KArgType.Properties].Count);
55+
56+
Assert.Equal("world", kargs[KArgType.Properties]["hello"]);
57+
Assert.True(kargs[KArgType.Properties].ContainsKey("nowarn"));
58+
Assert.Equal("1702;NU5119;1591;1701", kargs[KArgType.Properties]["nowarn"]);
59+
Assert.Equal("Debug", kargs[KArgType.Properties]["Configuration"]);
60+
Assert.Equal("x64", kargs[KArgType.Properties]["Platform"]);
61+
62+
Assert.Equal(2, kargs[KArgType.CIM].Count);
63+
64+
Assert.True(kargs[KArgType.CIM].ContainsKey("CI.MSBuild.dll"));
65+
Assert.Null(kargs[KArgType.CIM]["CI.MSBuild.dll"]);
66+
Assert.Equal("en-US", kargs[KArgType.CIM]["cultureUI"]);
67+
68+
Assert.Null(kargs[(KArgType)int.MaxValue]);
69+
Assert.Equal(KArgType.CIM, KArgType.Loggers);
70+
}
71+
72+
[Fact]
73+
public void GetKeysTest1()
74+
{
75+
var raw = @"Conari.sln /p:nowarn=1702;NU5119;1591;1701 /l:CI.MSBuild.dll;lib=D:\bin\;cultureUI=en-US /v:m /t:Rebuild;Pub1 /p:Configuration=Debug;Platform=x64 /m:7";
76+
77+
var kargs = new KArgs(raw.Split(' '));
78+
79+
Assert.Equal(3, kargs.GetKeys(KArgType.CIM, null).Count());
80+
Assert.Equal("CI.MSBuild.dll", kargs.GetKeys(KArgType.CIM, null).ElementAt(0));
81+
Assert.Equal("lib", kargs.GetKeys(KArgType.CIM, null).ElementAt(1));
82+
Assert.Equal("cultureUI", kargs.GetKeys(KArgType.CIM, null).ElementAt(2));
83+
84+
Assert.Equal(2, kargs.GetKeys(KArgType.CIM, true).Count());
85+
Assert.Equal("lib", kargs.GetKeys(KArgType.CIM, true).ElementAt(0));
86+
Assert.Equal("cultureUI", kargs.GetKeys(KArgType.CIM, true).ElementAt(1));
87+
88+
Assert.Single(kargs.GetKeys(KArgType.CIM, false));
89+
Assert.Equal("CI.MSBuild.dll", kargs.GetKeys(KArgType.CIM, false).ElementAt(0));
90+
}
91+
92+
[Fact]
93+
public void GetKeysTest2()
94+
{
95+
var raw = @"Conari.sln /p:nowarn=1702;NU5119;1591;1701 /l:CI.MSBuild.dll;lib=D:\bin\;cultureUI=en-US /v:m /t:Rebuild;Pub1 /p:Configuration=Debug;Platform=x64 /m:7";
96+
97+
var kargs = new KArgs(raw.Split(' '));
98+
99+
Assert.Equal(3, kargs.GetKeys(KArgType.Common, null).Count());
100+
Assert.Equal("Conari.sln", kargs.GetKeys(KArgType.Common, null).ElementAt(0));
101+
Assert.Equal("/v:m", kargs.GetKeys(KArgType.Common, null).ElementAt(1));
102+
Assert.Equal("/m:7", kargs.GetKeys(KArgType.Common, null).ElementAt(2));
103+
104+
Assert.Empty(kargs.GetKeys(KArgType.Common, true));
105+
106+
Assert.Equal(3, kargs.GetKeys(KArgType.Common, false).Count());
107+
Assert.Equal("Conari.sln", kargs.GetKeys(KArgType.Common, false).ElementAt(0));
108+
Assert.Equal("/v:m", kargs.GetKeys(KArgType.Common, false).ElementAt(1));
109+
Assert.Equal("/m:7", kargs.GetKeys(KArgType.Common, false).ElementAt(2));
110+
}
111+
112+
[Fact]
113+
public void GetKeysTest3()
114+
{
115+
var raw = @"Conari.sln /p:nowarn=1702;NU5119;1591;1701 /l:CI.MSBuild.dll;lib=D:\bin\;cultureUI=en-US /v:m /t:Rebuild;Pub1 /p:Configuration=Debug;Platform=x64 /m:7";
116+
117+
var kargs = new KArgs(raw.Split(' '));
118+
119+
Assert.Equal(3, kargs.GetKeys(KArgType.Properties, null).Count());
120+
Assert.Equal("nowarn", kargs.GetKeys(KArgType.Properties, null).ElementAt(0));
121+
Assert.Equal("Configuration", kargs.GetKeys(KArgType.Properties, null).ElementAt(1));
122+
Assert.Equal("Platform", kargs.GetKeys(KArgType.Properties, null).ElementAt(2));
123+
124+
Assert.Empty(kargs.GetKeys(KArgType.Properties, false));
125+
126+
Assert.Equal(3, kargs.GetKeys(KArgType.Properties, true).Count());
127+
Assert.Equal("nowarn", kargs.GetKeys(KArgType.Properties, true).ElementAt(0));
128+
Assert.Equal("Configuration", kargs.GetKeys(KArgType.Properties, true).ElementAt(1));
129+
Assert.Equal("Platform", kargs.GetKeys(KArgType.Properties, true).ElementAt(2));
130+
}
131+
132+
[Fact]
133+
public void GetKeysTest4()
134+
{
135+
var raw = @"Conari.sln /p:nowarn=1702;NU5119;1591;1701 /l:CI.MSBuild.dll;lib=D:\bin\;cultureUI=en-US /v:m /t:Rebuild;Pub1 /p:Configuration=Debug;Platform=x64 /m:7";
136+
137+
var kargs = new KArgs(raw.Split(' '));
138+
139+
Assert.Single(kargs.GetKeys(KArgType.Targets, null));
140+
Assert.Equal("Rebuild;Pub1", kargs.GetKeys(KArgType.Targets, null).ElementAt(0));
141+
142+
Assert.Empty(kargs.GetKeys(KArgType.Targets, true));
143+
144+
Assert.Single(kargs.GetKeys(KArgType.Targets, false));
145+
Assert.Equal("Rebuild;Pub1", kargs.GetKeys(KArgType.Targets, false).ElementAt(0));
146+
147+
Assert.Null(kargs.GetKeys((KArgType)int.MaxValue, null));
148+
Assert.Null(kargs.GetKeys((KArgType)int.MaxValue, true));
149+
Assert.Null(kargs.GetKeys((KArgType)int.MaxValue, false));
150+
}
151+
152+
[Fact]
153+
public void GetCountTest1()
154+
{
155+
var raw = @"Conari.sln /p:nowarn=1702;NU5119;1591;1701 /l:CI.MSBuild.dll;lib=D:\bin\;cultureUI=en-US /v:m /t:Rebuild;Pub1 /p:Configuration=Debug;Platform=x64 /m:7";
156+
157+
var kargs = new KArgs(raw.Split(' '));
158+
159+
Assert.Equal(kargs.GetCount(KArgType.CIM), kargs[KArgType.CIM].Count);
160+
Assert.Equal(kargs.GetCount(KArgType.Common), kargs[KArgType.Common].Count);
161+
Assert.Equal(kargs.GetCount(KArgType.Loggers), kargs[KArgType.Loggers].Count);
162+
Assert.Equal(kargs.GetCount(KArgType.Properties), kargs[KArgType.Properties].Count);
163+
Assert.Equal(kargs.GetCount(KArgType.Targets), kargs[KArgType.Targets].Count);
164+
165+
Assert.Equal(0, kargs.GetCount((KArgType)int.MaxValue));
166+
}
167+
168+
[Fact]
169+
public void ExistsTest1()
170+
{
171+
var raw = @"Conari.sln /p:nowarn=1702;NU5119;1591;1701 /v:m /p:Configuration=Debug;Platform=x64 /m:7";
172+
173+
var kargs = new KArgs(raw.Split(' '));
174+
175+
Assert.False(kargs.Exists(KArgType.CIM));
176+
Assert.True(kargs.Exists(KArgType.Common));
177+
Assert.False(kargs.Exists(KArgType.Loggers));
178+
Assert.True(kargs.Exists(KArgType.Properties));
179+
Assert.False(kargs.Exists(KArgType.Targets));
180+
181+
Assert.False(kargs.Exists((KArgType)int.MaxValue));
182+
}
183+
184+
[Fact]
185+
public void CtorTest1()
186+
{
187+
Assert.Throws<ArgumentNullException>(() => new KArgs(null));
188+
}
189+
190+
public static IEnumerable<object[]> GetRaws()
191+
{
192+
yield return new[] { new string[0] };
193+
yield return new[] { new[] { string.Empty } };
194+
yield return new[] { new[] { " " } };
195+
yield return new[] { new[] { " ", " " } };
196+
197+
yield return new[] { new[] { "/p: " } };
198+
yield return new[] { new[] { "/t: " } };
199+
yield return new[] { new[] { "/p: ", "/t: " } };
200+
yield return new[] { new[] { "/p:= ", "/t:= " } };
201+
yield return new[] { new[] { "/p: = ", "/t: = " } };
202+
203+
yield return new[] { new[] { " /p: " } };
204+
yield return new[] { new[] { " /t: " } };
205+
yield return new[] { new[] { " /p: ", " /t: " } };
206+
yield return new[] { new[] { " /p:= ", " /t:= " } };
207+
yield return new[] { new[] { " /p: = ", " /t: = " } };
208+
}
209+
210+
[Theory]
211+
[MemberData(nameof(GetRaws))]
212+
public void CtorTest2(string[] raw)
213+
{
214+
var kargs = new KArgs(raw);
215+
216+
Assert.Empty(kargs.GetKeys(KArgType.Common));
217+
Assert.Empty(kargs[KArgType.Common]);
218+
219+
Assert.Empty(kargs[KArgType.Properties]);
220+
Assert.Empty(kargs[KArgType.Targets]);
221+
Assert.Empty(kargs[KArgType.CIM]);
222+
Assert.Empty(kargs[KArgType.Loggers]);
223+
224+
Assert.Null(kargs[(KArgType)int.MaxValue]);
225+
}
226+
}
227+
}

Diff for: CI.MSBuild/CI.MSBuild.csproj

+2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@
6868
<ItemGroup>
6969
<Compile Include="AbortException.cs" />
7070
<Compile Include="EventManager.cs" />
71+
<Compile Include="KArgType.cs" />
72+
<Compile Include="KArgs.cs" />
7173
<Compile Include="InitializerProperties.cs" />
7274
<Compile Include="Initializer.cs" />
7375
<Compile Include="LibSettings.cs" />

0 commit comments

Comments
 (0)