elm-review/tests/ErrorMessageTest.elm

462 lines
14 KiB
Elm
Raw Normal View History

2019-07-09 09:15:24 +03:00
module ErrorMessageTest exposing (all)
import Elm.Syntax.Range exposing (Range)
import Expect exposing (Expectation)
2019-07-09 09:15:24 +03:00
import Lint.Rule as Rule exposing (Error)
import Lint.Test.ErrorMessage as ErrorMessage exposing (ExpectedErrorData)
2019-07-09 09:15:24 +03:00
import Test exposing (Test, describe, test)
all : Test
all =
describe "Test.ErrorMessage"
[ parsingFailureTest
2019-07-09 09:15:24 +03:00
, didNotExpectErrorsTest
, messageMismatchTest
, underMismatchTest
, wrongLocationTest
, expectedMoreErrorsTest
2019-07-09 09:15:24 +03:00
, tooManyErrorsTest
, locationIsAmbiguousInSourceCodeTest
2019-07-09 09:15:24 +03:00
]
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" <|
2019-07-09 09:15:24 +03:00
\() ->
ErrorMessage.parsingFailure
|> expectMessageEqual """
TEST SOURCE CODE PARSING ERROR
2019-07-09 09:15:24 +03:00
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:
2019-07-09 09:15:24 +03:00
`module A exposing (..)`"""
2019-07-09 09:15:24 +03:00
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
2019-07-09 09:15:24 +03:00
]
in
ErrorMessage.didNotExpectErrors errors
|> expectMessageEqual """
DID NOT EXPECT ERRORS
2019-07-09 09:15:24 +03:00
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 } }
"""
2019-07-09 09:15:24 +03:00
messageMismatchTest : Test
messageMismatchTest =
test "messageMismatch" <|
2019-07-09 09:15:24 +03:00
\() ->
let
expectedError : ExpectedErrorData
2019-07-09 09:15:24 +03:00
expectedError =
{ message = "Remove the use of `Debug` before shipping to production"
, under = "Debug.log"
}
2019-07-09 09:15:24 +03:00
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
dummyRange
2019-07-09 09:15:24 +03:00
in
ErrorMessage.messageMismatch expectedError error
|> expectMessageEqual """
UNEXPECTED ERROR MESSAGE
2019-07-09 09:15:24 +03:00
I was looking for the error with the following message:
`Remove the use of `Debug` before shipping to production`
2019-07-09 09:15:24 +03:00
but I found the following error message:
`Some error`"""
2019-07-09 09:15:24 +03:00
underMismatchTest : Test
underMismatchTest =
describe "underMismatch"
2019-07-09 09:15:24 +03:00
[ test "with single-line extracts" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
dummyRange
2019-07-09 09:15:24 +03:00
in
ErrorMessage.underMismatch
2019-07-09 09:15:24 +03:00
error
{ under = "abcd"
, codeAtLocation = "abcd = 1"
}
|> expectMessageEqual """
UNEXPECTED ERROR LOCATION
2019-07-09 09:15:24 +03:00
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`"""
2019-07-09 09:15:24 +03:00
, test "with multi-line extracts" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some other error"
, details = [ "Some other details" ]
}
dummyRange
2019-07-09 09:15:24 +03:00
in
ErrorMessage.underMismatch
2019-07-09 09:15:24 +03:00
error
{ under = "abcd =\n 1\n + 2"
, codeAtLocation = "abcd =\n 1"
}
|> expectMessageEqual """
UNEXPECTED ERROR LOCATION
2019-07-09 09:15:24 +03:00
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`"""
2019-07-09 09:15:24 +03:00
]
wrongLocationTest : Test
wrongLocationTest =
describe "wrongLocation"
2019-07-09 09:15:24 +03:00
[ test "with single-line extracts" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some error"
, details = [ "Some details" ]
}
2019-07-09 09:15:24 +03:00
{ start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
in
ErrorMessage.wrongLocation
2019-07-09 09:15:24 +03:00
error
{ start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
"abcd"
|> expectMessageEqual """
UNEXPECTED ERROR LOCATION
2019-07-09 09:15:24 +03:00
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:
2019-07-09 09:15:24 +03:00
{ 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 } }
"""
2019-07-09 09:15:24 +03:00
, test "with multi-line extracts" <|
\() ->
let
error : Error
error =
Rule.error
{ message = "Some other error"
, details = [ "Some other details" ]
}
2019-07-09 09:15:24 +03:00
{ start = { row = 4, column = 1 }, end = { row = 5, column = 3 } }
in
ErrorMessage.wrongLocation
2019-07-09 09:15:24 +03:00
error
{ start = { row = 2, column = 1 }, end = { row = 3, column = 3 } }
"abcd =\n 1"
|> expectMessageEqual """
UNEXPECTED ERROR LOCATION
2019-07-09 09:15:24 +03:00
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:
2019-07-09 09:15:24 +03:00
{ 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 } }
"""
2019-07-09 09:15:24 +03:00
]
expectedMoreErrorsTest : Test
expectedMoreErrorsTest =
test "expectedMoreErrors" <|
2019-07-09 09:15:24 +03:00
\() ->
let
missingErrors : List ExpectedErrorData
2019-07-09 09:15:24 +03:00
missingErrors =
[ { message = "Remove the use of `Debug` before shipping to production"
, under = "Debug.log"
}
, { message = "Remove the use of `Debug` before shipping to production"
, under = "Debug.log"
}
2019-07-09 09:15:24 +03:00
]
in
ErrorMessage.expectedMoreErrors missingErrors
|> expectMessageEqual """
RULE REPORTED LESS ERRORS THAN EXPECTED
2019-07-09 09:15:24 +03:00
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`
"""
2019-07-09 09:15:24 +03:00
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" ]
}
2019-07-09 09:15:24 +03:00
{ start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }
]
in
ErrorMessage.tooManyErrors extraErrors
|> expectMessageEqual """
RULE REPORTED MORE ERRORS THAN EXPECTED
2019-07-09 09:15:24 +03:00
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 } }
"""
2019-07-09 09:15:24 +03:00
, 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" ]
}
2019-07-09 09:15:24 +03:00
{ 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" ]
}
2019-07-09 09:15:24 +03:00
{ start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
]
in
ErrorMessage.tooManyErrors extraErrors
|> expectMessageEqual """
RULE REPORTED MORE ERRORS THAN EXPECTED
2019-07-09 09:15:24 +03:00
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 } }
"""
2019-07-09 09:15:24 +03:00
]
locationIsAmbiguousInSourceCodeTest : Test
locationIsAmbiguousInSourceCodeTest =
describe "locationIsAmbiguousInSourceCode"
2019-07-09 09:15:24 +03:00
[ 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" ]
}
2019-07-09 09:15:24 +03:00
{ start = { row = 3, column = 1 }, end = { row = 3, column = 5 } }
in
ErrorMessage.locationIsAmbiguousInSourceCode
2019-07-09 09:15:24 +03:00
sourceCode
error
under
(String.indexes under sourceCode)
|> expectMessageEqual """
AMBIGUOUS ERROR LOCATION
2019-07-09 09:15:24 +03:00
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.
2019-07-09 09:15:24 +03:00
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 } }
"""
2019-07-09 09:15:24 +03:00
, 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" ]
}
2019-07-09 09:15:24 +03:00
{ start = { row = 3, column = 1 }, end = { row = 4, column = 3 } }
in
ErrorMessage.locationIsAmbiguousInSourceCode
2019-07-09 09:15:24 +03:00
sourceCode
error
under
(String.indexes under sourceCode)
|> expectMessageEqual """
AMBIGUOUS ERROR LOCATION
2019-07-09 09:15:24 +03:00
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.
2019-07-09 09:15:24 +03:00
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 } }
"""
2019-07-09 09:15:24 +03:00
]
dummyRange : Range
dummyRange =
{ start = { row = 2, column = 1 }, end = { row = 2, column = 5 } }