diff --git a/.gitignore b/.gitignore index c88ebe9..e3f3582 100644 --- a/.gitignore +++ b/.gitignore @@ -246,7 +246,7 @@ src/ReactiveUI.Events*/Events_*.cs # macOS .DS_Store -src/*.Tests/**/ApiApprovalTests*.received.txt +src/*.Tests/**/*.received.txt .idea/ # Fody Weavers (for tests) diff --git a/src/Pharmacist.Core/Generation/ReflectionExtensions.cs b/src/Pharmacist.Core/Generation/ReflectionExtensions.cs index b1313d9..d610c9b 100644 --- a/src/Pharmacist.Core/Generation/ReflectionExtensions.cs +++ b/src/Pharmacist.Core/Generation/ReflectionExtensions.cs @@ -85,16 +85,6 @@ public static IReadOnlyCollection GetReferenceTypeDefinitionsWi return map.GetValueOrDefault(name); } - public static string GetBuiltInType(string typeName) - { - if (_fullToBuiltInTypes.TryGetValue(typeName, out var builtInName)) - { - return builtInName; - } - - return typeName; - } - /// /// Get a list of non-generic public type definitions. /// @@ -158,7 +148,8 @@ public static IType GetRealType(this IType type, ICompilation compilation) /// A type descriptor including the generic arguments. public static string GenerateFullGenericName(this IType currentType) { - var sb = new StringBuilder("global::" + GetBuiltInType(currentType.FullName)); + var (isBuiltIn, typeName) = GetBuiltInType(currentType.FullName); + var sb = new StringBuilder(!isBuiltIn ? "global::" + typeName : typeName); if (currentType.TypeParameterCount > 0) { @@ -177,5 +168,15 @@ private static IImmutableList GetPublicTypeDefinitionsWithEvent comp => comp.GetPublicNonGenericTypeDefinitions().Where(x => x.Events.Any(eventInfo => eventInfo.Accessibility == Accessibility.Public)) .ToImmutableList()); } + + private static (bool isInternalType, string typeName) GetBuiltInType(string typeName) + { + if (_fullToBuiltInTypes.TryGetValue(typeName, out var builtInName)) + { + return (true, builtInName); + } + + return (false, typeName); + } } } diff --git a/src/Pharmacist.Tests/IntegrationTests/IntegrationTestHelper.cs b/src/Pharmacist.Tests/IntegrationTests/IntegrationTestHelper.cs new file mode 100644 index 0000000..61a0ddc --- /dev/null +++ b/src/Pharmacist.Tests/IntegrationTests/IntegrationTestHelper.cs @@ -0,0 +1,92 @@ +// Copyright (c) 2019 .NET Foundation and Contributors. All rights reserved. +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for full license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; + +using NuGet.Configuration; +using NuGet.Frameworks; +using NuGet.LibraryModel; +using NuGet.Packaging.Core; +using NuGet.Protocol.Core.Types; + +using Pharmacist.Core; +using Pharmacist.Core.NuGet; + +using Shouldly; + +namespace Pharmacist.Tests.IntegrationTests +{ + internal static class IntegrationTestHelper + { + private static readonly Regex _whitespaceRegex = new Regex(@"\s"); + + public static async Task CheckResultsAgainstTemplate(PackageIdentity[] package, IReadOnlyCollection frameworks, [CallerFilePath]string filePath = null) + { + using (var memoryStream = new MemoryStream()) + { + await ObservablesForEventGenerator.ExtractEventsFromNuGetPackages(memoryStream, package, frameworks).ConfigureAwait(false); + CheckContents(memoryStream, package[0], filePath); + } + } + + public static async Task CheckResultsAgainstTemplate(LibraryRange[] package, IReadOnlyCollection frameworks, [CallerFilePath]string filePath = null) + { + var bestPackageIdentity = await NuGetPackageHelper.GetBestMatch(package[0], new SourceRepository(new PackageSource(NuGetPackageHelper.DefaultNuGetSource), NuGetPackageHelper.Providers), CancellationToken.None).ConfigureAwait(false); + + using (var memoryStream = new MemoryStream()) + { + await ObservablesForEventGenerator.ExtractEventsFromNuGetPackages(memoryStream, package, frameworks).ConfigureAwait(false); + CheckContents(memoryStream, bestPackageIdentity, filePath); + } + } + + private static void CheckContents(MemoryStream memoryStream, PackageIdentity bestPackageIdentity, string filePath) + { + var sourceDirectory = Path.GetDirectoryName(filePath); + + var approvedFileName = Path.Combine(sourceDirectory, $"{bestPackageIdentity.Id}.{bestPackageIdentity.Version}.approved.txt"); + var receivedFileName = Path.Combine(sourceDirectory, $"{bestPackageIdentity.Id}.{bestPackageIdentity.Version}.received.txt"); + + if (!File.Exists(approvedFileName)) + { + File.Create(approvedFileName); + } + + if (!File.Exists(receivedFileName)) + { + File.Create(receivedFileName); + } + + memoryStream.Flush(); + + memoryStream.Position = 0; + using (var sr = new StreamReader(memoryStream)) + { + var actualContents = sr.ReadToEnd().Trim('\n').Trim('\r'); + var expectedContents = File.ReadAllText(approvedFileName); + + string normalizedActual = _whitespaceRegex.Replace(actualContents, string.Empty); + string normalizedExpected = _whitespaceRegex.Replace(expectedContents, string.Empty); + + if (!string.Equals(normalizedActual, normalizedExpected, StringComparison.InvariantCulture)) + { + File.WriteAllText(receivedFileName, actualContents); + ShouldlyConfiguration.DiffTools.GetDiffTool().Open(receivedFileName, approvedFileName, true); + } + + normalizedActual.ShouldNotBeEmpty(); + + normalizedActual.ShouldBe(normalizedExpected, StringCompareShould.IgnoreLineEndings); + } + } + } +} diff --git a/src/Pharmacist.Tests/IntegrationTests/LibraryRangeIntegrationTests.cs b/src/Pharmacist.Tests/IntegrationTests/LibraryRangeIntegrationTests.cs new file mode 100644 index 0000000..7759011 --- /dev/null +++ b/src/Pharmacist.Tests/IntegrationTests/LibraryRangeIntegrationTests.cs @@ -0,0 +1,54 @@ +using System.Threading.Tasks; + +using NuGet.Frameworks; +using NuGet.LibraryModel; +using NuGet.Versioning; + +using Pharmacist.Core.NuGet; + +using Xunit; + +namespace Pharmacist.Tests.IntegrationTests +{ + public class LibraryRangeIntegrationTests + { + /// + /// Tests to make sure the Tizen platform produces the expected results. + /// + /// A task to monitor the progress. + [Fact] + public Task TizenNuGetTest() + { + var package = new[] { new LibraryRange("Tizen.NET.API4", VersionRange.Parse("4.0.1.*"), LibraryDependencyTarget.Package) }; + var frameworks = new[] { FrameworkConstants.CommonFrameworks.NetStandard20 }; + + return IntegrationTestHelper.CheckResultsAgainstTemplate(package, frameworks); + } + + /// + /// Tests to make sure the Xamarin.Essentials platform produces the expected results. + /// + /// A task to monitor the progress. + [Fact] + public Task XamarinEssentialsNuGetTest() + { + var package = new[] { new LibraryRange("Xamarin.Essentials", VersionRange.Parse("1.1.*"), LibraryDependencyTarget.Package) }; + var frameworks = "MonoAndroid81".ToFrameworks(); + + return IntegrationTestHelper.CheckResultsAgainstTemplate(package, frameworks); + } + + /// + /// Tests to make sure the Xamarin.Forms platform produces the expected results. + /// + /// A task to monitor the progress. + [Fact] + public Task XamarinFormsNuGetTest() + { + var package = new[] { new LibraryRange("Xamarin.Forms", VersionRange.Parse("4.0.0.*"), LibraryDependencyTarget.Package) }; + var frameworks = "MonoAndroid81".ToFrameworks(); + + return IntegrationTestHelper.CheckResultsAgainstTemplate(package, frameworks); + } + } +} diff --git a/src/Pharmacist.Tests/PackageIdentityIntegrationTests.cs b/src/Pharmacist.Tests/IntegrationTests/PackageIdentityIntegrationTests.cs similarity index 55% rename from src/Pharmacist.Tests/PackageIdentityIntegrationTests.cs rename to src/Pharmacist.Tests/IntegrationTests/PackageIdentityIntegrationTests.cs index 751fd5e..14d2b4a 100644 --- a/src/Pharmacist.Tests/PackageIdentityIntegrationTests.cs +++ b/src/Pharmacist.Tests/IntegrationTests/PackageIdentityIntegrationTests.cs @@ -3,31 +3,23 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for full license information. -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; using System.Threading.Tasks; using NuGet.Frameworks; using NuGet.Packaging.Core; using NuGet.Versioning; -using Pharmacist.Core; using Pharmacist.Core.NuGet; -using Shouldly; - using Xunit; -namespace Pharmacist.Tests +namespace Pharmacist.Tests.IntegrationTests { /// /// Tests to make sure that integration tests produce correct results. /// public class PackageIdentityIntegrationTests { - private static readonly Regex _whitespaceRegex = new Regex(@"\s"); - /// /// Tests to make sure the Tizen platform produces the expected results. /// @@ -38,7 +30,7 @@ public Task TizenNuGetTest() var package = new[] { new PackageIdentity("Tizen.NET.API4", new NuGetVersion("4.0.1.14152")) }; var frameworks = new[] { FrameworkConstants.CommonFrameworks.NetStandard20 }; - return CheckResultsAgainstTemplate(package, frameworks); + return IntegrationTestHelper.CheckResultsAgainstTemplate(package, frameworks); } /// @@ -51,7 +43,7 @@ public Task XamarinEssentialsNuGetTest() var package = new[] { new PackageIdentity("Xamarin.Essentials", new NuGetVersion("1.1.0")) }; var frameworks = "MonoAndroid81".ToFrameworks(); - return CheckResultsAgainstTemplate(package, frameworks); + return IntegrationTestHelper.CheckResultsAgainstTemplate(package, frameworks); } /// @@ -64,30 +56,7 @@ public Task XamarinFormsNuGetTest() var package = new[] { new PackageIdentity("Xamarin.Forms", new NuGetVersion("4.0.0.482894")) }; var frameworks = "MonoAndroid81".ToFrameworks(); - return CheckResultsAgainstTemplate(package, frameworks); - } - - private static async Task CheckResultsAgainstTemplate(PackageIdentity[] package, IReadOnlyCollection frameworks) - { - using (var memoryStream = new MemoryStream()) - { - await ObservablesForEventGenerator.ExtractEventsFromNuGetPackages(memoryStream, package, frameworks).ConfigureAwait(false); - memoryStream.Flush(); - - memoryStream.Position = 0; - using (var sr = new StreamReader(memoryStream)) - { - var actualContents = sr.ReadToEnd(); - var expectedContents = File.ReadAllText($"TestExpectedResults/{package[0].Id}.{package[0].Version}.txt"); - - string normalizedActual = _whitespaceRegex.Replace(actualContents, string.Empty); - string normalizedExpected = _whitespaceRegex.Replace(expectedContents, string.Empty); - - normalizedActual.ShouldNotBeEmpty(); - - normalizedActual.ShouldBe(normalizedExpected, StringCompareShould.IgnoreLineEndings); - } - } + return IntegrationTestHelper.CheckResultsAgainstTemplate(package, frameworks); } } } diff --git a/src/Pharmacist.Tests/TestExpectedResults/Tizen.Net.API4.4.0.1.14152.txt b/src/Pharmacist.Tests/IntegrationTests/Tizen.NET.API4.4.0.1.14152.approved.txt similarity index 99% rename from src/Pharmacist.Tests/TestExpectedResults/Tizen.Net.API4.4.0.1.14152.txt rename to src/Pharmacist.Tests/IntegrationTests/Tizen.NET.API4.4.0.1.14152.approved.txt index 6eab7b5..758549a 100644 --- a/src/Pharmacist.Tests/TestExpectedResults/Tizen.Net.API4.4.0.1.14152.txt +++ b/src/Pharmacist.Tests/IntegrationTests/Tizen.NET.API4.4.0.1.14152.approved.txt @@ -1,4 +1,5 @@ -namespace ElmSharp + +namespace ElmSharp { /// /// A class that contains extension methods to wrap events for classes contained within the namespace. @@ -3593,7 +3594,7 @@ namespace Tizen.NUI /// /// Gets an observable which signals when the event triggers. /// - public global::System.IObservable Notified => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.PropertyNotification.NotifyEventArgs>(x => _data.Notified += x, x => _data.Notified -= x).Select(x => x.EventArgs); + public global::System.IObservable Notified => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.PropertyNotification.NotifyEventArgs>(x => _data.Notified += x, x => _data.Notified -= x).Select(x => x.EventArgs); } /// @@ -3614,7 +3615,7 @@ namespace Tizen.NUI /// /// Gets an observable which signals when the event triggers. /// - public global::System.IObservable SnapStarted => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.ScrollView.SnapStartedEventArgs>(x => _data.SnapStarted += x, x => _data.SnapStarted -= x).Select(x => x.EventArgs); + public global::System.IObservable SnapStarted => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.ScrollView.SnapStartedEventArgs>(x => _data.SnapStarted += x, x => _data.SnapStarted -= x).Select(x => x.EventArgs); } /// @@ -3831,15 +3832,15 @@ namespace Tizen.NUI.BaseComponents /// /// Gets an observable which signals when the event triggers. /// - public global::System.IObservable ScrollCompleted => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.BaseComponents.Scrollable.CompletedEventArgs>(x => _data.ScrollCompleted += x, x => _data.ScrollCompleted -= x).Select(x => x.EventArgs); + public global::System.IObservable ScrollCompleted => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.BaseComponents.Scrollable.CompletedEventArgs>(x => _data.ScrollCompleted += x, x => _data.ScrollCompleted -= x).Select(x => x.EventArgs); /// /// Gets an observable which signals when the event triggers. /// - public global::System.IObservable ScrollStarted => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.BaseComponents.Scrollable.StartedEventArgs>(x => _data.ScrollStarted += x, x => _data.ScrollStarted -= x).Select(x => x.EventArgs); + public global::System.IObservable ScrollStarted => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.BaseComponents.Scrollable.StartedEventArgs>(x => _data.ScrollStarted += x, x => _data.ScrollStarted -= x).Select(x => x.EventArgs); /// /// Gets an observable which signals when the event triggers. /// - public global::System.IObservable ScrollUpdated => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.BaseComponents.Scrollable.UpdatedEventArgs>(x => _data.ScrollUpdated += x, x => _data.ScrollUpdated -= x).Select(x => x.EventArgs); + public global::System.IObservable ScrollUpdated => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.NUI.BaseComponents.Scrollable.UpdatedEventArgs>(x => _data.ScrollUpdated += x, x => _data.ScrollUpdated -= x).Select(x => x.EventArgs); } /// @@ -5822,4 +5823,4 @@ namespace Tizen.Uix.VoiceControl /// public static global::System.IObservable VoiceControlClientStateChanged => global::System.Reactive.Linq.Observable.FromEventPattern, global::Tizen.Uix.VoiceControl.StateChangedEventArgs>(x => global::Tizen.Uix.VoiceControl.VoiceControlClient.StateChanged += x, x => global::Tizen.Uix.VoiceControl.VoiceControlClient.StateChanged -= x).Select(x => x.EventArgs); } -} +} \ No newline at end of file diff --git a/src/Pharmacist.Tests/TestExpectedResults/Xamarin.Essentials.1.1.0.txt b/src/Pharmacist.Tests/IntegrationTests/Xamarin.Essentials.1.1.0.approved.txt similarity index 99% rename from src/Pharmacist.Tests/TestExpectedResults/Xamarin.Essentials.1.1.0.txt rename to src/Pharmacist.Tests/IntegrationTests/Xamarin.Essentials.1.1.0.approved.txt index 70511af..4dc3ac8 100644 --- a/src/Pharmacist.Tests/TestExpectedResults/Xamarin.Essentials.1.1.0.txt +++ b/src/Pharmacist.Tests/IntegrationTests/Xamarin.Essentials.1.1.0.approved.txt @@ -1,4 +1,4 @@ -namespace Xamarin.Essentials +namespace Xamarin.Essentials { /// /// A class that contains extension methods to wrap events contained within static classes within the namespace. diff --git a/src/Pharmacist.Tests/TestExpectedResults/Xamarin.Forms.4.0.0.482894.txt b/src/Pharmacist.Tests/IntegrationTests/Xamarin.Forms.4.0.0.482894.approved.txt similarity index 99% rename from src/Pharmacist.Tests/TestExpectedResults/Xamarin.Forms.4.0.0.482894.txt rename to src/Pharmacist.Tests/IntegrationTests/Xamarin.Forms.4.0.0.482894.approved.txt index 5d1d732..78cdc53 100644 --- a/src/Pharmacist.Tests/TestExpectedResults/Xamarin.Forms.4.0.0.482894.txt +++ b/src/Pharmacist.Tests/IntegrationTests/Xamarin.Forms.4.0.0.482894.approved.txt @@ -1,4 +1,5 @@ -namespace Xamarin.Forms + +namespace Xamarin.Forms { /// /// A class that contains extension methods to wrap events for classes contained within the namespace. @@ -1765,11 +1766,11 @@ namespace Xamarin.Forms.Internals /// /// Gets an observable which signals when the event triggers. /// - public global::System.IObservable> ItemLongPressed => global::System.Reactive.Linq.Observable.FromEventPattern>, global::Xamarin.Forms.Internals.EventArg>(x => _data.ItemLongPressed += x, x => _data.ItemLongPressed -= x).Select(x => x.EventArgs); + public global::System.IObservable> ItemLongPressed => global::System.Reactive.Linq.Observable.FromEventPattern>, global::Xamarin.Forms.Internals.EventArg>(x => _data.ItemLongPressed += x, x => _data.ItemLongPressed -= x).Select(x => x.EventArgs); /// /// Gets an observable which signals when the event triggers. /// - public global::System.IObservable> ItemSelected => global::System.Reactive.Linq.Observable.FromEventPattern>, global::Xamarin.Forms.Internals.EventArg>(x => _data.ItemSelected += x, x => _data.ItemSelected -= x).Select(x => x.EventArgs); + public global::System.IObservable> ItemSelected => global::System.Reactive.Linq.Observable.FromEventPattern>, global::Xamarin.Forms.Internals.EventArg>(x => _data.ItemSelected += x, x => _data.ItemSelected -= x).Select(x => x.EventArgs); } /// @@ -2379,4 +2380,4 @@ namespace Xamarin.Forms /// public static global::System.IObservable FormsViewInitialized => global::System.Reactive.Linq.Observable.FromEventPattern, global::Xamarin.Forms.ViewInitializedEventArgs>(x => global::Xamarin.Forms.Forms.ViewInitialized += x, x => global::Xamarin.Forms.Forms.ViewInitialized -= x).Select(x => x.EventArgs); } -} +} \ No newline at end of file diff --git a/src/Pharmacist.Tests/LibraryRangeIntegrationTests.cs b/src/Pharmacist.Tests/LibraryRangeIntegrationTests.cs deleted file mode 100644 index 16edf88..0000000 --- a/src/Pharmacist.Tests/LibraryRangeIntegrationTests.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; - -using NuGet.Configuration; -using NuGet.Frameworks; -using NuGet.LibraryModel; -using NuGet.Packaging.Core; -using NuGet.Protocol.Core.Types; -using NuGet.Versioning; - -using Pharmacist.Core; -using Pharmacist.Core.NuGet; - -using Shouldly; - -using Xunit; - -namespace Pharmacist.Tests -{ - public class LibraryRangeIntegrationTests - { - private static readonly Regex _whitespaceRegex = new Regex(@"\s"); - - /// - /// Tests to make sure the Tizen platform produces the expected results. - /// - /// A task to monitor the progress. - [Fact] - public Task TizenNuGetTest() - { - var package = new[] { new LibraryRange("Tizen.NET.API4", VersionRange.Parse("4.0.1.*"), LibraryDependencyTarget.Package) }; - var frameworks = new[] { FrameworkConstants.CommonFrameworks.NetStandard20 }; - - return CheckResultsAgainstTemplate(package, frameworks); - } - - /// - /// Tests to make sure the Xamarin.Essentials platform produces the expected results. - /// - /// A task to monitor the progress. - [Fact] - public Task XamarinEssentialsNuGetTest() - { - var package = new[] { new LibraryRange("Xamarin.Essentials", VersionRange.Parse("1.1.*"), LibraryDependencyTarget.Package) }; - var frameworks = "MonoAndroid81".ToFrameworks(); - - return CheckResultsAgainstTemplate(package, frameworks); - } - - /// - /// Tests to make sure the Xamarin.Forms platform produces the expected results. - /// - /// A task to monitor the progress. - [Fact] - public Task XamarinFormsNuGetTest() - { - var package = new[] { new LibraryRange("Xamarin.Forms", VersionRange.Parse("4.0.0.*"), LibraryDependencyTarget.Package) }; - var frameworks = "MonoAndroid81".ToFrameworks(); - - return CheckResultsAgainstTemplate(package, frameworks); - } - - private static async Task CheckResultsAgainstTemplate(LibraryRange[] package, IReadOnlyCollection frameworks) - { - var bestPackageIdentity = await NuGetPackageHelper.GetBestMatch(package[0], new SourceRepository(new PackageSource(NuGetPackageHelper.DefaultNuGetSource), NuGetPackageHelper.Providers), CancellationToken.None).ConfigureAwait(false); - using (var memoryStream = new MemoryStream()) - { - await ObservablesForEventGenerator.ExtractEventsFromNuGetPackages(memoryStream, package, frameworks).ConfigureAwait(false); - memoryStream.Flush(); - - memoryStream.Position = 0; - using (var sr = new StreamReader(memoryStream)) - { - var actualContents = sr.ReadToEnd(); - var expectedContents = File.ReadAllText($"TestExpectedResults/{package[0].Name}.{bestPackageIdentity.Version}.txt"); - - string normalizedActual = _whitespaceRegex.Replace(actualContents, string.Empty); - string normalizedExpected = _whitespaceRegex.Replace(expectedContents, string.Empty); - - normalizedActual.ShouldNotBeEmpty(); - - normalizedActual.ShouldBe(normalizedExpected, StringCompareShould.IgnoreLineEndings); - } - } - } - } -} diff --git a/src/Pharmacist.Tests/Pharmacist.Tests.csproj b/src/Pharmacist.Tests/Pharmacist.Tests.csproj index 9949f8f..9072267 100644 --- a/src/Pharmacist.Tests/Pharmacist.Tests.csproj +++ b/src/Pharmacist.Tests/Pharmacist.Tests.csproj @@ -13,17 +13,12 @@ - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest + + + +