diff --git a/.changeset/spec-sync-dokimasia-assert-spec.md b/.changeset/spec-sync-dokimasia-assert-spec.md new file mode 100644 index 0000000..ded4cb1 --- /dev/null +++ b/.changeset/spec-sync-dokimasia-assert-spec.md @@ -0,0 +1,4 @@ +--- +--- + +Sync the vendored copy of assert-spec to 15.0.0. diff --git a/src/dokimi_assert/conformance/VERSION b/src/dokimi_assert/conformance/VERSION index fc9c00c..94188a7 100644 --- a/src/dokimi_assert/conformance/VERSION +++ b/src/dokimi_assert/conformance/VERSION @@ -1 +1 @@ -13.6.0 +15.0.0 diff --git a/src/dokimi_assert/conformance/corpus/history/linearizable.json b/src/dokimi_assert/conformance/corpus/history/linearizable.json index 15a2c45..2273680 100644 --- a/src/dokimi_assert/conformance/corpus/history/linearizable.json +++ b/src/dokimi_assert/conformance/corpus/history/linearizable.json @@ -2729,6 +2729,411 @@ "limit": null } }, + { + "id": "linearizable/unknown-writes-that-no-read-needs-pass-within-the-budget", + "spec": "register", + "budget": 10000, + "history": [ + { + "invoke": 0, + "client": 0, + "operation": "write", + "args": [ + { + "type": "int", + "value": 1 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 0, + "error": "crashed" + }, + { + "invoke": 1, + "client": 1, + "operation": "write", + "args": [ + { + "type": "int", + "value": 2 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 1, + "error": "crashed" + }, + { + "invoke": 2, + "client": 2, + "operation": "write", + "args": [ + { + "type": "int", + "value": 3 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 2, + "error": "crashed" + }, + { + "invoke": 3, + "client": 0, + "operation": "write", + "args": [ + { + "type": "int", + "value": 1 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 3, + "error": "crashed" + }, + { + "invoke": 4, + "client": 1, + "operation": "write", + "args": [ + { + "type": "int", + "value": 2 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 4, + "error": "crashed" + }, + { + "invoke": 5, + "client": 2, + "operation": "write", + "args": [ + { + "type": "int", + "value": 3 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 5, + "error": "crashed" + }, + { + "invoke": 6, + "client": 0, + "operation": "write", + "args": [ + { + "type": "int", + "value": 1 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 6, + "error": "crashed" + }, + { + "invoke": 7, + "client": 1, + "operation": "write", + "args": [ + { + "type": "int", + "value": 2 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 7, + "error": "crashed" + }, + { + "invoke": 8, + "client": 2, + "operation": "write", + "args": [ + { + "type": "int", + "value": 3 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 8, + "error": "crashed" + }, + { + "invoke": 9, + "client": 0, + "operation": "write", + "args": [ + { + "type": "int", + "value": 1 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 9, + "error": "crashed" + }, + { + "invoke": 10, + "client": 1, + "operation": "write", + "args": [ + { + "type": "int", + "value": 2 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 10, + "error": "crashed" + }, + { + "invoke": 11, + "client": 2, + "operation": "write", + "args": [ + { + "type": "int", + "value": 3 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 11, + "error": "crashed" + }, + { + "invoke": 12, + "client": 0, + "operation": "read", + "args": [], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "ok": 12, + "output": { + "type": "null" + } + } + ], + "expect": "pass", + "detail": { + "outcome": "passed", + "partitions": 1, + "steps": 1325, + "partition": null, + "calls": null, + "concurrency": null, + "linearized": null, + "states": null, + "candidates": null, + "limit": null + } + }, + { + "id": "linearizable/a-covered-configuration-is-no-frontier", + "spec": "register", + "history": [ + { + "invoke": 0, + "client": 0, + "operation": "write", + "args": [ + { + "type": "int", + "value": 1 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 0, + "error": "crashed" + }, + { + "invoke": 1, + "client": 1, + "operation": "write", + "args": [ + { + "type": "int", + "value": 1 + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "unknown": 1, + "error": "crashed" + }, + { + "invoke": 2, + "client": 2, + "operation": "read", + "args": [], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "ok": 2, + "output": { + "type": "int", + "value": 7 + } + } + ], + "expect": "fail", + "detail": { + "outcome": "violated", + "partitions": 1, + "steps": 7, + "partition": [ + { + "type": "string", + "value": "x" + } + ], + "calls": 3, + "concurrency": 3, + "linearized": [ + { + "call": 0, + "completion": 1, + "process": 0, + "operation": "write", + "args": [ + { + "type": "int", + "value": 1 + } + ] + } + ], + "states": [ + { + "type": "int", + "value": 1 + } + ], + "candidates": [ + { + "call": 4, + "completion": 5, + "process": 2, + "operation": "read", + "args": [], + "output": { + "type": "int", + "value": 7 + } + } + ], + "limit": null + } + }, { "id": "linearizable/a-compare-and-set-that-refuses-a-matching-value-is-violated", "spec": "cas-register", diff --git a/src/dokimi_assert/conformance/corpus/history/serializable.json b/src/dokimi_assert/conformance/corpus/history/serializable.json index 9dab638..89d7fe1 100644 --- a/src/dokimi_assert/conformance/corpus/history/serializable.json +++ b/src/dokimi_assert/conformance/corpus/history/serializable.json @@ -1755,6 +1755,444 @@ ] } }, + { + "id": "serializable/two-transactions-append-to-the-list-that-both-read", + "history": [ + { + "invoke": 0, + "client": 0, + "operation": "txn", + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 1 + } + ] + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "ok": 0, + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 1 + } + ] + } + ] + } + }, + { + "invoke": 1, + "client": 1, + "operation": "txn", + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "invoke": 2, + "client": 2, + "operation": "txn", + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "ok": 1, + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ] + } + }, + { + "ok": 2, + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ] + } + } + ], + "expect": "fail", + "detail": { + "anomaly": "lost-update", + "kinds": [ + "lost-update", + "G2" + ], + "transactions": [ + { + "call": 2, + "completion": 4, + "kind": "ok", + "process": 1, + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ], + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ] + } + }, + { + "call": 3, + "completion": 5, + "kind": "ok", + "process": 2, + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ], + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ] + } + } + ], + "cycle": null, + "explanation": [ + { + "calls": [ + 2, + 3 + ], + "key": { + "type": "string", + "value": "x" + }, + "read": { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + } + ] + } + }, { "id": "serializable/two-transactions-append-to-two-keys-in-opposite-orders", "history": [ @@ -11261,8 +11699,9 @@ ], "expect": "fail", "detail": { - "anomaly": "G2", + "anomaly": "lost-update", "kinds": [ + "lost-update", "G2" ], "transactions": [ @@ -11427,53 +11866,20 @@ } } ], - "cycle": [ - { - "call": 2, - "relations": [ - "rw" - ] - }, - { - "call": 3, - "relations": [ - "rw" - ] - } - ], + "cycle": null, "explanation": [ { - "from": 2, - "to": 3, - "relation": "rw", - "key": { - "type": "string", - "value": "x" - }, - "value": { - "type": "int", - "value": 1 - }, - "next": { - "type": "int", - "value": 3 - } - }, - { - "from": 3, - "to": 2, - "relation": "rw", + "calls": [ + 2, + 3 + ], "key": { "type": "string", "value": "x" }, - "value": { + "read": { "type": "int", "value": 1 - }, - "next": { - "type": "int", - "value": 2 } } ] diff --git a/src/dokimi_assert/conformance/corpus/history/snapshot-isolation.json b/src/dokimi_assert/conformance/corpus/history/snapshot-isolation.json index 13ad486..a5ac7d8 100644 --- a/src/dokimi_assert/conformance/corpus/history/snapshot-isolation.json +++ b/src/dokimi_assert/conformance/corpus/history/snapshot-isolation.json @@ -1754,6 +1754,443 @@ ] } }, + { + "id": "snapshot-isolation/two-transactions-append-to-the-list-that-both-read", + "history": [ + { + "invoke": 0, + "client": 0, + "operation": "txn", + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 1 + } + ] + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "ok": 0, + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 1 + } + ] + } + ] + } + }, + { + "invoke": 1, + "client": 1, + "operation": "txn", + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "invoke": 2, + "client": 2, + "operation": "txn", + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ], + "keys": [ + { + "type": "string", + "value": "x" + } + ] + }, + { + "ok": 1, + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ] + } + }, + { + "ok": 2, + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ] + } + } + ], + "expect": "fail", + "detail": { + "anomaly": "lost-update", + "kinds": [ + "lost-update" + ], + "transactions": [ + { + "call": 2, + "completion": 4, + "kind": "ok", + "process": 1, + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ], + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ] + } + }, + { + "call": 3, + "completion": 5, + "kind": "ok", + "process": 2, + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ], + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "append" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ] + } + } + ], + "cycle": null, + "explanation": [ + { + "calls": [ + 2, + 3 + ], + "key": { + "type": "string", + "value": "x" + }, + "read": { + "type": "list", + "of": "int", + "value": [ + 1 + ] + } + } + ] + } + }, { "id": "snapshot-isolation/two-transactions-append-to-two-keys-in-opposite-orders", "history": [ @@ -10438,13 +10875,191 @@ } } ], - "expect": "pass", + "expect": "fail", "detail": { - "anomaly": null, - "kinds": [], - "transactions": null, + "anomaly": "lost-update", + "kinds": [ + "lost-update" + ], + "transactions": [ + { + "call": 2, + "completion": 4, + "kind": "ok", + "process": 1, + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "write" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ], + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 1 + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "write" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 2 + } + ] + } + ] + } + }, + { + "call": 3, + "completion": 5, + "kind": "ok", + "process": 2, + "args": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "null" + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "write" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ], + "output": { + "type": "list", + "items": [ + { + "type": "list", + "items": [ + { + "type": "string", + "value": "read" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 1 + } + ] + }, + { + "type": "list", + "items": [ + { + "type": "string", + "value": "write" + }, + { + "type": "string", + "value": "x" + }, + { + "type": "int", + "value": 3 + } + ] + } + ] + } + } + ], "cycle": null, - "explanation": null + "explanation": [ + { + "calls": [ + 2, + 3 + ], + "key": { + "type": "string", + "value": "x" + }, + "read": { + "type": "int", + "value": 1 + } + } + ] } }, { diff --git a/src/dokimi_assert/conformance/corpus/prop/behaviour.json b/src/dokimi_assert/conformance/corpus/prop/behaviour.json index 9bbbafd..91eb592 100644 --- a/src/dokimi_assert/conformance/corpus/prop/behaviour.json +++ b/src/dokimi_assert/conformance/corpus/prop/behaviour.json @@ -835,6 +835,68 @@ "reason": null } }, + { + "id": "behaviour/reports-a-valid-case-whose-replay-observes-another-fingerprint", + "body": { + "kind": "observes-its-calls" + }, + "settings": { + "seed": "7", + "confirm": 1 + }, + "detail": { + "outcome": "flaky", + "cases": 1, + "rejected": 0, + "seed": "7", + "counterexample": [ + { + "label": "value", + "value": { + "type": "int", + "value": 0 + }, + "any-value-fails": null, + "nearest-passing": null + } + ], + "failure": null, + "choices": null, + "others": null, + "divergence": { + "what": "fingerprint", + "index": 0, + "recorded": 1, + "replayed": 2, + "label": null, + "step": null + }, + "coverage": null, + "reason": null + } + }, + { + "id": "behaviour/passes-the-same-body-without-confirm", + "body": { + "kind": "observes-its-calls" + }, + "settings": { + "seed": "7" + }, + "detail": { + "outcome": "passed", + "cases": 10, + "rejected": 0, + "seed": "7", + "counterexample": null, + "failure": null, + "choices": null, + "others": null, + "divergence": null, + "coverage": null, + "reason": null + } + }, { "id": "behaviour/skips-the-run-at-a-case-that-skips", "body": { diff --git a/src/dokimi_assert/conformance/corpus/prop/recording.json b/src/dokimi_assert/conformance/corpus/prop/recording.json index 968bf9f..3b9de26 100644 --- a/src/dokimi_assert/conformance/corpus/prop/recording.json +++ b/src/dokimi_assert/conformance/corpus/prop/recording.json @@ -732,6 +732,107 @@ } ] }, + { + "id": "recording/records-the-replay-of-every-fifth-valid-case", + "body": { + "draw": { + "gen": "integer", + "min": 0, + "max": 1000 + } + }, + "settings": { + "seed": "7", + "cases": 10, + "confirm": 5 + }, + "verdict": "pass", + "calls": [ + { + "run": 1, + "phase": "simplest", + "verdict": "pass" + }, + { + "run": 2, + "phase": "random", + "verdict": "pass" + }, + { + "run": 4, + "phase": "random", + "verdict": "pass" + }, + { + "run": 5, + "phase": "edge", + "verdict": "pass" + }, + { + "run": 6, + "phase": "random", + "verdict": "pass" + }, + { + "run": 7, + "phase": "confirm", + "verdict": "pass" + }, + { + "run": 8, + "phase": "edge", + "verdict": "pass" + }, + { + "run": 9, + "phase": "random", + "verdict": "pass" + }, + { + "run": 11, + "phase": "random", + "verdict": "pass" + }, + { + "run": 12, + "phase": "random", + "verdict": "pass" + }, + { + "run": 13, + "phase": "random", + "verdict": "pass" + }, + { + "run": 14, + "phase": "confirm", + "verdict": "pass" + } + ] + }, + { + "id": "recording/records-the-replay-of-a-valid-case-that-observes-another-fingerprint", + "body": { + "kind": "observes-its-calls" + }, + "settings": { + "seed": "7", + "confirm": 1 + }, + "verdict": "fail", + "calls": [ + { + "run": 1, + "phase": "simplest", + "verdict": "pass" + }, + { + "run": 2, + "phase": "confirm", + "verdict": "pass" + } + ] + }, { "id": "recording/records-the-examples-then-the-stored-cases", "body": { diff --git a/src/dokimi_assert/conformance/corpus/stateful/machines.json b/src/dokimi_assert/conformance/corpus/stateful/machines.json index a4cc2ad..54de473 100644 --- a/src/dokimi_assert/conformance/corpus/stateful/machines.json +++ b/src/dokimi_assert/conformance/corpus/stateful/machines.json @@ -298,6 +298,30 @@ }, "error": null }, + { + "id": "racy-counter/a-concurrent-mean-of-0-stops-each-section-before-the-race", + "subject": "racy-counter", + "setup": { + "concurrent-mean": 0 + }, + "settings": { + "seed": "1" + }, + "detail": { + "outcome": "passed", + "cases": 98, + "rejected": 0, + "seed": "1", + "counterexample": null, + "failure": null, + "choices": null, + "others": null, + "divergence": null, + "coverage": null, + "reason": null + }, + "error": null + }, { "id": "counter-refuses-every-third/a-refusal-changes-the-actions-a-step-lists", "subject": "counter-refuses-every-third", diff --git a/src/dokimi_assert/conformance/manifest.json b/src/dokimi_assert/conformance/manifest.json index e638863..dbbd198 100644 --- a/src/dokimi_assert/conformance/manifest.json +++ b/src/dokimi_assert/conformance/manifest.json @@ -1,8 +1,8 @@ { - "commit": "ddbe8c21a3bc591b219ba88243c5b4a06785a454", - "digest": "sha256:9a679b0a3c09dca4945c49a78610ccee600e706f820ab12b4ea933c44fb2a109", + "commit": "43476f24e7782562b28e7b2d6ac812d7f489a091", + "digest": "sha256:68a7d26ed39f4322c0affbd840b1bd2906e364b1098385dbb0f5a2b96cbd8476", "files": { - "VERSION": "sha256:66bcc7471f4ca6bed3b255adacc2804880b4ab2adb78324996de8f1c0cde6bb1", + "VERSION": "sha256:55d90fdc3f902e5c0b16b3378f9eaa36e970a1c09723c33de7d47d0370044012", "corpus/accumulates.json": "sha256:9ac2967d84157a9b57d3fb59ef75378e60495ced35194ba170bf216deb0e3daf", "corpus/after-close.json": "sha256:c7df47d3ef812973763b2191caa55180c1d2536710873bb420ff8d4e79da6506", "corpus/associative.json": "sha256:41169311a5d852966b84a14702a528a8f99591e82c734d32017fc6586bae56e9", @@ -28,10 +28,10 @@ "corpus/files/tree-unchanged.json": "sha256:d1384e7a48e2fa983c8d829af94fed71491b6d31b492dd60abdae043fe3c9a75", "corpus/has-prefix.json": "sha256:935fdc489462090ae65b257970411fc6dbd695123ec48e07c5cac29a5583bc4f", "corpus/has-suffix.json": "sha256:ee23deeed9804651f26c0a6be8fdb655acec52d003521de5498c1181caec646d", - "corpus/history/linearizable.json": "sha256:64a55f71bcba1ea89824b28f7f891c98e78f64ce00ab26cccedc0ddb16c15d29", + "corpus/history/linearizable.json": "sha256:5bd71a0e763f20cfdec46f162f8c6319ea961cbe50006548d883a852436a5f95", "corpus/history/seam.json": "sha256:d5e727ea967d185ebfb433db1cfa75e42cd2df88ab30e586ba9b141a60145dab", - "corpus/history/serializable.json": "sha256:af4cc86b24544b3758b757d11a9dfd78d4b5038dd677375d5ed3b7e03c08a712", - "corpus/history/snapshot-isolation.json": "sha256:37372dd869ef8cf5baccf5ce9852241205ecfccf68e5ca126545e672793f5d4e", + "corpus/history/serializable.json": "sha256:0123efa1da6c5bed6f16955cb48fc9cd599640c2c79c632dc54564df9277ed86", + "corpus/history/snapshot-isolation.json": "sha256:651a42e705b2e4c808d6610004557040c3839d5e56d409b23d8d849bd2b5865f", "corpus/honours-cancellation.json": "sha256:81fc9e6a6b721a0140cfe4e3d68847e36fc45463ec4baa25499613f26b6dc48f", "corpus/honours-deadline.json": "sha256:0bd133592bbdfbb145cabacdc1360904da546e9e3f000670c08222f3694ebe32", "corpus/idempotent.json": "sha256:f78e287c54ef7033ceff0148d71844c32085e5e61f1a0929d21e1708ec1a8f7f", @@ -50,7 +50,7 @@ "corpus/not-throws.json": "sha256:8ee7b238c79930fe5321626e78e2ecaee7d3255f4aba66d8b32aac5336fb07da", "corpus/permutation.json": "sha256:a4f23e73693f5241d0507c098a5f21fd9398a0e2ccec516ef634893ce62392c1", "corpus/poisoned.json": "sha256:52f833723b3575767d95313a19b7b7023ae8fe450f31ac7c0b08352ec89173b9", - "corpus/prop/behaviour.json": "sha256:17780fa221f623357f5b293f3f965e99defcf1e653a32c9446dcb117abc35225", + "corpus/prop/behaviour.json": "sha256:b4dd7fc872c0aef3989ad72dbcfe49acf78becef0d17d73f5ef729a77bbb9b07", "corpus/prop/bridge.json": "sha256:583763bb7ab09e7d6f9905ec548f505cd78496f9f61a5f11461d2bae657e3474", "corpus/prop/coverage.json": "sha256:6ddea5b6932e1722599d37efcbbfcbfbcf7a72fe82cef8d380c84430b041673e", "corpus/prop/decoding.json": "sha256:651e4ba90fee8ac5b67673c815b4d2a32f79054f009659a481b71c92a06c6934", @@ -59,7 +59,7 @@ "corpus/prop/forms.json": "sha256:c2cbc6a1e0d172cafe5acbfe4dbe40aecddbd5a5632eaf032e6742ee8e3257b5", "corpus/prop/generation.json": "sha256:790499ef131f4c062d9b4b406052cb9f8f070ca93d9a3a66ed170c7dc411ebe1", "corpus/prop/inverse.json": "sha256:82c1a258ebeb5e282deb7e7a6c9d722b50f8eeaec283cd20a2ad49a7ccda08f0", - "corpus/prop/recording.json": "sha256:d8a57c7e4f859fa82d19e96c17d3411108aeacc6cc6b13c29c970516f84012da", + "corpus/prop/recording.json": "sha256:63f7f94360b4c1b961642926c2a55750dc64b445f92e4ad3d5f9390c47c575ce", "corpus/prop/shapes.json": "sha256:7d0eb36916a1e1927f905fafb974405660a608b05eed8e20b7e86000ac1365fd", "corpus/prop/shrinking.json": "sha256:bb8195520aa1f5179b53780c2184c24f9338aaf340daaabf1d07a61f283f5027", "corpus/prop/store.json": "sha256:9e4f60498961abfb3b255d2957012165058e3736b89527da4ebaacd2424ce65f", @@ -67,13 +67,13 @@ "corpus/pure.json": "sha256:ad3dd837179217ed368d298d1f80f9f122758849404ad89bf6df2ef5542b2cd6", "corpus/round-trip.json": "sha256:4cf7e3545cb39b5e72c22d80fe257d924a22689004c57194e8524aa6bc72d334", "corpus/stable-order.json": "sha256:396b4366b7c118bb9e52c3d38cd2c28c40dbb727520c9a3bb0cac2546275a188", - "corpus/stateful/machines.json": "sha256:16548fef443c4daca2994003b70b1442756c135b417ceb10348cb78bf81bb36c", + "corpus/stateful/machines.json": "sha256:8a46b4f1b36338e7d38e9de60b8afb08de15f1daf34436032622a36467880c27", "corpus/throws.json": "sha256:40dd385108c7ada8c0ce236a79c13db2da23e8e142f2fa5947fcce1623e7e365", "corpus/total.json": "sha256:ee76e6bd97358d2576dd24dc9d32949cdce5b46484635237a1a4c0e043322cb3", "corpus/true.json": "sha256:43e01f045228fd01449d2abad5c07b50b8d700fd6c986e6877a4f192ff86b616", - "overlays/python.json": "sha256:517d75bb2d734f7bbe8cd60db00e2eb316eac43f64dc8d5201a1c01e70fe5844", - "spec/assertions.json": "sha256:8a33045679335176af75ed8b1a4d35c9ee15e7f669b38c054a9b0f42b8af3924", - "spec/naming.json": "sha256:e81b7cb928eafdb36f9b228347fd5d6ea79089d845f334b8b36e0fe886669535", + "overlays/python.json": "sha256:e62ec4315354c58c0d076576d3cfc9c751c700e993244ff842e211951934f637", + "spec/assertions.json": "sha256:e363801ca77364b66ff9bac19f589fd260a6936256131791949a567296f207df", + "spec/naming.json": "sha256:83bbc4d1514633c99ba75236ecac3bb74688acd272dd73ce181829db27cbe388", "spec/zones.json": "sha256:6eb1d994a1e2d727161582e20dee8cd429073fa561c06f8eb7442c20f810f6c6" }, "languages": { @@ -82,5 +82,5 @@ ] }, "repo": "dokimasia/assert-spec", - "version": "13.6.0" + "version": "15.0.0" } diff --git a/src/dokimi_assert/conformance/overlays/python.json b/src/dokimi_assert/conformance/overlays/python.json index d4691e6..56f66e7 100644 --- a/src/dokimi_assert/conformance/overlays/python.json +++ b/src/dokimi_assert/conformance/overlays/python.json @@ -1,5 +1,5 @@ { - "extends": "spec://assertions@13.6.0", + "extends": "spec://assertions@15.0.0", "language": "python", "diverge": [ { diff --git a/src/dokimi_assert/conformance/spec/assertions.json b/src/dokimi_assert/conformance/spec/assertions.json index b3857e4..ace871f 100644 --- a/src/dokimi_assert/conformance/spec/assertions.json +++ b/src/dokimi_assert/conformance/spec/assertions.json @@ -24,7 +24,8 @@ ], "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "Combining the combination of a and b with c gives what combining a with the combination of b and c gives. first is the former, and second the latter.\n" }, @@ -81,7 +82,8 @@ ], "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "Combining a and b gives what combining b and a gives. first is the combination of a and b, and second the combination of b and a.\n" }, @@ -102,7 +104,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "Text contains a substring, a sequence an element, or a map a key. An element or a key compares as equal compares, so an int does not match a float.\n" }, @@ -123,7 +126,8 @@ ], "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "32 calls of a subject with one input return equal results. first is the first result, and second the first result that differs.\n" }, @@ -144,7 +148,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "Structural equality. A null collection does not equal an empty one, no type coercion, NaN is unequal to itself, floats compare exactly and by value so -0 equals +0, cycles stop, functions compare by identity.\n" }, @@ -299,7 +304,8 @@ ], "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "Calling a subject twice with one input leaves the observed state that calling it once left. first is the observation after one call, and second after two.\n" }, @@ -431,7 +437,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "One iteration of a subject yields each element at most once. got is the first element equal to an earlier one, and index its position.\n" }, @@ -451,7 +458,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "Negation of contains.\n" }, @@ -470,7 +478,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "Negation of equal.\n" }, @@ -486,7 +495,8 @@ ], "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "Observed state changes across a call. got is the observation that did not change.\n" }, @@ -523,7 +533,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "A sequence contains the same elements as another, each as often, in any order. Elements compare as equal compares them.\n" }, @@ -587,7 +598,8 @@ "package": "prop", "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "The property form of associative. Each case of a run generates a, b and c, and associative runs on them as prop-for-all runs a body.\n" }, @@ -642,7 +654,8 @@ "package": "prop", "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "The property form of commutative. Each case of a run generates a and b, and commutative runs on them as prop-for-all runs a body.\n" }, @@ -672,7 +685,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "The property form of contains. Each case of a run generates the input, and contains runs on it as prop-for-all runs a body.\n" }, @@ -726,7 +740,8 @@ "package": "prop", "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "The property form of deterministic. Each case of a run generates the input, and deterministic runs on it as prop-for-all runs a body.\n" }, @@ -781,7 +796,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "The property form of equal. Each case of a run generates the input, and equal runs on it as prop-for-all runs a body.\n" }, @@ -1078,7 +1094,8 @@ "package": "prop", "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "The property form of idempotent. Each case of a run generates the input, and idempotent runs on it as prop-for-all runs a body.\n" }, @@ -1283,7 +1300,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "The property form of not-contains. Each case of a run generates the input, and not-contains runs on it as prop-for-all runs a body.\n" }, @@ -1338,7 +1356,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "The property form of not-equal. Each case of a run generates the input, and not-equal runs on it as prop-for-all runs a body.\n" }, @@ -1392,7 +1411,8 @@ "package": "prop", "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "The property form of not-pure. Each case of a run generates the input, and not-pure runs on it as prop-for-all runs a body.\n" }, @@ -1472,7 +1492,8 @@ "relaxations": [ "equate-empty", "equate-nans", - "by-identity" + "by-identity", + "equate-by" ], "summary": "The property form of permutation. Each case of a run generates the input, and permutation runs on it as prop-for-all runs a body.\n" }, @@ -1501,7 +1522,8 @@ "package": "prop", "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "The property form of pure. Each case of a run generates the input, and pure runs on it as prop-for-all runs a body.\n" }, @@ -1530,7 +1552,8 @@ "package": "prop", "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "The property form of round-trip. Each case of a run generates the input, and round-trip runs on it as prop-for-all runs a body.\n" }, @@ -1592,7 +1615,8 @@ ], "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "Observed state is unchanged across a call.\n" }, @@ -1609,7 +1633,8 @@ ], "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "The inverse conversion of the forward conversion of an input returns the input. want is the input, and got what came back.\n" }, @@ -1645,7 +1670,8 @@ ], "relaxations": [ "equate-empty", - "equate-nans" + "equate-nans", + "equate-by" ], "summary": "32 iterations of a subject yield equal sequences. first is the first sequence, and second the first sequence that differs.\n" }, @@ -1785,6 +1811,9 @@ "by-identity": { "summary": "A reference equals another reference only when both refer to the same object, whatever the object's value. A value that is no reference compares as without it. The modifier applies wherever the comparison meets a reference: at the top, in an element of a list, in a value of a map and in a field of a record. What a reference is in each language is stated where the encoding states the reference literal.\n" }, + "equate-by": { + "summary": "A value of the type of the transform's argument compares by the transform's result, under the comparison and the other modifiers of the call. The modifier applies wherever the comparison meets such a value: at the top, in an element of a list, in a key and a value of a map and in a field of a record. At one place at most one transform applies: the result compares as it is, and its parts compare under the transforms again. The last transform of a call whose type matches a value applies. The record of equal and of not-equal states the result in place of got and want when the transform matches them.\n" + }, "equate-empty": { "summary": "An absent container equals an empty one of the same type. Without it a null map and an empty map are different values, which is what the standard states by default.\n" }, @@ -1928,5 +1957,5 @@ "summary": "Yields two objects, and the value of each is 1.\n" } }, - "version": "13.6.0" + "version": "15.0.0" } diff --git a/src/dokimi_assert/conformance/spec/naming.json b/src/dokimi_assert/conformance/spec/naming.json index 11928eb..67d10d3 100644 --- a/src/dokimi_assert/conformance/spec/naming.json +++ b/src/dokimi_assert/conformance/spec/naming.json @@ -921,6 +921,13 @@ "python": "by_identity", "typescript": "byIdentity" }, + "equate-by": { + "go": "EquateBy", + "java": "Option.equateBy", + "kotlin": "Option.equateBy", + "python": "equate_by", + "typescript": "equateBy" + }, "equate-empty": { "go": "EquateEmpty", "java": "Option.EQUATE_EMPTY", @@ -1163,6 +1170,14 @@ "rust": "prop::composite", "typescript": "prop.composite" }, + "prop.confirm": { + "go": "prop.Confirm", + "java": "Prop.confirm", + "kotlin": "Prop.confirm", + "python": "prop.confirm", + "rust": "prop::confirm", + "typescript": "prop.confirm" + }, "prop.dict": { "go": "prop.Dict", "java": "Prop.dict", @@ -1507,6 +1522,14 @@ "rust": "stateful::concurrent", "typescript": "stateful.concurrent" }, + "steps.concurrent-mean": { + "go": "stateful.ConcurrentMean", + "java": "Stateful.concurrentMean", + "kotlin": "Stateful.concurrentMean", + "python": "stateful.concurrent_mean", + "rust": "stateful::concurrent_mean", + "typescript": "stateful.concurrentMean" + }, "steps.max": { "go": "stateful.Max", "java": "Stateful.max", @@ -2507,5 +2530,5 @@ } } }, - "version": "13.6.0" + "version": "15.0.0" }