summaryrefslogtreecommitdiff
path: root/source/Test/Unit/Source.hs
diff options
context:
space:
mode:
Diffstat (limited to 'source/Test/Unit/Source.hs')
-rw-r--r--source/Test/Unit/Source.hs1930
1 files changed, 46 insertions, 1884 deletions
diff --git a/source/Test/Unit/Source.hs b/source/Test/Unit/Source.hs
index 3f6703e..73eaef5 100644
--- a/source/Test/Unit/Source.hs
+++ b/source/Test/Unit/Source.hs
@@ -5,35 +5,24 @@
module Test.Unit.Source (unitTests) where
import Base
-import Checking qualified
-import Checking.Backend.Problem qualified as Backend
-import Checking.Backend.Reconstruction qualified as Reconstruction
-import Checking.Core qualified as Core
-import Checking.Facts qualified as Facts
import Checking.Foundation qualified as Foundation
import Checking.Identity qualified as Identity
-import Checking.Kernel.Derivation qualified as Derivation
-import Checking.Legacy qualified as Legacy
-import Checking.Obligation qualified as Obligation
import Checking.Semantic qualified as Semantic
-import Checking.Transition qualified as Transition
import Felix.Cache.Codec qualified as Cache
import Felix.Module qualified as Module
import Felix.Parse qualified as Parse
import Felix.Parsed.Identity qualified as ParsedIdentity
import Felix.Parsed.Payload qualified as Parsed
+import Felix.Prelude qualified as Prelude
import Felix.Source
import Felix.Source.Content qualified as Content
import Felix.Source.Graph
import Felix.Store qualified as Store
-import Meaning qualified
-import Provers qualified
import Report.Location
( FileId(..)
, FileIdAllocator(..)
, Location(..)
, LocationRegistrationError(..)
- , pattern Nowhere
, allocateFileId
, locColumn
, locFile
@@ -44,21 +33,14 @@ import Report.Location
import Syntax.Abstract qualified as Raw
import Syntax.Adapt qualified as Adapt
import Syntax.Interface qualified as Interface
-import Syntax.Internal
import Syntax.Token (runLexer)
-import Bound.Scope (toScope)
-import Control.Exception (bracket, evaluate, try)
-import Control.Monad (foldM)
-import Control.Monad.Logger (runNoLoggingT)
+import Control.Exception (bracket, evaluate)
import Data.ByteString qualified as ByteString
-import Data.HashMap.Strict qualified as HashMap
import Data.IORef
import Data.List qualified as List
import Data.List.NonEmpty qualified as NonEmpty
-import Data.Set qualified as Set
import Data.Text qualified as Text
-import Data.Vector qualified as Vector
import Data.Word (Word8, Word16)
import Database.SQLite.Simple qualified as SQLite
import System.Directory qualified as Directory
@@ -89,6 +71,8 @@ unitTests = testGroup "Source resolution"
, testCase "reserves the all-ones file identifier"
preservesReservedFileId
, testCase "builds an imported-before-importer source graph" buildsSourceGraph
+ , testCase "rejects the packaged prelude as ordinary source"
+ rejectsPackagedPreludeAsOrdinarySource
, testCase "orders sibling imports by textual occurrence"
ordersSiblingImports
, testCase "orders shared dependencies before their importers"
@@ -114,20 +98,6 @@ unitTests = testGroup "Source resolution"
, testCase "rejects a corrupted cached declaration anchor"
rejectsCorruptedCachedDeclarationAnchor
, testCase "parses source-local blocks in graph order" parsesSourceGraph
- , testCase "assigns and reserves dense legacy module positions"
- reservesLegacyModulePositions
- , testCase "admits complete legacy declaration batches"
- admitsLegacyDeclarations
- , testCase "publishes deterministic legacy import views"
- publishesLegacyImportViews
- , testCase "publishes typed signatures and facts through transition modules"
- publishesTransitionSignatures
- , testCase "rejects cached global types from another builder"
- rejectsForeignCachedGlobalType
- , testCase "authorizes exact typed Vampire requests"
- authorizesTypedVampireRequests
- , testCase "enforces and replays direct inductive guards"
- publishesTypedInductive
, testCase "does not leak syntax between sibling imports"
rejectsSiblingSyntaxLeakage
, testCase "parses source fixity levels and grouping"
@@ -154,10 +124,8 @@ unitTests = testGroup "Source resolution"
reportsMalformedLexicalDeclaration
, testCase "validates inductive function patterns during scanning"
rejectsMalformedInductivePattern
- , testCase "scans, parses, and checks adjective signatures"
+ , testCase "scans and parses adjective signatures"
acceptsAdjectiveSignature
- , testCase "rejects unresolved quantified symbolic-signature terms"
- rejectsQuantifiedSymbolicSignatureTerm
, testCase "rejects malformed math-led signature heads"
rejectsMalformedSignatureHead
, testCase "locates conflicting declarations within one environment"
@@ -166,8 +134,6 @@ unitTests = testGroup "Source resolution"
acceptsBuiltinSourceDeclaration
, testCase "keeps the built-in marker for a prefix predicate declaration"
acceptsBuiltinPrefixPredicateDeclaration
- , testCase "rejects duplicate fixed-base semantics during checking"
- rejectsDuplicateFixedBaseSemantics
, testCase "does not rescan repeated canonical imports"
avoidsAliasImportLexiconCollision
, testCase "parses loaded sources without rereading files" parsesWithoutRereading
@@ -275,6 +241,47 @@ rootFormsShareIdentity =
(resolvedSourceRelativePath (loadedSource searchedLoaded))
(resolvedSourceRelativePath (loadedSource exactLoaded))
+rejectsPackagedPreludeAsOrdinarySource :: Assertion
+rejectsPackagedPreludeAsOrdinarySource = do
+ packaged <- expectRight =<< Prelude.loadReservedPreludeSourceInput
+ canonical <- expectJust "packaged canonical path"
+ (Prelude.reservedPreludeSourceCanonicalPath packaged)
+ let path = canonicalPathFilePath canonical
+ mounts <- oneMount "packaged" (Posix.takeDirectory path)
+ request <- expectRight (searchedRoot (Posix.takeFileName path))
+ let validate = Prelude.rejectOrdinaryPreludeSourceGraph packaged
+ syntaxInputs = const []
+ Parse.parseSourceWorkspaceMeasuredWithSyntaxInputsAndGraphValidation
+ mounts request syntaxInputs validate >>= \case
+ Left
+ (Parse.SourceWorkspaceError
+ (PackagedPreludeSelectedAsOrdinarySource source)) ->
+ assertEqual "authority-free rejected path"
+ canonical
+ (resolvedSourceCanonicalPath source)
+ other ->
+ assertFailure
+ ("unexpected authority-free result: " <> show other)
+
+ withTemporaryDirectory "felix-reserved-parse-store" \temp -> do
+ foundation <- expectRight Foundation.checkedFoundation
+ store <- openTestStore
+ (temp Posix.</> "store.sqlite")
+ (Identity.theoryId foundation)
+ Parse.parseSourceWorkspaceMeasuredWithStoreAndSyntaxInputsAndGraphValidation
+ store mounts request syntaxInputs validate >>= \case
+ Left
+ (Parse.ParseExecutionWorkspaceError
+ (Parse.SourceWorkspaceError
+ (PackagedPreludeSelectedAsOrdinarySource source))) ->
+ assertEqual "typed rejected path"
+ canonical
+ (resolvedSourceCanonicalPath source)
+ other ->
+ assertFailure
+ ("unexpected typed result: " <> show other)
+ Store.closeStore store
+
attributesNestedSources :: Assertion
attributesNestedSources =
withTemporaryDirectory "felix-source-nested-mount" \temp -> do
@@ -682,46 +689,6 @@ buildsEmptyModules =
(Parse.parsedModuleSyntaxInterface
(Parse.parsedWorkspaceRootModule
workspace)))))
- assignments <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals workspace)
- assignment <-
- case toList assignments of
- [only] ->
- pure only
- actual ->
- assertFailure
- ("expected one empty module assignment, got "
- <> show (length actual))
- >> fail "unreachable"
- checkedFoundationValue <-
- expectRight Foundation.checkedFoundation
- builder <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- assignment
- [])
- checked <-
- Checking.runCheckingBlocks
- []
- (Checking.initialTransitionCheckingStateWithTaskPreparation
- Checking.WithoutDumpPremselTraining
- id
- builder
- (\_batch ->
- assertFailure
- "empty module emitted an obligation"))
- finalBuilder <-
- expectJust
- "empty transition builder"
- (Checking.checkingTransitionModuleBuilder checked)
- void
- (expectRight
- (Transition.sealTransitionModule
- (Checking.checkingStateEnvironment checked)
- finalBuilder))
identifiesOwnerIndependentParsedModules :: Assertion
identifiesOwnerIndependentParsedModules =
@@ -1235,1613 +1202,6 @@ parsesSourceGraph =
["shared.tex", "entry.tex"]
emitted
-reservesLegacyModulePositions :: Assertion
-reservesLegacyModulePositions =
- withTemporaryDirectory "felix-legacy-module-stage" \temp -> do
- writeTheory (temp Posix.</> "shared.tex") [] "shared"
- writeTheory
- (temp Posix.</> "entry.tex")
- ["shared.tex"]
- "entry"
- graph <- buildSearchedGraph temp "entry.tex"
- workspace <-
- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- assignments <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals workspace)
- assertEqual "dense imported-first module ordinals"
- [0, 1]
- ( Legacy.legacyModuleOrdinalValue
- . Legacy.assignedLegacyModuleOrdinal
- <$> toList assignments
- )
- assertEqual "assigned source order"
- ["shared.tex", "entry.tex"]
- ( safeRelativePathFilePath
- . sourceAddressRelativePath
- . Parse.parsedModuleAddress
- . Legacy.assignedParsedModule
- <$> toList assignments
- )
-
- let firstAssignment :| _remainingAssignments =
- assignments
- stage =
- Legacy.openLegacyModuleStage
- firstAssignment
- (Legacy.emptyLegacyImportedView
- Checking.initialLegacyCheckingEnvironment)
- origin = Facts.factOrigin (Location 0) "declaration"
- firstFact =
- Facts.stageFact
- ("first" :| ["first_alias"])
- origin
- (Facts.prepareSemanticFact Top)
- secondFact =
- Facts.stageFact
- ("second" :| [])
- origin
- (Facts.prepareSemanticFact Bottom)
- reservation <-
- expectRight
- (Legacy.reserveLegacyDeclaration
- (firstFact :| [secondFact])
- stage)
- assertEqual "dense local fact ordinals"
- [0, 1]
- ( Legacy.legacyLocalFactOrdinalValue
- . Legacy.legacyFactLocalOrdinal
- . Legacy.legacyReservedFactReference
- <$> toList (Legacy.legacyReservedFacts reservation)
- )
-
- let duplicateAliasFact =
- Facts.stageFact
- ("first_alias" :| [])
- origin
- (Facts.prepareSemanticFact Bottom)
- case Legacy.reserveLegacyDeclaration
- (firstFact :| [duplicateAliasFact])
- stage of
- Left Legacy.LegacyAliasAlreadyBound{} ->
- pure ()
- Left err ->
- assertFailure
- ("expected alias rejection, got " <> show err)
- Right _ ->
- assertFailure "expected duplicate legacy alias rejection"
-
-admitsLegacyDeclarations :: Assertion
-admitsLegacyDeclarations =
- withTemporaryDirectory "felix-legacy-admission" \temp -> do
- writeTheory (temp Posix.</> "entry.tex") [] "entry"
- graph <- buildSearchedGraph temp "entry.tex"
- workspace <-
- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- assignment :| _ <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals workspace)
- let stage =
- Legacy.openLegacyModuleStage
- assignment
- (Legacy.emptyLegacyImportedView
- Checking.initialLegacyCheckingEnvironment)
- blocks =
- [ BlockAxiom
- Nowhere
- "declared"
- (Axiom [] Top)
- , BlockLemma
- Nowhere
- "omitted"
- (Lemma [] Bottom)
- , BlockProof
- Nowhere
- Nowhere
- (Omitted Nowhere)
- ]
- resolveGapBatch batch = do
- resolved <-
- traverse
- (either
- (ioError . userError . show)
- pure
- . Obligation.resolveObligationAsGap)
- (Obligation.preparedBatchObligations batch)
- either
- (ioError . userError . show)
- pure
- (Obligation.resolveObligationBatch
- batch
- resolved)
- initial =
- Checking.initialLegacyCheckingStateWithTaskPreparation
- Checking.WithoutDumpPremselTraining
- id
- stage
- resolveGapBatch
- checked <-
- Checking.runCheckingBlocks blocks initial
- admittedStage <-
- maybe
- (assertFailure
- "authoritative checking lost the legacy stage"
- >> pure stage)
- pure
- (Checking.checkingLegacyModuleStage checked)
- admittedModule <-
- expectRight
- (Legacy.sealLegacyModuleStage
- (Checking.checkingStateEnvironment checked)
- admittedStage)
- assertEqual "two sealed local facts"
- 2
- (Vector.length
- (Legacy.legacyAdmittedLocalFacts admittedModule))
- assertEqual "one sealed declared assumption"
- 1
- (Vector.length
- (Legacy.legacyAdmittedDirectAxiomManifest
- admittedModule))
- let finalTrust =
- Legacy.legacyFactEntryTrustDependencies
- (Vector.last
- (Legacy.legacyAdmittedLocalFacts
- admittedModule))
- assertEqual "one explicit gap"
- 1
- (Set.size
- (Legacy.legacyExplicitGaps finalTrust))
- assertEqual "direct gap needs no legacy finalization rule"
- 0
- (Set.size
- (Legacy.trustedLegacyRuleUses finalTrust))
-
-publishesTransitionSignatures :: Assertion
-publishesTransitionSignatures =
- withTemporaryDirectory "felix-transition-signatures" \temp -> do
- writeTheory (temp Posix.</> "shared.tex") [] "shared"
- writeTheory
- (temp Posix.</> "entry.tex")
- ["shared.tex"]
- "entry"
- graph <- buildSearchedGraph temp "entry.tex"
- workspace <-
- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- assignments <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals workspace)
- checkedFoundationValue <-
- expectRight Foundation.checkedFoundation
- case toList assignments of
- [sharedAssignment, entryAssignment] -> do
- shared <-
- admit
- checkedFoundationValue
- sharedAssignment
- []
- [ BlockSig
- Nowhere
- "shared_signature"
- []
- (SignaturePredicate
- sharedPredicate
- ("x" :| []))
- , BlockAxiom
- Nowhere
- "shared_atomic_axiom"
- (Axiom [] sharedAtomicFormula)
- ]
- let sharedGlobals =
- Transition.transitionAdmittedGlobals
- shared
- assertEqual
- "one shared typed declaration"
- 1
- (Vector.length sharedGlobals)
- case Vector.toList sharedGlobals of
- [(symbol, reference, _origin)] -> do
- assertEqual
- "shared symbol"
- (SymbolPredicate sharedPredicate)
- symbol
- assertEqual
- "shared declaration ordinal"
- 0
- (Transition.localDeclarationOrdinalValue
- (Transition.opaqueDeclarationOrdinal
- (Transition.checkedGlobalReference
- reference)))
- assertEqual
- "shared predicate type"
- (Core.TySet
- `Core.TyArrow`
- Core.TyProp)
- (Transition.checkedGlobalType reference)
- _ ->
- assertFailure
- "expected one shared typed declaration"
- let sharedFacts =
- Vector.toList
- (Transition.transitionAdmittedFacts
- shared)
- sharedManifest =
- Vector.toList
- (Transition.transitionAdmittedTypedDirectAxiomManifest
- shared)
- (sharedReference, sharedStatement) <-
- case (sharedFacts, sharedManifest) of
- ([assumption], [manifestEntry]) -> do
- assertBool
- "typed axiom is not a kernel proof"
- (not
- (Transition.admittedFactIsKernelProof
- assumption))
- assertEqual
- "manifest kind"
- Legacy.DeclaredUserAxiom
- (Transition.typedDirectAssumptionKind
- manifestEntry)
- assertEqual
- "manifest fact reference"
- (Just
- (Transition.typedDirectAssumptionFact
- manifestEntry))
- (Transition.transitionTypedFactReference
- (Transition.admittedFactReference
- assumption))
- pure
- ( Transition.admittedFactReference
- assumption
- , Transition.typedDirectAssumptionStatement
- manifestEntry
- )
- _ ->
- fail
- "expected one manifest-backed typed axiom"
-
- hiddenBuilder <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- entryAssignment
- [])
- hiddenTarget <-
- expectRight
- (Core.checkCanonicalCore
- (const Nothing)
- (Core.CImp
- Core.CFalsum
- Core.CFalsum))
- hiddenImport <-
- expectRight
- (Transition.transitionDerivationImport
- sharedReference
- hiddenTarget)
- case Transition.commitTransitionKernelFactWithImports
- ("hidden_import" :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just "hidden_import"))
- (Vector.singleton hiddenImport)
- hiddenTarget
- (Derivation.importedFactDerivation
- (Derivation.importIx 0))
- hiddenBuilder of
- Left
- (Transition.TransitionKernelImportNotVisible
- actualReference) ->
- assertEqual
- "unimported fact reference"
- sharedReference
- actualReference
- Left err ->
- assertFailure
- ("expected hidden typed import failure, got "
- <> show err)
- Right _ ->
- assertFailure
- "an unimported typed row authorized replay"
-
- entryBuilder <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- entryAssignment
- [shared])
- assertBool
- "direct import exposes the typed global"
- (isJust
- (Transition.lookupTransitionGlobal
- (SymbolPredicate sharedPredicate)
- entryBuilder))
- entry <-
- admitWithBuilder
- entryBuilder
- [ BlockAxiom
- Nowhere
- "legacy_axiom"
- (Axiom [] Top)
- , BlockSig
- Nowhere
- "entry_signature"
- []
- (SignaturePredicate
- entryPredicate
- ("z" :| []))
- , BlockLemma
- Nowhere
- "typed_import_reuse"
- (Lemma [] sharedAtomicFormula)
- , BlockLemma
- Nowhere
- "typed_reflexivity"
- (Lemma
- []
- (Equals
- Nowhere
- (EmptySet Nowhere)
- (EmptySet Nowhere)))
- ]
- case Vector.toList
- (Transition.transitionAdmittedGlobals
- entry) of
- [(_symbol, reference, _origin)] ->
- assertEqual
- "legacy declaration occupies its source ordinal"
- 1
- (Transition.localDeclarationOrdinalValue
- (Transition.opaqueDeclarationOrdinal
- (Transition.checkedGlobalReference
- reference)))
- _ ->
- assertFailure
- "expected one local entry declaration"
- let facts =
- Vector.toList
- (Transition.transitionAdmittedFacts
- entry)
- assertEqual
- "imported and local rows retain declaration order"
- [False, False, True, True]
- (Transition.admittedFactIsKernelProof
- <$> facts)
- case facts of
- [_assumption, _legacy, reused, reflexivity] -> do
- case Transition.transitionTypedFactReference
- (Transition.admittedFactReference
- reused) of
- Nothing ->
- assertFailure
- "expected a typed fact reference"
- Just reference ->
- assertEqual
- "first typed fact ordinal"
- 0
- (Transition.localFactOrdinalValue
- (Transition.factReferenceOrdinal
- reference))
- case Transition.transitionTypedFactReference
- (Transition.admittedFactReference
- reflexivity) of
- Nothing ->
- assertFailure
- "expected a typed reflexivity reference"
- Just reference ->
- assertEqual
- "second typed fact ordinal"
- 1
- (Transition.localFactOrdinalValue
- (Transition.factReferenceOrdinal
- reference))
- _ ->
- assertFailure
- "expected imported assumption and three local facts"
- let inheritedAssumptions =
- Set.toList
- (Transition.typedDeclaredAssumptionUses
- (Transition.transitionAdmittedTypedTrustDependencies
- entry))
- case inheritedAssumptions of
- [assumption] -> do
- assertEqual
- "the importer retains the owner fact"
- (Transition.transitionTypedFactReference
- sharedReference)
- (Just
- (Transition.sessionTypedAssumptionFact
- assumption))
- assertEqual
- "the owner assumption ordinal"
- 0
- (Transition.localAssumptionOrdinalValue
- (Transition.sessionTypedAssumptionOrdinal
- assumption))
- assertEqual
- "the imported assumption statement"
- sharedStatement
- (Transition.sessionTypedAssumptionStatement
- assumption)
- _ ->
- assertFailure
- "expected one inherited typed declared assumption"
- assertEqual
- "two local replayed kernel proofs"
- 2
- (Transition.transitionAdmittedKernelProofCount
- entry)
- actual ->
- assertFailure
- ("expected two module assignments, got "
- <> show (length actual))
- where
- sharedPredicate =
- PredicateSymbol "typed_shared_predicate"
- entryPredicate =
- PredicateSymbol "typed_entry_predicate"
- sharedAtomicFormula =
- Atomic
- Nowhere
- sharedPredicate
- [EmptySet Nowhere]
-
- admit checkedFoundationValue assignment imports blocks = do
- builder <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- assignment
- imports)
- admitWithBuilder builder blocks
-
- admitWithBuilder builder blocks = do
- checked <-
- Checking.runCheckingBlocks
- blocks
- (Checking.initialTransitionCheckingStateWithTaskPreparation
- Checking.WithoutDumpPremselTraining
- id
- builder
- (\_batch ->
- assertFailure
- "typed transition emitted an obligation"))
- finalBuilder <-
- maybe
- (assertFailure
- "checking lost its transition builder")
- pure
- (Checking.checkingTransitionModuleBuilder
- checked)
- expectRight
- (Transition.sealTransitionModule
- (Checking.checkingStateEnvironment checked)
- finalBuilder)
-
-rejectsForeignCachedGlobalType :: Assertion
-rejectsForeignCachedGlobalType =
- withTemporaryDirectory "felix-transition-global-types" \temp -> do
- writeTheory
- (temp Posix.</> "entry.tex")
- []
- "entry"
- graph <-
- buildSearchedGraph temp "entry.tex"
- workspace <-
- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- assignments <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals workspace)
- assignment <-
- case toList assignments of
- [only] ->
- pure only
- actual ->
- assertFailure
- ("expected one module assignment, got "
- <> show (length actual))
- >> fail "unreachable"
- checkedFoundationValue <-
- expectRight Foundation.checkedFoundation
- builderA0 <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- assignment
- [])
- builderB0 <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- assignment
- [])
- let symbol =
- SymbolPredicate
- (PredicateSymbol
- "same_nominal_global")
- declarationOrigin =
- Transition.origin
- Nowhere
- Nothing
- (Just "same_nominal_global")
- builderA <-
- expectRight
- (Transition.commitTransitionOpaqueGlobal
- symbol
- Core.TySet
- declarationOrigin
- (Transition.beginTransitionDeclaration
- builderA0))
- builderB <-
- expectRight
- (Transition.commitTransitionOpaqueGlobal
- symbol
- Core.TyProp
- declarationOrigin
- (Transition.beginTransitionDeclaration
- builderB0))
- globalA <-
- maybe
- (assertFailure "builder A lost its global"
- >> fail "unreachable")
- pure
- (Transition.lookupTransitionGlobal
- symbol
- builderA)
- globalB <-
- maybe
- (assertFailure "builder B lost its global"
- >> fail "unreachable")
- pure
- (Transition.lookupTransitionGlobal
- symbol
- builderB)
- operand <-
- expectRight
- (Core.checkCanonicalCore
- (Just . Transition.checkedGlobalType)
- (Core.CGlobal globalA))
- statement <-
- expectRight
- (Core.checkCanonicalCore
- (Just . Transition.checkedGlobalType)
- (Core.CEq
- Core.TySet
- (Core.CGlobal globalA)
- (Core.CGlobal globalA)))
- case Transition.commitTransitionKernelFact
- ("foreign_global_type" :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just "foreign_global_type"))
- statement
- (Derivation.equalityReflexivityDerivation
- operand)
- (Transition.beginTransitionDeclaration
- builderB) of
- Left
- (Transition.TransitionGlobalReferenceTypeMismatch
- actual
- authoritativeType) -> do
- assertEqual
- "cached global reference"
- globalA
- actual
- assertEqual
- "builder B authoritative type"
- Core.TyProp
- authoritativeType
- Left err ->
- assertFailure
- ("expected cached global type rejection, got "
- <> show err)
- Right _ ->
- assertFailure
- "builder B admitted builder A's cached type"
- let remappedOperand =
- Core.mapFrozenGlobals
- (const globalB)
- operand
- remappedStatement =
- Core.mapFrozenGlobals
- (const globalB)
- statement
- case Transition.commitTransitionKernelFact
- ("stale_term_annotation" :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just "stale_term_annotation"))
- remappedStatement
- (Derivation.equalityReflexivityDerivation
- remappedOperand)
- (Transition.beginTransitionDeclaration
- builderB) of
- Left
- (Transition.TransitionCoreCheckError
- (Core.EqualityOperandTypeMismatch
- Core.TySet
- Core.TyProp)) ->
- pure ()
- Left err ->
- assertFailure
- ("expected fresh builder-relative core check, got "
- <> show err)
- Right _ ->
- assertFailure
- "builder B admitted a stale term annotation"
-
-authorizesTypedVampireRequests :: Assertion
-authorizesTypedVampireRequests =
- withTemporaryDirectory "felix-typed-vampire" \temp -> do
- let sourcePath =
- temp Posix.</> "entry.tex"
- executablePath =
- temp Posix.</> "vampire"
- writeTheory sourcePath [] "entry"
- graph <-
- buildSearchedGraph temp "entry.tex"
- workspace <-
- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- assignments <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals
- workspace)
- assignment <-
- case toList assignments of
- [only] ->
- pure only
- actual ->
- assertFailure
- ("expected one module assignment, got "
- <> show (length actual))
- >> fail "unreachable"
- checkedFoundationValue <-
- expectRight Foundation.checkedFoundation
- baseBuilder <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- assignment
- [])
- let legacyStage =
- Transition.transitionBuilderLegacyStage
- baseBuilder
- legacyStaged =
- Facts.stageFact
- ("legacy_input" :| [])
- (Facts.factOrigin
- (Location 0)
- "legacy_input")
- (Facts.prepareSemanticFact Top)
- legacyReservation <-
- expectRight
- (Legacy.reserveLegacyDeclaration
- (legacyStaged :| [])
- legacyStage)
- let legacyReserved =
- NonEmpty.head
- (Legacy.legacyReservedFacts
- legacyReservation)
- legacyAdmitted =
- Legacy.authorizeLegacyDeclaredAssumption
- legacyStage
- Legacy.DeclaredUserAxiom
- legacyReserved
- legacyStage' <-
- expectRight
- (Legacy.appendEstablishedLegacyDeclaration
- legacyReservation
- (legacyAdmitted :| [])
- legacyStage)
- builderWithLegacy <-
- expectRight
- (Transition.transitionBuilderWithLegacyStage
- legacyStage'
- baseBuilder)
- target <-
- expectRight
- (Core.checkCanonicalCore
- (Just . Transition.checkedGlobalType)
- (Core.CImp
- Core.CFalsum
- Core.CFalsum))
- claim <-
- expectRight
- (Backend.supportedProposition
- (Vector.empty
- :: Vector.Vector
- (Void, Core.CoreType))
- (Core.embedClosedCore [] target))
- builderWithFof <-
- expectRight
- (Transition.commitTransitionTypedDeclaredAssumption
- ("fof_input" :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just "fof_input"))
- Legacy.DeclaredUserAxiom
- target
- (Transition.beginTransitionDeclaration
- builderWithLegacy))
- let higherOrderTarget =
- Core.mapFrozenGlobals
- absurd
- (Foundation.foundationAxiomFrozen
- checkedFoundationValue
- Foundation.DoubleNegationElim)
- builderWithTh0 <-
- expectRight
- (Transition.commitTransitionTypedDeclaredAssumption
- ("th0_input" :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just "th0_input"))
- Legacy.DeclaredUserAxiom
- higherOrderTarget
- (Transition.beginTransitionDeclaration
- builderWithFof))
- builder <-
- expectRight
- (Transition.commitTransitionTypedDeclaredAssumption
- ("second_fof_input" :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just "second_fof_input"))
- Legacy.DeclaredUserAxiom
- target
- (Transition.beginTransitionDeclaration
- builderWithTh0))
- implicitProblem <-
- expectRight
- (Transition.planTransitionTypedProblem
- builder
- claim
- []
- []
- Transition.ImplicitFofFacts
- Backend.FirstOrderLocals)
- let selected =
- Vector.toList
- (Backend.typedProblemGlobalPremises
- implicitProblem)
- references <-
- traverse
- ( maybe
- (assertFailure
- "implicit planning selected a legacy row"
- >> fail "unreachable")
- pure
- . Transition.transitionTypedFactReference
- . Backend.typedBackendFactReference
- )
- selected
- assertEqual
- "implicit planning preserves FOF admission order"
- [0, 2]
- ( Transition.localFactOrdinalValue
- . Transition.factReferenceOrdinal
- <$> references
- )
- assertEqual
- "implicit admitted-fact route"
- Backend.RouteFof
- (Backend.typedProblemRoute
- implicitProblem)
- explicitHigherOrder <-
- expectRight
- (Transition.planTransitionTypedProblem
- builder
- claim
- []
- []
- (Transition.ExplicitFacts
- ("th0_input" :| ["th0_input"]))
- Backend.FirstOrderLocals)
- assertEqual
- "explicit higher-order admitted fact selects TH0"
- Backend.RouteTh0
- (Backend.typedProblemRoute
- explicitHigherOrder)
- assertEqual
- "repeated explicit aliases select one fact"
- 1
- (Vector.length
- (Backend.typedProblemGlobalPremises
- explicitHigherOrder))
- case Transition.planTransitionTypedProblem
- builder
- claim
- []
- []
- (Transition.ExplicitFacts
- ("legacy_input" :| []))
- Backend.FirstOrderLocals of
- Left
- (Transition.TransitionTypedProblemDependencyNotMigrated
- reference) ->
- assertEqual
- "legacy dependency stays legacy"
- Nothing
- (Transition.transitionTypedFactReference
- reference)
- result' ->
- assertFailure
- ("expected legacy dependency rejection, got "
- <> case result' of
- Left err ->
- "Left " <> show err
- Right _problem ->
- "Right problem")
- problem <-
- expectRight
- (Transition.planTransitionTypedProblem
- builder
- claim
- []
- [Backend.typedFoundationAuxiliaryInput
- checkedFoundationValue
- Foundation.DoubleNegationElim]
- Transition.NoGlobalFacts
- Backend.AllLocals)
- prepared <-
- expectRight
- (Provers.prepareTypedProverTask
- Provers.DirectTask
- problem)
- mismatched <-
- expectRight
- (Provers.prepareTypedProverTask
- Provers.IndirectTask
- problem)
- assertEqual
- "higher-order foundation input selects TH0"
- Provers.VerificationTh0
- (Provers.preparedVerificationDialect
- (Provers.preparedTypedProverRequest
- prepared))
- writeFile executablePath
- (unlines
- [ "#!/bin/sh"
- , "cat >/dev/null"
- , "printf '%s\\n' '% SZS status Theorem for typed'"
- ])
- permissions <-
- Directory.getPermissions executablePath
- Directory.setPermissions executablePath
- (Directory.setOwnerExecutable
- True
- permissions)
- result <-
- runNoLoggingT
- (Provers.runPreparedTypedProver
- (Provers.vampire
- executablePath
- Provers.defaultTimeLimit
- Provers.defaultMemoryLimit)
- prepared)
- accepted <-
- case result of
- Right answer
- | Just run <-
- Provers.provedVampireRun answer ->
- pure run
- _ ->
- assertFailure
- ("expected accepted typed Vampire run, got "
- <> show result)
- >> fail "unreachable"
- let factOrigin =
- Transition.origin
- Nowhere
- Nothing
- (Just "typed_vampire")
- commit task =
- Transition.commitTransitionTypedVampireFact
- Reconstruction.defaultReconstructionPolicy
- ("typed_vampire" :| [])
- factOrigin
- target
- task
- accepted
- builder
- case commit mismatched of
- Left Transition.TransitionTypedVampireRequestMismatch ->
- pure ()
- result' ->
- assertFailure
- ("expected exact-request mismatch, got "
- <> showResult result')
- committed <-
- expectRight (commit prepared)
- admitted <-
- expectRight
- (Transition.sealTransitionModule
- Checking.initialLegacyCheckingEnvironment
- committed)
- let trust =
- Transition.transitionAdmittedTypedTrustDependencies
- admitted
- assertEqual
- "one typed trusted Vampire row"
- 1
- (Transition.transitionAdmittedTypedTrustedVampireCount
- admitted)
- assertEqual
- "one typed Vampire trust occurrence"
- 1
- (Set.size
- (Transition.typedTrustedVampireUses
- trust))
- assertEqual
- "mandatory lowering assumptions"
- Legacy.mandatoryVampireLoweringAssumptions
- (Transition.typedVampireLoweringUses
- trust)
- assertEqual
- "exact foundation input"
- (Set.singleton
- Foundation.DoubleNegationElim)
- (Transition.typedFoundationUses
- trust)
- let atom argument =
- Core.CApp
- (Core.CApp
- (Core.CIntrinsic Core.Member)
- (Core.CIntrinsic Core.Empty))
- argument
- atomP =
- atom (Core.CIntrinsic Core.Empty)
- atomQ =
- atom (Core.COpaqueInteger 1)
- atomR =
- atom (Core.COpaqueInteger 2)
- declareTyped alias statement current =
- expectRight
- (Transition.commitTransitionTypedDeclaredAssumption
- (alias :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just alias))
- Legacy.DeclaredUserAxiom
- statement
- (Transition.beginTransitionDeclaration
- current))
- premiseP <-
- expectRight
- (Core.checkCanonicalCore
- (Just . Transition.checkedGlobalType)
- atomP)
- premisePtoQ <-
- expectRight
- (Core.checkCanonicalCore
- (Just . Transition.checkedGlobalType)
- (Core.CImp atomP atomQ))
- premiseQtoR <-
- expectRight
- (Core.checkCanonicalCore
- (Just . Transition.checkedGlobalType)
- (Core.CImp atomQ atomR))
- reconstructedTarget <-
- expectRight
- (Core.checkCanonicalCore
- (Just . Transition.checkedGlobalType)
- atomR)
- builderWithP <-
- declareTyped
- "horn_p"
- premiseP
- builder
- builderWithPtoQ <-
- declareTyped
- "horn_p_to_q"
- premisePtoQ
- builderWithP
- builderWithHornInputs <-
- declareTyped
- "horn_q_to_r"
- premiseQtoR
- builderWithPtoQ
- reconstructedClaim <-
- expectRight
- (Backend.supportedProposition
- (Vector.empty
- :: Vector.Vector
- (Void, Core.CoreType))
- (Core.embedClosedCore
- []
- reconstructedTarget))
- reconstructedProblem <-
- expectRight
- (Transition.planTransitionTypedProblem
- builderWithHornInputs
- reconstructedClaim
- []
- []
- (Transition.ExplicitFacts
- ("horn_p"
- :| [ "horn_p_to_q"
- , "horn_q_to_r"
- ]))
- Backend.FirstOrderLocals)
- reconstructedPrepared <-
- expectRight
- (Provers.prepareTypedProverTask
- Provers.DirectTask
- reconstructedProblem)
- reconstructedResult <-
- runNoLoggingT
- (Provers.runPreparedTypedProver
- (Provers.vampire
- executablePath
- Provers.defaultTimeLimit
- Provers.defaultMemoryLimit)
- reconstructedPrepared)
- reconstructedAccepted <-
- case reconstructedResult of
- Right answer
- | Just run <-
- Provers.provedVampireRun answer ->
- pure run
- _ ->
- assertFailure
- ("expected accepted Horn Vampire run, got "
- <> show reconstructedResult)
- >> fail "unreachable"
- reconstructedBuilder <-
- expectRight
- (Transition.commitTransitionTypedVampireFact
- Reconstruction.defaultReconstructionPolicy
- ("horn_result" :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just "horn_result"))
- reconstructedTarget
- reconstructedPrepared
- reconstructedAccepted
- builderWithHornInputs)
- reconstructedModule <-
- expectRight
- (Transition.sealTransitionModule
- Checking.initialLegacyCheckingEnvironment
- reconstructedBuilder)
- reconstructedFact <-
- case Vector.unsnoc
- (Transition.transitionAdmittedFacts
- reconstructedModule) of
- Just (_earlier, finalFact) ->
- pure finalFact
- Nothing ->
- assertFailure
- "expected a reconstructed admitted fact"
- >> fail "unreachable"
- assertBool
- "supported accepted task becomes a reconstructed kernel proof"
- (Transition.admittedFactIsReconstructedKernelProof
- reconstructedFact)
- reconstructedTrust <-
- maybe
- (assertFailure
- "expected typed reconstructed trust")
- pure
- (Transition.admittedFactTypedTrustDependencies
- reconstructedFact)
- assertEqual
- "reconstruction inherits its three exact assumptions"
- 3
- (Set.size
- (Transition.typedDeclaredAssumptionUses
- reconstructedTrust))
- assertEqual
- "reconstructed run adds no trusted Vampire leaf"
- Set.empty
- (Transition.typedTrustedVampireUses
- reconstructedTrust)
- assertEqual
- "reconstructed run adds no Vampire lowering trust"
- Set.empty
- (Transition.typedVampireLoweringUses
- reconstructedTrust)
- tinyKernelLimits <-
- expectRight
- (Derivation.kernelReplayLimits 1 10)
- let tinyKernelPolicy =
- Reconstruction.reconstructionPolicy
- (Reconstruction.reconstructionPolicyConnectionLimits
- Reconstruction.defaultReconstructionPolicy)
- tinyKernelLimits
- fallbackBuilder <-
- expectRight
- (Transition.commitTransitionTypedVampireFact
- tinyKernelPolicy
- ("horn_fallback" :| [])
- (Transition.origin
- Nowhere
- Nothing
- (Just "horn_fallback"))
- reconstructedTarget
- reconstructedPrepared
- reconstructedAccepted
- builderWithHornInputs)
- fallbackModule <-
- expectRight
- (Transition.sealTransitionModule
- Checking.initialLegacyCheckingEnvironment
- fallbackBuilder)
- fallbackFact <-
- case Vector.unsnoc
- (Transition.transitionAdmittedFacts
- fallbackModule) of
- Just (_earlier, finalFact) ->
- pure finalFact
- Nothing ->
- assertFailure
- "expected a kernel-exhaustion fallback fact"
- >> fail "unreachable"
- assertBool
- "kernel exhaustion retains accepted Vampire authority"
- (Transition.admittedFactIsTrustedVampire
- fallbackFact)
- where
- showResult = \case
- Left err ->
- "Left " <> show err
- Right _builder ->
- "Right builder"
-
-publishesTypedInductive :: Assertion
-publishesTypedInductive =
- withTemporaryDirectory "felix-transition-inductive" \temp -> do
- writeTheory
- (temp Posix.</> "entry.tex")
- []
- "entry"
- graph <- buildSearchedGraph temp "entry.tex"
- workspace <-
- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- assignments <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals
- workspace)
- assignment <-
- case toList assignments of
- [only] ->
- pure only
- actual ->
- assertFailure
- ("expected one module assignment, got "
- <> show (length actual))
- >> fail "unreachable"
- checkedFoundationValue <-
- expectRight Foundation.checkedFoundation
- builder <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- assignment
- [])
- let unprovedCarrier =
- TermOp Nowhere unprovedInductiveSymbol []
- unprovedBlocks =
- [ BlockInductive
- Nowhere
- "unproved_inductive"
- Inductive
- { inductiveSymbol =
- unprovedInductiveSymbol
- , inductiveParams = []
- , inductiveDomain =
- EmptySet Nowhere
- , inductiveIntros =
- IntroRule
- []
- ( EmptySet Nowhere
- `isElementOf`
- unprovedCarrier
- )
- :| []
- }
- ]
- unproved <-
- try
- (Checking.runCheckingBlocks
- unprovedBlocks
- (Checking.initialTransitionCheckingStateWithTaskPreparation
- Checking.WithoutDumpPremselTraining
- id
- builder
- (\_batch ->
- assertFailure
- "unproved inductive emitted a legacy obligation")))
- :: IO
- (Either
- Checking.CheckingError
- Checking.CheckingState)
- case unproved of
- Left checkingError ->
- assertBool
- "missing exact guard is reported"
- ("has no authorized typed fact"
- `Text.isInfixOf`
- Text.pack (show checkingError))
- Right _checked ->
- assertFailure
- "inductive with an unproved domain guard was admitted"
- unchanged <-
- expectRight
- (Transition.sealTransitionModule
- Checking.initialLegacyCheckingEnvironment
- builder)
- assertEqual
- "failed inductive publishes no global"
- 0
- (Vector.length
- (Transition.transitionAdmittedGlobals
- unchanged))
- assertEqual
- "failed inductive publishes no fact"
- 0
- (Vector.length
- (Transition.transitionAdmittedFacts
- unchanged))
- let parameter =
- NamedVar "domain"
- domain =
- TermOp
- Nowhere
- cumulSymbol
- [TermVar parameter]
- carrier =
- TermOp
- Nowhere
- typedInductiveSymbol
- [TermVar parameter]
- blocks =
- [ BlockInductive
- Nowhere
- "typed_inductive"
- Inductive
- { inductiveSymbol =
- typedInductiveSymbol
- , inductiveParams = [parameter]
- , inductiveDomain = domain
- , inductiveIntros =
- IntroRule
- []
- (TermVar parameter
- `isElementOf`
- carrier)
- :| []
- }
- ]
- checked <-
- Checking.runCheckingBlocks
- blocks
- (Checking.initialTransitionCheckingStateWithTaskPreparation
- Checking.WithoutDumpPremselTraining
- id
- builder
- (\_batch ->
- assertFailure
- "typed inductive emitted a legacy obligation"))
- finalBuilder <-
- maybe
- (assertFailure
- "checking lost its transition builder"
- >> fail "unreachable")
- pure
- (Checking.checkingTransitionModuleBuilder
- checked)
- admitted <-
- expectRight
- (Transition.sealTransitionModule
- (Checking.checkingStateEnvironment
- checked)
- finalBuilder)
- assertEqual
- "one transparent carrier"
- 1
- (Vector.length
- (Transition.transitionAdmittedGlobals
- admitted))
- assertEqual
- "four derived facts"
- [True, True, True, True]
- ( Transition.admittedFactIsKernelProof
- <$> Vector.toList
- (Transition.transitionAdmittedFacts
- admitted)
- )
- assertEqual
- "four replayed inductive facts"
- 4
- (Transition.transitionAdmittedKernelProofCount
- admitted)
- assertBool
- "foundation guard dependency is retained"
- (Foundation.UnivOfContains
- `Set.member`
- Transition.typedFoundationUses
- (Transition.transitionAdmittedTypedTrustDependencies
- admitted))
- where
- typedInductiveSymbol =
- mkMixfixItem
- [ Just (Command "typedfin")
- , Just InvisibleBraceL
- , Nothing
- , Just InvisibleBraceR
- ]
- "typed_inductive"
- NonAssoc
-
- cumulSymbol =
- mkMixfixItem
- [ Just (Command "cumul")
- , Just InvisibleBraceL
- , Nothing
- , Just InvisibleBraceR
- ]
- "cumul"
- NonAssoc
-
- unprovedInductiveSymbol =
- mkMixfixItem
- [Just (Command "unprovedfin")]
- "unproved_inductive"
- NonAssoc
-
-publishesLegacyImportViews :: Assertion
-publishesLegacyImportViews =
- withTemporaryDirectory "felix-legacy-import-view" \temp -> do
- writeTheory (temp Posix.</> "shared.tex") [] "shared"
- writeTheory
- (temp Posix.</> "a.tex")
- ["shared.tex"]
- "a"
- writeTheory
- (temp Posix.</> "b.tex")
- ["shared.tex"]
- "b"
- writeTheory
- (temp Posix.</> "entry.tex")
- ["a.tex", "b.tex"]
- "entry"
- graph <- buildSearchedGraph temp "entry.tex"
- workspace <-
- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- assignments <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals workspace)
- case toList assignments of
- [ sharedAssignment
- , aAssignment
- , bAssignment
- , entryAssignment
- ] -> do
- shared <-
- admitOne
- sharedAssignment
- (Legacy.emptyLegacyImportedView
- Checking.initialLegacyCheckingEnvironment)
- "shared_fact"
- Bottom
- (Location 1)
- sharedView <-
- expectRight
- (Legacy.legacyImportedView
- Checking.initialLegacyCheckingEnvironment
- [shared])
- a <-
- admitOne
- aAssignment
- sharedView
- "a_fact"
- Top
- (Location 2)
- b <-
- admitOne
- bAssignment
- sharedView
- "b_fact"
- Top
- (Location 3)
- diamondView <-
- expectRight
- (Legacy.legacyImportedView
- Checking.initialLegacyCheckingEnvironment
- [a, b])
- entry <-
- expectRight
- (Legacy.sealLegacyModuleStage
- (Legacy.legacyImportedCheckingEnvironment
- diamondView)
- (Legacy.openLegacyModuleStage
- entryAssignment
- diamondView))
- assertEqual
- "direct imports retain textual order"
- [1, 2]
- ( Legacy.legacyModuleOrdinalValue
- <$> Vector.toList
- (Legacy.legacyAdmittedDirectImports
- entry)
- )
- assertEqual
- "diamond facts retain imported source order"
- [0, 1, 2]
- ( Legacy.legacyModuleOrdinalValue
- . Legacy.legacyFactModule
- . Legacy.legacyFactEntryReference
- <$> Vector.toList
- (Legacy.legacyAdmittedVisibleFacts
- entry)
- )
- assertEqual
- "equal statements at different references remain"
- 3
- (Vector.length
- (Legacy.legacyAdmittedVisibleFacts entry))
- let environmentSymbol =
- SymbolMixfix
- (mkMixfixItem
- [Just
- (Command
- "module_environment")]
- "module_environment"
- NonAssoc)
- environmentWith body =
- Legacy.legacyCheckingEnvironment
- (HashMap.insert
- environmentSymbol
- (toScope body)
- (Legacy.legacyEnvironmentAbbreviations
- Checking.initialLegacyCheckingEnvironment))
- (Legacy.legacyEnvironmentPredicateDefinitions
- Checking.initialLegacyCheckingEnvironment)
- (Legacy.legacyEnvironmentDependencies
- Checking.initialLegacyCheckingEnvironment)
- (Legacy.legacyEnvironmentOwnedSymbols
- Checking.initialLegacyCheckingEnvironment)
- (Legacy.legacyEnvironmentOwnedSymbolMarkers
- Checking.initialLegacyCheckingEnvironment)
- (Legacy.legacyEnvironmentFrozenSymbols
- Checking.initialLegacyCheckingEnvironment)
- (Legacy.legacyEnvironmentStructs
- Checking.initialLegacyCheckingEnvironment)
- (Legacy.legacyEnvironmentDefinedMarkers
- Checking.initialLegacyCheckingEnvironment)
- environmentA <-
- admitEnvironment
- aAssignment
- (Legacy.emptyLegacyImportedView
- Checking.initialLegacyCheckingEnvironment)
- (environmentWith Top)
- environmentView <-
- expectRight
- (Legacy.legacyImportedView
- Checking.initialLegacyCheckingEnvironment
- [environmentA])
- assertEqual
- "admitted semantic environment is imported"
- (Just (toScope Top))
- (HashMap.lookup
- environmentSymbol
- (Legacy.legacyEnvironmentAbbreviations
- (Legacy.legacyImportedCheckingEnvironment
- environmentView)))
- environmentB <-
- admitEnvironment
- bAssignment
- (Legacy.emptyLegacyImportedView
- Checking.initialLegacyCheckingEnvironment)
- (environmentWith Bottom)
- case Legacy.legacyImportedView
- Checking.initialLegacyCheckingEnvironment
- [environmentA, environmentB] of
- Left Legacy.LegacyImportedEnvironmentConflict{} ->
- pure ()
- Left err ->
- assertFailure
- ("expected imported environment conflict, got "
- <> show err)
- Right _ ->
- assertFailure
- "expected imported environment conflict"
-
- conflictingA <-
- admitOne
- aAssignment
- (Legacy.emptyLegacyImportedView
- Checking.initialLegacyCheckingEnvironment)
- "conflicting"
- Top
- (Location 4)
- conflictingB <-
- admitOne
- bAssignment
- (Legacy.emptyLegacyImportedView
- Checking.initialLegacyCheckingEnvironment)
- "conflicting"
- Bottom
- (Location 5)
- case Legacy.legacyImportedView
- Checking.initialLegacyCheckingEnvironment
- [conflictingA, conflictingB] of
- Left Legacy.LegacyImportedAliasConflict{} ->
- pure ()
- Left err ->
- assertFailure
- ("expected imported alias conflict, got "
- <> show err)
- Right _ ->
- assertFailure
- "expected imported alias conflict"
- actual ->
- assertFailure
- ("expected four module assignments, got "
- <> show (length actual))
- where
- admitOne assignment imported alias statement location = do
- let stage =
- Legacy.openLegacyModuleStage
- assignment
- imported
- staged =
- Facts.stageFact
- (alias :| [])
- (Facts.factOrigin location alias)
- (Facts.prepareSemanticFact statement)
- reservation <-
- expectRight
- (Legacy.reserveLegacyDeclaration
- (staged :| [])
- stage)
- let reserved =
- NonEmpty.head
- (Legacy.legacyReservedFacts reservation)
- admitted =
- Legacy.authorizeLegacyDeclaredAssumption
- stage
- Legacy.DeclaredUserAxiom
- reserved
- stage' <-
- expectRight
- (Legacy.appendEstablishedLegacyDeclaration
- reservation
- (admitted :| [])
- stage)
- expectRight
- (Legacy.sealLegacyModuleStage
- (Legacy.legacyImportedCheckingEnvironment imported)
- stage')
-
- admitEnvironment assignment imported finalEnvironment =
- expectRight
- (Legacy.sealLegacyModuleStage
- finalEnvironment
- (Legacy.openLegacyModuleStage assignment imported))
-
rejectsSiblingSyntaxLeakage :: Assertion
rejectsSiblingSyntaxLeakage =
withTemporaryDirectory "felix-source-syntax-world" \temp -> do
@@ -3667,48 +2027,6 @@ acceptsAdjectiveSignature =
_ ->
assertFailure
("unexpected adjective-signature blocks: " <> show blocks)
- semanticBlocks <- expectRight (Meaning.meaning blocks)
- void
- (Checking.check
- Checking.WithoutDumpPremselTraining
- semanticBlocks)
-
-rejectsQuantifiedSymbolicSignatureTerm :: Assertion
-rejectsQuantifiedSymbolicSignatureTerm =
- withTemporaryDirectory "felix-source-signature-quantified-term" \temp -> do
- writeFile
- (temp Posix.</> "entry.tex")
- (unlines
- [ "\\begin{definition}\\label{bridge}"
- , " $z$ is a bridge from $A$ to $B$ iff $z = z$ and $A = A$ and $B = B$."
- , "\\end{definition}"
- , "\\begin{signature}\\label{bridge_signature}"
- , " $\\foo{A}$ is a bridge from every set $x$ to $x$."
- , "\\end{signature}"
- ])
- graph <- buildSearchedGraph temp "entry.tex"
- workspace <- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- case Meaning.meaning
- (Parse.importedBeforeImporterBlocks workspace) of
- Left (Meaning.QuantifiedTermRequiresResolvedContext location) -> do
- assertEqual "quantified term file"
- "entry.tex"
- (locFile location)
- assertEqual "quantified term line"
- 5
- (locLine location)
- assertEqual "quantified term column"
- 30
- (locColumn location)
- Left err ->
- assertFailure
- ("expected quantified-term context error, got "
- <> show err)
- Right blocks ->
- assertFailure
- ("expected quantified-term context rejection, got "
- <> show blocks)
rejectsMalformedSignatureHead :: Assertion
rejectsMalformedSignatureHead = do
@@ -3902,162 +2220,6 @@ acceptsBuiltinPrefixPredicateDeclaration =
("unexpected built-in prefix declaration parse: "
<> show blocks)
-rejectsDuplicateFixedBaseSemantics :: Assertion
-rejectsDuplicateFixedBaseSemantics =
- withTemporaryDirectory "felix-source-builtin-collision" \temp -> do
- writeBuiltinZeroDefinition
- (temp Posix.</> "a.tex")
- "source_zero_a"
- writeFile
- (temp Posix.</> "entry.tex")
- ("\\import{a.tex}\n"
- <> builtinZeroDefinition "source_zero_b")
- graph <- buildSearchedGraph temp "entry.tex"
- workspace <- expectRight
- =<< Parse.parseResolvedSourceGraph graph
- assignments <-
- expectRight
- (Legacy.assignLegacyModuleOrdinals workspace)
- case toList assignments of
- [acceptedAssignment, collidingAssignment] -> do
- let acceptedParsed =
- Legacy.assignedParsedModule acceptedAssignment
- collidingParsed =
- Legacy.assignedParsedModule collidingAssignment
- acceptedLocation <-
- onlySyntaxOccurrenceLocation acceptedParsed
- collidingLocation <-
- onlySyntaxOccurrenceLocation collidingParsed
- assertLocation
- "accepted declaration"
- "a.tex"
- 1
- acceptedLocation
- assertLocation
- "colliding declaration"
- "entry.tex"
- 2
- collidingLocation
- assertEqual
- "fixed reuses emit no syntax delta"
- [[], []]
- [ Interface.canonicalSyntaxDeltaEntries
- (Interface.moduleSyntaxLocalDelta
- (Parse.parsedModuleSyntaxInterface parsed))
- | parsed <- [acceptedParsed, collidingParsed]
- ]
-
- checkedFoundationValue <-
- expectRight Foundation.checkedFoundation
- (acceptedBlocks, glossState) <-
- glossParsedBlocks
- Meaning.initialGlossState
- acceptedParsed
- acceptedBuilder <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- acceptedAssignment
- [])
- acceptedState <-
- Checking.runCheckingBlocks
- acceptedBlocks
- (checkingState acceptedBuilder)
- finalAcceptedBuilder <-
- expectJust
- "accepted transition builder"
- (Checking.checkingTransitionModuleBuilder
- acceptedState)
- acceptedModule <-
- expectRight
- (Transition.sealTransitionModule
- (Checking.checkingStateEnvironment
- acceptedState)
- finalAcceptedBuilder)
-
- (collidingBlocks, _finalGlossState) <-
- glossParsedBlocks glossState collidingParsed
- collidingBuilder <-
- expectRight
- (Transition.openTransitionModuleBuilder
- checkedFoundationValue
- Checking.initialLegacyCheckingEnvironment
- collidingAssignment
- [acceptedModule])
- result <-
- try
- (Checking.runCheckingBlocks
- collidingBlocks
- (checkingState collidingBuilder))
- :: IO
- (Either
- Checking.CheckingError
- Checking.CheckingState)
- case result of
- Left
- (Checking.CheckingError
- message
- location
- marker) -> do
- assertEqual
- "semantic collision location"
- collidingLocation
- location
- assertEqual
- "semantic collision marker"
- "source_zero_b"
- marker
- assertBool
- "accepted owner is identified"
- ("already owned by abbreviation source_zero_a"
- `Text.isInfixOf` message)
- Left err ->
- assertFailure
- ("expected located ownership collision, got "
- <> show err)
- Right _checked ->
- assertFailure
- "duplicate fixed-base semantics were accepted"
- actual ->
- assertFailure
- ("expected two module assignments, got "
- <> show (length actual))
- where
- checkingState builder =
- Checking.initialTransitionCheckingStateWithTaskPreparation
- Checking.WithoutDumpPremselTraining
- id
- builder
- (\_batch ->
- assertFailure
- "fixed-base abbreviation emitted an obligation")
-
- glossParsedBlocks initialState parsed =
- fmap
- (\(reversed, finalState) ->
- (reverse reversed, finalState))
- (foldM
- glossOne
- ([], initialState)
- (Parse.parsedModuleBlocks parsed))
-
- glossOne (reversed, state) raw = do
- (block, nextState) <-
- expectRight (Meaning.glossStep state raw)
- pure (block : reversed, nextState)
-
- onlySyntaxOccurrenceLocation parsed =
- case Parse.parsedModuleSyntaxOccurrences parsed of
- [occurrence] ->
- pure
- (Parse.parsedSyntaxOccurrenceLocation
- occurrence)
- occurrences ->
- assertFailure
- ("expected one fixed-base occurrence, got "
- <> show occurrences)
-
avoidsAliasImportLexiconCollision :: Assertion
avoidsAliasImportLexiconCollision =
withTemporaryDirectory "felix-source-alias-lexicon" \temp -> do