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