eo-phi-normalizer 3.0.0 → 3.1.0
raw patch · 16 files changed
+1261/−113 lines, 16 files
Files
- CHANGELOG.md +13/−1
- app/Main.hs +7/−6
- eo-phi-normalizer.cabal +7/−3
- src/Language/EO/Phi.hs +9/−19
- src/Language/EO/Phi/Pipeline/Config.hs +109/−6
- src/Language/EO/Phi/Rules/PhiPaper.hs +0/−42
- src/Language/EO/Phi/TH.hs +11/−3
- test/Language/EO/Phi/DataizeSpec.hs +2/−12
- test/Language/EO/Phi/RewriteSpec.hs +81/−0
- test/Language/EO/PhiSpec.hs +4/−21
- test/Test/EO/Phi.hs +5/−0
- test/eo/phi/confluence.yaml +27/−0
- test/eo/phi/dataization.yaml +709/−0
- test/eo/phi/from-eo/as-phi.yaml +76/−0
- test/eo/phi/metrics.yaml +81/−0
- test/eo/phi/rewriting.yaml +120/−0
CHANGELOG.md view
@@ -6,11 +6,23 @@ and this project adheres to the [Haskell Package Versioning Policy](https://pvp.haskell.org/). +## v3.1.0 - 2024-12-28++### Breaking changes++- Use `new.yaml` in the CLI by default ([#658](https://github.com/objectionary/eo-phi-normalizer/pull/658))++### Changes and fixes++- Simplify pipeline config format ([#648](https://github.com/objectionary/eo-phi-normalizer/pull/648))+- Use dependencies for EO 0.50.0 ([#653](https://github.com/objectionary/eo-phi-normalizer/pull/653))+- Add tests from hone-maven-plugin ([#655](https://github.com/objectionary/eo-phi-normalizer/pull/655))+ ## v3.0.0 - 2024-12-28 ### Breaking changes -- Switch to built-in rules until `new.yaml` rules work ([#619](https://github.com/objectionary/eo-phi-normalizer/pull/619))+- Switch to built-in rules in the pipeline until `new.yaml` rules work ([#619](https://github.com/objectionary/eo-phi-normalizer/pull/619)) - Update EO to 0.50.0, use `yegor.yaml` by default ([#617](https://github.com/objectionary/eo-phi-normalizer/pull/617), [#641](https://github.com/objectionary/eo-phi-normalizer/pull/641)) ### Changes and fixes
app/Main.hs view
@@ -65,7 +65,7 @@ import Data.Text.Lazy as TL (unpack) import Data.Text.Lazy.Manipulate (toOrdinal) import Data.Version (showVersion)-import Data.Yaml (decodeFileThrow, decodeThrow)+import Data.Yaml (decodeThrow, encodeFile) import GHC.Generics (Generic) import Language.EO.Locale (withCorrectLocale) import Language.EO.Phi (Binding (..), Bytes (Bytes), Object (..), Program (Program), parseProgram, printTree)@@ -276,7 +276,7 @@ } rulesFile :: String-rulesFile = "yegor.yaml"+rulesFile = "new.yaml" commandParser :: CommandParser commandParser =@@ -607,7 +607,7 @@ -- Temporary hack while rules are not stabilized. -- Nothing -> return (True, "Yegor's rules (builtin)", [fastYegorInsideOutAsRule]) Nothing -> do- ruleSet :: RuleSet <- decodeThrow $(embedFileRelative "test/eo/phi/rules/yegor.yaml")+ ruleSet :: RuleSet <- decodeThrow $(embedFileRelative "test/eo/phi/rules/new.yaml") return (False, ruleSet.title, convertRuleNamed <$> ruleSet.rules) unless (single || json || latex) $ logStrLn ruleSetTitle bindingsWithDeps <- case deepMergePrograms (program' : deps) of@@ -766,7 +766,8 @@ in logStrLn (printAsProgramOrAsObject obj'') Right (Bytes bytes) -> logStrLn bytes CLI'Pipeline' (CLI'Pipeline'Report' CLI'Pipeline'Report{..}) -> do- pipelineConfig <- decodeFileThrow @_ @PipelineConfig configFile+ pipelineConfig <- readPipelineConfig configFile+ encodeFile "abra.yaml" pipelineConfig let testSets = filter (fromMaybe True . (.enable)) pipelineConfig.testSets programReports <- forM (zip [1 ..] testSets) $ \(index :: Int, (.phi) -> testSet) -> do let progress = [fmt|({index}/{length testSets})|] :: String@@ -796,10 +797,10 @@ createDirectoryIfMissing True (takeDirectory path) writeFile path reportString CLI'Pipeline' (CLI'Pipeline'PrepareTests' CLI'Pipeline'PrepareTests{..}) -> do- config <- decodeFileThrow @_ @PipelineConfig configFile+ config <- readPipelineConfig configFile PrepareTests.prepareTests config CLI'Pipeline' (CLI'Pipeline'PrintDataizeConfigs' CLI'Pipeline'PrintDataizeConfigs{..}) -> do- config <- decodeFileThrow @_ @PipelineConfig configFile+ config <- readPipelineConfig configFile PrintConfigs.printDataizeConfigs config phiPrefixesToStrip singleLine CLI'Test' (CLI'Test{..}) -> evalSpec defaultConfig (spec rulePaths)
eo-phi-normalizer.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: eo-phi-normalizer-version: 3.0.0+version: 3.1.0 synopsis: Command line normalizer of 𝜑-calculus expressions. description: Please see the README on GitHub at <https://github.com/objectionary/eo-phi-normalizer#readme> homepage: https://github.com/objectionary/eo-phi-normalizer#readme@@ -390,6 +390,11 @@ data/0.50.0/org/eolang/tuple.phi data/0.50.0/org/eolang/txt/sprintf.phi data/0.50.0/org/eolang/while.phi+ test/eo/phi/confluence.yaml+ test/eo/phi/dataization.yaml+ test/eo/phi/from-eo/as-phi.yaml+ test/eo/phi/metrics.yaml+ test/eo/phi/rewriting.yaml test/eo/phi/rules/new.yaml test/eo/phi/rules/streams.yaml test/eo/phi/rules/yegor.yaml@@ -430,7 +435,6 @@ Language.EO.Phi.Report.Html Language.EO.Phi.Rules.Common Language.EO.Phi.Rules.Fast- Language.EO.Phi.Rules.PhiPaper Language.EO.Phi.Rules.RunYegor Language.EO.Phi.Rules.Yaml Language.EO.Phi.Syntax@@ -561,7 +565,6 @@ Language.EO.Phi.Report.Html Language.EO.Phi.Rules.Common Language.EO.Phi.Rules.Fast- Language.EO.Phi.Rules.PhiPaper Language.EO.Phi.Rules.RunYegor Language.EO.Phi.Rules.Yaml Language.EO.Phi.Syntax@@ -625,6 +628,7 @@ main-is: Main.hs other-modules: Language.EO.Phi.DataizeSpec+ Language.EO.Phi.RewriteSpec Language.EO.PhiSpec Language.EO.Rules.PhiPaperSpec Language.EO.YamlSpec
src/Language/EO/Phi.hs view
@@ -22,21 +22,18 @@ -- SOFTWARE. {- FOURMOLU_ENABLE -} module Language.EO.Phi (- defaultMain, normalize, parseProgram, unsafeParseObject, unsafeParseProgram,+ unsafeParseProgramFromFile, module Language.EO.Phi.Syntax, ) where -import System.Exit (exitFailure)--import Language.EO.Phi.Syntax.Abs qualified as Phi-import Language.EO.Phi.Syntax.Par qualified as Phi- import Language.EO.Phi.Normalize import Language.EO.Phi.Syntax+import Language.EO.Phi.Syntax.Abs qualified as Phi+import Language.EO.Phi.Syntax.Par qualified as Phi -- | Parse a 'Program' or return a parsing error. parseProgram :: String -> Either String Phi.Program@@ -59,16 +56,9 @@ unsafeParseObject :: String -> Phi.Object unsafeParseObject = either error id . parseObject --- | Default entry point.--- Parses a 𝜑-program from standard input, normalizes,--- then pretty-prints the result to standard output.-defaultMain :: IO ()-defaultMain = do- input <- getContents -- read entire standard input- let tokens = Phi.myLexer input- case Phi.pProgram tokens of- Left parseError -> do- putStrLn parseError- exitFailure- Right program -> do- putStrLn (printTree (normalize program))+unsafeParseProgramFromFile :: FilePath -> IO Phi.Program+unsafeParseProgramFromFile inputFile = do+ src <- readFile inputFile+ case parseProgram src of+ Left err -> error ("Error parsing program from '" ++ inputFile ++ "':\n" ++ err)+ Right program -> pure program
src/Language/EO/Phi/Pipeline/Config.hs view
@@ -27,17 +27,28 @@ {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE OverloadedRecordDot #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE RankNTypes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-} {-# OPTIONS_GHC -Wno-partial-fields #-} module Language.EO.Phi.Pipeline.Config where +import Control.Monad.IO.Class (MonadIO) import Data.Aeson (ToJSON) import Data.Aeson.Types (FromJSON)+import Data.Functor ((<&>))+import Data.List (intercalate)+import Data.Yaml (decodeFileThrow) import GHC.Generics (Generic) import Language.EO.Phi.Metrics.Data import Language.EO.Phi.TH (deriveJSON)+import PyF (fmt) import Text.Printf (printf) data TestSetPhi = TestSetPhi@@ -127,16 +138,65 @@ $(deriveJSON ''AtomsSet) -data TestSet = TestSet- { eo :: TestSetEO- , phi :: TestSetPhi- , atoms :: Maybe AtomsSet+data PathPrefixEO = PathPrefixEO+ { original :: FilePath+ , yaml :: FilePath+ , filtered :: FilePath+ }+ deriving stock (Show, Generic)++$(deriveJSON ''PathPrefixEO)++data PathPrefixPhi = PathPrefixPhi+ { initial :: FilePath+ , normalized :: FilePath+ }+ deriving stock (Show, Generic)++$(deriveJSON ''PathPrefixPhi)++data PathPrefix = PathPrefix+ { eo :: PathPrefixEO+ , phi :: PathPrefixPhi+ }+ deriving stock (Show, Generic)++$(deriveJSON ''PathPrefix)++data Common = Common+ { pathPrefix :: PathPrefix+ , bindingsPath :: Maybe String+ }+ deriving stock (Show, Generic)++$(deriveJSON ''Common)++data Individual = Individual+ { name :: String , enable :: Maybe Bool- -- ^- -- Whether to enable this test set.+ , include :: Maybe [String]+ , exclude :: Maybe [String]+ , atoms :: Maybe AtomsSet } deriving stock (Show, Generic) +$(deriveJSON ''Individual)++data TestSet+ = TestSetExtended+ { eo :: TestSetEO+ , phi :: TestSetPhi+ , atoms :: Maybe AtomsSet+ , enable :: Maybe Bool+ -- ^+ -- Whether to enable this test set.+ }+ | TestSetCompact+ { common :: Common+ , individual :: [Individual]+ }+ deriving stock (Show, Generic)+ $(deriveJSON ''TestSet) data PipelineConfig = PipelineConfig@@ -152,3 +212,46 @@ | -- | GitHub Flavored Markdown ReportFormat'Markdown deriving stock (Eq)++split :: forall a. (a -> Bool) -> [a] -> [[a]]+split cond xs = go xs [] []+ where+ go [] _ res = res+ go (y : ys) curSpan res+ | cond y = go ys [] (res <> [curSpan])+ | otherwise = go ys (curSpan <> [y]) res++-- >>> split @Int (== 3) [1,2,3,3,4,3]++toExtended :: PipelineConfig -> PipelineConfig+toExtended c@(PipelineConfig{testSets}) = c{testSets = concatMap go testSets}+ where+ go = \case+ e@TestSetExtended{} -> [e]+ TestSetCompact{..} -> go1 common <$> individual++ go1 (Common{..}) (Individual{..}) = TestSetExtended{..}+ where+ mkPath :: FilePath -> String -> String+ mkPath prefix extension = [fmt|{prefix}/{name}.{extension}|]+ eo =+ TestSetEO+ { original = mkPath pathPrefix.eo.original "eo"+ , yaml = mkPath pathPrefix.eo.yaml "yaml"+ , filtered = mkPath pathPrefix.eo.filtered "eo"+ , include+ , exclude+ }+ phi =+ TestSetPhi+ { initial = mkPath pathPrefix.phi.initial "phi"+ , normalized = mkPath pathPrefix.phi.normalized "phi"+ , bindingsPathInitial = bindingsPath <&> mkBindingsPathSuffix+ , bindingsPathNormalized = bindingsPath <&> mkBindingsPathSuffix+ }+ where+ name' = split (== '/') name+ mkBindingsPathSuffix x = x <> intercalate "." (if name' /= [] then init name' else [])++readPipelineConfig :: (MonadIO m) => FilePath -> m PipelineConfig+readPipelineConfig path = toExtended <$> decodeFileThrow @_ @PipelineConfig path
− src/Language/EO/Phi/Rules/PhiPaper.hs
@@ -1,42 +0,0 @@-{- FOURMOLU_DISABLE -}--- The MIT License (MIT)---- Copyright (c) 2016-2024 Objectionary.com---- Permission is hereby granted, free of charge, to any person obtaining a copy--- of this software and associated documentation files (the "Software"), to deal--- in the Software without restriction, including without limitation the rights--- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell--- copies of the Software, and to permit persons to whom the Software is--- furnished to do so, subject to the following conditions:---- The above copyright notice and this permission notice shall be included--- in all copies or substantial portions of the Software.---- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR--- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,--- FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE--- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER--- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,--- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE--- SOFTWARE.-{- FOURMOLU_ENABLE -}-module Language.EO.Phi.Rules.PhiPaper where--import Control.Monad (guard)-import Language.EO.Phi-import Language.EO.Phi.Rules.Common---- * Yegor's Rules---- | Rule 6.-rule6 :: Rule-rule6 ctx (ObjectDispatch (Formation bindings) a)- | Just obj <- lookupBinding a bindings = do- guard (isNF ctx obj)- return (Application obj [AlphaBinding Rho (Formation bindings')])- where- bindings' = filter (not . isDispatched) bindings- isDispatched (AlphaBinding a' _) = a == a'- isDispatched _ = False-rule6 _ _ = []
src/Language/EO/Phi/TH.hs view
@@ -23,13 +23,21 @@ {- FOURMOLU_ENABLE -} module Language.EO.Phi.TH where -import Data.Aeson (Options (..), camelTo2)-import Data.Aeson.TH as TH (deriveJSON)+import Data.Aeson (Options (..), SumEncoding (..), camelTo2)+import Data.Aeson.TH as TH (deriveFromJSON, deriveJSON) import Data.Aeson.Types (defaultOptions) import Language.Haskell.TH (Dec, Name, Q) defaultOptions' :: Options-defaultOptions' = defaultOptions{fieldLabelModifier = camelTo2 '-', rejectUnknownFields = True}+defaultOptions' =+ defaultOptions+ { fieldLabelModifier = camelTo2 '-'+ , rejectUnknownFields = True+ , sumEncoding = UntaggedValue+ } deriveJSON :: Name -> Q [Dec] deriveJSON = TH.deriveJSON defaultOptions'++deriveFromJSON :: Name -> Q [Dec]+deriveFromJSON = TH.deriveFromJSON defaultOptions'
test/Language/EO/Phi/DataizeSpec.hs view
@@ -38,7 +38,7 @@ import Language.EO.Phi.Dependencies (deepMergePrograms) import Language.EO.Phi.Rules.Common (equalObject) import Language.EO.Phi.Rules.Yaml (convertRuleNamed, parseRuleSetFromFile, rules)-import Test.EO.Phi (DataizationResult (Bytes, Object), DataizeTest (..), DataizeTestGroup (..), dataizationTests)+import Test.EO.Phi (DataizationResult (Bytes, Object), DataizeTest (..), DataizeTestGroup (..), dataizationTests, progToObj) newtype ObjectOrBytes = ObjectOrBytes (Either Phi.Object Phi.Bytes) @@ -53,13 +53,6 @@ x == y _ == _ = False -getProgram :: FilePath -> IO Phi.Program-getProgram inputFile = do- src <- readFile inputFile- case Phi.parseProgram src of- Left err -> error ("Error parsing program from '" ++ inputFile ++ "': " ++ err)- Right program -> pure program- spec :: Spec spec = do DataizeTestGroup{..} <- runIO (dataizationTests "test/eo/phi/dataization.yaml")@@ -75,7 +68,7 @@ describe rulesTitle do forM_ tests $ \test -> do- deps <- runIO $ mapM getProgram test.dependencies+ deps <- runIO $ mapM Phi.unsafeParseProgramFromFile test.dependencies let mergedProgs = case deepMergePrograms (test.input : deps) of Left err -> error ("Error merging programs: " ++ err) Right prog -> prog@@ -87,6 +80,3 @@ it test.name $ do let dataizedResult = dataizeRecursively ctx inputObj ObjectOrBytes dataizedResult `shouldBe` ObjectOrBytes expectedResult--progToObj :: Phi.Program -> Phi.Object-progToObj (Phi.Program bindings) = Phi.Formation bindings
+ test/Language/EO/Phi/RewriteSpec.hs view
@@ -0,0 +1,81 @@+{- FOURMOLU_DISABLE -}+-- The MIT License (MIT)++-- Copyright (c) 2016-2024 Objectionary.com++-- Permission is hereby granted, free of charge, to any person obtaining a copy+-- of this software and associated documentation files (the "Software"), to deal+-- in the Software without restriction, including without limitation the rights+-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+-- copies of the Software, and to permit persons to whom the Software is+-- furnished to do so, subject to the following conditions:++-- The above copyright notice and this permission notice shall be included+-- in all copies or substantial portions of the Software.++-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+-- FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE+-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+-- SOFTWARE.+{- FOURMOLU_ENABLE -}+{-# LANGUAGE BlockArguments #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedRecordDot #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}++module Language.EO.Phi.RewriteSpec where++import Control.Monad (forM_)+import Data.Yaml qualified as Yaml+import GHC.Generics (Generic)+import Language.EO.Phi (Program (..))+import Language.EO.Phi.Dataize.Context (defaultContext)+import Language.EO.Phi.Rules.Common (applyRules)+import Language.EO.Phi.Rules.Yaml (convertRuleNamed, parseRuleSetFromFile, rules)+import Language.EO.Phi.Syntax (printTree)+import Language.EO.Phi.TH+import Test.EO.Phi (progToObj)+import Test.Hspec++data Test = Test+ { name :: String+ , input :: Program+ , output :: Program+ }+ deriving stock (Generic, Show)++$(deriveFromJSON ''Test)++data RewriteTests = RewriteTests+ { title :: String+ , tests :: [Test]+ }+ deriving stock (Generic, Show)++$(deriveFromJSON ''RewriteTests)++spec :: Spec+spec = do+ rewriteTests <- runIO (Yaml.decodeFileThrow @_ @RewriteTests "test/eo/phi/rewriting.yaml")+ describe rewriteTests.title do+ forM_+ [ ("New Yegor's rules", "test/eo/phi/rules/new.yaml")+ ]+ $ \(rulesTitle, rulesFile) -> do+ ruleset <- runIO $ parseRuleSetFromFile rulesFile+ let rules' = convertRuleNamed <$> ruleset.rules+ describe rulesTitle do+ forM_ rewriteTests.tests $+ \test -> it test.name do+ let+ inputObj = progToObj test.input+ expectedOutputObj = progToObj test.output+ ctx = defaultContext rules' inputObj+ outputObj = head $ applyRules ctx inputObj+ printTree outputObj `shouldBe` printTree expectedOutputObj
test/Language/EO/PhiSpec.hs view
@@ -25,10 +25,8 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedRecordDot #-}-{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TypeApplications #-}-{-# LANGUAGE ViewPatterns #-} module Language.EO.PhiSpec where @@ -37,15 +35,12 @@ import Data.List (dropWhileEnd) import Data.String (IsString (..)) import Data.Yaml (decodeFileThrow)-import Language.EO.Phi-import Language.EO.Phi.Dataize.Context (defaultContext)+import Language.EO.Phi (Binding (..), Object, Program (..), normalize, printTree) import Language.EO.Phi.Metrics.Collect (getProgramMetrics) import Language.EO.Phi.Metrics.Data (BindingsByPathMetrics (..), ProgramMetrics (..))-import Language.EO.Phi.Rules.Common (Rule, equalProgram)-import Language.EO.Phi.Rules.PhiPaper (rule6)-import PyF (fmt)-import Test.EO.Phi-import Test.Hspec+import Language.EO.Phi.Rules.Common (equalProgram)+import Test.EO.Phi (PhiTest (..), PhiTestGroup (..), allPhiTests)+import Test.Hspec (Spec, describe, it, runIO, shouldBe, shouldSatisfy) import Test.Metrics.Phi (MetricsTest (..), MetricsTestSet (..)) applyRule :: (Object -> [Object]) -> Program -> [Program]@@ -57,15 +52,6 @@ spec :: Spec spec = do- describe "Pre-defined rules" $- forM_ ([(6, rule6)] :: [(Int, Rule)]) $- \(idx, rule) -> do- PhiTestGroup{..} <- runIO (fileTests [fmt|test/eo/phi/rule-{idx}.yaml|])- describe title $- forM_ tests $- \PhiTest{..} ->- it name $- applyRule (rule (defaultContext [] (progToObj input))) input `shouldBe` [normalized] describe "Programs translated from EO" $ do phiTests <- runIO (allPhiTests "test/eo/phi/from-eo/") forM_ phiTests $ \PhiTestGroup{..} ->@@ -86,6 +72,3 @@ trim :: String -> String trim = dropWhileEnd isSpace--progToObj :: Program -> Object-progToObj (Program bindings) = Formation bindings
test/Test/EO/Phi.hs view
@@ -71,10 +71,12 @@ , dependencies :: [FilePath] } deriving (Generic, FromJSON)+ data DataizationResult = Bytes {bytes :: Phi.Bytes} | Object {object :: Phi.Object} deriving (Generic, Show)+ instance FromJSON DataizationResult where parseJSON = genericParseJSON defaultOptions{sumEncoding = UntaggedValue} @@ -101,3 +103,6 @@ parseJSON = fmap unsafeParseObject . parseJSON deriving newtype instance FromJSON Phi.Bytes++progToObj :: Phi.Program -> Phi.Object+progToObj (Phi.Program bindings) = Phi.Formation bindings
+ test/eo/phi/confluence.yaml view
@@ -0,0 +1,27 @@+# The MIT License (MIT)++# Copyright (c) 2016-2024 Objectionary.com++# Permission is hereby granted, free of charge, to any person obtaining a copy+# of this software and associated documentation files (the "Software"), to deal+# in the Software without restriction, including without limitation the rights+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+# copies of the Software, and to permit persons to whom the Software is+# furnished to do so, subject to the following conditions:++# The above copyright notice and this permission notice shall be included+# in all copies or substantial portions of the Software.++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+# SOFTWARE.++title: Manual (regression) tests for confluence+tests:+ - '⟦ ρ ↦ ⊥.a ⟧'+ - '⟦ ρ ↦ ⊥ () ⟧'+ - '⟦ v4 ↦ Φ (e6 ↦ ⟦ φ ↦ Φ ⟧.φ) ⟧'
+ test/eo/phi/dataization.yaml view
@@ -0,0 +1,709 @@+# The MIT License (MIT)++# Copyright (c) 2016-2024 Objectionary.com++# Permission is hereby granted, free of charge, to any person obtaining a copy+# of this software and associated documentation files (the "Software"), to deal+# in the Software without restriction, including without limitation the rights+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+# copies of the Software, and to permit persons to whom the Software is+# furnished to do so, subject to the following conditions:++# The above copyright notice and this permission notice shall be included+# in all copies or substantial portions of the Software.++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+# SOFTWARE.++title: Dataization tests+tests:+ - name: "Celsius example"+ dependencies:+ - ./data/0.50.0/org/eolang/number.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ c ↦ Φ̇.number(+ as-bytes ↦ Φ̇.bytes(+ ⟦ Δ ⤍ 40-39-00-00-00-00-00-00 ⟧+ )+ ),+ φ ↦ ξ.c.times(+ x ↦ ⟦+ Δ ⤍ 3F-FC-CC-CC-CC-CC-CC-CD+ ⟧+ ).plus(+ x ↦ ⟦+ Δ ⤍ 40-40-00-00-00-00-00-00+ ⟧+ )+ ⟧+ }+ output:+ object: "77.0"++ - name: "Equality of booleans (via equality of bytes)"+ dependencies:+ - ./data/0.50.0/org/eolang/bytes.phi+ - ./data/0.50.0/org/eolang/true.phi+ - ./data/0.50.0/org/eolang/false.phi+ input: |+ {+ ⟦+ φ ↦ Φ̇.true.eq(α0 ↦ Φ̇.true)+ ⟧+ }+ output:+ bytes: "01-"++ - name: "Program with ξ.ρ.ρ"+ dependencies: []+ input: |+ {+ ⟦+ x ↦ ⟦+ b ↦ ⟦+ Δ ⤍ 01-+ ⟧,+ φ ↦ ⟦+ b ↦ ⟦+ Δ ⤍ 02-+ ⟧,+ c ↦ ⟦+ a ↦ ξ.ρ.ρ.b,+ ρ ↦ ∅+ ⟧.a,+ ρ ↦ ∅+ ⟧.c,+ ρ ↦ ∅+ ⟧.φ,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ x ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧++ - name: "Preprocessing and dispatch"+ dependencies: []+ input: |+ {+ ⟦+ a ↦ ⟦+ b ↦ ⟦+ Δ ⤍ 01-+ ⟧+ ⟧.b,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ a ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧++ - name: "New values in copy through ξ"+ dependencies: []+ input: |+ {+ ⟦+ a ↦ ⟦+ b ↦ ∅,+ c ↦ ξ.b+ ⟧,+ d ↦ ξ.a(+ b ↦ ⟦+ Δ ⤍ 01-+ ⟧+ ).c,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ a ↦ ⟦ b ↦ ∅, c ↦ ξ.b ⟧, d ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧++ - name: "ρ-applications and stacked dispatches"+ dependencies: []+ input: |+ {+ ⟦+ x ↦ ⟦+ a ↦ ⟦+ b ↦ ⟦+ c ↦ ⟦+ Δ ⤍ 01-+ ⟧+ ⟧+ ⟧+ ⟧.a.b.c,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ x ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧++ - name: "ρ-applications and immediate dispatches"+ dependencies: []+ input: |+ {+ ⟦+ x ↦ ⟦+ a ↦ ⟦+ b ↦ ⟦+ c ↦ ⟦+ Δ ⤍ 01-+ ⟧+ ⟧.c+ ⟧.b+ ⟧.a,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ x ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧++ - name: "new values in copy through ρ"+ dependencies: []+ input: |+ {+ ⟦+ x ↦ ⟦+ a ↦ ⟦+ b ↦ ξ.ρ.c+ ⟧.b,+ c ↦ ∅+ ⟧,+ d ↦ ξ.x(+ c ↦ ⟦+ Δ ⤍ 01-+ ⟧+ ).a,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ x ↦ ⟦ a ↦ ⟦ b ↦ ξ.ρ.c ⟧.b, c ↦ ∅ ⟧, d ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧++ - name: "ρ and nested dispatches"+ dependencies: []+ input: |+ {+ ⟦+ x ↦ ⟦+ a ↦ ⟦+ b ↦ ⟦+ c ↦ ξ.ρ+ ⟧.c+ ⟧.b+ ⟧.a,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ x ↦ ⟦ b ↦ ⟦ c ↦ ξ.ρ ⟧.ρ, ρ ↦ ⟦ a ↦ ⟦ b ↦ ⟦ c ↦ ξ.ρ ⟧.ρ ⟧ ⟧ ⟧, λ ⤍ Package ⟧++ - name: "usage of Φ with a loop"+ dependencies: []+ input: |+ {+ ⟦+ a ↦ ⟦+ b ↦ Φ.a+ ⟧,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ a ↦ ⟦ b ↦ Φ.a ⟧, λ ⤍ Package ⟧++ - name: "ρ passed to both term of object application?"+ dependencies: []+ input: |+ {+ ⟦+ x ↦ ⟦+ c ↦ ⟦+ a ↦ ∅+ ⟧(+ a ↦ ⟦+ d ↦ ξ.ρ+ ⟧+ )+ ⟧.c,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ x ↦ ⟦+ a ↦ ⟦+ d ↦ ξ.ρ,+ ρ ↦ ⟦ c ↦ ⟦ a ↦ ∅ ⟧(a ↦ ⟦ d ↦ ξ.ρ ⟧) ⟧+ ⟧,+ ρ ↦ ⟦ c ↦ ⟦ a ↦ ∅ ⟧(a ↦ ⟦ d ↦ ξ.ρ ⟧) ⟧+ ⟧,+ λ ⤍ Package+ ⟧++ - name: "Object with ξ.ρ is an argument in application"+ dependencies: []+ input: |+ {+ ⟦+ a ↦ ⟦+ b ↦ ∅,+ x ↦ ⟦+ Δ ⤍ 01-+ ⟧+ ⟧(+ b ↦ ⟦+ c ↦ ξ.ρ.x+ ⟧+ ).b.c,+ x ↦ ⟦+ Δ ⤍ 02-+ ⟧,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ a ↦ ⟦ Δ ⤍ 02- ⟧, x ↦ ⟦ Δ ⤍ 02- ⟧, λ ⤍ Package ⟧++ # TODO #636:30min hangs+ # - name: "ξ in application"+ # dependencies: []+ # input: |+ # {⟦ x ↦ ⟦ a ↦ ∅ ⟧(a ↦ ξ.b), b ↦ ⟦ Δ ⤍ 01- ⟧ , λ ⤍ Package ⟧}+ # output:+ # object: |+ # ⟦ x ↦ ⟦+ # a ↦ ⟦+ # Δ ⤍ 01-,+ # ρ ↦ ⟦+ # b ↦ ⟦ Δ ⤍ 01- ⟧,+ # x ↦ ⟦ a ↦ ∅ ⟧ (a ↦ ξ.b),+ # λ ⤍ Package+ # ⟧+ # ⟧+ # ⟧,+ # b ↦ ⟦ Δ ⤍ 01- ⟧,+ # λ ⤍ Package+ # ⟧++ - name: "ξ chain"+ dependencies: []+ input: |+ {+ ⟦+ a ↦ ξ.b,+ b ↦ ξ.c,+ c ↦ ξ.d,+ d ↦ ⟦+ Δ ⤍ 01-+ ⟧,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦ a ↦ ⟦ Δ ⤍ 01- ⟧, b ↦ ⟦ Δ ⤍ 01- ⟧, c ↦ ⟦ Δ ⤍ 01- ⟧, d ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧++ # TODO #636:30min fails+ # - name: "cross-reference (1)"+ # dependencies: []+ # input: |+ # {⟦ x ↦ ⟦ a ↦ ⟦ b ↦ ξ.ρ.d.e, c ↦ ⟦ Δ ⤍ 01- ⟧, ρ ↦ ∅ ⟧, d ↦ ⟦ e ↦ ξ.ρ.a.c, ρ ↦ ∅ ⟧, ρ ↦ ∅ ⟧.a.b , λ ⤍ Package ⟧}+ # output:+ # object: |+ # NOT ⟦ x ↦ ⊥, λ ⤍ Package ⟧++ # TODO #636:30min fails+ # - name: "cross-reference (2)"+ # dependencies: []+ # input: |+ # {⟦ x ↦ ⟦ a ↦ ⟦ b ↦ ξ.ρ.d.e, c ↦ ξ.ρ.d.f ⟧, d ↦ ⟦ e ↦ ξ.ρ.a.c, f ↦ ⟦ Δ ⤍ 01- ⟧ ⟧ ⟧.a.b , λ ⤍ Package ⟧}+ # output:+ # object: |+ # NOT ⟦ x ↦ ⊥, λ ⤍ Package ⟧++ # TODO #636:30min fails+ # - name: "cross-reference + dispatch (1)"+ # dependencies: []+ # input: |+ # {⟦ x ↦ ⟦ a ↦ ⟦ b ↦ ξ.ρ.d, c ↦ ⟦ Δ ⤍ 01- ⟧ ⟧, d ↦ ⟦ e ↦ ξ.ρ.a.c ⟧ ⟧.a.b.e , λ ⤍ Package ⟧}+ # output:+ # object: |+ # NOT ⟦ x ↦ ⊥, λ ⤍ Package ⟧++ # TODO #636:30min fails+ # - name: "cross-reference + dispatch (1)"+ # dependencies: []+ # input: |+ # {⟦ x ↦ ⟦ a ↦ ⟦ b ↦ ξ.ρ.d, c ↦ ⟦ Δ ⤍ 01- ⟧ ⟧, d ↦ ⟦ e ↦ ξ.ρ.a.c ⟧ ⟧.a.b.e , λ ⤍ Package ⟧}+ # output:+ # object: |+ # NOT ⟦ x ↦ ⊥, λ ⤍ Package ⟧++ # TODO #636:30min fails+ # - name: "cross-reference + dispatch (2)"+ # dependencies: []+ # input: |+ # {⟦ x ↦ ⟦ a ↦ ⟦ b ↦ ξ.ρ.d, c ↦ ξ.ρ.d.f ⟧, d ↦ ⟦ e ↦ ξ.ρ.a.c, f ↦ ⟦ Δ ⤍ 01- ⟧ ⟧ ⟧.a.b.e , λ ⤍ Package ⟧}+ # output:+ # object: |+ # NOT ⟦ x ↦ ⊥, λ ⤍ Package ⟧++ # TODO #636:30min fails+ # - name: "cross-reference + dispatch (3)"+ # dependencies: []+ # input: |+ # {⟦ x ↦ ⟦ a ↦ ⟦ b ↦ ξ.ρ.d, c ↦ ξ.ρ.d ⟧, d ↦ ⟦ e ↦ ξ.ρ.a.c, f ↦ ⟦ Δ ⤍ 01- ⟧ ⟧ ⟧.a.b.e.f , λ ⤍ Package ⟧}+ # output:+ # object: |+ # NOT ⟦ x ↦ ⊥, λ ⤍ Package ⟧++ # TODO #636:30min fails+ # - name: "interleaving ρ and other dispatches"+ # dependencies: []+ # input: |+ # {⟦ x ↦ ⟦ a ↦ ξ.ρ.b.ρ.c ⟧.a, b ↦ ⟦⟧, c ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧}+ # output:+ # object: |+ # NOT ⟦ x ↦ ⟦ ⟧.ρ.b.ρ.c, b ↦ ⟦ ⟧, c ↦ ⟦ Δ ⤍ 01- ⟧, λ ⤍ Package ⟧++ - name: "Dataize in siblings of Package"+ dependencies:+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ org ↦ ⟦+ eolang ↦ ⟦+ bool ↦ ⟦+ α0 ↦ ∅,+ φ ↦ ξ.α0+ ⟧,+ x ↦ ⟦+ φ ↦ Φ̇.bool(+ Φ̇.bytes(+ ⟦ Δ ⤍ 01- ⟧+ )+ )+ ⟧,+ z ↦ ⟦+ y ↦ ⟦+ x ↦ ∅,+ φ ↦ ξ.x+ ⟧,+ φ ↦ Φ̇.bool(+ Φ̇.bytes(+ ⟦ Δ ⤍ 01- ⟧+ )+ )+ ⟧,+ λ ⤍ Package+ ⟧,+ λ ⤍ Package+ ⟧,+ λ ⤍ Package+ ⟧+ }+ output:+ object: |+ ⟦+ org ↦ ⟦+ eolang ↦ ⟦+ bool ↦ ⟦ α0 ↦ ∅, φ ↦ ξ.α0 ⟧,+ x ↦ ⟦ Δ ⤍ 01- ⟧,+ z ↦ ⟦ Δ ⤍ 01- ⟧,+ λ ⤍ Package+ ⟧,+ λ ⤍ Package+ ⟧,+ λ ⤍ Package+ ⟧++ - name: "int times and plus"+ dependencies:+ - ./data/0.50.0/org/eolang/i64.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ x ↦ ⟦+ x ↦ ⟦+ Δ ⤍ 09-+ ⟧,+ ρ ↦ ⟦+ Δ ⤍ 04-+ ⟧,+ λ ⤍ Lorg_eolang_int_times+ ⟧,+ ρ ↦ ⟦+ Δ ⤍ 06-+ ⟧,+ λ ⤍ Lorg_eolang_int_plus+ ⟧+ ⟧+ }+ output:+ object: "42"++ - name: "int greater than"+ dependencies:+ - ./data/0.50.0/org/eolang/i64.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ - ./data/0.50.0/org/eolang/false.phi+ - ./data/0.50.0/org/eolang/true.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ ρ ↦ ⟦+ Δ ⤍ 06-+ ⟧,+ x ↦ ⟦+ Δ ⤍ 09-+ ⟧,+ λ ⤍ Lorg_eolang_int_gt+ ⟧+ ⟧+ }+ output:+ bytes: "00-"++ # TODO #636:30min Missing int tests: div++ - name: "bitwise and"+ dependencies:+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ b ↦ ⟦+ Δ ⤍ 15-+ ⟧,+ ρ ↦ ⟦+ Δ ⤍ 0D-+ ⟧,+ λ ⤍ Lorg_eolang_bytes_and+ ⟧+ ⟧+ }+ output:+ bytes: "00-00-00-00-00-00-00-05"++ - name: "bitwise not"+ dependencies:+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ ρ ↦ ⟦+ Δ ⤍ 50-3D-10-C0-6F-12-42-69+ ⟧,+ λ ⤍ Lorg_eolang_bytes_not+ ⟧+ ⟧+ }+ output:+ bytes: "AF-C2-EF-3F-90-ED-BD-96"++ - name: "bytes size"+ dependencies:+ - ./data/0.50.0/org/eolang/i64.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ ρ ↦ ⟦+ Δ ⤍ 00-11-22-33-44+ ⟧,+ λ ⤍ Lorg_eolang_bytes_size+ ⟧+ ⟧+ }+ output:+ bytes: "00-00-00-00-00-00-00-05"++ - name: "bytes shift and equal"+ dependencies:+ - ./data/0.50.0/org/eolang/bytes.phi+ - ./data/0.50.0/org/eolang/true.phi+ - ./data/0.50.0/org/eolang/i64.phi+ - ./data/0.50.0/org/eolang/false.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ ρ ↦ ⟦+ Δ ⤍ 02-24-46-68-8A-AC-CE-F1+ ⟧,+ b ↦ ⟦+ ρ ↦ ⟦+ Δ ⤍ 11-22-33-44-55-66-77-88+ ⟧,+ x ↦ 3,+ λ ⤍ Lorg_eolang_bytes_right+ ⟧,+ λ ⤍ Lorg_eolang_bytes_eq+ ⟧+ ⟧+ }+ output:+ bytes: "01-"++ # TODO #636:30min Missing bytes tests: or, xor, slice, concat++ - name: "float times and plus (raw bytes)"+ dependencies:+ - ./data/0.50.0/org/eolang/number.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ x ↦ ⟦+ x ↦ ⟦+ Δ ⤍ 40-14-00-00-00-00-00-00+ ⟧,+ ρ ↦ ⟦+ Δ ⤍ 40-2A-66-66-66-66-66-66+ ⟧,+ λ ⤍ Lorg_eolang_number_times+ ⟧,+ ρ ↦ ⟦+ Δ ⤍ 40-0B-5C-28-F5-C2-8F-5C+ ⟧,+ λ ⤍ Lorg_eolang_number_plus+ ⟧+ ⟧+ }+ output:+ object: "69.42"++ - name: "float times and plus"+ dependencies:+ - ./data/0.50.0/org/eolang/number.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ x ↦ ⟦+ x ↦ 5.0,+ ρ ↦ 13.2,+ λ ⤍ Lorg_eolang_number_times+ ⟧,+ ρ ↦ 3.42,+ λ ⤍ Lorg_eolang_number_plus+ ⟧+ ⟧+ }+ output:+ object: "69.42"++ # TODO #636:30min Missing float tests: gt, div++ - name: "string slice (raw bytes)"+ dependencies:+ - ./data/0.50.0/org/eolang/string.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ start ↦ ⟦+ Δ ⤍ 40-00-00-00-00-00-00-00+ ⟧,+ len ↦ ⟦+ Δ ⤍ 40-14-00-00-00-00-00-00+ ⟧,+ ρ ↦ ⟦+ Δ ⤍ 48-65-6C-6C-6F-20-77-6F-72-6C-64+ ⟧,+ λ ⤍ Lorg_eolang_string_slice+ ⟧+ ⟧+ }+ output:+ object: "\"llo w\""++ - name: "string slice"+ dependencies:+ - ./data/0.50.0/org/eolang/string.phi+ - ./data/0.50.0/org/eolang/i64.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ start ↦ 2.0,+ len ↦ 5.0,+ ρ ↦ "Hello world",+ λ ⤍ Lorg_eolang_string_slice+ ⟧+ ⟧+ }+ output:+ object: "\"llo w\""++ - name: "string length (raw bytes)"+ dependencies:+ - ./data/0.50.0/org/eolang/string.phi+ - ./data/0.50.0/org/eolang/i64.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ ρ ↦ ⟦+ Δ ⤍ 48-65-6C-6C-6F-20-77-6F-72-6C-64+ ⟧,+ λ ⤍ Lorg_eolang_string_length+ ⟧+ ⟧+ }+ output:+ object: "11" # == 11++ - name: "string length"+ dependencies:+ - ./data/0.50.0/org/eolang/string.phi+ - ./data/0.50.0/org/eolang/i64.phi+ - ./data/0.50.0/org/eolang/bytes.phi+ input: |+ {+ ⟦+ φ ↦ ⟦+ ρ ↦ "Hello world",+ λ ⤍ Lorg_eolang_string_length+ ⟧+ ⟧+ }+ output:+ object: "11" # == 11++ # TODO #636:30min Missing malloc tests: (all)++ # TODO #636:30min Missing cage tests: (all)++ # TODO #636:30min Missing io tests: (all)++ # TODO #636:30min Other missing tests: dataized, error, seq, as_phi, rust, try
+ test/eo/phi/from-eo/as-phi.yaml view
@@ -0,0 +1,76 @@+# The MIT License (MIT)++# Copyright (c) 2016-2024 Objectionary.com++# Permission is hereby granted, free of charge, to any person obtaining a copy+# of this software and associated documentation files (the "Software"), to deal+# in the Software without restriction, including without limitation the rights+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+# copies of the Software, and to permit persons to whom the Software is+# furnished to do so, subject to the following conditions:++# The above copyright notice and this permission notice shall be included+# in all copies or substantial portions of the Software.++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+# SOFTWARE.++title: Processing terms generated from EO+tests:+ - name: "A program that prints itself"+ input: |+ {⟦org ↦ ⟦eolang ↦ ⟦prints-itself ↦ ⟦φ ↦ Φ.org.eolang.as-phi(α0 ↦ ξ).length.gt(α0 ↦ Φ.org.eolang.int(α0 ↦ Φ.org.eolang.bytes(Δ ⤍ 00-00-00-00-00-00-00-00)))⟧, prints-itself-to-console ↦ ⟦x ↦ Φ.org.eolang.int(α0 ↦ Φ.org.eolang.bytes(Δ ⤍ 00-00-00-00-00-00-00-2A)), φ ↦ Φ.org.eolang.io.stdout(α0 ↦ Φ.org.eolang.as-phi(α0 ↦ ξ))⟧, λ ⤍ Package⟧, λ ⤍ Package⟧⟧}+ normalized: |+ { ⟦ org ↦ ⟦ eolang ↦ ⟦ prints-itself ↦ ⟦ φ ↦ Φ.org.eolang.as-phi (α0 ↦ ξ).length.gt (α0 ↦ Φ.org.eolang.int (α0 ↦ Φ.org.eolang.bytes (Δ ⤍ 00-00-00-00-00-00-00-00))) ⟧, prints-itself-to-console ↦ ⟦ x ↦ Φ.org.eolang.int (α0 ↦ Φ.org.eolang.bytes (Δ ⤍ 00-00-00-00-00-00-00-2A)), φ ↦ Φ.org.eolang.io.stdout (α0 ↦ Φ.org.eolang.as-phi (α0 ↦ ξ)) ⟧, λ ⤍ Package ⟧, λ ⤍ Package ⟧ ⟧ }+ prettified: |+ {+ ⟦+ org ↦ ⟦+ eolang ↦ ⟦+ prints-itself ↦ ⟦+ φ ↦ Φ̇.as-phi(+ ξ+ ).length.gt(+ Φ̇.int(+ Φ̇.bytes(+ Δ ⤍ 00-00-00-00-00-00-00-00+ )+ )+ )+ ⟧,+ prints-itself-to-console ↦ ⟦+ x ↦ Φ̇.int(+ Φ̇.bytes(+ Δ ⤍ 00-00-00-00-00-00-00-2A+ )+ ),+ φ ↦ Φ̇.io.stdout(+ Φ̇.as-phi(+ ξ+ )+ )+ ⟧,+ λ ⤍ Package+ ⟧,+ λ ⤍ Package+ ⟧+ ⟧+ }+ - name: "Prints empty parentheses"+ input: |+ {⟦ m ↦ ⟦ x ↦ ⟦ ⟧ ⟧() ⟧}+ normalized: |+ {⟦ m ↦ ⟦ x ↦ ⟦ ⟧ ⟧() ⟧}+ prettified: |+ {+ ⟦+ m ↦ ⟦+ x ↦ ⟦⟧+ ⟧()+ ⟧+ }
+ test/eo/phi/metrics.yaml view
@@ -0,0 +1,81 @@+# The MIT License (MIT)++# Copyright (c) 2016-2024 Objectionary.com++# Permission is hereby granted, free of charge, to any person obtaining a copy+# of this software and associated documentation files (the "Software"), to deal+# in the Software without restriction, including without limitation the rights+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+# copies of the Software, and to permit persons to whom the Software is+# furnished to do so, subject to the following conditions:++# The above copyright notice and this permission notice shall be included+# in all copies or substantial portions of the Software.++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+# SOFTWARE.++title: Metrics tests+tests:+- title: prints-itself+ phi: |+ {+ ⟦+ org ↦ ⟦+ eolang ↦ ⟦+ prints-itself ↦ ⟦+ φ ↦+ Φ.org.eolang.as-phi(+ α0 ↦ ξ+ ).length.gt(+ α0 ↦ Φ.org.eolang.int(+ α0 ↦ Φ.org.eolang.bytes(+ Δ ⤍ 00-00-00-00-00-00-00-00+ )+ )+ )+ ⟧,+ prints-itself-to-console ↦ ⟦+ x ↦ Φ.org.eolang.int(+ α0 ↦ Φ.org.eolang.bytes(+ Δ ⤍ 00-00-00-00-00-00-00-2A+ )+ ),+ φ ↦ Φ.org.eolang.io.stdout(+ α0 ↦ Φ.org.eolang.as-phi(+ α0 ↦ ξ+ )+ )+ ⟧,+ λ ⤍ Package+ ⟧,+ λ ⤍ Package+ ⟧+ ⟧+ }+ metrics:+ program-metrics:+ dataless: 5+ applications: 8+ formations: 5+ dispatches: 24+ bindings-by-path-metrics:+ path: org.eolang+ bindings-metrics:+ - name: prints-itself+ metrics:+ dataless: 1+ applications: 4+ formations: 1+ dispatches: 11+ - name: prints-itself-to-console+ metrics:+ dataless: 1+ applications: 4+ formations: 1+ dispatches: 13
+ test/eo/phi/rewriting.yaml view
@@ -0,0 +1,120 @@+# The MIT License (MIT)++# Copyright (c) 2016-2024 Objectionary.com++# Permission is hereby granted, free of charge, to any person obtaining a copy+# of this software and associated documentation files (the "Software"), to deal+# in the Software without restriction, including without limitation the rights+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+# copies of the Software, and to permit persons to whom the Software is+# furnished to do so, subject to the following conditions:++# The above copyright notice and this permission notice shall be included+# in all copies or substantial portions of the Software.++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+# SOFTWARE.++title: "Rewriting tests (integration tests)"+tests:+# TODO #655:10m Enable+# - name: e-alph+# input: |+# {⟦ k ↦ ⟦ x ↦ ∅ ⟧ ( α0 ↦ ⟦ Δ ⤍ 42- ⟧ ).x ⟧}+# output: |+# {⟦ k ↦ ⟦ Δ ⤍ 42- ⟧ ⟧}+# - name: e-fnk+# input: |+# {⟦ m ↦ ⟦ x ↦ ⟦ t ↦ ∅ ⟧ (t ↦ ξ.k), k ↦ ⟦ λ ⤍ Fn ⟧ ⟧.x.t.p ⟧}+# output: |+# {⟦ m ↦ ⟦ λ ⤍ Fn, ρ ↦ ⟦ x ↦ ⟦ t ↦ ∅ ⟧ (t ↦ ξ.k), k ↦ ⟦ λ ⤍ Fn ⟧ ⟧ ⟧.p ⟧}+- name: e-ald+ input: |+ {⟦ k ↦ ⟦ x ↦ ∅ ⟧ ( α1 ↦ ⟦ Δ ⤍ 42- ⟧ ).x ⟧}+ output: |+ {⟦ k ↦ ⊥ ⟧}+- name: e-app+ input: |+ {⟦ k ↦ ⟦ x ↦ ξ.t, t ↦ ∅ ⟧ (t ↦ ⟦ Δ ⤍ 42- ⟧) ⟧}+ output: |+ {⟦ k ↦ ⟦ t ↦ ⟦ Δ ⤍ 42- ⟧, x ↦ ξ.t ⟧ ⟧}+- name: e-cpy+ input: |+ {⟦ m ↦ ⟦ x ↦ ∅, y ↦ ξ.x ⟧ (x ↦ ⟦ Δ ⤍ 42- ⟧).y ⟧}+ output: |+ { ⟦ m ↦ ⟦ ρ ↦ ⟦ x ↦ ⟦ Δ ⤍ 42- ⟧, y ↦ ξ.x ⟧, Δ ⤍ 42- ⟧ ⟧}+- name: e-int+ input: |+ {⟦ m ↦ ⟦ x ↦ ⟦ t ↦ ⟦ Δ ⤍ 42- ⟧ ⟧.t ⟧.x ⟧}+ output: |+ {⟦ m ↦ ⟦ ρ ↦ ⟦ t ↦ ⟦ Δ ⤍ 42- ⟧ ⟧, Δ ⤍ 42- ⟧ ⟧}+- name: e-lam+ input: |+ {⟦ m ↦ ⟦ x ↦ ⟦ λ ⤍ Fn ⟧.ρ.k, k ↦ ⟦ Δ ⤍ 42- ⟧ ⟧.x ⟧}+ output: |+ {⟦ m ↦ ⟦ λ ⤍ Fn ⟧.ρ.k(ρ ↦ ⟦ x ↦ ⟦ λ ⤍ Fn ⟧.ρ.k, k ↦ ⟦ Δ ⤍ 42- ⟧ ⟧ ) ⟧}+- name: e-nf+ input: |+ {⟦ x ↦ ⟦ t ↦ Φ.x ⟧ ⟧}+ output: |+ {⟦ x ↦ ⟦ t ↦ Φ.x ⟧ ⟧}+- name: e-nk+ input: |+ {⟦ x ↦ ξ.k, k ↦ ⟦ Δ ⤍ 42- ⟧ ⟧}+ output: |+ {⟦ x ↦ ξ.k, k ↦ ⟦ Δ ⤍ 42- ⟧ ⟧}+- name: e-np+ input: |+ {⟦ x ↦ ξ.t, λ ⤍ Fn ⟧}+ output: |+ {⟦ x ↦ ξ.t, λ ⤍ Fn ⟧}+- name: e-nr+ input: |+ {⟦ x ↦ ξ.k, t ↦ ⟦ Δ ⤍ 42- ⟧ ⟧}+ output: |+ {⟦ x ↦ ξ.k, t ↦ ⟦ Δ ⤍ 42- ⟧ ⟧}+- name: e-nt+ input: |+ {⟦ m ↦ ⟦ x ↦ ⟦ Δ ⤍ 42- ⟧, λ ⤍ Fn ⟧.y ⟧}+ output: |+ {⟦ m ↦ ⟦ x ↦ ⟦ Δ ⤍ 42- ⟧, λ ⤍ Fn ⟧.y ⟧}+- name: e-phi+ input: |+ {⟦ m ↦ ⟦ x ↦ ξ.t, φ ↦ ⟦ t ↦ ⟦⟧ ⟧ ⟧.x ⟧}+ output: |+ {⟦ m ↦ ⟦ ρ ↦ ⟦ t ↦ ⟦ ⟧, ρ ↦ ⟦ φ ↦ ⟦ t ↦ ⟦ ⟧ ⟧, x ↦ ξ.t ⟧ ⟧ ⟧ ⟧}+- name: e-rep+ input: |+ {⟦ m ↦ ⟦ x ↦ ξ.t (k ↦ ξ.f).k, t ↦ ⟦ k ↦ ∅ ⟧, f ↦ ⟦⟧ ⟧.x ⟧}+ output: |+ {⟦ m ↦ ⟦ ρ ↦ ⟦f ↦ ⟦⟧, x ↦ ξ.t (k ↦ ξ.f).k, t ↦ ⟦k ↦ ∅⟧ ⟧ ⟧ ⟧}+- name: e-rha+ input: |+ {⟦ m ↦ ⟦ x ↦ ⟦ ρ ↦ ∅ ⟧.ρ.k, k ↦ ⟦ Δ ⤍ 42- ⟧ ⟧.x ⟧}+ output: |+ {⟦ m ↦ ⊥ ⟧}+- name: e-rhi+ input: |+ {⟦ m ↦ ⟦ x ↦ ⟦ t ↦ ⟦ p ↦ ξ.ρ.ρ.k ⟧.p ⟧.t, k ↦ ⟦ Δ ⤍ 42- ⟧ ⟧.x ⟧}+ output: |+ {⟦ m ↦ ⊥ ⟧}+- name: e-rho+ input: |+ {⟦ m ↦ ⟦ x ↦ ξ.ρ.ρ.t ⟧.x ⟧}+ output: |+ {⟦ m ↦ ⊥ ⟧}+- name: e-twi+ input: |+ {⟦ m ↦ ⟦ x ↦ ⟦ t ↦ ξ.ρ.k.ρ.t ⟧, k ↦ ⟦⟧, t ↦ ⟦⟧ ⟧.x.t ⟧}+ output: |+ { ⟦ m ↦ ⟦ ρ ↦ ⟦ t ↦ ⟦ ⟧, ρ ↦ ⟦ ρ ↦ ⟦ x ↦ ⟦ t ↦ ξ.ρ.k.ρ.t ⟧, k ↦ ⟦ ⟧, t ↦ ⟦ ⟧ ⟧, t ↦ ξ.ρ.k.ρ.t ⟧, k ↦ ⟦ ⟧, x ↦ ⟦ t ↦ ξ.ρ.k.ρ.t ⟧ ⟧ ⟧ ⟧}+- name: e-xxi+ input: |+ {⟦ m ↦ ⟦ x ↦ ξ.t, t ↦ ∅ ⟧.x ⟧}+ output: |+ {⟦ m ↦ ⊥ ⟧}