(.module: [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)] ["." predicate] {[0 #spec] [/ ["$." equivalence]]}] [control ["." try] ["." exception] [concurrency ["." promise]]] [data ["." product] ["." binary] ["." text ["." encoding]] [format ["." xml]] [collection ["." dictionary] ["." set]]] [math ["." random (#+ Random)]]] ["$." /// #_ ["#." package] ["#." repository] ["#." artifact] [// [lux [data ["$." binary]]]]] {#program ["." / ["//#" /// #_ ["#" profile] ["#." package (#+ Package)] ["#." hash] ["#." dependency ["#/." status]] ["#." pom] ["#." artifact (#+ Artifact) ["#/." type] ["#/." extension]] ["#." repository (#+ Simulation) ["#/." origin]]]]}) (def: random (Random /.Resolution) (do {! random.monad} [artifact $///artifact.random [_ package] $///package.random] (wrap (dictionary.put {#///dependency.artifact artifact #///dependency.type ///artifact/type.lux_library} package /.empty)))) (def: #export (single artifact package) (-> Artifact Package (Simulation Any)) (structure (def: (on_download uri state) (if (text.contains? (///artifact.uri artifact) uri) (cond (text.ends_with? ///artifact/extension.lux_library uri) (#try.Success [state (|> package (get@ #///package.library) product.left)]) (text.ends_with? ///artifact/extension.pom uri) (#try.Success [state (|> package (get@ #///package.pom) product.left (\ xml.codec encode) (\ encoding.utf8 encode))]) ## (text.ends_with? ///artifact/extension.sha-1 uri) ## (#try.Success [state (|> package ## (get@ #///package.sha-1) ## (\ ///hash.sha-1_codec encode) ## (\ encoding.utf8 encode))]) ## (text.ends_with? ///artifact/extension.md5 uri) ## (#try.Success [state (|> package ## (get@ #///package.md5) ## (\ ///hash.md5_codec encode) ## (\ encoding.utf8 encode))]) ## else (#try.Failure "NOPE")) (#try.Failure "NOPE"))) (def: (on_upload uri binary state) (#try.Failure "NOPE")))) (def: one Test (do {! random.monad} [expected_artifact $///artifact.random [_ expected_package] $///package.random [_ dummy_package] (random.filter (|>> product.right (set@ #///package.pom (get@ #///package.pom expected_package)) (\ ///package.equivalence = expected_package) not) $///package.random) #let [good (..single expected_artifact expected_package) bad_sha-1 (: (Simulation Any) (structure (def: (on_download uri state) (if (text.contains? (///artifact.uri expected_artifact) uri) (cond (text.ends_with? ///artifact/extension.lux_library uri) (#try.Success [state (|> expected_package (get@ #///package.library) product.left)]) (text.ends_with? ///artifact/extension.pom uri) (#try.Success [state (|> expected_package (get@ #///package.pom) product.left (\ xml.codec encode) (\ encoding.utf8 encode))]) ## (text\= extension ///artifact/extension.sha-1) ## (#try.Success [state (|> dummy_package ## (get@ #///package.sha-1) ## (\ ///hash.sha-1_codec encode) ## (\ encoding.utf8 encode))]) ## (text\= extension ///artifact/extension.md5) ## (#try.Success [state (|> expected_package ## (get@ #///package.md5) ## (\ ///hash.md5_codec encode) ## (\ encoding.utf8 encode))]) ## else (#try.Failure "NOPE")) (#try.Failure "NOPE"))) (def: (on_upload uri binary state) (#try.Failure "NOPE")))) bad_md5 (: (Simulation Any) (structure (def: (on_download uri state) (if (text.contains? (///artifact.uri expected_artifact) uri) (cond (text.ends_with? ///artifact/extension.lux_library uri) (#try.Success [state (|> expected_package (get@ #///package.library) product.left)]) (text.ends_with? ///artifact/extension.pom uri) (#try.Success [state (|> expected_package (get@ #///package.pom) product.left (\ xml.codec encode) (\ encoding.utf8 encode))]) ## (text\= extension ///artifact/extension.sha-1) ## (#try.Success [state (|> expected_package ## (get@ #///package.sha-1) ## (\ ///hash.sha-1_codec encode) ## (\ encoding.utf8 encode))]) ## (text\= extension ///artifact/extension.md5) ## (#try.Success [state (|> dummy_package ## (get@ #///package.md5) ## (\ ///hash.md5_codec encode) ## (\ encoding.utf8 encode))]) ## else (#try.Failure "NOPE")) (#try.Failure "NOPE"))) (def: (on_upload uri binary state) (#try.Failure "NOPE"))))]] (`` ($_ _.and (wrap (do promise.monad [actual_package (/.one (///repository.mock good []) {#///dependency.artifact expected_artifact #///dependency.type ///artifact/type.lux_library})] (_.cover' [/.one] (case actual_package (#try.Success actual_package) (\ ///package.equivalence = (set@ #///package.origin (#///repository/origin.Remote "") expected_package) actual_package) (#try.Failure _) false)))) (~~ (template [ ] [(wrap (do promise.monad [actual_package (/.one (///repository.mock []) {#///dependency.artifact expected_artifact #///dependency.type ///artifact/type.lux_library})] (_.cover' [] (case actual_package (#try.Failure error) (exception.match? error) (#try.Success _) false))))] [/.sha-1_does_not_match bad_sha-1] [/.md5_does_not_match bad_md5] )) )))) (def: any Test (do {! random.monad} [expected_artifact $///artifact.random [_ expected_package] $///package.random [_ dummy_package] (random.filter (|>> product.right (set@ #///package.pom (get@ #///package.pom expected_package)) (\ ///package.equivalence = expected_package) not) $///package.random) #let [good (..single expected_artifact expected_package) bad_sha-1 (: (Simulation Any) (structure (def: (on_download uri state) (if (text.contains? (///artifact.uri expected_artifact) uri) (cond (text.ends_with? ///artifact/extension.lux_library uri) (#try.Success [state (|> expected_package (get@ #///package.library) product.left)]) (text.ends_with? ///artifact/extension.pom uri) (#try.Success [state (|> expected_package (get@ #///package.pom) product.left (\ xml.codec encode) (\ encoding.utf8 encode))]) ## (text\= extension ///artifact/extension.sha-1) ## (#try.Success [state (|> dummy_package ## (get@ #///package.sha-1) ## (\ ///hash.sha-1_codec encode) ## (\ encoding.utf8 encode))]) ## (text\= extension ///artifact/extension.md5) ## (#try.Success [state (|> expected_package ## (get@ #///package.md5) ## (\ ///hash.md5_codec encode) ## (\ encoding.utf8 encode))]) ## else (#try.Failure "NOPE")) (#try.Failure "NOPE"))) (def: (on_upload uri binary state) (#try.Failure "NOPE")))) bad_md5 (: (Simulation Any) (structure (def: (on_download uri state) (if (text.contains? (///artifact.uri expected_artifact) uri) (cond (text.ends_with? ///artifact/extension.lux_library uri) (#try.Success [state (|> expected_package (get@ #///package.library) product.left)]) (text.ends_with? ///artifact/extension.pom uri) (#try.Success [state (|> expected_package (get@ #///package.pom) product.left (\ xml.codec encode) (\ encoding.utf8 encode))]) ## (text\= extension ///artifact/extension.sha-1) ## (#try.Success [state (|> expected_package ## (get@ #///package.sha-1) ## (\ ///hash.sha-1_codec encode) ## (\ encoding.utf8 encode))]) ## (text\= extension ///artifact/extension.md5) ## (#try.Success [state (|> dummy_package ## (get@ #///package.md5) ## (\ ///hash.md5_codec encode) ## (\ encoding.utf8 encode))]) ## else (#try.Failure "NOPE")) (#try.Failure "NOPE"))) (def: (on_upload uri binary state) (#try.Failure "NOPE"))))]] ($_ _.and (wrap (do promise.monad [actual_package (/.any (list (///repository.mock bad_sha-1 []) (///repository.mock bad_md5 []) (///repository.mock good [])) {#///dependency.artifact expected_artifact #///dependency.type ///artifact/type.lux_library})] (_.cover' [/.any] (case actual_package (#try.Success actual_package) (\ ///package.equivalence = (set@ #///package.origin (#///repository/origin.Remote "") expected_package) actual_package) (#try.Failure _) false)))) (wrap (do promise.monad [actual_package (/.any (list (///repository.mock bad_sha-1 []) (///repository.mock bad_md5 [])) {#///dependency.artifact expected_artifact #///dependency.type ///artifact/type.lux_library})] (_.cover' [/.cannot_resolve] (case actual_package (#try.Failure error) (exception.match? /.cannot_resolve error) (#try.Success _) false)))) ))) (def: all Test (do {! random.monad} [dependee_artifact $///artifact.random depender_artifact (random.filter (predicate.complement (\ ///artifact.equivalence = dependee_artifact)) $///artifact.random) ignored_artifact (random.filter (predicate.complement (predicate.unite (\ ///artifact.equivalence = dependee_artifact) (\ ///artifact.equivalence = depender_artifact))) $///artifact.random) [_ dependee_package] $///package.random [_ depender_package] $///package.random [_ ignored_package] $///package.random #let [dependee {#///dependency.artifact dependee_artifact #///dependency.type ///artifact/type.lux_library} depender {#///dependency.artifact depender_artifact #///dependency.type ///artifact/type.lux_library} ignored {#///dependency.artifact ignored_artifact #///dependency.type ///artifact/type.lux_library} dependee_pom (|> (\ ///.monoid identity) (set@ #///.identity (#.Some dependee_artifact)) ///pom.write try.assume) depender_pom (|> (\ ///.monoid identity) (set@ #///.identity (#.Some depender_artifact)) (set@ #///.dependencies (set.from_list ///dependency.hash (list dependee))) ///pom.write try.assume) ignored_pom (|> (\ ///.monoid identity) (set@ #///.identity (#.Some ignored_artifact)) ///pom.write try.assume) dependee_package (set@ #///package.pom [dependee_pom #///dependency/status.Unverified] dependee_package) depender_package (set@ #///package.pom [depender_pom #///dependency/status.Unverified] depender_package) ignored_package (set@ #///package.pom [ignored_pom #///dependency/status.Unverified] ignored_package)]] ($_ _.and (wrap (do promise.monad [resolution (/.all (list (///repository.mock (..single dependee_artifact dependee_package) []) (///repository.mock (..single depender_artifact depender_package) []) (///repository.mock (..single ignored_artifact ignored_package) [])) (list depender) /.empty)] (_.cover' [/.all] (case resolution (#try.Success resolution) (and (dictionary.key? resolution depender) (dictionary.key? resolution dependee) (not (dictionary.key? resolution ignored))) (#try.Failure error) false)))) ))) (def: #export test Test (<| (_.covering /._) (_.for [/.Resolution]) ($_ _.and (_.for [/.equivalence] ($equivalence.spec /.equivalence ..random)) (_.cover [/.empty] (dictionary.empty? /.empty)) ..one ..any ..all )))