Merge pull request #2454 from tastywheattasteslikechicken/FixVtableAbort
[mono.git] / mcs / class / Microsoft.Build.Engine / Test / various / Conditions.cs
index ba7409f91dcfcb4d92719a5c2c3d360598020e74..c3c8dacabc5c4d3e19f5c2142195cffff4297174 100644 (file)
@@ -278,9 +278,152 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                        proj.LoadXml (documentString);
 
                        Assert.IsNotNull (proj.EvaluatedProperties ["A"], "A1");
-                       Assert.IsNotNull (proj.EvaluatedProperties ["B"], "A1");
-                       Assert.IsNotNull (proj.EvaluatedProperties ["C"], "A1");
-                       Assert.IsNull (proj.EvaluatedProperties ["D"], "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]
@@ -301,9 +444,9 @@ 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),
-                       "A reference to an item list at position 1 is not allowed in this condition \"@(A)\".  ")]
+               [ExpectedException (typeof (InvalidProjectFileException))]
                [Category ("NotWorking")]
                public void TestIncorrectCondition2 ()
                {
@@ -321,9 +464,9 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                        proj.LoadXml (documentString);
                }
 
+               // Found an unexpected character '%' at position 0 in condition \%(A)\.
                [Test]
-               [ExpectedException (typeof (InvalidProjectFileException),
-                       "Found an unexpected character '%' at position 0 in condition \"%(A)\".  ")]
+               [ExpectedException (typeof (InvalidProjectFileException))]
                [Category ("NotWorking")]
                public void TestIncorrectCondition3 ()
                {
@@ -341,9 +484,9 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                        proj.LoadXml (documentString);
                }
 
+               // Found an unexpected character '%' at position 0 in condition "%(A)\.
                [Test]
-               [ExpectedException (typeof (InvalidProjectFileException),
-                       "Found an unexpected character '%' at position 0 in condition \"%(A)\".  ")]
+               [ExpectedException (typeof (InvalidProjectFileException))]
                [Category ("NotWorking")]
                public void TestIncorrectCondition4 ()
                {
@@ -378,5 +521,24 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
 
                        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);
+               }
+
        }
 }