From ce7614f00a134cb61b4a6f88cfea33461a7bf478 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 7 Oct 2020 17:00:57 -0400 Subject: Test imports for circular dependencies. --- stdlib/source/test/aedifex/parser.lux | 212 ++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 stdlib/source/test/aedifex/parser.lux (limited to 'stdlib/source/test/aedifex') 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 + ["" 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 + (.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 + (.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 + )))) -- cgit v1.2.3