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