aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/aedifex/parser.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/test/aedifex/parser.lux')
-rw-r--r--stdlib/source/test/aedifex/parser.lux212
1 files changed, 212 insertions, 0 deletions
diff --git a/stdlib/source/test/aedifex/parser.lux b/stdlib/source/test/aedifex/parser.lux
new file mode 100644
index 000000000..497533fbf
--- /dev/null
+++ b/stdlib/source/test/aedifex/parser.lux
@@ -0,0 +1,212 @@
+(.module:
+ [lux #*
+ ["_" test (#+ Test)]
+ [abstract
+ [monad (#+ do)]
+ [hash (#+ Hash)]]
+ [control
+ [pipe (#+ case>)]
+ ["." try]
+ [parser
+ ["<c>" code]]]
+ [data
+ ["." text
+ ["%" format (#+ format)]]
+ [number
+ ["n" nat]]
+ [collection
+ ["." set (#+ Set)]
+ ["." dictionary (#+ Dictionary)]
+ ["." list ("#@." functor)]]]
+ [math
+ ["." random (#+ Random) ("#@." monad)]]
+ [macro
+ ["." code]]]
+ {#program
+ ["." /
+ ["/#" // #_
+ ["#" profile]
+ ["#." project (#+ Project)]
+ ["#." artifact (#+ Artifact)]
+ ["#." dependency (#+ Repository Dependency)]
+ ["#." format]]]})
+
+(def: distribution
+ (Random //.Distribution)
+ (random.or (random@wrap [])
+ (random@wrap [])))
+
+(def: license
+ (Random //.License)
+ ($_ random.and
+ (random.ascii/alpha 1)
+ (random.ascii/alpha 1)
+ ..distribution))
+
+(def: scm
+ (Random //.SCM)
+ (random.ascii/alpha 1))
+
+(def: organization
+ (Random //.Organization)
+ ($_ random.and
+ (random.ascii/alpha 1)
+ (random.ascii/alpha 1)))
+
+(def: email
+ (Random //.Email)
+ (random.ascii/alpha 1))
+
+(def: developer
+ (Random //.Developer)
+ ($_ random.and
+ (random.ascii/alpha 1)
+ (random.ascii/alpha 1)
+ (random.maybe organization)))
+
+(def: contributor
+ (Random //.Contributor)
+ ..developer)
+
+(def: (list-of random)
+ (All [a] (-> (Random a) (Random (List a))))
+ (do {@ random.monad}
+ [size (:: @ map (n.% 5) random.nat)]
+ (random.list size random)))
+
+(def: (set-of hash random)
+ (All [a] (-> (Hash a) (Random a) (Random (Set a))))
+ (:: random.functor map
+ (set.from-list hash)
+ (..list-of random)))
+
+(def: (dictionary-of key-hash key-random value-random)
+ (All [k v] (-> (Hash k) (Random k) (Random v) (Random (Dictionary k v))))
+ (:: random.functor map
+ (dictionary.from-list key-hash)
+ (..list-of (random.and key-random value-random))))
+
+(def: info
+ (Random //.Info)
+ ($_ random.and
+ (random.maybe (random.ascii/alpha 1))
+ (random.maybe ..scm)
+ (random.maybe (random.ascii/alpha 1))
+ (..list-of ..license)
+ (random.maybe ..organization)
+ (..list-of ..developer)
+ (..list-of ..contributor)
+ ))
+
+(def: name
+ (Random //.Name)
+ (random.ascii/alpha 1))
+
+(def: artifact
+ (Random Artifact)
+ ($_ random.and
+ (random.ascii/alpha 1)
+ (random.ascii/alpha 1)
+ (random.ascii/alpha 1)))
+
+(def: repository
+ (Random Repository)
+ (random.ascii/alpha 1))
+
+(def: dependency
+ (Random Dependency)
+ ($_ random.and
+ ..artifact
+ (random.ascii/alpha 1)))
+
+(def: source
+ (Random //.Source)
+ (random.ascii/alpha 1))
+
+(def: target
+ (Random //.Target)
+ (random.ascii/alpha 1))
+
+(def: profile
+ (Random //.Profile)
+ ($_ random.and
+ (..list-of ..name)
+ (random.maybe ..artifact)
+ (random.maybe ..info)
+ (..set-of text.hash ..repository)
+ (..set-of //dependency.hash ..dependency)
+ (..set-of text.hash ..source)
+ (random.maybe ..target)
+ (random.maybe (random.ascii/alpha 1))
+ (random.maybe (random.ascii/alpha 1))
+ (..dictionary-of text.hash (random.ascii/alpha 1) ..repository)
+ ))
+
+(def: project
+ (Random Project)
+ (..dictionary-of text.hash ..name ..profile))
+
+(def: with-default-sources
+ (-> //.Profile //.Profile)
+ (update@ #//.sources
+ (: (-> (Set //.Source) (Set //.Source))
+ (function (_ sources)
+ (if (set.empty? sources)
+ (set.from-list text.hash (list //.default-source))
+ sources)))))
+
+(def: single-profile
+ Test
+ (do random.monad
+ [expected ..profile]
+ (_.test "Single profile."
+ (|> expected
+ //format.profile
+ list
+ (<c>.run /.project)
+ (case> (#try.Success actual)
+ (|> expected
+ ..with-default-sources
+ [//.default]
+ list
+ (dictionary.from-list text.hash)
+ (:: //project.equivalence = actual))
+
+ (#try.Failure error)
+ false)))))
+
+(def: (with-empty-profile project)
+ (-> Project Project)
+ (if (dictionary.empty? project)
+ //project.empty
+ project))
+
+(def: multiple-profiles
+ Test
+ (do random.monad
+ [expected ..project]
+ (_.test "Multiple profiles."
+ (|> expected
+ //format.project
+ list
+ (<c>.run /.project)
+ (case> (#try.Success actual)
+ (|> expected
+ ..with-empty-profile
+ dictionary.entries
+ (list@map (function (_ [name profile])
+ [name (..with-default-sources profile)]))
+ (dictionary.from-list text.hash)
+ (:: //project.equivalence = actual))
+
+ (#try.Failure error)
+ false)))))
+
+(def: #export test
+ Test
+ (<| (_.covering /._)
+ (_.with-cover [/.project]
+ ($_ _.and
+ ..single-profile
+ ..multiple-profiles
+ ))))