Skip to content
This repository was archived by the owner on Apr 25, 2024. It is now read-only.

Commit 02ec6eb

Browse files
lucasmtrv-auditor
andauthored
Adds new tests for node refutation (#884)
Adds tests in `test_refute_node.py` for the fixes from #877. * Initialization of the prover is factored out to its own function `build_prover`. * `test_apr_proof_read_node_refutations` tests that the node refutations can be successfully and correctly read from the `.json` file (before the above PR this would raise an error). * `test_apr_proof_refute_node_no_successors` tests that a node can only be refuted if it has no successors. --------- Co-authored-by: devops <[email protected]>
1 parent b7934d5 commit 02ec6eb

File tree

4 files changed

+82
-30
lines changed

4 files changed

+82
-30
lines changed

docs/conf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
project = 'pyk'
1010
author = 'Runtime Verification, Inc'
1111
copyright = '2024, Runtime Verification, Inc'
12-
version = '0.1.630'
13-
release = '0.1.630'
12+
version = '0.1.631'
13+
release = '0.1.631'
1414

1515
# -- General configuration ---------------------------------------------------
1616
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

package/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.630
1+
0.1.631

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
44

55
[tool.poetry]
66
name = "pyk"
7-
version = "0.1.630"
7+
version = "0.1.631"
88
description = ""
99
authors = [
1010
"Runtime Verification, Inc. <[email protected]>",

src/tests/integration/proof/test_refute_node.py

Lines changed: 78 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,15 @@ def semantics(self, definition: KDefinition) -> KCFGSemantics:
8787
def proof_dir(self, tmp_path_factory: TempPathFactory) -> Path:
8888
return tmp_path_factory.mktemp('proofs')
8989

90-
def test_apr_proof_unrefute_node(
90+
def build_prover(
9191
self,
9292
kprove: KProve,
9393
proof_dir: Path,
9494
kcfg_explore: KCFGExplore,
95-
) -> None:
96-
# Given
97-
spec_file = K_FILES / 'refute-node-spec.k'
98-
spec_module = 'REFUTE-NODE-SPEC'
99-
claim_id = 'split-int-succeed'
100-
95+
spec_file: Path,
96+
spec_module: str,
97+
claim_id: str,
98+
) -> APRProver:
10199
claim = single(
102100
kprove.get_claims(Path(spec_file), spec_module_name=spec_module, claim_labels=[f'{spec_module}.{claim_id}'])
103101
)
@@ -111,14 +109,27 @@ def test_apr_proof_unrefute_node(
111109
logs={},
112110
proof_dir=proof_dir,
113111
)
114-
prover = APRProver(proof, kcfg_explore)
112+
return APRProver(proof, kcfg_explore)
113+
114+
def test_apr_proof_unrefute_node(
115+
self,
116+
kprove: KProve,
117+
proof_dir: Path,
118+
kcfg_explore: KCFGExplore,
119+
) -> None:
120+
# Given
121+
spec_file = K_FILES / 'refute-node-spec.k'
122+
spec_module = 'REFUTE-NODE-SPEC'
123+
claim_id = 'split-int-succeed'
124+
125+
prover = self.build_prover(kprove, proof_dir, kcfg_explore, spec_file, spec_module, claim_id)
115126

116127
# When
117128
prover.advance_proof(max_iterations=1)
118129
frontier_nodes = prover.proof.pending
119130
assert prover.proof.status == ProofStatus.PENDING
120131

121-
assert len(frontier_nodes)
132+
assert len(frontier_nodes) == 2
122133
frontier_node = frontier_nodes[0]
123134
prover.proof.refute_node(frontier_node)
124135
prover.proof.unrefute_node(frontier_node)
@@ -147,23 +158,7 @@ def test_apr_proof_refute_node(
147158
spec_module = 'REFUTE-NODE-SPEC'
148159
claim_id = 'split-int-fail'
149160

150-
claim = single(
151-
kprove.get_claims(Path(spec_file), spec_module_name=spec_module, claim_labels=[f'{spec_module}.{claim_id}'])
152-
)
153-
kcfg_pre, init_node, target_node = KCFG.from_claim(kprove.definition, claim, proof_dir)
154-
proof = APRProof(
155-
f'{spec_module}.{claim_id}',
156-
kcfg_pre,
157-
[],
158-
init=init_node,
159-
target=target_node,
160-
logs={},
161-
proof_dir=proof_dir,
162-
)
163-
prover = APRProver(
164-
proof,
165-
kcfg_explore,
166-
)
161+
prover = self.build_prover(kprove, proof_dir, kcfg_explore, spec_file, spec_module, claim_id)
167162

168163
# When
169164
prover.advance_proof()
@@ -196,3 +191,60 @@ def test_apr_proof_refute_node(
196191

197192
# Then
198193
assert prover.proof.status == expected_status
194+
195+
def test_apr_proof_read_node_refutations(
196+
self,
197+
kprove: KProve,
198+
proof_dir: Path,
199+
kcfg_explore: KCFGExplore,
200+
) -> None:
201+
# Given
202+
spec_file = K_FILES / 'refute-node-spec.k'
203+
spec_module = 'REFUTE-NODE-SPEC'
204+
claim_id = 'split-int-succeed'
205+
206+
prover = self.build_prover(kprove, proof_dir, kcfg_explore, spec_file, spec_module, claim_id)
207+
208+
# When
209+
prover.advance_proof(max_iterations=1)
210+
frontier_nodes = prover.proof.pending
211+
assert prover.proof.status == ProofStatus.PENDING
212+
213+
assert len(frontier_nodes) == 2
214+
frontier_node = frontier_nodes[0]
215+
prover.proof.refute_node(frontier_node)
216+
217+
proof_from_file = APRProof.read_proof_data(proof_dir, prover.proof.id)
218+
refutation_id = prover.proof.get_refutation_id(frontier_node.id)
219+
220+
# Then
221+
assert len(proof_from_file.node_refutations) == 1
222+
assert frontier_node.id in proof_from_file.node_refutations
223+
assert proof_from_file.node_refutations[frontier_node.id].id == refutation_id
224+
225+
def test_apr_proof_refute_node_no_successors(
226+
self,
227+
kprove: KProve,
228+
proof_dir: Path,
229+
kcfg_explore: KCFGExplore,
230+
) -> None:
231+
# Given
232+
spec_file = K_FILES / 'refute-node-spec.k'
233+
spec_module = 'REFUTE-NODE-SPEC'
234+
claim_id = 'split-int-fail'
235+
236+
prover = self.build_prover(kprove, proof_dir, kcfg_explore, spec_file, spec_module, claim_id)
237+
238+
# When
239+
prover.advance_proof()
240+
failing_node = single(prover.proof.failing)
241+
predecessors = prover.proof.kcfg.predecessors(failing_node.id)
242+
assert len(predecessors) == 1
243+
predecessor_node = predecessors[0].source
244+
245+
result_predecessor = prover.proof.refute_node(predecessor_node)
246+
result_successor = prover.proof.refute_node(failing_node)
247+
248+
# Then
249+
assert result_predecessor is None # fails because the node has successors
250+
assert result_successor is not None # succeeds because the node has no successors

0 commit comments

Comments
 (0)