static MSBuildProject LoadAndEvaluate (string dir, string testFile)
		{
			string projectFile = Util.GetSampleProject (dir, testFile);
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();
			return p;
		}
		protected override void OnReadProject (ProgressMonitor monitor, MSBuildProject msproject)
		{
			base.OnReadProject (monitor, msproject);

			var import = msproject.Imports.FirstOrDefault (im => im.Label == "Shared");
			if (import == null)
				return;

			// TODO: load the type from msbuild
			foreach (var item in msproject.Imports) {
				if (item.Project.Equals (CSharptargets, StringComparison.OrdinalIgnoreCase)) {
					LanguageName = "C#";
					break;
				}
				if (item.Project.Equals (FSharptargets, StringComparison.OrdinalIgnoreCase)) {
					LanguageName = "F#";
					break;
				}
			}
			//If for some reason the language name is empty default it to C#
			if (String.IsNullOrEmpty(LanguageName))
				LanguageName = "C#";

			projItemsPath = MSBuildProjectService.FromMSBuildPath (msproject.BaseDirectory, import.Project);

			MSBuildProject p = new MSBuildProject (msproject.EngineManager);
			p.Load (projItemsPath);
			p.Evaluate ();

			var cp = p.PropertyGroups.FirstOrDefault (g => g.Label == "Configuration");
			if (cp != null)
				DefaultNamespace = cp.GetValue ("Import_RootNamespace");

			LoadProjectItems (p, ProjectItemFlags.None, usedMSBuildItems);

			projitemsProject = p;
		}
		public void ConditionedProperties ()
		{
			string projectFile = Util.GetSampleProject ("msbuild-tests", "conditioned-properties.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();

			Assert.That (new string [] { "cond1", "cond2", "cond9", "cond10", "cond13" }, Is.EquivalentTo (p.ConditionedProperties.GetAllProperties ().ToArray ()));

			Assert.That (new string [] { "val1", "val14_1", "val14_4", "val14_5" }, Is.EquivalentTo (p.ConditionedProperties.GetAllPropertyValues ("cond1").ToArray ()));

			Assert.That (new string [] { "val2_0", "val2_7", "val14_2", "val14_3", "val14_6" }, Is.EquivalentTo (p.ConditionedProperties.GetAllPropertyValues ("cond2").ToArray ()));

			Assert.That (new string [] { "val9" }, Is.EquivalentTo (p.ConditionedProperties.GetAllPropertyValues ("cond9").ToArray ()));

			Assert.That (new string [] { "val10_1", "val10_2" }, Is.EquivalentTo (p.ConditionedProperties.GetAllPropertyValues ("cond10").ToArray ()));

			Assert.That (new string [] { "val13_4" }, Is.EquivalentTo (p.ConditionedProperties.GetAllPropertyValues ("cond13").ToArray ()));

			// Combined values

			Assert.That (new [] {
				new ValueSet (new [] { "cond1" }, new [] { "val1" })
			}, Is.EquivalentTo (p.ConditionedProperties.GetCombinedPropertyValues ("cond1").ToArray ()));

			Assert.That (new [] {
				new ValueSet (new [] { "cond2" }, new [] { "val2_0" }),
				new ValueSet (new [] { "cond2" }, new [] { "val2_7" }),
			}, Is.EquivalentTo (p.ConditionedProperties.GetCombinedPropertyValues ("cond2").ToArray ()));

			Assert.That (new [] {
				new ValueSet (new [] { "cond9" }, new [] { "val9" }),
			}, Is.EquivalentTo (p.ConditionedProperties.GetCombinedPropertyValues ("cond9").ToArray ()));

			Assert.That (new [] {
				new ValueSet (new [] { "cond10" }, new [] { "val10_1" }),
				new ValueSet (new [] { "cond10" }, new [] { "val10_2" }),
			}, Is.EquivalentTo (p.ConditionedProperties.GetCombinedPropertyValues ("cond10").ToArray ()));

			Assert.That (new [] {
				new ValueSet (new [] { "cond13" }, new [] { "val13_4" }),
			}, Is.EquivalentTo (p.ConditionedProperties.GetCombinedPropertyValues ("cond13").ToArray ()));

			Assert.That (new [] {
				new ValueSet (new [] { "cond1", "cond2" }, new [] { "val14_1", "val14_2" }),
				new ValueSet (new [] { "cond1", "cond2" }, new [] { "val14_4", "val14_3" }),
				new ValueSet (new [] { "cond1", "cond2" }, new [] { "val14_5", "val14_6" }),
			}, Is.EquivalentTo (p.ConditionedProperties.GetCombinedPropertyValues ("cond1", "cond2").ToArray ()));
		}
		public void EvalItemsAfterProperties ()
		{
			string projectFile = Util.GetSampleProject ("msbuild-tests", "property-eval-order.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();
			Assert.AreEqual (new [] {"Two"}, p.EvaluatedItems.Select (i => i.Include).ToArray ());
		}
		public void FunctionProperties ()
		{
			string projectFile = Util.GetSampleProject ("msbuild-tests", "functions.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();

			Assert.AreEqual ("bcd", p.EvaluatedProperties.GetValue ("Substring"));
			Assert.AreEqual ("ab", p.EvaluatedProperties.GetValue ("MethodWithParams1"));
			Assert.AreEqual ("abc", p.EvaluatedProperties.GetValue ("MethodWithParams2"));
			Assert.AreEqual ("abcd", p.EvaluatedProperties.GetValue ("MethodWithParams3"));
			Assert.AreEqual ("abcdefghij", p.EvaluatedProperties.GetValue ("MethodWithParams4"));
			Assert.AreEqual ("ab", p.EvaluatedProperties.GetValue ("MethodWithParams5"));
			Assert.AreEqual ("255", p.EvaluatedProperties.GetValue ("MaxByte"));
			Assert.AreEqual ("A", p.EvaluatedProperties.GetValue ("Upper1"));
			Assert.AreEqual ("a'b'c5", p.EvaluatedProperties.GetValue ("Upper2"));
			Assert.AreEqual ("a\"b\"c5", p.EvaluatedProperties.GetValue ("Upper3"));
			Assert.AreEqual ("abc5", p.EvaluatedProperties.GetValue ("Upper4"));
			Assert.AreEqual ("abcdefgh5", p.EvaluatedProperties.GetValue ("Upper5"));
			Assert.AreEqual ("1234567890", p.EvaluatedProperties.GetValue ("FileContent"));
			Assert.AreEqual ("00007fff", p.EvaluatedProperties.GetValue ("HexConv"));
			Assert.AreEqual ("[1234567890]", p.EvaluatedProperties.GetValue ("ConcatFileContent"));

			Assert.AreEqual ("5", p.EvaluatedProperties.GetValue ("MSBuildAdd"));
			Assert.AreEqual ("5.5", p.EvaluatedProperties.GetValue ("MSBuildAddDouble"));
			Assert.AreEqual ("abcdefgh", p.EvaluatedProperties.GetValue ("MSBuildValueOrDefault1"));
			Assert.AreEqual ("empty", p.EvaluatedProperties.GetValue ("MSBuildValueOrDefault2"));
			Assert.AreEqual ("a", p.EvaluatedProperties.GetValue ("CharTrim"));

			var dir = System.IO.Path.GetFullPath (System.IO.Path.Combine (System.IO.Path.GetDirectoryName (projectFile), "foo"));
			Assert.AreEqual (dir, p.EvaluatedProperties.GetValue ("FullPath"));
		}
		public void ChooseElement ()
		{
			string projectFile = Util.GetSampleProject ("project-with-choose-element", "project.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();
			Assert.AreEqual ("One", p.EvaluatedProperties.GetValue ("Foo"));

			var pi = p.CreateInstance ();
			pi.SetGlobalProperty ("Configuration", "Release");
			pi.Evaluate ();
			Assert.AreEqual ("Two", pi.EvaluatedProperties.GetValue ("Foo"));

			pi.SetGlobalProperty ("Configuration", "Alt");
			pi.Evaluate ();
			Assert.AreEqual ("Three", pi.EvaluatedProperties.GetValue ("Foo"));
		}
		public void ParseConditionWithoutQuotes ()
		{
			string projectFile = Util.GetSampleProject ("msbuild-tests", "condition-parse.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();
			Assert.AreEqual (new [] {"aa","vv","test"}, p.EvaluatedItems.Select (i => i.Include).ToArray ());
		}
		public void ImportGroups ()
		{
			string projectFile = Util.GetSampleProject ("project-with-import-groups", "import-group-test.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();

			Assert.AreEqual ("v2", p.EvaluatedProperties.GetValue ("TestProp"));
			Assert.AreEqual ("one", p.EvaluatedProperties.GetValue ("PropFromTest1"));
			Assert.AreEqual ("two", p.EvaluatedProperties.GetValue ("PropFromTest2"));
			Assert.AreEqual ("three", p.EvaluatedProperties.GetValue ("PropFromFoo"));
		}
		public void ImplicitImportOfUserProject ()
		{
			string projectFile = Util.GetSampleProject ("msbuild-project-test", "test-user.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();
			Assert.AreEqual ("Bar", p.EvaluatedProperties.GetValue ("TestProp"));
		}
		public void ParseConditionWithMethodInvoke ()
		{
			// XBC 40008
			string projectFile = Util.GetSampleProject ("msbuild-tests", "condition-parse.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();
			Assert.AreEqual ("Foo", p.EvaluatedProperties.GetValue ("Test1"));
			Assert.AreEqual ("Bar", p.EvaluatedProperties.GetValue ("Test2"));
		}
		public void StartWhitespaceForImportInsertedAsFirstChild ()
		{
			string projectFile = Util.GetSampleProject ("ConsoleApp-VS2013", "ConsoleApplication.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();
			var firstChild = p.GetAllObjects ().First ();

			MSBuildImport import = p.AddNewImport ("MyImport.targets", beforeObject: firstChild);

			Assert.AreEqual (p.TextFormat.NewLine, p.StartWhitespace);
			Assert.AreEqual ("  ", import.StartWhitespace);
		}
		public void ConditionedProperties ()
		{
			string projectFile = Util.GetSampleProject ("msbuild-tests", "conditioned-properties.csproj");
			var p = new MSBuildProject ();
			p.Load (projectFile);
			p.Evaluate ();

			Assert.That (new string [] { "cond1", "cond2", "cond9", "cond10", "cond13"}, Is.EquivalentTo (p.ConditionedProperties.Keys.ToArray ()));

			Assert.That (new string [] { "val1"}, Is.EquivalentTo (p.ConditionedProperties["cond1"].ToArray ()));

			Assert.That (new string [] { "val2_0", "val2_7"}, Is.EquivalentTo (p.ConditionedProperties["cond2"].ToArray ()));

			Assert.That (new string [] { "val9"}, Is.EquivalentTo (p.ConditionedProperties["cond9"].ToArray ()));

			Assert.That (new string [] { "val10_1", "val10_2"}, Is.EquivalentTo (p.ConditionedProperties["cond10"].ToArray ()));

			Assert.That (new string [] { "val13_4"}, Is.EquivalentTo (p.ConditionedProperties["cond13"].ToArray ()));
		}