// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Immutable; using FluentAssertions; using Newtonsoft.Json; using NuGet.LibraryModel; using NuGet.Versioning; using Xunit; namespace NuGet.ProjectModel.Test { public class LockFileLibraryTests { [Fact] public void LockFileLibrary_ComparesEqualPaths() { // Arrange var libraryA = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = "SomeLibrary/1.0.0" }; // same thing var libraryB = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = "SomeLibrary/1.0.0" }; // Act & Assert Assert.True(libraryA.Equals(libraryB), "The two libraries should be equal."); } [Fact] public void LockFileLibrary_ComparesDifferentCasePaths() { // Arrange var libraryA = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = "SomeLibrary/1.0.0" }; // different case var libraryB = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = "somelibrary/1.0.0" }; // Act & Assert Assert.False(libraryA.Equals(libraryB), "The two libraries should not be equal."); } [Fact] public void LockFileLibrary_ComparesDifferentPaths() { // Arrange var libraryA = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = "SomeLibrary/1.0.0" }; // different thing var libraryB = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = null }; // Act & Assert Assert.False(libraryA.Equals(libraryB), "The two libraries should not be equal."); } [Fact] public void LockFileLibrary_ComparesDifferentCaseFiles() { // Arrange var libraryA = new LockFileLibrary { Files = ImmutableArray.Create("path/a.txt", "path/b.txt") }; // different case var libraryB = new LockFileLibrary { Files = ImmutableArray.Create("path/a.txt", "PATH/b.txt") }; // Act & Assert Assert.False(libraryA.Equals(libraryB), "The two libraries should not be equal."); } [Fact] public void LockFileLibrary_CloneIncludesAllProperties() { // Arrange var original = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = "SomeLibrary/1.0.0", IsServiceable = true, MSBuildProject = "MSBuildProject", Sha512 = "FAKE-HASH", Type = LibraryType.Package, Files = ImmutableArray.Create("file/a.txt", "file/b.txt") }; // Use Newtonsoft.Json to enumerate all properties. var originalSerialized = JsonConvert.SerializeObject(original, Formatting.Indented); // Act var clone = original with { Name = original.Name }; // Assert var cloneSerialized = JsonConvert.SerializeObject(original, Formatting.Indented); Assert.Equal(originalSerialized, cloneSerialized); } [Fact] public void LockFileLibrary_CloneIsEqual() { // Arrange var original = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = "SomeLibrary/1.0.0", IsServiceable = true, MSBuildProject = "MSBuildProject", Sha512 = "FAKE-HASH", Type = LibraryType.Package, Files = ImmutableArray.Create("file/a.txt", "file/b.txt") }; // Act var clone = original with { Name = original.Name }; // Assert Assert.Equal(original, clone); } [Fact] public void LockFileLibrary_CloneReturnsDifferentInstance() { // Arrange var original = new LockFileLibrary { Name = "SomeLibrary", Version = new NuGetVersion("1.0.0"), Path = "SomeLibrary/1.0.0", IsServiceable = true, MSBuildProject = "MSBuildProject", Sha512 = "FAKE-HASH", Type = LibraryType.Package, Files = ImmutableArray.Create("file/a.txt", "file/b.txt") }; // Use Newtonsoft.Json to take a snapshot of all properties. var originalSerializedBefore = JsonConvert.SerializeObject(original, Formatting.Indented); // Act var clone = original with { Name = original.Name }; // Assert Assert.NotSame(original, clone); var originalSerializedAfter = JsonConvert.SerializeObject(original, Formatting.Indented); Assert.Equal(originalSerializedBefore, originalSerializedAfter); } [Fact] public void LockFileLibrary_EqualityEmpty() { // Arrange var library1 = new LockFileLibrary(); var library2 = new LockFileLibrary(); // Act & Assert Assert.True(library1.Equals(library2)); } [Fact] public void LockFileLibrary_EqualityDiffersOnMSBuildPath() { // Arrange var library1 = new LockFileLibrary() { MSBuildProject = "a" }; var library2 = new LockFileLibrary() { MSBuildProject = "b" }; // Act & Assert Assert.False(library1.Equals(library2)); } [Fact] public void LockFileLibrary_EqualitySameMSBuildPath() { // Arrange var library1 = new LockFileLibrary() { MSBuildProject = "b" }; var library2 = new LockFileLibrary() { MSBuildProject = "b" }; // Act & Assert Assert.True(library1.Equals(library2)); } [Theory] [InlineData("name", "name", true)] [InlineData("NAME", "name", true)] [InlineData("name", "name2", false)] public void Equals_WithName(string left, string right, bool expected) { var leftSide = new LockFileLibrary() { Name = left }; var rightSide = new LockFileLibrary() { Name = right }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } [Theory] [InlineData("project", "project", true)] [InlineData("PROJECT", "project", true)] [InlineData("project", "package", false)] public void Equals_WithType(string left, string right, bool expected) { var leftSide = new LockFileLibrary() { Type = left }; var rightSide = new LockFileLibrary() { Type = right }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } [Theory] [InlineData("1.0.0", "1.0.0", true)] [InlineData("1.0.0-preview.1", "1.0.0-preview.1", true)] [InlineData("1.0.0", "2.1.0", false)] public void Equals_WithVersion(string left, string right, bool expected) { var leftSide = new LockFileLibrary() { Version = NuGetVersion.Parse(left) }; var rightSide = new LockFileLibrary() { Version = NuGetVersion.Parse(right) }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } [Theory] [InlineData(true, true, true)] [InlineData(false, false, true)] [InlineData(true, false, false)] public void Equals_WithIsServiceable(bool left, bool right, bool expected) { var leftSide = new LockFileLibrary() { IsServiceable = left }; var rightSide = new LockFileLibrary() { IsServiceable = right }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } [Theory] [InlineData(true, true, true)] [InlineData(false, false, true)] [InlineData(true, false, false)] public void Equals_WithHasTools(bool left, bool right, bool expected) { var leftSide = new LockFileLibrary() { HasTools = left }; var rightSide = new LockFileLibrary() { HasTools = right }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } [Theory] [InlineData("project", "project", true)] [InlineData("project", "PROJECT", false)] [InlineData("project", "package", false)] public void Equals_WithPath(string left, string right, bool expected) { var leftSide = new LockFileLibrary() { Path = left }; var rightSide = new LockFileLibrary() { Path = right }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } [Theory] [InlineData("project", "project", true)] [InlineData("project", "PROJECT", false)] [InlineData("project", "package", false)] public void Equals_WithMSBuildProject(string left, string right, bool expected) { var leftSide = new LockFileLibrary() { MSBuildProject = left }; var rightSide = new LockFileLibrary() { MSBuildProject = right }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } [Theory] [InlineData("project", "project", true)] [InlineData("project", "PROJECT", false)] [InlineData("project", "package", false)] public void Equals_WithSha512(string left, string right, bool expected) { var leftSide = new LockFileLibrary() { Sha512 = left }; var rightSide = new LockFileLibrary() { Sha512 = right }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } [Theory] [InlineData("project", "project", true)] [InlineData("PROJECT", "project", false)] [InlineData("project", "package", false)] [InlineData("project;project2", "project2;project", true)] [InlineData("project;project2", "project;project2;project3", false)] public void Equals_WithFiles(string left, string right, bool expected) { var leftSide = new LockFileLibrary() { Files = left.Split(';').ToImmutableArray() }; var rightSide = new LockFileLibrary() { Files = right.Split(';').ToImmutableArray() }; // Act & Assert if (expected) { leftSide.Should().Be(rightSide); } else { leftSide.Should().NotBe(rightSide); } } } }