summaryrefslogtreecommitdiff
path: root/mcs/class/Microsoft.Build.Utilities
diff options
context:
space:
mode:
authorJo Shields <directhex@apebox.org>2014-02-19 22:12:43 +0000
committerJo Shields <directhex@apebox.org>2014-02-19 22:12:43 +0000
commit9972bf87b4f27d9c8f358ef8414ac1ab957a2f0f (patch)
tree5bb230c1d698659115f918e243c1d4b0aa4c7f51 /mcs/class/Microsoft.Build.Utilities
parentd0a215f5626219ff7927f576588a777e5331c7be (diff)
downloadmono-upstream/3.2.8+dfsg.tar.gz
Imported Upstream version 3.2.8+dfsgupstream/3.2.8+dfsg
Diffstat (limited to 'mcs/class/Microsoft.Build.Utilities')
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Assembly/AssemblyInfo.cs8
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Makefile23
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities.dll.sources1
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ProcessService.cs1
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TargetDotNetFrameworkVersion.cs14
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs12
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs61
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs19
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources1
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs3
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs59
-rw-r--r--mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolTaskTest.cs141
12 files changed, 308 insertions, 35 deletions
diff --git a/mcs/class/Microsoft.Build.Utilities/Assembly/AssemblyInfo.cs b/mcs/class/Microsoft.Build.Utilities/Assembly/AssemblyInfo.cs
index 90933c5a29..2f80ed7552 100644
--- a/mcs/class/Microsoft.Build.Utilities/Assembly/AssemblyInfo.cs
+++ b/mcs/class/Microsoft.Build.Utilities/Assembly/AssemblyInfo.cs
@@ -46,9 +46,9 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany (Consts.MonoCompany)]
[assembly: AssemblyProduct (Consts.MonoProduct)]
[assembly: AssemblyCopyright (Consts.MonoCopyright)]
-[assembly: AssemblyVersion (Consts.FxVersion)]
-[assembly: SatelliteContractVersion (Consts.FxVersion)]
-[assembly: AssemblyInformationalVersion (Consts.FxFileVersion)]
+[assembly: AssemblyVersion (XBuildConsts.AssemblyVersion)]
+[assembly: SatelliteContractVersion (XBuildConsts.AssemblyVersion)]
+[assembly: AssemblyInformationalVersion (XBuildConsts.FileVersion)]
[assembly: NeutralResourcesLanguage ("en-US")]
@@ -57,6 +57,6 @@ using System.Runtime.InteropServices;
[assembly: AssemblyDelaySign (true)]
[assembly: AssemblyKeyFile("../msfinal.pub")]
-[assembly: AssemblyFileVersion (Consts.FxFileVersion)]
+[assembly: AssemblyFileVersion (XBuildConsts.FileVersion)]
#endif
diff --git a/mcs/class/Microsoft.Build.Utilities/Makefile b/mcs/class/Microsoft.Build.Utilities/Makefile
index 32f34e3f40..0951df6adb 100644
--- a/mcs/class/Microsoft.Build.Utilities/Makefile
+++ b/mcs/class/Microsoft.Build.Utilities/Makefile
@@ -2,27 +2,18 @@ thisdir = class/Microsoft.Build.Utilities
SUBDIRS =
include ../../build/rules.make
-LIBRARY = Microsoft.Build.Utilities.dll
-BUILD_FRAMEWORK = Microsoft.Build.Framework.dll
+XBUILD_DIR=$(topdir)/tools/xbuild
+include $(XBUILD_DIR)/xbuild.make
-ifeq (3.5, $(FRAMEWORK_VERSION))
-LIBRARY_NAME = Microsoft.Build.Utilities.v3.5.dll
-BUILD_FRAMEWORK := $(topdir)/class/lib/$(PROFILE)/$(BUILD_FRAMEWORK)
-else
-ifeq (4, $(FRAMEWORK_VERSION_MAJOR))
-LIBRARY_NAME = Microsoft.Build.Utilities.v4.0.dll
-endif
-endif
+LIBRARY = Microsoft.Build.Utilities.dll
+LIBRARY_NAME = Microsoft.Build.Utilities$(NAME_SUFFIX).dll
LIB_MCS_FLAGS = \
/r:$(corlib) \
/r:System.dll \
- /r:$(BUILD_FRAMEWORK)
-
-TEST_MCS_FLAGS = /r:$(BUILD_FRAMEWORK) -r:System.dll
+ /r:$(XBUILD_FRAMEWORK)
-export TESTING_MONO=a
-XBUILD_DIR=../../tools/xbuild
-include $(XBUILD_DIR)/xbuild_targets.make
+TEST_MCS_FLAGS = /r:$(XBUILD_ENGINE) /r:$(XBUILD_FRAMEWORK) -r:System.dll -r:System.Core.dll
+include $(XBUILD_DIR)/xbuild_test.make
include ../../build/library.make
diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities.dll.sources b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities.dll.sources
index c377282586..deb3e77ec9 100644
--- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities.dll.sources
+++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities.dll.sources
@@ -1,5 +1,6 @@
../../build/common/Consts.cs
../../build/common/MonoTODOAttribute.cs
+../../tools/xbuild/XBuildConsts.cs
Assembly/AssemblyInfo.cs
Microsoft.Build.Utilities/AppDomainIsolatedTask.cs
Microsoft.Build.Utilities/CommandLineBuilder.cs
diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ProcessService.cs b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ProcessService.cs
index 3de4979772..d022ea16c0 100644
--- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ProcessService.cs
+++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ProcessService.cs
@@ -117,6 +117,7 @@ namespace Microsoft.Build.Utilities
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardInput = redirectStandardInput;
startInfo.UseShellExecute = false;
+ startInfo.CreateNoWindow = true;
return startInfo;
}
diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TargetDotNetFrameworkVersion.cs b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TargetDotNetFrameworkVersion.cs
index 4401042a60..04940d5e8b 100644
--- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TargetDotNetFrameworkVersion.cs
+++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TargetDotNetFrameworkVersion.cs
@@ -31,7 +31,12 @@ namespace Microsoft.Build.Utilities
{
// If changing something here then update
// ToolLocationHelper.GetPathToDotNetFramework also
- public enum TargetDotNetFrameworkVersion
+ #if MICROSOFT_BUILD_DLL
+ internal
+ #else
+ public
+ #endif
+ enum TargetDotNetFrameworkVersion
{
Version11,
Version20,
@@ -43,8 +48,13 @@ namespace Microsoft.Build.Utilities
#if NET_4_5
Version45,
#endif
+#if XBUILD_12
+ Version451,
+#endif
-#if NET_4_5
+#if XBUILD_12
+ VersionLatest = Version451
+#elif NET_4_5
VersionLatest = Version45
#elif NET_4_0
VersionLatest = Version40
diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs
index d917d3e6a3..03c018a54d 100644
--- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs
+++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskItem.cs
@@ -36,7 +36,10 @@ using Mono.XBuild.Utilities;
namespace Microsoft.Build.Utilities
{
- public sealed class TaskItem : MarshalByRefObject, ITaskItem
+#if !MICROSOFT_BUILD_DLL
+ public
+#endif
+ sealed class TaskItem : MarshalByRefObject, ITaskItem
{
IDictionary metadata;
string itemSpec;
@@ -61,7 +64,6 @@ namespace Microsoft.Build.Utilities
if (itemSpec == null)
throw new ArgumentNullException ("itemSpec");
- this.itemSpec = itemSpec;
this.metadata = CollectionsUtil.CreateCaseInsensitiveHashtable ();
// FIXME: hack
@@ -105,9 +107,9 @@ namespace Microsoft.Build.Utilities
public string GetMetadata (string metadataName)
{
if (ReservedNameUtils.IsReservedMetadataName (metadataName))
- return ReservedNameUtils.GetReservedMetadata (ItemSpec, metadataName, metadata);
+ return MSBuildUtils.Unescape (ReservedNameUtils.GetReservedMetadata (ItemSpec, metadataName, metadata));
else if (metadata.Contains (metadataName))
- return (string) metadata [metadataName];
+ return MSBuildUtils.Unescape ((string)metadata [metadataName]);
else
return String.Empty;
}
@@ -150,7 +152,7 @@ namespace Microsoft.Build.Utilities
}
public string ItemSpec {
- get { return itemSpec; }
+ get { return MSBuildUtils.Unescape (itemSpec); }
set { itemSpec = value; }
}
diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs
index cc5b84cb90..91441df066 100644
--- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs
+++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs
@@ -30,10 +30,16 @@ using System.IO;
namespace Microsoft.Build.Utilities
{
- public static class ToolLocationHelper
+ #if MICROSOFT_BUILD_DLL
+ internal
+ #else
+ public
+ #endif
+ static class ToolLocationHelper
{
static string lib_mono_dir;
static string [] mono_dir;
+ static bool runningOnDotNet;
static ToolLocationHelper ()
{
@@ -48,23 +54,45 @@ namespace Microsoft.Build.Utilities
t2 = t1.Parent;
lib_mono_dir = t2.FullName;
+
+#if NET_4_0
+ var windowsPath = Environment.GetFolderPath (Environment.SpecialFolder.Windows);
+ runningOnDotNet = !string.IsNullOrEmpty (windowsPath) && lib_mono_dir.StartsWith (windowsPath);
+#endif
+
if (Environment.GetEnvironmentVariable ("TESTING_MONO") != null) {
mono_dir = new string [] {
Path.Combine (lib_mono_dir, "net_1_0"),
Path.Combine (lib_mono_dir, "net_2_0"),
Path.Combine (lib_mono_dir, "net_2_0"),
Path.Combine (lib_mono_dir, "net_3_5"),
- Path.Combine (lib_mono_dir, "net_4_0"),
+ // mono's 4.0 is not an actual framework directory with all tools etc
+ // it's simply reference assemblies. So like .NET we consider 4.5 to
+ // be a complete replacement for 4.0.
+ Path.Combine (lib_mono_dir, "net_4_5"),
+ Path.Combine (lib_mono_dir, "net_4_5"),
Path.Combine (lib_mono_dir, "net_4_5")
};
+ } else if (runningOnDotNet) {
+ mono_dir = new string [] {
+ Path.Combine (lib_mono_dir, "v1.0.3705"),
+ Path.Combine (lib_mono_dir, "v2.0.50727"),
+ Path.Combine (lib_mono_dir, "v2.0.50727"),
+ Path.Combine (lib_mono_dir, "v3.5"),
+ Path.Combine (lib_mono_dir, "v4.0.30319"),
+ Path.Combine (lib_mono_dir, "v4.0.30319"),
+ Path.Combine (lib_mono_dir, "v4.0.30319")
+ };
} else {
mono_dir = new string [] {
Path.Combine (lib_mono_dir, "1.0"),
Path.Combine (lib_mono_dir, "2.0"),
Path.Combine (lib_mono_dir, "2.0"),
Path.Combine (lib_mono_dir, "3.5"),
- Path.Combine (lib_mono_dir, "4.0"),
- Path.Combine (lib_mono_dir, "4.5")
+ // see comment above regarding 4.0/4.5
+ Path.Combine (lib_mono_dir, "4.5"),
+ Path.Combine (lib_mono_dir, "4.5"),
+ Path.Combine (lib_mono_dir, "4.5"),
};
}
@@ -124,5 +152,30 @@ namespace Microsoft.Build.Utilities
throw new NotImplementedException ();
}
}
+
+#if XBUILD_12
+ public static string CurrentToolsVersion {
+ get {
+ return XBuildConsts.Version;
+ }
+ }
+
+ public static string GetPathToBuildTools (string toolsVersion)
+ {
+ if (toolsVersion != "12.0")
+ return null;
+
+ if (Environment.GetEnvironmentVariable ("TESTING_MONO") != null)
+ return Path.Combine (lib_mono_dir, "xbuild_12");
+
+ if (runningOnDotNet) {
+ //see http://msdn.microsoft.com/en-us/library/vstudio/bb397428(v=vs.120).aspx
+ var programFiles = Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86);
+ return Path.Combine (programFiles, "MSBuild", toolsVersion, "bin");
+ }
+
+ return Path.Combine (lib_mono_dir, "xbuild", toolsVersion, "bin");
+ }
+#endif
}
}
diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs
index 4094c122e3..01a7c453ae 100644
--- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs
+++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs
@@ -298,6 +298,7 @@ namespace Microsoft.Build.Utilities
pinfo.WorkingDirectory = GetWorkingDirectory () ?? Environment.CurrentDirectory;
pinfo.UseShellExecute = false;
+ pinfo.CreateNoWindow = true;
pinfo.RedirectStandardOutput = true;
pinfo.RedirectStandardError = true;
@@ -464,13 +465,25 @@ namespace Microsoft.Build.Utilities
}
}
- // Snatched from our codedom code, with some changes to make it compatible with csc
- // (the line+column group is optional is csc)
+ // Keep in sync with mcs/class/System/Microsoft.CSharp/CSharpCodeCompiler.cs
+ const string ErrorRegexPattern = @"
+ ^
+ (\s*(?<file>[^\(]+) # filename (optional)
+ (\((?<line>\d*)(,(?<column>\d*[\+]*))?\))? # line+column (optional)
+ :\s+)?
+ (?<level>\w+) # error|warning
+ \s+
+ (?<number>[^:]*\d) # CS1234
+ :
+ \s*
+ (?<message>.*)$";
+
static Regex errorRegex;
static Regex CscErrorRegex {
get {
if (errorRegex == null)
- errorRegex = new Regex (@"^(\s*(?<file>[^\(]+)(\((?<line>\d*)(,(?<column>\d*[\+]*))?\))?:\s+)*(?<level>\w+)\s+(?<number>.*\d):\s*(?<message>.*)", RegexOptions.Compiled | RegexOptions.ExplicitCapture);
+ errorRegex = new Regex (ErrorRegexPattern,
+ RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnorePatternWhitespace);
return errorRegex;
}
}
diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources
index 8f797a06ec..b1a3758e98 100644
--- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources
+++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources
@@ -2,3 +2,4 @@ Microsoft.Build.Utilities/CommandLineBuilderTest.cs
Microsoft.Build.Utilities/LoggerTest.cs
Microsoft.Build.Utilities/TaskItemTest.cs
Microsoft.Build.Utilities/TaskLoggingHelperTest.cs
+Microsoft.Build.Utilities/ToolTaskTest.cs
diff --git a/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs b/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs
index f2712566d5..6789cfbd92 100644
--- a/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs
+++ b/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs
@@ -77,7 +77,8 @@ namespace Mono.XBuild.Utilities {
switch (metadataName.ToLowerInvariant ()) {
case "fullpath":
- return Path.GetFullPath (itemSpec);
+ var unescapedItemSpec = MSBuildUtils.Unescape (itemSpec);
+ return MSBuildUtils.Escape (Path.GetFullPath (unescapedItemSpec));
case "rootdir":
if (Path.IsPathRooted (itemSpec))
return Path.GetPathRoot (itemSpec);
diff --git a/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs
index 2032f7c357..79e2eff5f6 100644
--- a/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs
+++ b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/TaskItemTest.cs
@@ -28,6 +28,7 @@
using System;
using System.Collections;
using System.Collections.Specialized;
+using System.IO;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using NUnit.Framework;
@@ -116,6 +117,50 @@ namespace MonoTests.Microsoft.Build.Utilities {
}
[Test]
+ public void TestCtor_EscapedSpecialChar ()
+ {
+ // If we instantiate with the *escaped* metadata, it's unescaped automatically
+ var metadata = "foo@2x.png";
+ var escapedMetadata = global::Microsoft.Build.BuildEngine.Utilities.Escape ("foo@2x.png");
+ var item = new TaskItem (escapedMetadata);
+ item.SetMetadata ("mine", escapedMetadata);
+
+ Assert.AreEqual (metadata, item.ItemSpec, "#1");
+ Assert.AreEqual (metadata, item.GetMetadata ("Identity"), "#2");
+ Assert.AreEqual (Path.GetFileNameWithoutExtension (metadata), item.GetMetadata ("FileName"), "#3");
+ Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (metadata), "#4");
+ Assert.AreEqual (metadata, item.GetMetadata ("mine"), "#5");
+ }
+
+ [Test]
+ public void TestCtor_EscapedSpecialChar_BrokenEscaping ()
+ {
+ // This is badly escaped, but MSBuild does not care.
+ var metadata = "foo%4@2x.png";
+ var item = new TaskItem (metadata);
+
+ Assert.AreEqual (metadata, item.ItemSpec, "#1");
+ Assert.AreEqual (metadata, item.GetMetadata ("Identity"), "#2");
+ Assert.AreEqual (Path.GetFileNameWithoutExtension (metadata), item.GetMetadata ("FileName"), "#3");
+ Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (metadata), "#4");
+ }
+
+ [Test]
+ public void TestCtor_UnescapedSpecialChar ()
+ {
+ // If we instantiate with unescaped metadata, we get the same value back
+ var metadata = "foo@2x.png";
+ var item = new TaskItem (metadata);
+ item.SetMetadata ("mine", metadata);
+
+ Assert.AreEqual (metadata, item.ItemSpec, "#1");
+ Assert.AreEqual (metadata, item.GetMetadata ("Identity"), "#2");
+ Assert.AreEqual (Path.GetFileNameWithoutExtension (metadata), item.GetMetadata ("FileName"), "#3");
+ Assert.IsTrue (item.GetMetadata ("FullPath").EndsWith (metadata), "#4");
+ Assert.AreEqual (metadata, item.GetMetadata ("mine"), "#5");
+ }
+
+ [Test]
public void TestCopyConstructor ()
{
item1 = new TaskItem ("itemSpec");
@@ -240,5 +285,19 @@ namespace MonoTests.Microsoft.Build.Utilities {
item = new TaskItem ("lalala");
item.SetMetadata ("Identity", "some value");
}
+
+ [Test]
+ public void TestSetItemSpec ()
+ {
+ var itemSpec = "foo@2x.png";
+ var escapedItemSpec = global::Microsoft.Build.BuildEngine.Utilities.Escape (itemSpec);
+
+ var item = new TaskItem ("foo");
+ item.ItemSpec = itemSpec;
+ Assert.AreEqual (itemSpec, item.ItemSpec, "#1");
+
+ item.ItemSpec = escapedItemSpec;
+ Assert.AreEqual (itemSpec, item.ItemSpec, "#2");
+ }
}
}
diff --git a/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolTaskTest.cs b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolTaskTest.cs
new file mode 100644
index 0000000000..8b3ae6e69c
--- /dev/null
+++ b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolTaskTest.cs
@@ -0,0 +1,141 @@
+//
+// ToolTaskTest.cs:
+//
+// Author:
+// Jonathan Pryor (jonp@xamarin.com)
+//
+// (C) 2013 Xamarin Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
+
+using NUnit.Framework;
+
+namespace MonoTests.Microsoft.Build.Utilities {
+
+ [TestFixture]
+ public class ToolTaskTest {
+
+ [Test]
+ public void LogEventsFromTextOutput ()
+ {
+ var messages = new[] {
+ new {Code = "CS0152", Line = "class1.cs(16,4): error CS0152: The label `case 1:' already occurs in this switch statement" },
+ };
+
+ var task = new LogEventsFromTextOutputToolTask ();
+ foreach (var m in messages) {
+ task.LogEventsFromTextOutput (m.Line);
+ Assert.IsTrue (task.Codes.Count > 0, "No error logged for line: {0}", m.Line);
+ Assert.AreEqual (m.Code, task.Codes [0]);
+ task.Codes.Clear ();
+ }
+ }
+ }
+
+ class LogEventsFromTextOutputToolTask : ToolTask {
+
+ public List<string> Codes {
+ get {return engine.Codes;}
+ }
+
+ CodeLoggingBuildEngine engine = new CodeLoggingBuildEngine ();
+
+ public LogEventsFromTextOutputToolTask ()
+ {
+ BuildEngine = engine;
+ }
+
+ protected override string GenerateFullPathToTool ()
+ {
+ throw new NotImplementedException ();
+ }
+
+ protected override string ToolName {
+ get {throw new NotImplementedException ();}
+ }
+
+ public void LogEventsFromTextOutput (string line)
+ {
+ base.LogEventsFromTextOutput (line, MessageImportance.Normal);
+ }
+ }
+
+ class CodeLoggingBuildEngine : IBuildEngine {
+
+ public List<string> Codes = new List<string> ();
+
+ public int ColumnNumberOfTaskNode {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public bool ContinueOnError {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public int LineNumberOfTaskNode {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public string ProjectFileOfTaskNode {
+ get {
+ throw new NotImplementedException ();
+ }
+ }
+
+ public bool BuildProjectFile (string projectFileName, string[] targetNames, System.Collections.IDictionary globalProperties, System.Collections.IDictionary targetOutputs)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public void LogCustomEvent (CustomBuildEventArgs e)
+ {
+ }
+
+ public void LogErrorEvent (BuildErrorEventArgs e)
+ {
+ Codes.Add (e.Code);
+ }
+
+ public void LogMessageEvent (BuildMessageEventArgs e)
+ {
+ }
+
+ public void LogWarningEvent (BuildWarningEventArgs e)
+ {
+ Codes.Add (e.Code);
+ }
+ }
+}
+