elm-review/tests/ErrorMessageTest.elm
2019-07-28 17:37:21 +02:00

586 lines
17 KiB
Elm

module ErrorMessageTest exposing (all)
import Elm.Syntax.Range exposing (Range)
import Expect exposing (Expectation)
import Lint.Rule as Rule exposing (Error)
import Lint.Test.ErrorMessage as ErrorMessage exposing (ExpectedErrorData)
import Test exposing (Test, describe, test)
all : Test
all =
describe "Test.ErrorMessage"
[ parsingFailureTest
, didNotExpectErrorsTest
, messageMismatchTest
, underMismatchTest
, unexpectedDetailsTest
, emptyDetailsTest
, wrongLocationTest
, expectedMoreErrorsTest
, tooManyErrorsTest
, locationIsAmbiguousInSourceCodeTest
]
expectMessageEqual : String -> String -> Expectation
expectMessageEqual expectedMessage =
Expect.all
[ Expect.equal <| String.trim expectedMessage
, \receivedMessage ->
Expect.all
(String.lines receivedMessage
|> List.map
(\line () ->
(String.length line <= 76)
|> Expect.true ("Message has line longer than 76 characters:\n\n" ++ line)
)
)
()
]
parsingFailureTest : Test
parsingFailureTest =
test "parsingFailure" <|
\() ->
ErrorMessage.parsingFailure
|> expectMessageEqual """
TEST SOURCE CODE PARSING ERROR
I could not parse the test source code, because it was not valid Elm code.
Hint: Maybe you forgot to add the module definition at the top, like:
`module A exposing (..)`"""
didNotExpectErrorsTest : Test
didNotExpectErrorsTest =
test "didNotExpectErrors" <|
\() ->
let
errors : List Error
errors =
[ Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
dummyRange
, Rule.error
{ message = "Some other error"
, details = [ "Some other details" ]
}
dummyRange
]
in
ErrorMessage.didNotExpectErrors errors
|> expectMessageEqual """
DID NOT EXPECT ERRORS
I expected no errors but found:
- `Some error`
at { start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
- `Some other error`
at { start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
"""
messageMismatchTest : Test
messageMismatchTest =
test "messageMismatch" <|
\() ->
let
expectedError : ExpectedErrorData
expectedError =
{ message = "Remove the use of `Debug` before shipping to production"
, details = [ "Some details" ]
, under = "Debug.log"
}
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
dummyRange
in
ErrorMessage.messageMismatch expectedError error
|> expectMessageEqual """
UNEXPECTED ERROR MESSAGE
I was looking for the error with the following message:
`Remove the use of `Debug` before shipping to production`
but I found the following error message:
`Some error`"""
underMismatchTest : Test
underMismatchTest =
describe "underMismatch"
[ test "with single-line extracts" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
dummyRange
in
ErrorMessage.underMismatch
error
{ under = "abcd"
, codeAtLocation = "abcd = 1"
}
|> expectMessageEqual """
UNEXPECTED ERROR LOCATION
I found an error with the following message:
`Some error`
which I was expecting, but I found it under:
`abcd = 1`
when I was expecting it under:
`abcd`
Hint: Maybe you're passing the `Range` of a wrong node when
calling `Rule.error`"""
, test "with multi-line extracts" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some other error"
, details = [ "Some other details" ]
}
dummyRange
in
ErrorMessage.underMismatch
error
{ under = "abcd =\n 1\n + 2"
, codeAtLocation = "abcd =\n 1"
}
|> expectMessageEqual """
UNEXPECTED ERROR LOCATION
I found an error with the following message:
`Some other error`
which I was expecting, but I found it under:
```
abcd =
1
```
when I was expecting it under:
```
abcd =
1
+ 2
```
Hint: Maybe you're passing the `Range` of a wrong node when
calling `Rule.error`"""
]
unexpectedDetailsTest : Test
unexpectedDetailsTest =
describe "unexpectedDetails"
[ test "with single-line details" <|
\() ->
let
expectedDetails : List String
expectedDetails =
[ "Some details" ]
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some other details" ]
}
dummyRange
in
ErrorMessage.unexpectedDetails
expectedDetails
error
|> expectMessageEqual """
UNEXPECTED ERROR DETAILS
I found an error with the following message:
`Some error`
which I was expecting, but its details were:
`Some other details`
when I was expecting them to be:
`Some details`"""
, test "with multi-line details" <|
\() ->
let
expectedDetails : List String
expectedDetails =
[ "Some"
, "details"
]
error : Error
error =
Rule.error
{ message = "Some other error"
, details =
[ "Some"
, "other"
, "details"
]
}
dummyRange
in
ErrorMessage.unexpectedDetails
expectedDetails
error
|> expectMessageEqual """
UNEXPECTED ERROR DETAILS
I found an error with the following message:
`Some other error`
which I was expecting, but its details were:
```
Some
other
details
```
when I was expecting them to be:
```
Some
details
```
"""
]
emptyDetailsTest : Test
emptyDetailsTest =
describe "emptyDetails"
[ test "with single-line details" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
dummyRange
in
ErrorMessage.emptyDetails
error
|> expectMessageEqual """
EMPTY ERROR DETAILS
I found an error with the following message:
`Some error`
but its details were empty. I require having details as I believe they will
help the user who encounters the problem.
The details could:
- explain what the problem is
- give suggestions on how to solve the problem or alternatives"""
]
wrongLocationTest : Test
wrongLocationTest =
describe "wrongLocation"
[ test "with single-line extracts" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
{ start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
in
ErrorMessage.wrongLocation
error
{ start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
"abcd"
|> expectMessageEqual """
UNEXPECTED ERROR LOCATION
I was looking for the error with the following message:
`Some error`
under the following code:
`abcd`
and I found it, but the exact location you specified is not the one I found.
I was expecting the error at:
{ start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
but I found it at:
{ start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
"""
, test "with multi-line extracts" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some other error"
, details = [ "Some other details" ]
}
{ start = { row = 4, column = 1 }, end = { row = 5, column = 3 } }
in
ErrorMessage.wrongLocation
error
{ start = { row = 2, column = 1 }, end = { row = 3, column = 3 } }
"abcd =\n 1"
|> expectMessageEqual """
UNEXPECTED ERROR LOCATION
I was looking for the error with the following message:
`Some other error`
under the following code:
```
abcd =
1
```
and I found it, but the exact location you specified is not the one I found.
I was expecting the error at:
{ start = { row = 2, column = 1 }, end = { row = 3, column = 3 } }
but I found it at:
{ start = { row = 4, column = 1 }, end = { row = 5, column = 3 } }
"""
]
expectedMoreErrorsTest : Test
expectedMoreErrorsTest =
test "expectedMoreErrors" <|
\() ->
let
missingErrors : List ExpectedErrorData
missingErrors =
[ { message = "Remove the use of `Debug` before shipping to production"
, details = [ "Some details" ]
, under = "Debug.log"
}
, { message = "Remove the use of `Debug` before shipping to production"
, details = [ "Some details" ]
, under = "Debug.log"
}
]
in
ErrorMessage.expectedMoreErrors missingErrors
|> expectMessageEqual """
RULE REPORTED LESS ERRORS THAN EXPECTED
I expected to see 2 more errors:
- `Remove the use of `Debug` before shipping to production`
- `Remove the use of `Debug` before shipping to production`
"""
tooManyErrorsTest : Test
tooManyErrorsTest =
describe "tooManyErrors"
[ test "with one extra error" <|
\() ->
let
extraErrors : List Rule.Error
extraErrors =
[ Rule.error
{ message = "Remove the use of `Debug` before shipping to production"
, details = [ "Some details about Debug" ]
}
{ start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
]
in
ErrorMessage.tooManyErrors extraErrors
|> expectMessageEqual """
RULE REPORTED MORE ERRORS THAN EXPECTED
I found 1 error too many:
- `Remove the use of `Debug` before shipping to production`
at { start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
"""
, test "with multiple extra errors" <|
\() ->
let
extraErrors : List Rule.Error
extraErrors =
[ Rule.error
{ message = "Remove the use of `Debug` before shipping to production"
, details = [ "Some details about Debug" ]
}
{ start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
, Rule.error
{ message = "Remove the use of `Debug` before shipping to production"
, details = [ "Some details about Debug" ]
}
{ start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
]
in
ErrorMessage.tooManyErrors extraErrors
|> expectMessageEqual """
RULE REPORTED MORE ERRORS THAN EXPECTED
I found 2 errors too many:
- `Remove the use of `Debug` before shipping to production`
at { start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
- `Remove the use of `Debug` before shipping to production`
at { start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
"""
]
locationIsAmbiguousInSourceCodeTest : Test
locationIsAmbiguousInSourceCodeTest =
describe "locationIsAmbiguousInSourceCode"
[ test "with single-line extracts" <|
\() ->
let
sourceCode : String
sourceCode =
"module A exposing (..)\nabcd\nabcd"
under : String
under =
"abcd"
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
{ start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
in
ErrorMessage.locationIsAmbiguousInSourceCode
sourceCode
error
under
(String.indexes under sourceCode)
|> expectMessageEqual """
AMBIGUOUS ERROR LOCATION
Your test passes, but where the message appears is ambiguous.
You are looking for the following error message:
`Some error`
and expecting to see it under:
`abcd`
I found 2 locations where that code appeared. Please
use `Lint.Rule.atExactly` to make the part you were targetting unambiguous.
Tip: I found them at:
- { start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
- { start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
"""
, test "with multi-line extracts" <|
\() ->
let
sourceCode : String
sourceCode =
"module A exposing (..)\nabcd =\n 1\nabcd =\n 1\nabcd =\n 1"
under : String
under =
"abcd =\n 1"
error : Error
error =
Rule.error
{ message = "Some other error"
, details = [ "Some other details" ]
}
{ start = { row = 3, column = 1 }, end = { row = 4, column = 3 } }
in
ErrorMessage.locationIsAmbiguousInSourceCode
sourceCode
error
under
(String.indexes under sourceCode)
|> expectMessageEqual """
AMBIGUOUS ERROR LOCATION
Your test passes, but where the message appears is ambiguous.
You are looking for the following error message:
`Some other error`
and expecting to see it under:
```
abcd =
1
```
I found 3 locations where that code appeared. Please
use `Lint.Rule.atExactly` to make the part you were targetting unambiguous.
Tip: I found them at:
- { start = { row = 2, column = 1 }, end = { row = 3, column = 4 } }
- { start = { row = 4, column = 1 }, end = { row = 5, column = 4 } }
- { start = { row = 6, column = 1 }, end = { row = 7, column = 4 } }
"""
]
dummyRange : Range
dummyRange =
{ start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }