Merge pull request #2454 from tastywheattasteslikechicken/FixVtableAbort
[mono.git] / mcs / class / Microsoft.Build.Engine / Test / various / Conditions.cs
index a334f747e8fcc70abda53b42e6eddfd7e4f5706c..c3c8dacabc5c4d3e19f5c2142195cffff4297174 100644 (file)
@@ -113,7 +113,6 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void TestCondition4 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
@@ -203,6 +202,230 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                        Assert.IsNull (proj.EvaluatedProperties ["F"], "A4");
                }
 
+               [Test]
+               [Category ("NotWorking")]
+               public void TestCondition7 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A>true</A>
+                                       </PropertyGroup>
+                                       <ItemGroup>
+                                               <B Include='true' />
+                                               <C Include='true;false' />
+                                       </ItemGroup>
+
+                                       <Target Name='1'>
+                                               <Message Text='a' Condition='$(A)' />
+                                               <Message Text='b' Condition='@(B)' />
+                                               <Message Text='c' Condition='%(C.Filename)' />
+                                       </Target>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+                       Assert.IsTrue (proj.Build ("1"), "A1");
+               }
+
+               [Test]
+               public void TestCondition8 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A Condition='true == true'></A>
+                                               <B Condition='true != true'></B>
+                                               <C Condition='false == false'></C>
+                                               <D Condition='false != false'></D>
+                                               <E Condition='true != false'></E>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+
+                       Assert.IsNotNull (proj.EvaluatedProperties ["A"], "A1");
+                       Assert.IsNull (proj.EvaluatedProperties ["B"], "A2");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
+                       Assert.IsNull (proj.EvaluatedProperties ["D"], "A4");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["E"], "A5");
+               }
+
+               [Test]
+               public void TestCondition9 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A Condition=""'A' == 'A'""></A>
+                                               <B Condition="" 'A' == 'A' ""></B>
+                                               <C Condition=""'A' == 'a'""></C>
+                                               <D Condition=""'A' == 'b'""></D>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+
+                       Assert.IsNotNull (proj.EvaluatedProperties ["A"], "A1");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["B"], "A2");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
+                       Assert.IsNull (proj.EvaluatedProperties ["D"], "A4");
+               }
+
+               [Test]
+               [Category ("NotDotNet")]
+               public void TestCondition10 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A Condition="" !'true' ""></A>
+                                               <B Condition="" 'on' == 'true' ""></B>
+                                               <C Condition="" 4 == 4.0 and 04 == 4""></C>
+                                               <D Condition="" !(false and false) ==  !false or !false ""></D>
+                                               <E Condition="" Exists ('Test\resources\Import.csproj') ""></E>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+
+                       Assert.IsNull (proj.EvaluatedProperties ["A"], "A1");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["B"], "A2");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["D"], "A4");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["E"], "A5");
+               }
+               [Test]
+               public void TestCondition11 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+                       string documentString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+       <PropertyGroup>
+               <FooProp>true</FooProp>
+       </PropertyGroup>
+       <ItemGroup>
+               <FooList Include=""abc.exe""/>
+               <List1 Include=""fr_a.txt"" Condition="" $(FooProp) == 'true'"" />
+               <List1 Include=""fr_b.txt"" Condition="" '@(FooList->'%(Extension)a(foo', ',')' == '.exea(foo'"" />
+               <List1 Include=""fr_c.txt"" Condition="" @(FooList -> '%(Extension)', ',') == '.exe'"" />
+       </ItemGroup>
+</Project>";
+
+                       proj.LoadXml (documentString);
+
+                       BuildItemGroup bgp = proj.GetEvaluatedItemsByName ("List1");
+                       Assert.IsNotNull (bgp, "Expected values in List1");
+                       Assert.AreEqual (3, bgp.Count, "A1");
+                       Assert.AreEqual ("fr_a.txt", bgp [0].FinalItemSpec, "A2");
+                       Assert.AreEqual ("fr_b.txt", bgp [1].FinalItemSpec, "A3");
+                       Assert.AreEqual ("fr_c.txt", bgp [2].FinalItemSpec, "A4");
+               }
+
+               // Test shortcircuiting
+               [Test]
+               public void TestCondition12 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A Condition=""'$(NonExistant)' != '' and $(NonExistant)""></A>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+
+                       Assert.IsNull (proj.EvaluatedProperties ["A"], "A1");
+               }
+
+               [Test]
+               public void TestCondition_References ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A Condition=""$([System.String]::new('test').StartsWith(`te`))"">valid</A>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+
+                       Assert.AreEqual ("valid", proj.GetEvaluatedProperty ("A"), "#1");
+               }
+
+               [Test]
+               public void TestHasTrailingSlash1 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <EmptyProp></EmptyProp>
+                                               <WithTrailingBackSlash>foo\ </WithTrailingBackSlash>
+                                               <WithTrailingFwdSlash>foo/  </WithTrailingFwdSlash>
+                                               <NoTrailing>Foo</NoTrailing>
+
+                                               <A Condition="" HasTrailingSlash('$(EmptyProp)') ""></A>
+                                               <B Condition="" HasTrailingSlash('$(WithTrailingBackSlash)') ""></B>
+                                               <C Condition="" HasTrailingSlash('$(WithTrailingFwdSlash)') ""></C>
+                                               <D Condition="" HasTrailingSlash('$(NoTrailing)') ""></D>
+                                               <E Condition="" HasTrailingSlash('$(NonExistant)') ""></E>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+
+                       Assert.IsNull (proj.EvaluatedProperties ["A"], "A1");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["B"], "A2");
+                       Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A3");
+                       Assert.IsNull (proj.EvaluatedProperties ["D"], "A4");
+                       Assert.IsNull (proj.EvaluatedProperties ["E"], "A5");
+               }
+
+               [Test]
+               [ExpectedException (typeof (InvalidProjectFileException))]
+               public void TestUnknownFunction ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A Condition="" NonExistantFunction('$(EmptyProp)') ""></A>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+               }
+
                [Test]
                [ExpectedException (typeof (InvalidProjectFileException))]
                public void TestIncorrectCondition1 ()
