(.module: [library [lux "*" ["_" test {"+" [Test]}] [abstract [equivalence {"+" [Equivalence]}] [hash {"+" [Hash]}] ["." monad {"+" [do]}]] [control ["." io] ["." try] ["." exception {"+" [exception:]}]] [data ["." product] ["." binary {"+" [Binary]}] ["." text ["%" format {"+" [format]}]] [collection ["." dictionary {"+" [Dictionary]}]]] [math ["." random {"+" [Random]}]] [world [net ["." uri {"+" [URI]}]]]]] ["." / "_" ["#." identity] ["#." origin] ["#." local] ["#." remote] [// ["@." artifact]]] [\\specification ["$." /]] [\\program ["." / ["." remote] ["/#" // "_" ["#." artifact {"+" [Version Artifact]} ["#/." extension {"+" [Extension]}]]]]]) (def: artifact (-> Version Artifact) (|>> ["com.github.luxlang" "test-artifact"])) (exception: (not_found {uri URI}) (exception.report ["URI" (%.text uri)])) (exception: (cannot_upload {uri URI}) (exception.report ["URI" (%.text uri)])) (type: Store (Dictionary URI Binary)) (def: .public empty Store (dictionary.empty text.hash)) (def: valid_version Version "1.2.3-YES") (def: invalid_version Version "4.5.6-NO") (implementation: .public mock (/.Mock Store) (def: the_description "@") (def: (on_download uri state) (case (dictionary.value uri state) (#.Some content) (case (binary.size content) 0 (exception.except ..not_found [uri]) _ (#try.Success [state content])) #.None (exception.except ..not_found [uri]))) (def: (on_upload uri content state) (if (dictionary.key? state uri) (exception.except ..cannot_upload [uri]) (#try.Success (dictionary.has uri content state))))) (def: .public test Test (<| (_.covering /._) ($_ _.and (_.for [/.mock /.Mock] (do random.monad [_ (in [])] ($/.spec (..artifact ..valid_version) (..artifact ..invalid_version) (/.mock ..mock (|> ..empty (dictionary.has (remote.uri ..invalid_version (..artifact ..invalid_version) //artifact/extension.lux_library) (binary.empty 0))))))) /identity.test /origin.test /local.test /remote.test )))