Skip to content

Commit 065eff8

Browse files
committed
Helper that can check for multiple type errors
1 parent d8a8cea commit 065eff8

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

tests/fsharp/Compiler/CompilerAssert.fs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ module CompilerAssert =
111111
Assert.IsEmpty(typeCheckResults.Errors, sprintf "Type Check errors: %A" typeCheckResults.Errors)
112112

113113

114-
let TypeCheckSingleError (source: string) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) =
114+
115+
let TypeCheckWithErrors (source: string) expectedTypeErrors =
115116
lock gate <| fun () ->
116117
let parseResults, fileAnswer = checker.ParseAndCheckFileInProject("test.fs", 0, SourceText.ofString source, defaultProjectOptions) |> Async.RunSynchronously
117118

@@ -125,15 +126,20 @@ module CompilerAssert =
125126
typeCheckResults.Errors
126127
|> Array.distinctBy (fun e -> e.Severity, e.ErrorNumber, e.StartLineAlternate, e.StartColumn, e.EndLineAlternate, e.EndColumn, e.Message)
127128

128-
Assert.AreEqual(1, errors.Length, sprintf "Expected one type check error: %A" typeCheckResults.Errors)
129-
errors
130-
|> Array.iter (fun info ->
131-
Assert.AreEqual(FSharpErrorSeverity.Error, info.Severity)
129+
Assert.AreEqual(Array.length expectedTypeErrors, errors.Length, sprintf "Type check errors: %A" typeCheckResults.Errors)
130+
131+
Array.zip errors expectedTypeErrors
132+
|> Array.iter (fun (info, expectedError) ->
133+
let (expectedServerity: FSharpErrorSeverity, expectedErrorNumber: int, expectedErrorRange: int * int * int * int, expectedErrorMsg: string) = expectedError
134+
Assert.AreEqual(expectedServerity, info.Severity)
132135
Assert.AreEqual(expectedErrorNumber, info.ErrorNumber, "expectedErrorNumber")
133136
Assert.AreEqual(expectedErrorRange, (info.StartLineAlternate, info.StartColumn + 1, info.EndLineAlternate, info.EndColumn + 1), "expectedErrorRange")
134137
Assert.AreEqual(expectedErrorMsg, info.Message, "expectedErrorMsg")
135138
)
136139

140+
let TypeCheckSingleError (source: string) (expectedServerity: FSharpErrorSeverity) (expectedErrorNumber: int) (expectedErrorRange: int * int * int * int) (expectedErrorMsg: string) =
141+
TypeCheckWithErrors (source: string) [| expectedServerity, expectedErrorNumber, expectedErrorRange, expectedErrorMsg |]
142+
137143
let CompileExe (source: string) =
138144
compile true source (fun (errors, _) ->
139145
if errors.Length > 0 then

tests/fsharp/Compiler/Language/AnonRecordTests.fs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace FSharp.Compiler.UnitTests
44

55
open NUnit.Framework
6+
open FSharp.Compiler.SourceCodeServices
67

78
[<TestFixture>]
89
module AnonRecordsTests =
@@ -30,6 +31,7 @@ let sAnon = StructClass<struct {| S: int |}>()
3031
type RefClass<'a when 'a : not struct>() = class end
3132
let rAnon = RefClass<struct {| R: int |}>()
3233
"""
34+
FSharpErrorSeverity.Error
3335
1
3436
(3, 13, 3, 42)
3537
"A generic construct requires that the type 'struct {|R : int|}' have reference semantics, but it does not, i.e. it is a struct"
@@ -40,7 +42,8 @@ let rAnon = RefClass<struct {| R: int |}>()
4042
"""
4143
type StructClass<'a when 'a : struct>() = class end
4244
let sAnon = StructClass<{| S: int |}>()
43-
"""
45+
"""
46+
FSharpErrorSeverity.Error
4447
1
4548
(3, 13, 3, 38)
4649
"A generic construct requires that the type '{|S : int|}' is a CLI or F# struct type"

0 commit comments

Comments
 (0)