-
Notifications
You must be signed in to change notification settings - Fork 80
/
PackageName.purs
84 lines (70 loc) · 2.8 KB
/
PackageName.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
module Test.Registry.PackageName (spec) where
import Prelude
import Data.Array as Array
import Data.Either (Either(..))
import Data.Maybe (Maybe(..))
import Data.String as String
import Data.Tuple (Tuple(..))
import Data.Tuple.Nested ((/\))
import Registry.PackageName as PackageName
import Registry.Test.Assert as Assert
import Registry.Test.Utils as Utils
import Test.Spec as Spec
spec :: Spec.Spec Unit
spec = do
Spec.it "Parses well-formed package names" do
let
parse name = case PackageName.parse name of
Left error -> Left (name /\ error)
Right value -> Right (PackageName.print value)
formatError (Tuple name error) = name <> ": " <> error
{ fail } = Utils.partitionEithers $ map parse valid
unless (Array.null fail) do
Assert.fail $ String.joinWith "\n"
[ "Some well-formed package names were not parsed correctly:"
, Array.foldMap (append "\n - " <<< formatError) fail
]
Spec.it "Fails to parse malformed package names" do
let
parse (Tuple name expectedError) = case PackageName.parse name of
Left error | error == expectedError -> Right name
Left error -> Left { name, expectedError, actualError: Just error }
Right _ -> Left { name, expectedError, actualError: Nothing }
formatError { name, expectedError, actualError } = Array.foldMap (append "\n ") $ case actualError of
Nothing -> [ name, "...should have failed with '" <> expectedError <> "'", "...but succeeded instead." ]
Just error -> [ name, "...should have failed with '" <> expectedError <> "'", "...but failed with '" <> error <> "' instead." ]
{ fail } = Utils.partitionEithers $ map parse invalid
unless (Array.null fail) do
Assert.fail $ String.joinWith "\n"
[ "Some malformed package names were not parsed correctly:"
, Array.foldMap (append "\n - " <<< formatError) fail
]
valid :: Array String
valid =
-- standard package names
[ "a"
, "ab"
, "abc"
, "prelude"
, "codec-argonaut"
-- blessed purescript-prefixed packages
, "purescript-compiler-backend-utilities"
]
invalid :: Array (Tuple String String)
invalid = do
let startErr = "Package name should start with a lower case char or a digit"
let midErr = "Package name can contain lower case chars, digits and non-consecutive dashes"
let prefixErr = "Package names should not begin with 'purescript-'"
let endErr = "Package name should end with a lower case char or digit"
let manyDashesErr = "Package names cannot contain consecutive dashes"
let expectedEOF = "Expected EOF"
[ "-a" /\ startErr
, "double--dash" /\ manyDashesErr
, "BIGLETTERS" /\ startErr
, "some space" /\ midErr
, "a-" /\ endErr
, "" /\ startErr
, "🍝" /\ startErr
, "abc-🍝-abc" /\ expectedEOF
, "purescript-aff" /\ prefixErr
]