1 // Copyright (c) Microsoft. All rights reserved. 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information. 3 //----------------------------------------------------------------------- 4 // </copyright> 5 // <summary>Implementation of IComparer on ITaskItems used for testing.</summary> 6 //----------------------------------------------------------------------- 7 8 using System; 9 using System.Collections.Generic; 10 using System.Linq; 11 using System.Text; 12 using Microsoft.Build.Framework; 13 using Microsoft.Build.Shared; 14 15 namespace Microsoft.Build.UnitTests.BackEnd 16 { 17 /// <summary> 18 /// Implementation of IComparer on ITaskItems used for testing. 19 /// </summary> 20 public class TaskItemComparer : IComparer<ITaskItem> 21 { 22 /// <summary> 23 /// Constructor. 24 /// </summary> TaskItemComparer()25 private TaskItemComparer() 26 { 27 } 28 29 /// <summary> 30 /// Retrieves a new instance of the class. 31 /// </summary> 32 public static IComparer<ITaskItem> Instance 33 { 34 get { return new TaskItemComparer(); } 35 } 36 37 #region IComparer<ITaskItem> Members 38 39 /// <summary> 40 /// Compares two task items. 41 /// Built-in derivable metadata is ignored as it might not be copied. 42 /// </summary> 43 /// <returns>0 if they are equal, -1 otherwise.</returns> Compare(ITaskItem x, ITaskItem y)44 public int Compare(ITaskItem x, ITaskItem y) 45 { 46 if (x.ItemSpec != y.ItemSpec) 47 { 48 return -1; 49 } 50 51 if (x.CloneCustomMetadata().Count != y.CloneCustomMetadata().Count) 52 { 53 return -1; 54 } 55 56 foreach (string metadataName in x.MetadataNames) 57 { 58 if (!FileUtilities.ItemSpecModifiers.IsItemSpecModifier(metadataName) || 59 FileUtilities.ItemSpecModifiers.IsDerivableItemSpecModifier(metadataName)) 60 { 61 if (x.GetMetadata(metadataName) != y.GetMetadata(metadataName)) 62 { 63 return -1; 64 } 65 } 66 } 67 68 foreach (string metadataName in y.MetadataNames) 69 { 70 if (!FileUtilities.ItemSpecModifiers.IsItemSpecModifier(metadataName) || 71 FileUtilities.ItemSpecModifiers.IsDerivableItemSpecModifier(metadataName)) 72 { 73 if (x.GetMetadata(metadataName) != y.GetMetadata(metadataName)) 74 { 75 return -1; 76 } 77 } 78 } 79 80 return 0; 81 } 82 83 #endregion 84 } 85 } 86