From d7ead85166b721d75f46eb9bad8e6076657d873f Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Wed, 5 Aug 2020 15:04:52 +0200 Subject: [PATCH 01/13] add Is$OsName methods to OperatingSystem class --- .../src/System/OperatingSystem.cs | 77 ++++++++++++ .../tests/System/OperatingSystemTests.cs | 112 ++++++++++++++++++ .../System.Runtime/ref/System.Runtime.cs | 9 ++ 3 files changed, 198 insertions(+) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 718f67cc9096f5..bbf54e2891e568 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -79,5 +79,82 @@ public string VersionString return _versionString; } } + + public static bool IsBrowser() => +#if TARGET_BROWSER + true; +#else + false; +#endif + + public static bool IsLinux() => +#if TARGET_LINUX + true; +#else + false; +#endif + + public static bool IsFreeBSD() => +#if TARGET_FREEBSD + true; +#else + false; +#endif + + //public static bool IsFreeBSDVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + + public static bool IsAndroid() => +#if TARGET_ANDROID + true; +#else + false; +#endif + + //public static bool IsAndroidVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + + public static bool IsIOS() => +#if TARGET_IOS + true; +#else + false; +#endif + + //public static bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + + public static bool IsMacOS() => +#if TARGET_OSX + true; +#else + false; +#endif + + //public static bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + + public static bool IsTvOS() => +#if TARGET_TVOS + true; +#else + false; +#endif + + //public static bool IsTvOSVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + + public static bool IsWatchOS() => +#if TARGET_WATCHOS + true; +#else + false; +#endif + + //public static bool IsWatchOSVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + + public static bool IsWindows() => +#if TARGET_WINDOWS + true; +#else + false; +#endif + + //public static bool IsWindowsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); } } diff --git a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs index b6e7005d62f3b3..8e56d0f88134b2 100644 --- a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs @@ -47,5 +47,117 @@ public static void Clone() Assert.Equal(os.Version, os2.Version); Assert.Equal(os.VersionString, os2.VersionString); } + + [Fact, PlatformSpecific(TestPlatforms.Browser)] + public static void CheckBrowser() + { + Assert.True(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsWindows()); + } + + [Fact, PlatformSpecific(TestPlatforms.Linux)] + public static void CheckLinux() + { + Assert.False(OperatingSystem.IsBrowser()); + Assert.True(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsWindows()); + } + + [Fact, PlatformSpecific(TestPlatforms.FreeBSD)] + public static void CheckFreeBSD() + { + Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsLinux()); + Assert.True(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsWindows()); + } + + [Fact, PlatformSpecific(TestPlatforms.Android)] + public static void CheckAndroid() + { + Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsFreeBSD()); + Assert.True(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsWindows()); + } + + [Fact, PlatformSpecific(TestPlatforms.iOS)] + public static void CheckIOS() + { + Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsWindows()); + } + + [Fact, PlatformSpecific(TestPlatforms.OSX)] + public static void CheckMacOS() + { + Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsIOS()); + Assert.True(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsWindows()); + } + + [Fact, PlatformSpecific(TestPlatforms.tvOS)] + public static void CheckTvOS() + { + Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsMacOS()); + Assert.True(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsWindows()); + } + + [Fact, PlatformSpecific(TestPlatforms.Windows)] + public static void CheckWindows() + { + Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsWatchOS()); + Assert.True(OperatingSystem.IsWindows()); + } } } diff --git a/src/libraries/System.Runtime/ref/System.Runtime.cs b/src/libraries/System.Runtime/ref/System.Runtime.cs index da360cbad7cde7..70af2832a28324 100644 --- a/src/libraries/System.Runtime/ref/System.Runtime.cs +++ b/src/libraries/System.Runtime/ref/System.Runtime.cs @@ -3044,6 +3044,15 @@ public OperatingSystem(System.PlatformID platform, System.Version version) { } public object Clone() { throw null; } public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { } public override string ToString() { throw null; } + public static bool IsBrowser() { throw null; } + public static bool IsLinux() { throw null; } + public static bool IsFreeBSD() { throw null; } + public static bool IsAndroid() { throw null; } + public static bool IsIOS() { throw null; } + public static bool IsMacOS() { throw null; } + public static bool IsTvOS() { throw null; } + public static bool IsWatchOS() { throw null; } + public static bool IsWindows() { throw null; } } public partial class OperationCanceledException : System.SystemException { From 0a12f2da884fb3d70286c31048d1c0e2798b144e Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Wed, 5 Aug 2020 16:17:53 +0200 Subject: [PATCH 02/13] add OperatingSystem.*VersionAtLeast methods --- .../src/System/OperatingSystem.cs | 43 +++++++-- .../tests/System/OperatingSystemTests.cs | 96 +++++++++++++++++++ .../System.Runtime/ref/System.Runtime.cs | 7 ++ 3 files changed, 139 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index bbf54e2891e568..85f79eb00e4653 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -8,6 +8,8 @@ namespace System { public sealed class OperatingSystem : ISerializable, ICloneable { + private const int OSXRevisionNumber = -1; // it is unavailable on OSX and Environment.OSVersion.Version.Revision returns -1 + private readonly Version _version; private readonly PlatformID _platform; private readonly string? _servicePack; @@ -101,7 +103,8 @@ public static bool IsFreeBSD() => false; #endif - //public static bool IsFreeBSDVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + public static bool IsFreeBSDVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) + => IsFreeBSD() && IsOSVersionAtLeast(major, minor, build, revision); public static bool IsAndroid() => #if TARGET_ANDROID @@ -110,7 +113,8 @@ public static bool IsAndroid() => false; #endif - //public static bool IsAndroidVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + public static bool IsAndroidVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) + => IsAndroid() && IsOSVersionAtLeast(major, minor, build, revision); public static bool IsIOS() => #if TARGET_IOS @@ -119,7 +123,8 @@ public static bool IsIOS() => false; #endif - //public static bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + public static bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0) + => IsIOS() && IsOSVersionAtLeast(major, minor, build, OSXRevisionNumber); public static bool IsMacOS() => #if TARGET_OSX @@ -128,7 +133,8 @@ public static bool IsMacOS() => false; #endif - //public static bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + public static bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0) + => IsMacOS() && IsOSVersionAtLeast(major, minor, build, OSXRevisionNumber); public static bool IsTvOS() => #if TARGET_TVOS @@ -137,7 +143,8 @@ public static bool IsTvOS() => false; #endif - //public static bool IsTvOSVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + public static bool IsTvOSVersionAtLeast(int major, int minor = 0, int build = 0) + => IsTvOS() && IsOSVersionAtLeast(major, minor, build, OSXRevisionNumber); public static bool IsWatchOS() => #if TARGET_WATCHOS @@ -146,7 +153,8 @@ public static bool IsWatchOS() => false; #endif - //public static bool IsWatchOSVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + public static bool IsWatchOSVersionAtLeast(int major, int minor = 0, int build = 0) + => IsWatchOS() && IsOSVersionAtLeast(major, minor, build, OSXRevisionNumber); public static bool IsWindows() => #if TARGET_WINDOWS @@ -155,6 +163,27 @@ public static bool IsWindows() => false; #endif - //public static bool IsWindowsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0); + public static bool IsWindowsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) + => IsWindows() && IsOSVersionAtLeast(major, minor, build, revision); + + private static bool IsOSVersionAtLeast(int major, int minor, int build, int revision) + { + Version current = Environment.OSVersion.Version; + + if (current.Major != major) + { + return current.Major > major; + } + if (current.Minor != minor) + { + return current.Minor > minor; + } + if (current.Build != build) + { + return current.Build > build; + } + + return current.Revision >= revision; + } } } diff --git a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs index 8e56d0f88134b2..fb1afbd2bdd1a9 100644 --- a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs @@ -60,6 +60,14 @@ public static void CheckBrowser() Assert.False(OperatingSystem.IsTvOS()); Assert.False(OperatingSystem.IsWatchOS()); Assert.False(OperatingSystem.IsWindows()); + + AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); } [Fact, PlatformSpecific(TestPlatforms.Linux)] @@ -74,6 +82,14 @@ public static void CheckLinux() Assert.False(OperatingSystem.IsTvOS()); Assert.False(OperatingSystem.IsWatchOS()); Assert.False(OperatingSystem.IsWindows()); + + AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); } [Fact, PlatformSpecific(TestPlatforms.FreeBSD)] @@ -88,6 +104,14 @@ public static void CheckFreeBSD() Assert.False(OperatingSystem.IsTvOS()); Assert.False(OperatingSystem.IsWatchOS()); Assert.False(OperatingSystem.IsWindows()); + + AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, true); + AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); } [Fact, PlatformSpecific(TestPlatforms.Android)] @@ -102,6 +126,14 @@ public static void CheckAndroid() Assert.False(OperatingSystem.IsTvOS()); Assert.False(OperatingSystem.IsWatchOS()); Assert.False(OperatingSystem.IsWindows()); + + AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, true); + AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); } [Fact, PlatformSpecific(TestPlatforms.iOS)] @@ -116,6 +148,14 @@ public static void CheckIOS() Assert.False(OperatingSystem.IsTvOS()); Assert.False(OperatingSystem.IsWatchOS()); Assert.False(OperatingSystem.IsWindows()); + + AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, true); + AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); } [Fact, PlatformSpecific(TestPlatforms.OSX)] @@ -130,6 +170,14 @@ public static void CheckMacOS() Assert.False(OperatingSystem.IsTvOS()); Assert.False(OperatingSystem.IsWatchOS()); Assert.False(OperatingSystem.IsWindows()); + + AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, true); + AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); } [Fact, PlatformSpecific(TestPlatforms.tvOS)] @@ -144,6 +192,14 @@ public static void CheckTvOS() Assert.True(OperatingSystem.IsTvOS()); Assert.False(OperatingSystem.IsWatchOS()); Assert.False(OperatingSystem.IsWindows()); + + AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, true); + AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); } [Fact, PlatformSpecific(TestPlatforms.Windows)] @@ -158,6 +214,46 @@ public static void CheckWindows() Assert.False(OperatingSystem.IsTvOS()); Assert.False(OperatingSystem.IsWatchOS()); Assert.True(OperatingSystem.IsWindows()); + + AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, true); + } + + private static void AssertVersionChecks(Func isOSVersionAtLeast, bool isCurrentOS) + { + Version current = Environment.OSVersion.Version; + + Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor, current.Build, current.Revision)); + Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1, current.Build, current.Revision)); + Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build + 1, current.Revision)); + Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build, current.Revision + 1)); + + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build, current.Revision)); + + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major - 1, current.Minor, current.Build, current.Revision)); + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor - 1, current.Build, current.Revision)); + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build - 1, current.Revision)); + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build, current.Revision - 1)); + } + + private static void AssertVersionChecks(Func isOSVersionAtLeast, bool isCurrentOS) + { + Version current = Environment.OSVersion.Version; + + Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor, current.Build)); + Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1, current.Build)); + Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build + 1)); + + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build)); + + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major - 1, current.Minor, current.Build)); + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor - 1, current.Build)); + Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build - 1)); } } } diff --git a/src/libraries/System.Runtime/ref/System.Runtime.cs b/src/libraries/System.Runtime/ref/System.Runtime.cs index 70af2832a28324..a1a0a092ef5be6 100644 --- a/src/libraries/System.Runtime/ref/System.Runtime.cs +++ b/src/libraries/System.Runtime/ref/System.Runtime.cs @@ -3047,12 +3047,19 @@ public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, S public static bool IsBrowser() { throw null; } public static bool IsLinux() { throw null; } public static bool IsFreeBSD() { throw null; } + public static bool IsFreeBSDVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) { throw null; } public static bool IsAndroid() { throw null; } + public static bool IsAndroidVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) { throw null; } public static bool IsIOS() { throw null; } + public static bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0) { throw null; } public static bool IsMacOS() { throw null; } + public static bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0) { throw null; } public static bool IsTvOS() { throw null; } + public static bool IsTvOSVersionAtLeast(int major, int minor = 0, int build = 0) { throw null; } public static bool IsWatchOS() { throw null; } + public static bool IsWatchOSVersionAtLeast(int major, int minor = 0, int build = 0) { throw null; } public static bool IsWindows() { throw null; } + public static bool IsWindowsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) { throw null; } } public partial class OperationCanceledException : System.SystemException { From f45e9795b2d8a5fa841569c1d6a07d43fd0505c8 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 12:15:11 +0200 Subject: [PATCH 03/13] add IsOSPlatform and IsOSPlatformVersionAtLeast --- .../src/System/OperatingSystem.cs | 42 ++- .../tests/System/OperatingSystemTests.cs | 264 ++++++++++++++++++ .../System.Runtime/ref/System.Runtime.cs | 2 + 3 files changed, 302 insertions(+), 6 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 85f79eb00e4653..2d234e900a9471 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -8,7 +8,9 @@ namespace System { public sealed class OperatingSystem : ISerializable, ICloneable { - private const int OSXRevisionNumber = -1; // it is unavailable on OSX and Environment.OSVersion.Version.Revision returns -1 +#if TARGET_UNIX && !TARGET_OSX + private static string? s_osPlatformName; +#endif private readonly Version _version; private readonly PlatformID _platform; @@ -82,6 +84,33 @@ public string VersionString } } + public static bool IsOSPlatform(string platform) + { + if (platform == null) + { + throw new ArgumentNullException(nameof(platform)); + } + if (platform.Length == 0) + { + throw new ArgumentException(SR.Arg_EmptyOrNullString, nameof(platform)); + } + +#if TARGET_BROWSER + return platform.Equals("BROWSER", StringComparison.OrdinalIgnoreCase); +#elif TARGET_WINDOWS + return platform.Equals("WINDOWS", StringComparison.OrdinalIgnoreCase); +#elif TARGET_OSX + return platform.Equals("OSX", StringComparison.OrdinalIgnoreCase) || platform.Equals("MACOS", StringComparison.OrdinalIgnoreCase); +#elif TARGET_UNIX + return platform.Equals(s_osPlatformName ??= Interop.Sys.GetUnixName(), StringComparison.OrdinalIgnoreCase); +#else +#error Unknown OS +#endif + } + + public static bool IsOSPlatformVersionAtLeast(string platform, int major, int minor = 0, int build = 0, int revision = 0) + => IsOSPlatform(platform) && IsOSVersionAtLeast(major, minor, build, revision); + public static bool IsBrowser() => #if TARGET_BROWSER true; @@ -124,7 +153,7 @@ public static bool IsIOS() => #endif public static bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0) - => IsIOS() && IsOSVersionAtLeast(major, minor, build, OSXRevisionNumber); + => IsIOS() && IsOSVersionAtLeast(major, minor, build, 0); public static bool IsMacOS() => #if TARGET_OSX @@ -134,7 +163,7 @@ public static bool IsMacOS() => #endif public static bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0) - => IsMacOS() && IsOSVersionAtLeast(major, minor, build, OSXRevisionNumber); + => IsMacOS() && IsOSVersionAtLeast(major, minor, build, 0); public static bool IsTvOS() => #if TARGET_TVOS @@ -144,7 +173,7 @@ public static bool IsTvOS() => #endif public static bool IsTvOSVersionAtLeast(int major, int minor = 0, int build = 0) - => IsTvOS() && IsOSVersionAtLeast(major, minor, build, OSXRevisionNumber); + => IsTvOS() && IsOSVersionAtLeast(major, minor, build, 0); public static bool IsWatchOS() => #if TARGET_WATCHOS @@ -154,7 +183,7 @@ public static bool IsWatchOS() => #endif public static bool IsWatchOSVersionAtLeast(int major, int minor = 0, int build = 0) - => IsWatchOS() && IsOSVersionAtLeast(major, minor, build, OSXRevisionNumber); + => IsWatchOS() && IsOSVersionAtLeast(major, minor, build, 0); public static bool IsWindows() => #if TARGET_WINDOWS @@ -183,7 +212,8 @@ private static bool IsOSVersionAtLeast(int major, int minor, int build, int revi return current.Build > build; } - return current.Revision >= revision; + return current.Revision >= revision + || (current.Revision == -1 && revision == 0); // it is unavailable on OSX and Environment.OSVersion.Version.Revision returns -1 } } } diff --git a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs index fb1afbd2bdd1a9..bcdf9b45d59772 100644 --- a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs @@ -52,176 +52,440 @@ public static void Clone() public static void CheckBrowser() { Assert.True(OperatingSystem.IsBrowser()); + Assert.True(OperatingSystem.IsOSPlatform("BROWSER")); + Assert.True(OperatingSystem.IsOSPlatform("browser")); Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsOSPlatform("LINUX")); + Assert.False(OperatingSystem.IsOSPlatform("linux")); Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); + Assert.False(OperatingSystem.IsOSPlatform("freebsd")); Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); + Assert.False(OperatingSystem.IsOSPlatform("android")); Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsOSPlatform("IOS")); + Assert.False(OperatingSystem.IsOSPlatform("iOS")); + Assert.False(OperatingSystem.IsOSPlatform("ios")); Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsOSPlatform("MACOS")); + Assert.False(OperatingSystem.IsOSPlatform("macOS")); + Assert.False(OperatingSystem.IsOSPlatform("macos")); Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsOSPlatform("TVOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvos")); Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchios")); Assert.False(OperatingSystem.IsWindows()); + Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); + Assert.False(OperatingSystem.IsOSPlatform("windows")); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); } [Fact, PlatformSpecific(TestPlatforms.Linux)] public static void CheckLinux() { Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); + Assert.False(OperatingSystem.IsOSPlatform("browser")); Assert.True(OperatingSystem.IsLinux()); + Assert.True(OperatingSystem.IsOSPlatform("LINUX")); + Assert.True(OperatingSystem.IsOSPlatform("linux")); Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); + Assert.False(OperatingSystem.IsOSPlatform("freebsd")); Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); + Assert.False(OperatingSystem.IsOSPlatform("android")); Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsOSPlatform("IOS")); + Assert.False(OperatingSystem.IsOSPlatform("iOS")); + Assert.False(OperatingSystem.IsOSPlatform("ios")); Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsOSPlatform("MACOS")); + Assert.False(OperatingSystem.IsOSPlatform("macOS")); + Assert.False(OperatingSystem.IsOSPlatform("macos")); Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsOSPlatform("TVOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvos")); Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchios")); Assert.False(OperatingSystem.IsWindows()); + Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); + Assert.False(OperatingSystem.IsOSPlatform("windows")); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), true); AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); } [Fact, PlatformSpecific(TestPlatforms.FreeBSD)] public static void CheckFreeBSD() { Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); + Assert.False(OperatingSystem.IsOSPlatform("browser")); Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsOSPlatform("LINUX")); + Assert.False(OperatingSystem.IsOSPlatform("linux")); Assert.True(OperatingSystem.IsFreeBSD()); + Assert.True(OperatingSystem.IsOSPlatform("FREEBSD")); + Assert.True(OperatingSystem.IsOSPlatform("freebsd")); Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); + Assert.False(OperatingSystem.IsOSPlatform("android")); Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsOSPlatform("IOS")); + Assert.False(OperatingSystem.IsOSPlatform("iOS")); + Assert.False(OperatingSystem.IsOSPlatform("ios")); Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsOSPlatform("MACOS")); + Assert.False(OperatingSystem.IsOSPlatform("macOS")); + Assert.False(OperatingSystem.IsOSPlatform("macos")); Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsOSPlatform("TVOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvos")); Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchios")); Assert.False(OperatingSystem.IsWindows()); + Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); + Assert.False(OperatingSystem.IsOSPlatform("windows")); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), true); AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); } [Fact, PlatformSpecific(TestPlatforms.Android)] public static void CheckAndroid() { Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); + Assert.False(OperatingSystem.IsOSPlatform("browser")); Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsOSPlatform("LINUX")); + Assert.False(OperatingSystem.IsOSPlatform("linux")); Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); + Assert.False(OperatingSystem.IsOSPlatform("freebsd")); Assert.True(OperatingSystem.IsAndroid()); + Assert.True(OperatingSystem.IsOSPlatform("ANDROID")); + Assert.True(OperatingSystem.IsOSPlatform("android")); Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsOSPlatform("IOS")); + Assert.False(OperatingSystem.IsOSPlatform("iOS")); + Assert.False(OperatingSystem.IsOSPlatform("ios")); Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsOSPlatform("MACOS")); + Assert.False(OperatingSystem.IsOSPlatform("macOS")); + Assert.False(OperatingSystem.IsOSPlatform("macos")); Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsOSPlatform("TVOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvos")); Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchios")); Assert.False(OperatingSystem.IsWindows()); + Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); + Assert.False(OperatingSystem.IsOSPlatform("windows")); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), true); AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); } [Fact, PlatformSpecific(TestPlatforms.iOS)] public static void CheckIOS() { Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); + Assert.False(OperatingSystem.IsOSPlatform("browser")); Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsOSPlatform("LINUX")); + Assert.False(OperatingSystem.IsOSPlatform("linux")); Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); + Assert.False(OperatingSystem.IsOSPlatform("freebsd")); Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); + Assert.False(OperatingSystem.IsOSPlatform("android")); Assert.False(OperatingSystem.IsIOS()); + Assert.True(OperatingSystem.IsOSPlatform("IOS")); + Assert.True(OperatingSystem.IsOSPlatform("iOS")); + Assert.True(OperatingSystem.IsOSPlatform("ios")); Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsOSPlatform("MACOS")); + Assert.False(OperatingSystem.IsOSPlatform("macOS")); + Assert.False(OperatingSystem.IsOSPlatform("macos")); Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsOSPlatform("TVOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvos")); Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchios")); Assert.False(OperatingSystem.IsWindows()); + Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); + Assert.False(OperatingSystem.IsOSPlatform("windows")); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("iOS", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build), true); + AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("iOS", major, minor, build), true); AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); } [Fact, PlatformSpecific(TestPlatforms.OSX)] public static void CheckMacOS() { Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); + Assert.False(OperatingSystem.IsOSPlatform("browser")); Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsOSPlatform("LINUX")); + Assert.False(OperatingSystem.IsOSPlatform("linux")); Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); + Assert.False(OperatingSystem.IsOSPlatform("freebsd")); Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); + Assert.False(OperatingSystem.IsOSPlatform("android")); Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsOSPlatform("IOS")); + Assert.False(OperatingSystem.IsOSPlatform("iOS")); + Assert.False(OperatingSystem.IsOSPlatform("ios")); Assert.True(OperatingSystem.IsMacOS()); + Assert.True(OperatingSystem.IsOSPlatform("MACOS")); // both MACOS and OSX are supported + Assert.True(OperatingSystem.IsOSPlatform("macOS")); + Assert.True(OperatingSystem.IsOSPlatform("macos")); + Assert.True(OperatingSystem.IsOSPlatform("OSX")); + Assert.True(OperatingSystem.IsOSPlatform("osx")); Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsOSPlatform("TVOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvos")); Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchios")); Assert.False(OperatingSystem.IsWindows()); + Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); + Assert.False(OperatingSystem.IsOSPlatform("windows")); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("macOS", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("OSX", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("osx", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build), true); + AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("macOS", major, minor, build), true); + AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("OSX", major, minor, build), true); + AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("osx", major, minor, build), true); AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); } [Fact, PlatformSpecific(TestPlatforms.tvOS)] public static void CheckTvOS() { Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); + Assert.False(OperatingSystem.IsOSPlatform("browser")); Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsOSPlatform("LINUX")); + Assert.False(OperatingSystem.IsOSPlatform("linux")); Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); + Assert.False(OperatingSystem.IsOSPlatform("freebsd")); Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); + Assert.False(OperatingSystem.IsOSPlatform("android")); Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsOSPlatform("IOS")); + Assert.False(OperatingSystem.IsOSPlatform("iOS")); + Assert.False(OperatingSystem.IsOSPlatform("ios")); Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsOSPlatform("MACOS")); + Assert.False(OperatingSystem.IsOSPlatform("macOS")); + Assert.False(OperatingSystem.IsOSPlatform("macos")); Assert.True(OperatingSystem.IsTvOS()); + Assert.True(OperatingSystem.IsOSPlatform("TVOS")); + Assert.True(OperatingSystem.IsOSPlatform("tvOS")); + Assert.True(OperatingSystem.IsOSPlatform("tvos")); Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchios")); Assert.False(OperatingSystem.IsWindows()); + Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); + Assert.False(OperatingSystem.IsOSPlatform("windows")); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("tvOS", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build), true); + AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("tvOS", major, minor, build), true); AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); } [Fact, PlatformSpecific(TestPlatforms.Windows)] public static void CheckWindows() { Assert.False(OperatingSystem.IsBrowser()); + Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); + Assert.False(OperatingSystem.IsOSPlatform("browser")); Assert.False(OperatingSystem.IsLinux()); + Assert.False(OperatingSystem.IsOSPlatform("LINUX")); + Assert.False(OperatingSystem.IsOSPlatform("linux")); Assert.False(OperatingSystem.IsFreeBSD()); + Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); + Assert.False(OperatingSystem.IsOSPlatform("freebsd")); Assert.False(OperatingSystem.IsAndroid()); + Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); + Assert.False(OperatingSystem.IsOSPlatform("android")); Assert.False(OperatingSystem.IsIOS()); + Assert.False(OperatingSystem.IsOSPlatform("IOS")); + Assert.False(OperatingSystem.IsOSPlatform("iOS")); + Assert.False(OperatingSystem.IsOSPlatform("ios")); Assert.False(OperatingSystem.IsMacOS()); + Assert.False(OperatingSystem.IsOSPlatform("MACOS")); + Assert.False(OperatingSystem.IsOSPlatform("macOS")); + Assert.False(OperatingSystem.IsOSPlatform("macos")); Assert.False(OperatingSystem.IsTvOS()); + Assert.False(OperatingSystem.IsOSPlatform("TVOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvOS")); + Assert.False(OperatingSystem.IsOSPlatform("tvos")); Assert.False(OperatingSystem.IsWatchOS()); + Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchOS")); + Assert.False(OperatingSystem.IsOSPlatform("watchios")); Assert.True(OperatingSystem.IsWindows()); + Assert.True(OperatingSystem.IsOSPlatform("WINDOWS")); + Assert.True(OperatingSystem.IsOSPlatform("windows")); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), true); + AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("windows", major, minor, build, revision), true); } private static void AssertVersionChecks(Func isOSVersionAtLeast, bool isCurrentOS) diff --git a/src/libraries/System.Runtime/ref/System.Runtime.cs b/src/libraries/System.Runtime/ref/System.Runtime.cs index a1a0a092ef5be6..aaaf4da863d939 100644 --- a/src/libraries/System.Runtime/ref/System.Runtime.cs +++ b/src/libraries/System.Runtime/ref/System.Runtime.cs @@ -3044,6 +3044,8 @@ public OperatingSystem(System.PlatformID platform, System.Version version) { } public object Clone() { throw null; } public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { } public override string ToString() { throw null; } + public static bool IsOSPlatform(string platform) { throw null; } + public static bool IsOSPlatformVersionAtLeast(string platform, int major, int minor = 0, int build = 0, int revision = 0) { throw null; } public static bool IsBrowser() { throw null; } public static bool IsLinux() { throw null; } public static bool IsFreeBSD() { throw null; } From 0123a612eb737fcfe92fb95e0583883a3adc1a47 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 13:50:05 +0200 Subject: [PATCH 04/13] add xml comments --- .../src/System/OperatingSystem.cs | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 2d234e900a9471..ef55d1a35a39b9 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -84,6 +84,10 @@ public string VersionString } } + /// + /// Indicates whether the current application is running on the specified platform. + /// + /// Case-insensitive platform name. Examples: Browser, Linux, FreeBSD, Android, iOS, macOS, tvOS, watchOS, Windows. public static bool IsOSPlatform(string platform) { if (platform == null) @@ -108,9 +112,16 @@ public static bool IsOSPlatform(string platform) #endif } + /// + /// Check for the OS with a >= version comparison. Used to guard APIs that were added in the given OS release. + /// + /// Case-insensitive platform name. Examples: Browser, Linux, FreeBSD, Android, iOS, macOS, tvOS, watchOS, Windows. public static bool IsOSPlatformVersionAtLeast(string platform, int major, int minor = 0, int build = 0, int revision = 0) => IsOSPlatform(platform) && IsOSVersionAtLeast(major, minor, build, revision); + /// + /// Indicates whether the current application is running as WASM in a Browser. + /// public static bool IsBrowser() => #if TARGET_BROWSER true; @@ -118,6 +129,9 @@ public static bool IsBrowser() => false; #endif + /// + /// Indicates whether the current application is running on Linux. + /// public static bool IsLinux() => #if TARGET_LINUX true; @@ -125,6 +139,9 @@ public static bool IsLinux() => false; #endif + /// + /// Indicates whether the current application is running on FreeBSD. + /// public static bool IsFreeBSD() => #if TARGET_FREEBSD true; @@ -132,9 +149,15 @@ public static bool IsFreeBSD() => false; #endif + /// + /// Check for the FreeBSD version (returned by 'uname') with a >= version comparison. Used to guard APIs that were added in the given FreeBSD release. + /// public static bool IsFreeBSDVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) => IsFreeBSD() && IsOSVersionAtLeast(major, minor, build, revision); + /// + /// Indicates whether the current application is running on Android. + /// public static bool IsAndroid() => #if TARGET_ANDROID true; @@ -142,9 +165,15 @@ public static bool IsAndroid() => false; #endif + /// + /// Check for the Android version (returned by 'uname') with a >= version comparison. Used to guard APIs that were added in the given Android release. + /// public static bool IsAndroidVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) => IsAndroid() && IsOSVersionAtLeast(major, minor, build, revision); + /// + /// Indicates whether the current application is running on iOS. + /// public static bool IsIOS() => #if TARGET_IOS true; @@ -152,9 +181,15 @@ public static bool IsIOS() => false; #endif + /// + /// Check for the iOS version (returned by 'libobjc.get_operatingSystemVersion') with a >= version comparison. Used to guard APIs that were added in the given iOS release. + /// public static bool IsIOSVersionAtLeast(int major, int minor = 0, int build = 0) => IsIOS() && IsOSVersionAtLeast(major, minor, build, 0); + /// + /// Indicates whether the current application is running on macOS. + /// public static bool IsMacOS() => #if TARGET_OSX true; @@ -162,9 +197,15 @@ public static bool IsMacOS() => false; #endif + /// + /// Check for the macOS version (returned by 'libobjc.get_operatingSystemVersion') with a >= version comparison. Used to guard APIs that were added in the given macOS release. + /// public static bool IsMacOSVersionAtLeast(int major, int minor = 0, int build = 0) => IsMacOS() && IsOSVersionAtLeast(major, minor, build, 0); + /// + /// Indicates whether the current application is running on tvOS. + /// public static bool IsTvOS() => #if TARGET_TVOS true; @@ -172,9 +213,15 @@ public static bool IsTvOS() => false; #endif + /// + /// Check for the tvOS version (returned by 'libobjc.get_operatingSystemVersion') with a >= version comparison. Used to guard APIs that were added in the given tvOS release. + /// public static bool IsTvOSVersionAtLeast(int major, int minor = 0, int build = 0) => IsTvOS() && IsOSVersionAtLeast(major, minor, build, 0); + /// + /// Indicates whether the current application is running on watchOS. + /// public static bool IsWatchOS() => #if TARGET_WATCHOS true; @@ -182,9 +229,15 @@ public static bool IsWatchOS() => false; #endif + /// + /// Check for the watchOS version (returned by 'libobjc.get_operatingSystemVersion') with a >= version comparison. Used to guard APIs that were added in the given watchOS release. + /// public static bool IsWatchOSVersionAtLeast(int major, int minor = 0, int build = 0) => IsWatchOS() && IsOSVersionAtLeast(major, minor, build, 0); + /// + /// Indicates whether the current application is running on Windows. + /// public static bool IsWindows() => #if TARGET_WINDOWS true; @@ -192,6 +245,9 @@ public static bool IsWindows() => false; #endif + /// + /// Check for the Windows version (returned by 'RtlGetVersion') with a >= version comparison. Used to guard APIs that were added in the given Windows release. + /// public static bool IsWindowsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0) => IsWindows() && IsOSVersionAtLeast(major, minor, build, revision); From 8cd8fdebae8d7055e1c45f354873452286e7a81a Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 14:05:51 +0200 Subject: [PATCH 05/13] use throw helpers & add tests that assert thrown exceptions --- .../src/System/OperatingSystem.cs | 4 ++-- .../src/System/ThrowHelper.cs | 6 ++++++ .../tests/System/OperatingSystemTests.cs | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index ef55d1a35a39b9..cb016539355172 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -92,11 +92,11 @@ public static bool IsOSPlatform(string platform) { if (platform == null) { - throw new ArgumentNullException(nameof(platform)); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.platform); } if (platform.Length == 0) { - throw new ArgumentException(SR.Arg_EmptyOrNullString, nameof(platform)); + ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_EmptyOrNullString, ExceptionArgument.platform); } #if TARGET_BROWSER diff --git a/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs b/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs index b88eaa4d93738c..06a527a7fd1f31 100644 --- a/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs +++ b/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs @@ -699,6 +699,8 @@ private static string GetArgumentName(ExceptionArgument argument) return "prefix"; case ExceptionArgument.suffix: return "suffix"; + case ExceptionArgument.platform: + return "platform"; default: Debug.Fail("The enum value is not defined, please check the ExceptionArgument Enum."); return ""; @@ -855,6 +857,8 @@ private static string GetResourceString(ExceptionResource resource) return SR.Argument_SpansMustHaveSameLength; case ExceptionResource.Argument_InvalidFlag: return SR.Argument_InvalidFlag; + case ExceptionResource.Argument_EmptyOrNullString: + return SR.Arg_EmptyOrNullString; default: Debug.Fail("The enum value is not defined, please check the ExceptionResource Enum."); return ""; @@ -957,6 +961,7 @@ internal enum ExceptionArgument options, prefix, suffix, + platform, } // @@ -1031,5 +1036,6 @@ internal enum ExceptionResource Arg_TypeNotSupported, Argument_SpansMustHaveSameLength, Argument_InvalidFlag, + Argument_EmptyOrNullString, } } diff --git a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs index bcdf9b45d59772..19132432a89e28 100644 --- a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs @@ -48,6 +48,20 @@ public static void Clone() Assert.Equal(os.VersionString, os2.VersionString); } + [Fact] + public static void IsOSPlatform_InvalidArgs_Throws() + { + AssertExtensions.Throws("platform", () => OperatingSystem.IsOSPlatform(null)); + AssertExtensions.Throws("platform", () => OperatingSystem.IsOSPlatform(string.Empty)); + } + + [Fact] + public static void IsOSPlatformVersionAtLeast_InvalidArgs_Throws() + { + AssertExtensions.Throws("platform", () => OperatingSystem.IsOSPlatformVersionAtLeast(null, 1)); + AssertExtensions.Throws("platform", () => OperatingSystem.IsOSPlatformVersionAtLeast(string.Empty, 1)); + } + [Fact, PlatformSpecific(TestPlatforms.Browser)] public static void CheckBrowser() { From 49ca4af686dbd53ea48ea9c3d9b0c942f6a6e370 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 14:16:55 +0200 Subject: [PATCH 06/13] fix the compilation error ;) --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index cb016539355172..b07ff7a88eddd5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -116,6 +116,10 @@ public static bool IsOSPlatform(string platform) /// Check for the OS with a >= version comparison. Used to guard APIs that were added in the given OS release. /// /// Case-insensitive platform name. Examples: Browser, Linux, FreeBSD, Android, iOS, macOS, tvOS, watchOS, Windows. + /// Major OS version number. + /// Minor OS version number (optional). + /// Build OS version number (optional). + /// Revision OS version number (optional). public static bool IsOSPlatformVersionAtLeast(string platform, int major, int minor = 0, int build = 0, int revision = 0) => IsOSPlatform(platform) && IsOSVersionAtLeast(major, minor, build, revision); From a11e873a70f6d94f678441a443697b31193f77d8 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 17:29:07 +0200 Subject: [PATCH 07/13] address code review suggestions --- src/coreclr/clr.featuredefines.props | 6 ++++++ .../src/System/OperatingSystem.cs | 10 +++------- .../System.Private.CoreLib/src/System/ThrowHelper.cs | 6 ------ .../tests/System/OperatingSystemTests.cs | 2 -- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/coreclr/clr.featuredefines.props b/src/coreclr/clr.featuredefines.props index b5979c8d239013..41c348aa2995e8 100644 --- a/src/coreclr/clr.featuredefines.props +++ b/src/coreclr/clr.featuredefines.props @@ -70,5 +70,11 @@ $(DefineConstants);TARGET_UNIX $(DefineConstants);TARGET_WINDOWS $(DefineConstants);TARGET_OSX + $(DefineConstants);TARGET_LINUX/DefineConstants> + $(DefineConstants);TARGET_FREEBSD/DefineConstants> + $(DefineConstants);TARGET_IOS + $(DefineConstants);TARGET_TVOS + $(DefineConstants);TARGET_BROWSER + $(DefineConstants);TARGET_ANDROID diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index b07ff7a88eddd5..985e2237e51f2c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -9,7 +9,7 @@ namespace System public sealed class OperatingSystem : ISerializable, ICloneable { #if TARGET_UNIX && !TARGET_OSX - private static string? s_osPlatformName; + private static string s_osPlatformName = Interop.Sys.GetUnixName(); #endif private readonly Version _version; @@ -92,11 +92,7 @@ public static bool IsOSPlatform(string platform) { if (platform == null) { - ThrowHelper.ThrowArgumentNullException(ExceptionArgument.platform); - } - if (platform.Length == 0) - { - ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_EmptyOrNullString, ExceptionArgument.platform); + throw new ArgumentNullException(nameof(platform)); } #if TARGET_BROWSER @@ -106,7 +102,7 @@ public static bool IsOSPlatform(string platform) #elif TARGET_OSX return platform.Equals("OSX", StringComparison.OrdinalIgnoreCase) || platform.Equals("MACOS", StringComparison.OrdinalIgnoreCase); #elif TARGET_UNIX - return platform.Equals(s_osPlatformName ??= Interop.Sys.GetUnixName(), StringComparison.OrdinalIgnoreCase); + return platform.Equals(s_osPlatformName, StringComparison.OrdinalIgnoreCase); #else #error Unknown OS #endif diff --git a/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs b/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs index 06a527a7fd1f31..b88eaa4d93738c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs +++ b/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs @@ -699,8 +699,6 @@ private static string GetArgumentName(ExceptionArgument argument) return "prefix"; case ExceptionArgument.suffix: return "suffix"; - case ExceptionArgument.platform: - return "platform"; default: Debug.Fail("The enum value is not defined, please check the ExceptionArgument Enum."); return ""; @@ -857,8 +855,6 @@ private static string GetResourceString(ExceptionResource resource) return SR.Argument_SpansMustHaveSameLength; case ExceptionResource.Argument_InvalidFlag: return SR.Argument_InvalidFlag; - case ExceptionResource.Argument_EmptyOrNullString: - return SR.Arg_EmptyOrNullString; default: Debug.Fail("The enum value is not defined, please check the ExceptionResource Enum."); return ""; @@ -961,7 +957,6 @@ internal enum ExceptionArgument options, prefix, suffix, - platform, } // @@ -1036,6 +1031,5 @@ internal enum ExceptionResource Arg_TypeNotSupported, Argument_SpansMustHaveSameLength, Argument_InvalidFlag, - Argument_EmptyOrNullString, } } diff --git a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs index 19132432a89e28..cf3315ebb71edc 100644 --- a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs @@ -52,14 +52,12 @@ public static void Clone() public static void IsOSPlatform_InvalidArgs_Throws() { AssertExtensions.Throws("platform", () => OperatingSystem.IsOSPlatform(null)); - AssertExtensions.Throws("platform", () => OperatingSystem.IsOSPlatform(string.Empty)); } [Fact] public static void IsOSPlatformVersionAtLeast_InvalidArgs_Throws() { AssertExtensions.Throws("platform", () => OperatingSystem.IsOSPlatformVersionAtLeast(null, 1)); - AssertExtensions.Throws("platform", () => OperatingSystem.IsOSPlatformVersionAtLeast(string.Empty, 1)); } [Fact, PlatformSpecific(TestPlatforms.Browser)] From 82c68389f3147296917a7e4536aecbeff3752541 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 18:03:42 +0200 Subject: [PATCH 08/13] make the field readonly --- .../System.Private.CoreLib/src/System/OperatingSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 985e2237e51f2c..6b3a5b5682f48b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -9,7 +9,7 @@ namespace System public sealed class OperatingSystem : ISerializable, ICloneable { #if TARGET_UNIX && !TARGET_OSX - private static string s_osPlatformName = Interop.Sys.GetUnixName(); + private static readonly string s_osPlatformName = Interop.Sys.GetUnixName(); #endif private readonly Version _version; From 55d9b8de63f4b43fe00a1e9292a2e8d190d3e6c0 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 18:17:13 +0200 Subject: [PATCH 09/13] typos --- src/coreclr/clr.featuredefines.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/clr.featuredefines.props b/src/coreclr/clr.featuredefines.props index 41c348aa2995e8..b348906f2d4fbd 100644 --- a/src/coreclr/clr.featuredefines.props +++ b/src/coreclr/clr.featuredefines.props @@ -70,8 +70,8 @@ $(DefineConstants);TARGET_UNIX $(DefineConstants);TARGET_WINDOWS $(DefineConstants);TARGET_OSX - $(DefineConstants);TARGET_LINUX/DefineConstants> - $(DefineConstants);TARGET_FREEBSD/DefineConstants> + $(DefineConstants);TARGET_LINUX + $(DefineConstants);TARGET_FREEBSD $(DefineConstants);TARGET_IOS $(DefineConstants);TARGET_TVOS $(DefineConstants);TARGET_BROWSER From 7178fd84d047679f2272e53ff45b32f1daad23ba Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 19:28:36 +0200 Subject: [PATCH 10/13] add defines to mono corelib --- src/coreclr/clr.featuredefines.props | 4 ++-- .../System.Private.CoreLib/System.Private.CoreLib.csproj | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/coreclr/clr.featuredefines.props b/src/coreclr/clr.featuredefines.props index b348906f2d4fbd..a360271dcfe018 100644 --- a/src/coreclr/clr.featuredefines.props +++ b/src/coreclr/clr.featuredefines.props @@ -70,11 +70,11 @@ $(DefineConstants);TARGET_UNIX $(DefineConstants);TARGET_WINDOWS $(DefineConstants);TARGET_OSX - $(DefineConstants);TARGET_LINUX - $(DefineConstants);TARGET_FREEBSD $(DefineConstants);TARGET_IOS $(DefineConstants);TARGET_TVOS $(DefineConstants);TARGET_BROWSER $(DefineConstants);TARGET_ANDROID + $(DefineConstants);TARGET_LINUX + $(DefineConstants);TARGET_FREEBSD diff --git a/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj index 95e1e72845ad16..069986582baf4c 100644 --- a/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj +++ b/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj @@ -138,6 +138,9 @@ $(DefineConstants);TARGET_IOS $(DefineConstants);TARGET_TVOS $(DefineConstants);TARGET_BROWSER + $(DefineConstants);TARGET_ANDROID + $(DefineConstants);TARGET_LINUX + $(DefineConstants);TARGET_FREEBSD From e3a811dc7085e287774348861be97b7dafe837b5 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 19:42:05 +0200 Subject: [PATCH 11/13] move TARGET_* defines to a common file --- src/coreclr/clr.featuredefines.props | 10 ---------- .../src/System.Private.CoreLib.Shared.projitems | 11 +++++++++++ .../System.Private.CoreLib.csproj | 9 --------- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/coreclr/clr.featuredefines.props b/src/coreclr/clr.featuredefines.props index a360271dcfe018..c5119c80424d23 100644 --- a/src/coreclr/clr.featuredefines.props +++ b/src/coreclr/clr.featuredefines.props @@ -66,15 +66,5 @@ $(DefineConstants);PROFILING_SUPPORTED $(DefineConstants);FEATURE_PROFAPI_ATTACH_DETACH - - $(DefineConstants);TARGET_UNIX - $(DefineConstants);TARGET_WINDOWS - $(DefineConstants);TARGET_OSX - $(DefineConstants);TARGET_IOS - $(DefineConstants);TARGET_TVOS - $(DefineConstants);TARGET_BROWSER - $(DefineConstants);TARGET_ANDROID - $(DefineConstants);TARGET_LINUX - $(DefineConstants);TARGET_FREEBSD diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems index 1715d433f8d0bc..f7bb250fe0d32e 100644 --- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems +++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems @@ -15,6 +15,17 @@ true $(MSBuildThisFileDirectory)ILLink\ + + $(DefineConstants);TARGET_UNIX + $(DefineConstants);TARGET_WINDOWS + $(DefineConstants);TARGET_OSX + $(DefineConstants);TARGET_IOS + $(DefineConstants);TARGET_TVOS + $(DefineConstants);TARGET_BROWSER + $(DefineConstants);TARGET_ANDROID + $(DefineConstants);TARGET_LINUX + $(DefineConstants);TARGET_FREEBSD + diff --git a/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj index 069986582baf4c..167457a62ba2cf 100644 --- a/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj +++ b/src/mono/netcore/System.Private.CoreLib/System.Private.CoreLib.csproj @@ -132,15 +132,6 @@ $(DefineConstants);FEATURE_MANAGED_ETW_CHANNELS $(DefineConstants);FEATURE_PERFTRACING $(DefineConstants);FEATURE_DEFAULT_INTERFACES - $(DefineConstants);TARGET_UNIX - $(DefineConstants);TARGET_WINDOWS - $(DefineConstants);TARGET_OSX - $(DefineConstants);TARGET_IOS - $(DefineConstants);TARGET_TVOS - $(DefineConstants);TARGET_BROWSER - $(DefineConstants);TARGET_ANDROID - $(DefineConstants);TARGET_LINUX - $(DefineConstants);TARGET_FREEBSD From 7e6fd8057a5df51a9eae16307ef648b0ccc61957 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Thu, 6 Aug 2020 23:54:16 +0200 Subject: [PATCH 12/13] fix failing OSX test --- .../tests/System/OperatingSystemTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs index cf3315ebb71edc..837a869b57201e 100644 --- a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs @@ -507,7 +507,7 @@ private static void AssertVersionChecks(Func isOSVersi Assert.False(isOSVersionAtLeast(current.Major + 1, current.Minor, current.Build, current.Revision)); Assert.False(isOSVersionAtLeast(current.Major, current.Minor + 1, current.Build, current.Revision)); Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build + 1, current.Revision)); - Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build, current.Revision + 1)); + Assert.False(isOSVersionAtLeast(current.Major, current.Minor, current.Build, Math.Max(current.Revision + 1, 1))); // OSX Revision reports -1 Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build, current.Revision)); From f3d44768883b4a293de812733862602473df415c Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Fri, 7 Aug 2020 00:12:25 +0200 Subject: [PATCH 13/13] apply code review suggestions: simplify tests --- .../tests/System/OperatingSystemTests.cs | 522 ++++-------------- 1 file changed, 102 insertions(+), 420 deletions(-) diff --git a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs index 837a869b57201e..c355baf8e2aeac 100644 --- a/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs +++ b/src/libraries/System.Runtime.Extensions/tests/System/OperatingSystemTests.cs @@ -7,6 +7,19 @@ namespace System.Tests { public static class OperatingSystemTests { + private static readonly string[] AllKnownPlatformNames = new[] + { + "Android", + "macOS", + "iOS", + "tvOS", + "watchOS", + "Windows", + "Linux", + "FreeBSD", + "Browser" + }; + [Theory] [InlineData(PlatformID.Other, "1.0.0.0")] [InlineData(PlatformID.MacOSX, "1.2")] @@ -61,446 +74,115 @@ public static void IsOSPlatformVersionAtLeast_InvalidArgs_Throws() } [Fact, PlatformSpecific(TestPlatforms.Browser)] - public static void CheckBrowser() - { - Assert.True(OperatingSystem.IsBrowser()); - Assert.True(OperatingSystem.IsOSPlatform("BROWSER")); - Assert.True(OperatingSystem.IsOSPlatform("browser")); - Assert.False(OperatingSystem.IsLinux()); - Assert.False(OperatingSystem.IsOSPlatform("LINUX")); - Assert.False(OperatingSystem.IsOSPlatform("linux")); - Assert.False(OperatingSystem.IsFreeBSD()); - Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); - Assert.False(OperatingSystem.IsOSPlatform("freebsd")); - Assert.False(OperatingSystem.IsAndroid()); - Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); - Assert.False(OperatingSystem.IsOSPlatform("android")); - Assert.False(OperatingSystem.IsIOS()); - Assert.False(OperatingSystem.IsOSPlatform("IOS")); - Assert.False(OperatingSystem.IsOSPlatform("iOS")); - Assert.False(OperatingSystem.IsOSPlatform("ios")); - Assert.False(OperatingSystem.IsMacOS()); - Assert.False(OperatingSystem.IsOSPlatform("MACOS")); - Assert.False(OperatingSystem.IsOSPlatform("macOS")); - Assert.False(OperatingSystem.IsOSPlatform("macos")); - Assert.False(OperatingSystem.IsTvOS()); - Assert.False(OperatingSystem.IsOSPlatform("TVOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvos")); - Assert.False(OperatingSystem.IsWatchOS()); - Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchios")); - Assert.False(OperatingSystem.IsWindows()); - Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); - Assert.False(OperatingSystem.IsOSPlatform("windows")); - - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); - } + public static void TestIsOSPlatform_Browser() => TestIsOSPlatform("BROWSER", OperatingSystem.IsBrowser); + + [Fact, PlatformSpecific(TestPlatforms.Browser)] + public static void TestIsOSVersionAtLeast_Browser() => TestIsOSVersionAtLeast("BROWSER"); [Fact, PlatformSpecific(TestPlatforms.Linux)] - public static void CheckLinux() - { - Assert.False(OperatingSystem.IsBrowser()); - Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); - Assert.False(OperatingSystem.IsOSPlatform("browser")); - Assert.True(OperatingSystem.IsLinux()); - Assert.True(OperatingSystem.IsOSPlatform("LINUX")); - Assert.True(OperatingSystem.IsOSPlatform("linux")); - Assert.False(OperatingSystem.IsFreeBSD()); - Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); - Assert.False(OperatingSystem.IsOSPlatform("freebsd")); - Assert.False(OperatingSystem.IsAndroid()); - Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); - Assert.False(OperatingSystem.IsOSPlatform("android")); - Assert.False(OperatingSystem.IsIOS()); - Assert.False(OperatingSystem.IsOSPlatform("IOS")); - Assert.False(OperatingSystem.IsOSPlatform("iOS")); - Assert.False(OperatingSystem.IsOSPlatform("ios")); - Assert.False(OperatingSystem.IsMacOS()); - Assert.False(OperatingSystem.IsOSPlatform("MACOS")); - Assert.False(OperatingSystem.IsOSPlatform("macOS")); - Assert.False(OperatingSystem.IsOSPlatform("macos")); - Assert.False(OperatingSystem.IsTvOS()); - Assert.False(OperatingSystem.IsOSPlatform("TVOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvos")); - Assert.False(OperatingSystem.IsWatchOS()); - Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchios")); - Assert.False(OperatingSystem.IsWindows()); - Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); - Assert.False(OperatingSystem.IsOSPlatform("windows")); - - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), true); - AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); - } + public static void TestIsOSPlatform_Linux() => TestIsOSPlatform("Linux", OperatingSystem.IsLinux); + + [Fact, PlatformSpecific(TestPlatforms.Linux)] + public static void TestIsOSVersionAtLeast_Linux() => TestIsOSVersionAtLeast("Linux"); [Fact, PlatformSpecific(TestPlatforms.FreeBSD)] - public static void CheckFreeBSD() - { - Assert.False(OperatingSystem.IsBrowser()); - Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); - Assert.False(OperatingSystem.IsOSPlatform("browser")); - Assert.False(OperatingSystem.IsLinux()); - Assert.False(OperatingSystem.IsOSPlatform("LINUX")); - Assert.False(OperatingSystem.IsOSPlatform("linux")); - Assert.True(OperatingSystem.IsFreeBSD()); - Assert.True(OperatingSystem.IsOSPlatform("FREEBSD")); - Assert.True(OperatingSystem.IsOSPlatform("freebsd")); - Assert.False(OperatingSystem.IsAndroid()); - Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); - Assert.False(OperatingSystem.IsOSPlatform("android")); - Assert.False(OperatingSystem.IsIOS()); - Assert.False(OperatingSystem.IsOSPlatform("IOS")); - Assert.False(OperatingSystem.IsOSPlatform("iOS")); - Assert.False(OperatingSystem.IsOSPlatform("ios")); - Assert.False(OperatingSystem.IsMacOS()); - Assert.False(OperatingSystem.IsOSPlatform("MACOS")); - Assert.False(OperatingSystem.IsOSPlatform("macOS")); - Assert.False(OperatingSystem.IsOSPlatform("macos")); - Assert.False(OperatingSystem.IsTvOS()); - Assert.False(OperatingSystem.IsOSPlatform("TVOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvos")); - Assert.False(OperatingSystem.IsWatchOS()); - Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchios")); - Assert.False(OperatingSystem.IsWindows()); - Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); - Assert.False(OperatingSystem.IsOSPlatform("windows")); - - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), true); - AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); - } + public static void TestIsOSPlatform_FreeBSD() => TestIsOSPlatform("FreeBSD", OperatingSystem.IsFreeBSD); + + [Fact, PlatformSpecific(TestPlatforms.FreeBSD)] + public static void TestIsOSVersionAtLeast_FreeBSD() => TestIsOSVersionAtLeast("FreeBSD"); [Fact, PlatformSpecific(TestPlatforms.Android)] - public static void CheckAndroid() - { - Assert.False(OperatingSystem.IsBrowser()); - Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); - Assert.False(OperatingSystem.IsOSPlatform("browser")); - Assert.False(OperatingSystem.IsLinux()); - Assert.False(OperatingSystem.IsOSPlatform("LINUX")); - Assert.False(OperatingSystem.IsOSPlatform("linux")); - Assert.False(OperatingSystem.IsFreeBSD()); - Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); - Assert.False(OperatingSystem.IsOSPlatform("freebsd")); - Assert.True(OperatingSystem.IsAndroid()); - Assert.True(OperatingSystem.IsOSPlatform("ANDROID")); - Assert.True(OperatingSystem.IsOSPlatform("android")); - Assert.False(OperatingSystem.IsIOS()); - Assert.False(OperatingSystem.IsOSPlatform("IOS")); - Assert.False(OperatingSystem.IsOSPlatform("iOS")); - Assert.False(OperatingSystem.IsOSPlatform("ios")); - Assert.False(OperatingSystem.IsMacOS()); - Assert.False(OperatingSystem.IsOSPlatform("MACOS")); - Assert.False(OperatingSystem.IsOSPlatform("macOS")); - Assert.False(OperatingSystem.IsOSPlatform("macos")); - Assert.False(OperatingSystem.IsTvOS()); - Assert.False(OperatingSystem.IsOSPlatform("TVOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvos")); - Assert.False(OperatingSystem.IsWatchOS()); - Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchios")); - Assert.False(OperatingSystem.IsWindows()); - Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); - Assert.False(OperatingSystem.IsOSPlatform("windows")); - - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), true); - AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); - } + public static void TestIsOSPlatform_Android() => TestIsOSPlatform("Android", OperatingSystem.IsAndroid); + + [Fact, PlatformSpecific(TestPlatforms.Android)] + public static void TestIsOSVersionAtLeast_Android() => TestIsOSVersionAtLeast("Android"); [Fact, PlatformSpecific(TestPlatforms.iOS)] - public static void CheckIOS() - { - Assert.False(OperatingSystem.IsBrowser()); - Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); - Assert.False(OperatingSystem.IsOSPlatform("browser")); - Assert.False(OperatingSystem.IsLinux()); - Assert.False(OperatingSystem.IsOSPlatform("LINUX")); - Assert.False(OperatingSystem.IsOSPlatform("linux")); - Assert.False(OperatingSystem.IsFreeBSD()); - Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); - Assert.False(OperatingSystem.IsOSPlatform("freebsd")); - Assert.False(OperatingSystem.IsAndroid()); - Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); - Assert.False(OperatingSystem.IsOSPlatform("android")); - Assert.False(OperatingSystem.IsIOS()); - Assert.True(OperatingSystem.IsOSPlatform("IOS")); - Assert.True(OperatingSystem.IsOSPlatform("iOS")); - Assert.True(OperatingSystem.IsOSPlatform("ios")); - Assert.False(OperatingSystem.IsMacOS()); - Assert.False(OperatingSystem.IsOSPlatform("MACOS")); - Assert.False(OperatingSystem.IsOSPlatform("macOS")); - Assert.False(OperatingSystem.IsOSPlatform("macos")); - Assert.False(OperatingSystem.IsTvOS()); - Assert.False(OperatingSystem.IsOSPlatform("TVOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvos")); - Assert.False(OperatingSystem.IsWatchOS()); - Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchios")); - Assert.False(OperatingSystem.IsWindows()); - Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); - Assert.False(OperatingSystem.IsOSPlatform("windows")); - - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("iOS", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build), true); - AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("iOS", major, minor, build), true); - AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); - } + public static void TestIsOSPlatform_IOS() => TestIsOSPlatform("iOS", OperatingSystem.IsIOS); + + [Fact, PlatformSpecific(TestPlatforms.iOS)] + public static void TestIsOSVersionAtLeast_IOS() => TestIsOSVersionAtLeast("iOS"); [Fact, PlatformSpecific(TestPlatforms.OSX)] - public static void CheckMacOS() + public static void TestIsOSPlatform_MacOS() => TestIsOSPlatform("macOS", OperatingSystem.IsMacOS); + + [Fact, PlatformSpecific(TestPlatforms.OSX)] + public static void TestIsOSVersionAtLeast_MacOS() => TestIsOSVersionAtLeast("macOS"); + + [Fact, PlatformSpecific(TestPlatforms.OSX)] + public static void OSX_Is_Treated_as_macOS() { - Assert.False(OperatingSystem.IsBrowser()); - Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); - Assert.False(OperatingSystem.IsOSPlatform("browser")); - Assert.False(OperatingSystem.IsLinux()); - Assert.False(OperatingSystem.IsOSPlatform("LINUX")); - Assert.False(OperatingSystem.IsOSPlatform("linux")); - Assert.False(OperatingSystem.IsFreeBSD()); - Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); - Assert.False(OperatingSystem.IsOSPlatform("freebsd")); - Assert.False(OperatingSystem.IsAndroid()); - Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); - Assert.False(OperatingSystem.IsOSPlatform("android")); - Assert.False(OperatingSystem.IsIOS()); - Assert.False(OperatingSystem.IsOSPlatform("IOS")); - Assert.False(OperatingSystem.IsOSPlatform("iOS")); - Assert.False(OperatingSystem.IsOSPlatform("ios")); - Assert.True(OperatingSystem.IsMacOS()); - Assert.True(OperatingSystem.IsOSPlatform("MACOS")); // both MACOS and OSX are supported - Assert.True(OperatingSystem.IsOSPlatform("macOS")); - Assert.True(OperatingSystem.IsOSPlatform("macos")); + // we prefer "macOS", but still accept "OSX" + Assert.True(OperatingSystem.IsOSPlatform("OSX")); - Assert.True(OperatingSystem.IsOSPlatform("osx")); - Assert.False(OperatingSystem.IsTvOS()); - Assert.False(OperatingSystem.IsOSPlatform("TVOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvos")); - Assert.False(OperatingSystem.IsWatchOS()); - Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchios")); - Assert.False(OperatingSystem.IsWindows()); - Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); - Assert.False(OperatingSystem.IsOSPlatform("windows")); - - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("macOS", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("OSX", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("osx", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build), true); - AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("macOS", major, minor, build), true); - AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("OSX", major, minor, build), true); - AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("osx", major, minor, build), true); - AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); + + AssertVersionChecks(true, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("OSX", major, minor, build, revision)); + AssertVersionChecks(true, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("osx", major, minor, build, revision)); + AssertVersionChecks(true, (major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("OSX", major, minor, build)); + AssertVersionChecks(true, (major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("osx", major, minor, build)); } [Fact, PlatformSpecific(TestPlatforms.tvOS)] - public static void CheckTvOS() + public static void TestIsOSPlatform_TvOS() => TestIsOSPlatform("tvOS", OperatingSystem.IsTvOS); + + [Fact, PlatformSpecific(TestPlatforms.tvOS)] + public static void TestIsOSVersionAtLeast_TvOS() => TestIsOSVersionAtLeast("tvOS"); + + [Fact, PlatformSpecific(TestPlatforms.Windows)] + public static void TestIsOSPlatform_Windows() => TestIsOSPlatform("Windows", OperatingSystem.IsWindows); + + [Fact, PlatformSpecific(TestPlatforms.Windows)] + public static void TestIsOSVersionAtLeast_Windows() => TestIsOSVersionAtLeast("Windows"); + + private static void TestIsOSPlatform(string currentOSName, Func currentOSCheck) { - Assert.False(OperatingSystem.IsBrowser()); - Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); - Assert.False(OperatingSystem.IsOSPlatform("browser")); - Assert.False(OperatingSystem.IsLinux()); - Assert.False(OperatingSystem.IsOSPlatform("LINUX")); - Assert.False(OperatingSystem.IsOSPlatform("linux")); - Assert.False(OperatingSystem.IsFreeBSD()); - Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); - Assert.False(OperatingSystem.IsOSPlatform("freebsd")); - Assert.False(OperatingSystem.IsAndroid()); - Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); - Assert.False(OperatingSystem.IsOSPlatform("android")); - Assert.False(OperatingSystem.IsIOS()); - Assert.False(OperatingSystem.IsOSPlatform("IOS")); - Assert.False(OperatingSystem.IsOSPlatform("iOS")); - Assert.False(OperatingSystem.IsOSPlatform("ios")); - Assert.False(OperatingSystem.IsMacOS()); - Assert.False(OperatingSystem.IsOSPlatform("MACOS")); - Assert.False(OperatingSystem.IsOSPlatform("macOS")); - Assert.False(OperatingSystem.IsOSPlatform("macos")); - Assert.True(OperatingSystem.IsTvOS()); - Assert.True(OperatingSystem.IsOSPlatform("TVOS")); - Assert.True(OperatingSystem.IsOSPlatform("tvOS")); - Assert.True(OperatingSystem.IsOSPlatform("tvos")); - Assert.False(OperatingSystem.IsWatchOS()); - Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchios")); - Assert.False(OperatingSystem.IsWindows()); - Assert.False(OperatingSystem.IsOSPlatform("WINDOWS")); - Assert.False(OperatingSystem.IsOSPlatform("windows")); - - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("tvOS", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build), true); - AssertVersionChecks((major, minor, build) => OperatingSystem.IsOSPlatformVersionAtLeast("tvOS", major, minor, build), true); - AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), false); + foreach (string platfromName in AllKnownPlatformNames) + { + bool expected = currentOSName.Equals(platfromName, StringComparison.OrdinalIgnoreCase); + + Assert.Equal(expected, OperatingSystem.IsOSPlatform(platfromName)); + Assert.Equal(expected, OperatingSystem.IsOSPlatform(platfromName.ToUpper())); + Assert.Equal(expected, OperatingSystem.IsOSPlatform(platfromName.ToLower())); + } + + Assert.True(currentOSCheck()); + + bool[] allResults = new bool[] + { + OperatingSystem.IsBrowser(), + OperatingSystem.IsLinux(), + OperatingSystem.IsFreeBSD(), + OperatingSystem.IsAndroid(), + OperatingSystem.IsIOS(), + OperatingSystem.IsMacOS(), + OperatingSystem.IsTvOS(), + OperatingSystem.IsWatchOS(), + OperatingSystem.IsWindows() + }; + + Assert.Single(allResults, true); } - [Fact, PlatformSpecific(TestPlatforms.Windows)] - public static void CheckWindows() + private static void TestIsOSVersionAtLeast(string currentOSName) { - Assert.False(OperatingSystem.IsBrowser()); - Assert.False(OperatingSystem.IsOSPlatform("BROWSER")); - Assert.False(OperatingSystem.IsOSPlatform("browser")); - Assert.False(OperatingSystem.IsLinux()); - Assert.False(OperatingSystem.IsOSPlatform("LINUX")); - Assert.False(OperatingSystem.IsOSPlatform("linux")); - Assert.False(OperatingSystem.IsFreeBSD()); - Assert.False(OperatingSystem.IsOSPlatform("FREEBSD")); - Assert.False(OperatingSystem.IsOSPlatform("freebsd")); - Assert.False(OperatingSystem.IsAndroid()); - Assert.False(OperatingSystem.IsOSPlatform("ANDROID")); - Assert.False(OperatingSystem.IsOSPlatform("android")); - Assert.False(OperatingSystem.IsIOS()); - Assert.False(OperatingSystem.IsOSPlatform("IOS")); - Assert.False(OperatingSystem.IsOSPlatform("iOS")); - Assert.False(OperatingSystem.IsOSPlatform("ios")); - Assert.False(OperatingSystem.IsMacOS()); - Assert.False(OperatingSystem.IsOSPlatform("MACOS")); - Assert.False(OperatingSystem.IsOSPlatform("macOS")); - Assert.False(OperatingSystem.IsOSPlatform("macos")); - Assert.False(OperatingSystem.IsTvOS()); - Assert.False(OperatingSystem.IsOSPlatform("TVOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvOS")); - Assert.False(OperatingSystem.IsOSPlatform("tvos")); - Assert.False(OperatingSystem.IsWatchOS()); - Assert.False(OperatingSystem.IsOSPlatform("WATCHOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchOS")); - Assert.False(OperatingSystem.IsOSPlatform("watchios")); - Assert.True(OperatingSystem.IsWindows()); - Assert.True(OperatingSystem.IsOSPlatform("WINDOWS")); - Assert.True(OperatingSystem.IsOSPlatform("windows")); - - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("BROWSER", major, minor, build, revision), false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("LINUX", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsAndroidVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("ANDROID", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsFreeBSDVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("FREEBSD", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsIOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("IOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsMacOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("MACOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsTvOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("TVOS", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWatchOSVersionAtLeast, false); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WATCHTV", major, minor, build, revision), false); - AssertVersionChecks(OperatingSystem.IsWindowsVersionAtLeast, true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("WINDOWS", major, minor, build, revision), true); - AssertVersionChecks((major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast("windows", major, minor, build, revision), true); + foreach (string platfromName in AllKnownPlatformNames) + { + bool isCurrentOS = currentOSName.Equals(platfromName, StringComparison.OrdinalIgnoreCase); + + AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platfromName, major, minor, build, revision)); + AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platfromName.ToLower(), major, minor, build, revision)); + AssertVersionChecks(isCurrentOS, (major, minor, build, revision) => OperatingSystem.IsOSPlatformVersionAtLeast(platfromName.ToUpper(), major, minor, build, revision)); + } + + AssertVersionChecks(currentOSName.Equals("Android", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsAndroidVersionAtLeast); + AssertVersionChecks(currentOSName.Equals("iOS", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsIOSVersionAtLeast); + AssertVersionChecks(currentOSName.Equals("macOS", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsMacOSVersionAtLeast); + AssertVersionChecks(currentOSName.Equals("tvOS", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsTvOSVersionAtLeast); + AssertVersionChecks(currentOSName.Equals("watchOS", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsWatchOSVersionAtLeast); + AssertVersionChecks(currentOSName.Equals("Windows", StringComparison.OrdinalIgnoreCase), OperatingSystem.IsWindowsVersionAtLeast); } - private static void AssertVersionChecks(Func isOSVersionAtLeast, bool isCurrentOS) + private static void AssertVersionChecks(bool isCurrentOS, Func isOSVersionAtLeast) { Version current = Environment.OSVersion.Version; @@ -517,7 +199,7 @@ private static void AssertVersionChecks(Func isOSVersi Assert.Equal(isCurrentOS, isOSVersionAtLeast(current.Major, current.Minor, current.Build, current.Revision - 1)); } - private static void AssertVersionChecks(Func isOSVersionAtLeast, bool isCurrentOS) + private static void AssertVersionChecks(bool isCurrentOS, Func isOSVersionAtLeast) { Version current = Environment.OSVersion.Version;