d3954a2f322d73ac4320d87f96045efaae9b9ed3
[mono.git] / mcs / class / Microsoft.Build.Engine / Test / various / Conditions.cs
1 //
2 // Conditions.cs: Tests various conditions by checking if a property
3 // is added to EvaluatedProperties.
4 //
5 // Author:
6 //   Marek Sieradzki (marek.sieradzki@gmail.com)
7 //
8 // (C) 2006 Marek Sieradzki
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
29 using System;
30 using System.Xml;
31 using Microsoft.Build.BuildEngine;
32 using NUnit.Framework;
33
34 namespace MonoTests.Microsoft.Build.BuildEngine.Various {
35         [TestFixture]
36         public class Conditions {
37
38                 [Test]
39                 public void TestCondition1 ()
40                 {
41                         Engine engine = new Engine (Consts.BinPath);
42                         Project proj = engine.CreateNewProject ();
43
44                         string documentString = @"
45                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
46                                         <PropertyGroup>
47                                                 <A Condition='true'></A>
48                                                 <B Condition='false'></B>
49                                                 <C Condition='TRUE'></C>
50                                                 <D Condition='FALSE'></D>
51                                                 <E Condition=''>A</E>
52                                         </PropertyGroup>
53                                 </Project>
54                         ";
55
56                         proj.LoadXml (documentString);
57
58                         Assert.IsNotNull (proj.EvaluatedProperties ["A"], "A1");
59                         Assert.IsNull (proj.EvaluatedProperties ["B"], "A2");
60                         Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
61                         Assert.IsNull (proj.EvaluatedProperties ["D"], "A4");
62                         Assert.IsNotNull (proj.EvaluatedProperties ["E"], "A5");
63                 }
64
65                 [Test]
66                 public void TestCondition2 ()
67                 {
68                         Engine engine = new Engine (Consts.BinPath);
69                         Project proj = engine.CreateNewProject ();
70
71                         string documentString = @"
72                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
73                                         <PropertyGroup>
74                                                 <A Condition='true or true'></A>
75                                                 <B Condition='false or false'></B>
76                                                 <C Condition='true or false'></C>
77                                                 <D Condition='false or true'></D>
78                                         </PropertyGroup>
79                                 </Project>
80                         ";
81
82                         proj.LoadXml (documentString);
83
84                         Assert.IsNotNull (proj.EvaluatedProperties ["A"], "A1");
85                         Assert.IsNull (proj.EvaluatedProperties ["B"], "A2");
86                         Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
87                         Assert.IsNotNull (proj.EvaluatedProperties ["D"], "A4");
88                 }
89
90                 [Test]
91                 public void TestCondition3 ()
92                 {
93                         Engine engine = new Engine (Consts.BinPath);
94                         Project proj = engine.CreateNewProject ();
95
96                         string documentString = @"
97                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
98                                         <PropertyGroup>
99                                                 <A Condition='true and true'></A>
100                                                 <B Condition='false and false'></B>
101                                                 <C Condition='true and false'></C>
102                                                 <D Condition='false and true'></D>
103                                         </PropertyGroup>
104                                 </Project>
105                         ";
106
107                         proj.LoadXml (documentString);
108
109                         Assert.IsNotNull (proj.EvaluatedProperties ["A"], "A1");
110                         Assert.IsNull (proj.EvaluatedProperties ["B"], "A2");
111                         Assert.IsNull (proj.EvaluatedProperties ["C"], "A3");
112                         Assert.IsNull (proj.EvaluatedProperties ["D"], "A4");
113                 }
114
115                 [Test]
116                 public void TestCondition4 ()
117                 {
118                         Engine engine = new Engine (Consts.BinPath);
119                         Project proj = engine.CreateNewProject ();
120
121                         string documentString = @"
122                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
123                                         <PropertyGroup>
124                                                 <A Condition='!true'></A>
125                                                 <B Condition='!false'></B>
126                                         </PropertyGroup>
127                                 </Project>
128                         ";
129
130                         proj.LoadXml (documentString);
131
132                         Assert.IsNull (proj.EvaluatedProperties ["A"], "A1");
133                         Assert.IsNotNull (proj.EvaluatedProperties ["B"], "A2");
134                 }
135
136                 [Test]
137                 public void TestCondition5 ()
138                 {
139                         Engine engine = new Engine (Consts.BinPath);
140                         Project proj = engine.CreateNewProject ();
141
142                         string documentString = @"
143                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
144                                         <PropertyGroup>
145                                                 <a Condition='-1 &lt; 0'></a>
146                                                 <b Condition='-1 &lt;= 0'></b>
147                                                 <c Condition='-1.0 &lt; 0.0'></c>
148                                                 <d Condition='-1.0 &lt;= 0.0'></d>
149                                                 <e Condition='-1.0 == 0.0'></e>
150                                                 <f Condition='0.0 == 0.0'></f>
151                                                 <g Condition='-1.0 != 0.0'></g>
152                                                 <h Condition='0.0 != 0.0'></h>
153                                                 <i Condition='1 &gt; 0'></i>
154                                                 <j Condition='1 &gt;= 0'></j>
155                                                 <k Condition='-1 &gt; 0'></k>
156                                                 <l Condition='-1 &gt;= 0'></l>
157                                         </PropertyGroup>
158                                 </Project>
159                         ";
160
161                         proj.LoadXml (documentString);
162
163                         Assert.IsNotNull (proj.EvaluatedProperties ["a"], "A1");
164                         Assert.IsNotNull (proj.EvaluatedProperties ["b"], "A2");
165                         Assert.IsNotNull (proj.EvaluatedProperties ["c"], "A3");
166                         Assert.IsNotNull (proj.EvaluatedProperties ["d"], "A4");
167                         Assert.IsNull (proj.EvaluatedProperties ["e"], "A5");
168                         Assert.IsNotNull (proj.EvaluatedProperties ["f"], "A6");
169                         Assert.IsNotNull (proj.EvaluatedProperties ["g"], "A7");
170                         Assert.IsNull (proj.EvaluatedProperties ["h"], "A8");
171                         Assert.IsNotNull (proj.EvaluatedProperties ["i"], "A1");
172                         Assert.IsNotNull (proj.EvaluatedProperties ["j"], "A2");
173                         Assert.IsNull (proj.EvaluatedProperties ["k"], "A3");
174                         Assert.IsNull (proj.EvaluatedProperties ["l"], "A4");
175                 }
176
177                 [Test]
178                 [Category ("NotWorking")]
179                 public void TestCondition6 ()
180                 {
181                         Engine engine = new Engine (Consts.BinPath);
182                         Project proj = engine.CreateNewProject ();
183
184                         string documentString = @"
185                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
186                                         <PropertyGroup>
187                                                 <A>true</A>
188                                                 <B>false</B>
189                                                 <C Condition='$(A)'></C>
190                                                 <D Condition='$(B)'></D>
191                                                 <E Condition="" '$(A)' ""></E>
192                                                 <F Condition="" '$(B)' ""></F>
193                                         </PropertyGroup>
194                                 </Project>
195                         ";
196
197                         proj.LoadXml (documentString);
198
199                         Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A1");
200                         Assert.IsNull (proj.EvaluatedProperties ["D"], "A2");
201                         Assert.IsNotNull (proj.EvaluatedProperties ["E"], "A3");
202                         Assert.IsNull (proj.EvaluatedProperties ["F"], "A4");
203                 }
204
205                 [Test]
206                 [Category ("NotWorking")]
207                 public void TestCondition7 ()
208                 {
209                         Engine engine = new Engine (Consts.BinPath);
210                         Project proj = engine.CreateNewProject ();
211
212                         string documentString = @"
213                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
214                                         <PropertyGroup>
215                                                 <A>true</A>
216                                         </PropertyGroup>
217                                         <ItemGroup>
218                                                 <B Include='true' />
219                                                 <C Include='true;false' />
220                                         </ItemGroup>
221
222                                         <Target Name='1'>
223                                                 <Message Text='a' Condition='$(A)' />
224                                                 <Message Text='b' Condition='@(B)' />
225                                                 <Message Text='c' Condition='%(C.Filename)' />
226                                         </Target>
227                                 </Project>
228                         ";
229
230                         proj.LoadXml (documentString);
231                         Assert.IsTrue (proj.Build ("1"), "A1");
232                 }
233
234                 [Test]
235                 public void TestCondition8 ()
236                 {
237                         Engine engine = new Engine (Consts.BinPath);
238                         Project proj = engine.CreateNewProject ();
239
240                         string documentString = @"
241                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
242                                         <PropertyGroup>
243                                                 <A Condition='true == true'></A>
244                                                 <B Condition='true != true'></B>
245                                                 <C Condition='false == false'></C>
246                                                 <D Condition='false != false'></D>
247                                                 <E Condition='true != false'></E>
248                                         </PropertyGroup>
249                                 </Project>
250                         ";
251
252                         proj.LoadXml (documentString);
253
254                         Assert.IsNotNull (proj.EvaluatedProperties ["A"], "A1");
255                         Assert.IsNull (proj.EvaluatedProperties ["B"], "A2");
256                         Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
257                         Assert.IsNull (proj.EvaluatedProperties ["D"], "A4");
258                         Assert.IsNotNull (proj.EvaluatedProperties ["E"], "A5");
259                 }
260
261                 [Test]
262                 public void TestCondition9 ()
263                 {
264                         Engine engine = new Engine (Consts.BinPath);
265                         Project proj = engine.CreateNewProject ();
266
267                         string documentString = @"
268                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
269                                         <PropertyGroup>
270                                                 <A Condition=""'A' == 'A'""></A>
271                                                 <B Condition="" 'A' == 'A' ""></B>
272                                                 <C Condition=""'A' == 'a'""></C>
273                                                 <D Condition=""'A' == 'b'""></D>
274                                         </PropertyGroup>
275                                 </Project>
276                         ";
277
278                         proj.LoadXml (documentString);
279
280                         Assert.IsNotNull (proj.EvaluatedProperties ["A"], "A1");
281                         Assert.IsNotNull (proj.EvaluatedProperties ["B"], "A2");
282                         Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
283                         Assert.IsNull (proj.EvaluatedProperties ["D"], "A4");
284                 }
285
286                 [Test]
287                 public void TestCondition10 ()
288                 {
289                         Engine engine = new Engine (Consts.BinPath);
290                         Project proj = engine.CreateNewProject ();
291
292                         string documentString = @"
293                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
294                                         <PropertyGroup>
295                                                 <A Condition="" !'true' ""></A>
296                                                 <B Condition="" 'on' == 'true' ""></B>
297                                                 <C Condition="" 4 == 4.0 and 04 == 4""></C>
298                                                 <D Condition="" !(false and false) ==  !false or !false ""></D>
299                                                 <E Condition="" Exists ('Test\resources\Import.csproj') ""></E>
300                                         </PropertyGroup>
301                                 </Project>
302                         ";
303
304                         proj.LoadXml (documentString);
305
306                         Assert.IsNull (proj.EvaluatedProperties ["A"], "A1");
307                         Assert.IsNotNull (proj.EvaluatedProperties ["B"], "A2");
308                         Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
309                         Assert.IsNotNull (proj.EvaluatedProperties ["D"], "A4");
310                         Assert.IsNotNull (proj.EvaluatedProperties ["E"], "A5");
311                 }
312                 [Test]
313                 public void TestCondition11 ()
314                 {
315                         Engine engine = new Engine (Consts.BinPath);
316                         Project proj = engine.CreateNewProject ();
317                         string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
318         <PropertyGroup>
319                 <FooProp>true</FooProp>
320         </PropertyGroup>
321         <ItemGroup>
322                 <FooList Include=""abc.exe""/>
323                 <List1 Include=""fr_a.txt"" Condition="" $(FooProp) == 'true'"" />
324                 <List1 Include=""fr_b.txt"" Condition="" '@(FooList->'%(Extension)a(foo', ',')' == '.exea(foo'"" />
325                 <List1 Include=""fr_c.txt"" Condition="" @(FooList -> '%(Extension)', ',') == '.exe'"" />
326         </ItemGroup>
327 </Project>";
328
329                         proj.LoadXml (documentString);
330
331                         BuildItemGroup bgp = proj.GetEvaluatedItemsByName ("List1");
332                         Assert.IsNotNull (bgp, "Expected values in List1");
333                         Assert.AreEqual (3, bgp.Count, "A1");
334                         Assert.AreEqual ("fr_a.txt", bgp [0].FinalItemSpec, "A2");
335                         Assert.AreEqual ("fr_b.txt", bgp [1].FinalItemSpec, "A3");
336                         Assert.AreEqual ("fr_c.txt", bgp [2].FinalItemSpec, "A4");
337                 }
338
339                 // Test shortcircuiting
340                 [Test]
341                 public void TestCondition12 ()
342                 {
343                         Engine engine = new Engine (Consts.BinPath);
344                         Project proj = engine.CreateNewProject ();
345
346                         string documentString = @"
347                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
348                                         <PropertyGroup>
349                                                 <A Condition=""'$(NonExistant)' != '' and $(NonExistant)""></A>
350                                         </PropertyGroup>
351                                 </Project>
352                         ";
353
354                         proj.LoadXml (documentString);
355
356                         Assert.IsNull (proj.EvaluatedProperties ["A"], "A1");
357                 }
358
359
360                 [Test]
361                 public void TestHasTrailingSlash1 ()
362                 {
363                         Engine engine = new Engine (Consts.BinPath);
364                         Project proj = engine.CreateNewProject ();
365
366                         string documentString = @"
367                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
368                                         <PropertyGroup>
369                                                 <EmptyProp></EmptyProp>
370                                                 <WithTrailingBackSlash>foo\ </WithTrailingBackSlash>
371                                                 <WithTrailingFwdSlash>foo/  </WithTrailingFwdSlash>
372                                                 <NoTrailing>Foo</NoTrailing>
373
374                                                 <A Condition="" HasTrailingSlash('$(EmptyProp)') ""></A>
375                                                 <B Condition="" HasTrailingSlash('$(WithTrailingBackSlash)') ""></B>
376                                                 <C Condition="" HasTrailingSlash('$(WithTrailingFwdSlash)') ""></C>
377                                                 <D Condition="" HasTrailingSlash('$(NoTrailing)') ""></D>
378                                                 <E Condition="" HasTrailingSlash('$(NonExistant)') ""></E>
379                                         </PropertyGroup>
380                                 </Project>
381                         ";
382
383                         proj.LoadXml (documentString);
384
385                         Assert.IsNull (proj.EvaluatedProperties ["A"], "A1");
386                         Assert.IsNotNull (proj.EvaluatedProperties ["B"], "A2");
387                         Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
388                         Assert.IsNull (proj.EvaluatedProperties ["D"], "A4");
389                         Assert.IsNull (proj.EvaluatedProperties ["E"], "A5");
390                 }
391
392                 [Test]
393                 [ExpectedException (typeof (InvalidProjectFileException))]
394                 public void TestUnknownFunction ()
395                 {
396                         Engine engine = new Engine (Consts.BinPath);
397                         Project proj = engine.CreateNewProject ();
398
399                         string documentString = @"
400                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
401                                         <PropertyGroup>
402                                                 <A Condition="" NonExistantFunction('$(EmptyProp)') ""></A>
403                                         </PropertyGroup>
404                                 </Project>
405                         ";
406
407                         proj.LoadXml (documentString);
408                 }
409
410                 [Test]
411                 [ExpectedException (typeof (InvalidProjectFileException))]
412                 public void TestIncorrectCondition1 ()
413                 {
414                         Engine engine = new Engine (Consts.BinPath);
415                         Project proj = engine.CreateNewProject ();
416
417                         string documentString = @"
418                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
419                                         <PropertyGroup>
420                                                 <A Condition='x'>A</A>
421                                         </PropertyGroup>
422                                 </Project>
423                         ";
424
425                         proj.LoadXml (documentString);
426                 }
427
428                 // A reference to an item list at position 1 is not allowed in this condition "@(A)".
429                 [Test]
430                 [ExpectedException (typeof (InvalidProjectFileException))]
431                 [Category ("NotWorking")]
432                 public void TestIncorrectCondition2 ()
433                 {
434                         Engine engine = new Engine (Consts.BinPath);
435                         Project proj = engine.CreateNewProject ();
436
437                         string documentString = @"
438                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
439                                         <PropertyGroup>
440                                                 <A Condition='@(A)'>A</A>
441                                         </PropertyGroup>
442                                 </Project>
443                         ";
444
445                         proj.LoadXml (documentString);
446                 }
447
448                 // Found an unexpected character '%' at position 0 in condition \%(A)\.
449                 [Test]
450                 [ExpectedException (typeof (InvalidProjectFileException))]
451                 [Category ("NotWorking")]
452                 public void TestIncorrectCondition3 ()
453                 {
454                         Engine engine = new Engine (Consts.BinPath);
455                         Project proj = engine.CreateNewProject ();
456
457                         string documentString = @"
458                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
459                                         <PropertyGroup>
460                                                 <A Condition='%(A)'>A</A>
461                                         </PropertyGroup>
462                                 </Project>
463                         ";
464
465                         proj.LoadXml (documentString);
466                 }
467
468                 // Found an unexpected character '%' at position 0 in condition "%(A)\.
469                 [Test]
470                 [ExpectedException (typeof (InvalidProjectFileException))]
471                 [Category ("NotWorking")]
472                 public void TestIncorrectCondition4 ()
473                 {
474                         Engine engine = new Engine (Consts.BinPath);
475                         Project proj = engine.CreateNewProject ();
476
477                         string documentString = @"
478                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
479                                         <ItemGroup>
480                                                 <A Include='a' Condition='%(A)' />
481                                         </ItemGroup>
482                                 </Project>
483                         ";
484
485                         proj.LoadXml (documentString);
486                 }
487
488                 [Test]
489                 [ExpectedException (typeof (InvalidProjectFileException))]
490                 public void TestIncorrectCondition5 ()
491                 {
492                         Engine engine = new Engine (Consts.BinPath);
493                         Project proj = engine.CreateNewProject ();
494
495                         string documentString = @"
496                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
497                                         <ItemGroup>
498                                                 <A Include='a' Condition="" '  == ''  "" />
499                                         </ItemGroup>
500                                 </Project>
501                         ";
502
503                         proj.LoadXml (documentString);
504                 }
505
506                 [Test]
507                 [ExpectedException (typeof (InvalidProjectFileException))]
508                 public void TestIncorrectCondition6 ()
509                 {
510                         Engine engine = new Engine (Consts.BinPath);
511                         Project proj = engine.CreateNewProject ();
512
513                         string documentString = @"
514                                 <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
515                                         <ItemGroup>
516                                                 <A Include='a' Condition=""'$(NonExistant)' != '' or $(NonExistant)""/>
517                                         </ItemGroup>
518                                 </Project>
519                         ";
520
521                         proj.LoadXml (documentString);
522                 }
523
524         }
525 }