diff --git a/eng/Build.ps1 b/eng/Build.ps1 index 034ea1aaa6e..6e3d12f0e0a 100644 --- a/eng/Build.ps1 +++ b/eng/Build.ps1 @@ -46,6 +46,7 @@ param ( [switch]$warnAsError = $true, [switch][Alias('test')]$testDesktop, [switch]$testCoreClr, + [switch]$testFSharpCompiler, [switch]$testFSharpQA, [switch]$testFSharpCore, [switch]$testVs, @@ -77,6 +78,7 @@ function Print-Usage() { Write-Host " -testAll Run all tests" Write-Host " -testDesktop Run tests against full .NET Framework" Write-Host " -testCoreClr Run tests against CoreCLR" + Write-Host " -testFSharpCompiler Run F# Compiler unit tests" Write-Host " -testFSharpQA Run F# Cambridge tests" Write-Host " -testFSharpCore Run FSharpCore unit tests" Write-Host " -testVs Run F# editor unit tests" @@ -279,16 +281,16 @@ try { } if ($testFSharpCore) { - Write-Host "Environment Variables" - Get-Childitem Env: TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $desktopTargetFramework TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $coreclrTargetFramework } + if ($testFSharpCompiler) { + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $desktopTargetFramework + TestUsingNUnit -testProject "$RepoRoot\tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" -targetFramework $coreclrTargetFramework + } if ($testVs) { - Write-Host "Environment Variables" - Get-Childitem Env: TestUsingNUnit -testProject "$RepoRoot\vsintegration\tests\GetTypesVS.UnitTests\GetTypesVS.UnitTests.fsproj" -targetFramework $desktopTargetFramework TestUsingNUnit -testProject "$RepoRoot\vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" -targetFramework $desktopTargetFramework } diff --git a/src/fsharp/DotNetFrameworkDependencies.fs b/src/fsharp/DotNetFrameworkDependencies.fs index cf885f83164..504bde5fa37 100644 --- a/src/fsharp/DotNetFrameworkDependencies.fs +++ b/src/fsharp/DotNetFrameworkDependencies.fs @@ -38,21 +38,23 @@ module internal FSharp.Compiler.DotNetFrameworkDependencies // // Format: // ======= - // $(Major).$(Minor).$(Build) [-SomePrefix] + // $(Major).$(Minor).$(Build) [-SomeSuffix] // Major, Minor, Build collates normally - // Strings without -SomePrefix collate higher than SomePrefix, - // SomePrefix collates using normal alphanumeric rules + // Strings without -SomeSuffix collate higher than SomeSuffix, + // SomeSuffix collates using normal alphanumeric rules // let deconstructVersion (version:string) = - let getSuffix = + let version, suffix = let pos = version.IndexOf("-") - if pos >= 0 then version.Substring(pos + 1) else "" - let elements = version.Split('.') + if pos >= 0 then + version.Substring(0, pos), version.Substring(pos + 1) + else version, "" + let elements = version.Split('.') if elements.Length < 3 then - struct (0, 0, 0, getSuffix) + struct (0, 0, 0, suffix) else - struct (Int32.Parse(elements.[0]), Int32.Parse(elements.[1]), Int32.Parse(elements.[2]), getSuffix) + struct (Int32.Parse(elements.[0]), Int32.Parse(elements.[1]), Int32.Parse(elements.[2]), suffix) let versionCompare c1 c2 = if c1 = c2 then 0 @@ -60,17 +62,20 @@ module internal FSharp.Compiler.DotNetFrameworkDependencies try let struct (major1, minor1, build1, suffix1 ) = deconstructVersion c1 let struct (major2, minor2, build2, suffix2 ) = deconstructVersion c2 - - let v = major2 - major1 - if v = 0 then 0 + let v = major1 - major2 + if v <> 0 then v else - let v = minor2 - minor1 + let v = minor1 - minor2 if v <> 0 then v else - let v = build2 - build1 + let v = build1 - build2 if v <> 0 then v else - String.CompareOrdinal(suffix2, suffix1) + match String.IsNullOrEmpty(suffix1), String.IsNullOrEmpty(suffix2) with + | true, true -> 0 + | true, false -> 1 + | false, true -> -1 + | false, false -> String.Compare(suffix1, suffix2, StringComparison.InvariantCultureIgnoreCase) with _ -> 0 let executionTfm = diff --git a/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj b/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj index 7262d2fd895..b5b30d90671 100644 --- a/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj +++ b/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj @@ -17,6 +17,7 @@ + diff --git a/tests/FSharp.Compiler.UnitTests/VersionCompare.fs b/tests/FSharp.Compiler.UnitTests/VersionCompare.fs new file mode 100644 index 00000000000..f5d5f709b55 --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/VersionCompare.fs @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +namespace FSharp.Compiler.UnitTests + +open System +open System.Globalization +open System.Text +open NUnit.Framework +open FSharp.Compiler + +[] +module VersionCompare = + open FSharp.Compiler.DotNetFrameworkDependencies + + [] // 1.0.0 < 1.0.1 + [] // 1.0.0 = 1.0.0 + [] // 1.0.1 > 1.0.1 + [] // 0.0.9 < 1.0.0-Suffix1 + [] // 1.0.0 > 1.0.0-Suffix1 + [] // 1.0.0-Suffix1 < 1.0.0 + [] // 1.0.0-Suffix1 < 1.0.0-Suffix2 + [] // 1.0.0-Suffix2 > 1.0.0-Suffix1 + [] // 1.0.0-Suffix1 > 1.0.0-Suffix2 + [] // 1.0.1 > 1.0.0-Suffix1 + [] // 1.0.0-Suffix1 < 1.0.1 + let VersionCompareTest (str1: string, str2: string) : int = + versionCompare str1 str2 + + + [] + [] + let VersionCompareSortArrayHighestPreview _: string = + let versions = [| + "1.0.0-preview4-20000-01" + "3.0.0-preview4-27610-06" + "1.0.0-preview4-20000-02" + "3.0.0-preview4-27610-05" + "3.0.0-preview4-27609-10" + |] + versions |> Array.sortWith (versionCompare) |> Array.last + + [] + [] + let VersionCompareSortArrayHighestRelease _: string = + let versions = [| + "1.0.0-preview4-20000-01" + "3.0.0" + "3.0.0-preview4-27610-06" + "1.0.0-preview4-20000-02" + "3.0.0-preview4-27610-05" + "3.0.0-preview4-27609-10" + |] + versions |> Array.sortWith (versionCompare) |> Array.last + + [] + [] + let VersionCompareSortArrayEvenHighestRelease _: string = + let versions = [| + "3.0.1" + "1.0.0-preview4-20000-01" + "3.0.0" + "3.0.0-preview4-27610-06" + "1.0.0-preview4-20000-02" + "3.0.0-preview4-27610-05" + "3.0.0-preview4-27609-10" + |] + versions |> Array.sortWith (versionCompare) |> Array.last