Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Add regression tests for FSharpPlus consumer scenarios affected by F# 9#19008

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Draft
Copilot wants to merge2 commits intomain
base:main
Choose a base branch
Loading
fromcopilot/add-regression-tests-fsharp-plus
Draft
Show file tree
Hide file tree
Changes from1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
PrevPrevious commit
Add FSharpPlus regression tests for F# 9 issues
Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com>
  • Loading branch information
@T-Gro
Copilot andT-Gro committedOct 16, 2025
commitfd8508f58f0eff6eb6c8f224341467e83357ce07
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -234,6 +234,7 @@
<Compile Include="Language\IndexerSetterParamArray.fs" />
<Compile Include="Language\MultiDimensionalArrayTests.fs" />
<Compile Include="Language\RegressionTests.fs" />
<Compile Include="Language\FSharpPlusRegressionTests.fs" />
<Compile Include="Language\AttributeCheckingTests.fs" />
<Compile Include="Language\ObsoleteAttributeCheckingTests.fs" />
<Compile Include="Language\ExperimentalAttributeCheckingTests.fs" />
Expand Down
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.

namespace Language

open System
open Xunit
open FSharp.Test.ScriptHelpers
open FSharp.Compiler.Diagnostics

module FSharpPlusRegressionTests =

/// <summary>
/// Regression test for FSharpPlus issue #613 - monad.plus usage scenario.
/// This test reproduces a consumer-side failure where using monad.plus in F# 9
/// causes compilation issues. The code should compile successfully.
/// Issue: https://github.com/fsprojects/FSharpPlus/issues/613
/// </summary>
[<Theory>]
[<InlineData("8.0")>]
[<InlineData("preview")>]
[<InlineData("preview", "--checknulls+")>]
let ``monad.plus usage should compile successfully`` (langVersion: string, [<ParamArray>] additionalArgs: string[]) =
let allArgs = Array.concat [[| "--langversion:" + langVersion |]; additionalArgs]
use script = new FSharpScript(additionalArgs = allArgs, quiet = true)

let code = """
// Simulated monad.plus pattern from FSharpPlus
// This pattern uses statically resolved type parameters (SRTP) for ad-hoc polymorphism
type MonadPlusClass =
static member inline MPlus (x: option<'a>, y: option<'a>) =
match x with
| Some _ -> x
| None -> y

static member inline MPlus (x: list<'a>, y: list<'a>) = x @ y

// Generic mplus function using SRTP to dispatch to appropriate implementation
let inline mplus (x: ^M) (y: ^M) : ^M =
((^MonadPlusClass or ^M) : (static member MPlus : ^M * ^M -> ^M) (x, y))

// Direct usage with concrete types
let testOption() =
let result : int option = mplus (Some 1) (Some 2)
printfn "Option result = %A" result

let testList() =
let result : int list = mplus [1; 2] [3; 4]
printfn "List result = %A" result

testOption()
testList()
"""

let evalResult, diagnostics = script.Eval(code)

// The code should compile successfully
match evalResult with
| Ok _ ->
// Filter out informational diagnostics
let errors = diagnostics |> Array.filter (fun d ->
d.Severity = FSharpDiagnosticSeverity.Error)
Assert.Empty(errors)
| Error ex ->
Assert.True(false, sprintf "Evaluation failed with exception: %s\nDiagnostics: %A" ex.Message diagnostics)

/// <summary>
/// Regression test for FSharpPlus issue #613 - custom ResultTBuilder scenario.
/// This test reproduces a consumer-side failure where defining a custom ResultTBuilder
/// in F# 9 causes compilation issues. The code should compile successfully.
/// Issue: https://github.com/fsprojects/FSharpPlus/issues/613
/// </summary>
[<Theory>]
[<InlineData("8.0")>]
[<InlineData("preview")>]
[<InlineData("preview", "--checknulls+")>]
let ``custom ResultTBuilder should compile successfully`` (langVersion: string, [<ParamArray>] additionalArgs: string[]) =
let allArgs = Array.concat [[| "--langversion:" + langVersion |]; additionalArgs]
use script = new FSharpScript(additionalArgs = allArgs, quiet = true)

let code = """
// Custom ResultTBuilder pattern from FSharpPlus
type ResultTBuilder() =
member inline _.Return(x: 'T) : Result<'T, 'Error> = Ok x

member inline _.ReturnFrom(m: Result<'T, 'Error>) : Result<'T, 'Error> = m

member inline _.Bind(m: Result<'T, 'Error>, f: 'T -> Result<'U, 'Error>) : Result<'U, 'Error> =
match m with
| Ok x -> f x
| Error e -> Error e

member inline _.Zero() : Result<unit, 'Error> = Ok ()

member inline _.Combine(m1: Result<unit, 'Error>, m2: Result<'T, 'Error>) : Result<'T, 'Error> =
match m1 with
| Ok () -> m2
| Error e -> Error e

member inline _.Delay(f: unit -> Result<'T, 'Error>) : unit -> Result<'T, 'Error> = f

member inline _.Run(f: unit -> Result<'T, 'Error>) : Result<'T, 'Error> = f()

let resultT = ResultTBuilder()

// Usage example
let compute x y =
resultT {
let! a = Ok x
let! b = Ok y
return a + b
}

// Apply the function to avoid value restriction
let testResult : Result<int, string> = compute 5 10

// Verify result
printfn "testResult = %A" testResult
"""

let evalResult, diagnostics = script.Eval(code)

// The code should compile successfully
match evalResult with
| Ok _ ->
// Filter out informational diagnostics
let errors = diagnostics |> Array.filter (fun d ->
d.Severity = FSharpDiagnosticSeverity.Error)
Assert.Empty(errors)
| Error ex ->
Assert.True(false, sprintf "Evaluation failed with exception: %s\nDiagnostics: %A" ex.Message diagnostics)
Loading

[8]ページ先頭

©2009-2025 Movatter.jp