@@ -220,5 +443,102 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
 
                        proj.LoadXml (documentString);
                }
+
+               // A reference to an item list at position 1 is not allowed in this condition "@(A)".
+               [Test]
+               [ExpectedException (typeof (InvalidProjectFileException))]
+               [Category ("NotWorking")]
+               public void TestIncorrectCondition2 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A Condition='@(A)'>A</A>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+               }
+
+               // Found an unexpected character '%' at position 0 in condition \%(A)\.
+               [Test]
+               [ExpectedException (typeof (InvalidProjectFileException))]
+               [Category ("NotWorking")]
+               public void TestIncorrectCondition3 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A Condition='%(A)'>A</A>
+                                       </PropertyGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+               }
+
+               // Found an unexpected character '%' at position 0 in condition "%(A)\.
+               [Test]
+               [ExpectedException (typeof (InvalidProjectFileException))]
+               [Category ("NotWorking")]
+               public void TestIncorrectCondition4 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <A Include='a' Condition='%(A)' />
+                                       </ItemGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+               }
+
+               [Test]
+               [ExpectedException (typeof (InvalidProjectFileException))]
+               public void TestIncorrectCondition5 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <A Include='a' Condition="" '  == ''  "" />
+                                       </ItemGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+               }
+
+               [Test]
+               [ExpectedException (typeof (InvalidProjectFileException))]
+               public void TestIncorrectCondition6 ()
+               {
+                       Engine engine = new Engine (Consts.BinPath);
+                       Project proj = engine.CreateNewProject ();
+
+                       string documentString = @"
+                               <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <A Include='a' Condition=""'$(NonExistant)' != '' or $(NonExistant)""/>
+                                       </ItemGroup>
+                               </Project>
+                       ";
+
+                       proj.LoadXml (documentString);
+               }
+
        }
 }