using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Text; using UnitTestSharp; namespace Ariadne.Generator.UnitTests { public class SourcePlaceTests : TestFixture { public static SourcePlace Variant(string filePath = "File.cs", int start = 1, int line = 1) { return new SourcePlace(filePath, new TextSpan(start, 4), new LinePositionSpan(new LinePosition(line, 0), new LinePosition(line, 4))); } public class CtorTests : TestFixture { public void KeepsEveryArgument() { SourcePlace place = Variant(start: 3, line: 2); CheckEqual("File.cs", place.FilePath); CheckEqual(new TextSpan(3, 4), place.Span); CheckEqual(new LinePositionSpan(new LinePosition(2, 0), new LinePosition(2, 4)), place.LineSpan); } } public class OfTests : TestFixture { public void LocationInSource_IsItsFileAndSpans() { CSharpCompilation compilation = GeneratorRun.Compile(("Source.cs", "public class Foo { }")); Location location = compilation.GetTypeByMetadataName("Foo").Locations[0]; SourcePlace place = SourcePlace.Of(location); CheckEqual("Source.cs", place.FilePath); CheckEqual(location.SourceSpan, place.Span); CheckEqual(location.GetLineSpan().Span, place.LineSpan); } public void LocationNotInSource_HasNoFile() { CSharpCompilation compilation = GeneratorRun.Compile(("Source.cs", "")); Location location = compilation.GetSpecialType(SpecialType.System_Object).Locations[0]; CheckNull(SourcePlace.Of(location).FilePath); } public void NoLocation_HasNoFile() { CheckNull(SourcePlace.Of(null).FilePath); CheckNull(SourcePlace.Of(Location.None).FilePath); } } public class LocationInTests : TestFixture { public void FileInTheCompilation_IsAtTheSpanOfItsOwnSyntaxTree() { CSharpCompilation compilation = GeneratorRun.Compile(("Source.cs", "public class Foo { }")); SourcePlace place = SourcePlace.Of(compilation.GetTypeByMetadataName("Foo").Locations[0]); Location location = place.LocationIn(compilation); CheckEqual(LocationKind.SourceFile, location.Kind); CheckTrue(location.SourceTree == compilation.SyntaxTrees[1]); CheckEqual(place.Span, location.SourceSpan); } public void FileOutsideTheCompilation_IsAtItsPath() { CSharpCompilation compilation = GeneratorRun.Compile(("Source.cs", "public class Foo { }")); Location location = Variant(filePath: "Elsewhere.cs", start: 2, line: 3).LocationIn(compilation); CheckEqual(LocationKind.ExternalFile, location.Kind); CheckEqual("Elsewhere.cs", location.GetLineSpan().Path); CheckEqual(new TextSpan(2, 4), location.SourceSpan); } public void NoFile_IsNowhere() { CSharpCompilation compilation = GeneratorRun.Compile(("Source.cs", "")); CheckEqual(Location.None, SourcePlace.Of(null).LocationIn(compilation)); } } public class EqualsTests : TestFixture { public void SameValues_AreEqual() { CheckTrue(Variant().Equals(Variant())); CheckTrue(Variant().Equals((object)Variant())); } public void Null_IsNotEqual() { CheckFalse(Variant().Equals((SourcePlace)null)); CheckFalse(Variant().Equals((object)null)); } public void OtherType_IsNotEqual() { CheckFalse(Variant().Equals("File.cs")); } public void DifferentFilePath_IsNotEqual() { CheckFalse(Variant().Equals(Variant(filePath: "Other.cs"))); } public void DifferentSpan_IsNotEqual() { CheckFalse(Variant().Equals(Variant(start: 2))); } public void DifferentLineSpan_IsNotEqual() { CheckFalse(Variant().Equals(Variant(line: 2))); } } public class GetHashCodeTests : TestFixture { public void EqualPlaces_HaveEqualHashCodes() { CheckEqual(Variant().GetHashCode(), Variant().GetHashCode()); } } } }