-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
247 additions
and
11 deletions.
There are no files selected for viewing
208 changes: 208 additions & 0 deletions
208
src/Build.UnitTests/BackEnd/RequestedProjectState_Tests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,208 @@ | ||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
|
||
using System.Collections.Generic; | ||
using FluentAssertions; | ||
using Microsoft.Build.Execution; | ||
using Shouldly; | ||
using Xunit; | ||
using Xunit.Abstractions; | ||
|
||
namespace Microsoft.Build.UnitTests.BackEnd | ||
{ | ||
public class RequestedProjectState_Tests | ||
{ | ||
[Fact] | ||
public void DeepCloneEmpty() | ||
{ | ||
RequestedProjectState state = new(); | ||
RequestedProjectState clone = state.DeepClone(); | ||
|
||
clone.PropertyFilters.Should().BeNull(); | ||
clone.ItemFilters.Should().BeNull(); | ||
} | ||
|
||
[Fact] | ||
public void DeepCloneProperties() | ||
{ | ||
List<string> properties = ["prop1", "prop2"]; | ||
RequestedProjectState state = new() | ||
{ | ||
PropertyFilters = properties, | ||
}; | ||
RequestedProjectState clone = state.DeepClone(); | ||
|
||
clone.PropertyFilters.Should().BeEquivalentTo(properties); | ||
clone.ItemFilters.Should().BeNull(); | ||
|
||
// Mutating the original instance is not reflected in the clone. | ||
properties.Add("prop3"); | ||
clone.PropertyFilters.Count.Should().NotBe(properties.Count); | ||
} | ||
|
||
[Fact] | ||
public void DeepCloneItemsNoMetadata() | ||
{ | ||
Dictionary<string, List<string>> items = new() | ||
{ | ||
{ "item1", null! }, | ||
{ "item2", null! }, | ||
}; | ||
RequestedProjectState state = new() | ||
{ | ||
ItemFilters = items, | ||
}; | ||
RequestedProjectState clone = state.DeepClone(); | ||
|
||
clone.PropertyFilters.Should().BeNull(); | ||
clone.ItemFilters.Should().BeEquivalentTo(items); | ||
|
||
// Mutating the original instance is not reflected in the clone. | ||
items.Add("item3", null!); | ||
clone.ItemFilters.Count.Should().NotBe(items.Count); | ||
} | ||
|
||
[Fact] | ||
public void DeepCloneItemsWithMetadata() | ||
{ | ||
Dictionary<string, List<string>> items = new() | ||
{ | ||
{ "item1", ["metadatum1", "metadatum2"] }, | ||
{ "item2", ["metadatum3"] }, | ||
}; | ||
RequestedProjectState state = new() | ||
{ | ||
ItemFilters = items, | ||
}; | ||
RequestedProjectState clone = state.DeepClone(); | ||
|
||
clone.PropertyFilters.Should().BeNull(); | ||
clone.ItemFilters.Should().BeEquivalentTo(items); | ||
|
||
// Mutating the original instance is not reflected in the clone. | ||
items.Add("item3", ["metadatum4"]); | ||
clone.ItemFilters.Count.Should().NotBe(items.Count); | ||
} | ||
|
||
[Fact] | ||
public void IsSubsetOfEmpty() | ||
{ | ||
RequestedProjectState state1 = new(); | ||
RequestedProjectState state2 = new(); | ||
|
||
// Empty instances are subsets of each other. | ||
state1.IsSubsetOf(state2).Should().BeTrue(); | ||
state2.IsSubsetOf(state1).Should().BeTrue(); | ||
|
||
state1.PropertyFilters = ["prop1"]; | ||
state1.ItemFilters = new Dictionary<string, List<string>>() | ||
{ | ||
{ "item1", null! }, | ||
}; | ||
|
||
// Non-empty instance is a subset of empty instance but not the other way round. | ||
state1.IsSubsetOf(state2).Should().BeTrue(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
} | ||
|
||
[Fact] | ||
public void IsSubsetOfProperties() | ||
{ | ||
RequestedProjectState state1 = new() | ||
{ | ||
PropertyFilters = ["prop1"], | ||
}; | ||
RequestedProjectState state2 = new() | ||
{ | ||
PropertyFilters = ["prop1", "prop2"], | ||
}; | ||
|
||
// "prop1" is a subset of "prop1", "prop2". | ||
state1.IsSubsetOf(state2).Should().BeTrue(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
|
||
state1.PropertyFilters.Add("prop3"); | ||
|
||
// Disjoint sets are not subsets of each other. | ||
state1.IsSubsetOf(state2).Should().BeFalse(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
|
||
state1.PropertyFilters.Clear(); | ||
|
||
// Empty props is a subset of anything. | ||
state1.IsSubsetOf(state2).Should().BeTrue(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
} | ||
|
||
[Fact] | ||
public void IsSubsetOfItemsNoMetadata() | ||
{ | ||
RequestedProjectState state1 = new() | ||
{ | ||
ItemFilters = new Dictionary<string, List<string>>() | ||
{ | ||
{ "item1", null! }, | ||
}, | ||
}; | ||
RequestedProjectState state2 = new() | ||
{ | ||
ItemFilters = new Dictionary<string, List<string>>() | ||
{ | ||
{ "item1", null! }, | ||
{ "item2", null! }, | ||
}, | ||
}; | ||
|
||
// "item1" is a subset of "item1", "item2". | ||
state1.IsSubsetOf(state2).Should().BeTrue(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
|
||
state1.ItemFilters.Add("item3", null!); | ||
|
||
// Disjoint sets are not subsets of each other. | ||
state1.IsSubsetOf(state2).Should().BeFalse(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
|
||
state1.ItemFilters.Clear(); | ||
|
||
// Empty items is a subset of anything. | ||
state1.IsSubsetOf(state2).Should().BeTrue(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
} | ||
|
||
[Fact] | ||
public void IsSubsetOfItemsWithMetadata() | ||
{ | ||
RequestedProjectState state1 = new() | ||
{ | ||
ItemFilters = new Dictionary<string, List<string>>() | ||
{ | ||
{ "item1", ["metadatum1"] }, | ||
}, | ||
}; | ||
RequestedProjectState state2 = new() | ||
{ | ||
ItemFilters = new Dictionary<string, List<string>>() | ||
{ | ||
{ "item1", null! }, | ||
}, | ||
}; | ||
|
||
// "item1" with "metadatum1" is a subset of "item1" with no metadata filter. | ||
state1.IsSubsetOf(state2).Should().BeTrue(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
|
||
state2.ItemFilters["item1"] = ["metadatum2"]; | ||
|
||
// Disjoint metadata filters are not subsets of each other. | ||
state1.IsSubsetOf(state2).Should().BeFalse(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
|
||
state1.ItemFilters["item1"] = []; | ||
|
||
// Empty metadata filter is a subset of any other metadata filter. | ||
state1.IsSubsetOf(state2).Should().BeTrue(); | ||
state2.IsSubsetOf(state1).Should().BeFalse(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters