"""Original synthetic systems fixtures; SQLite is in-memory only."""
import sqlite3
def valid_ids(values):
 if any(not isinstance(v,str) or not v.strip() for v in values):raise ValueError('Invalid identifier')
def pairwise(values):
 valid_ids(values);duplicates=set();comparisons=0
 for i in range(len(values)):
  for j in range(i+1,len(values)):
   comparisons+=1
   if values[i]==values[j]:duplicates.add(values[i])
 return duplicates,comparisons
def seen_duplicates(values):
 valid_ids(values);seen=set();duplicates=set()
 for value in values:
  if value in seen:duplicates.add(value)
  seen.add(value)
 return duplicates,len(values)
def amount(value):
 if type(value) is not int or value<0:raise ValueError('Require nonnegative integer smallest-unit amount')
 return value
def database():
 db=sqlite3.connect(':memory:');db.execute('PRAGMA foreign_keys=ON')
 db.executescript('CREATE TABLE customers(id TEXT PRIMARY KEY);CREATE TABLE orders(id TEXT PRIMARY KEY,customer TEXT NOT NULL REFERENCES customers(id),amount INTEGER NOT NULL CHECK(amount>=0));')
 db.executemany('INSERT INTO customers VALUES(?)',[('C1',),('C2',)])
 db.executemany('INSERT INTO orders VALUES(?,?,?)',[('O1','C1',100),('O2','C1',200),('O3','C2',50)])
 return db
def totals(db):return db.execute('SELECT customer,SUM(amount) FROM orders GROUP BY customer ORDER BY customer').fetchall()
class RetryFixture:
 """Single-thread in-memory identity model; no durability or distributed guarantee."""
 def __init__(self):self.records={};self.effects=0
 def accept(self,request,order):
  valid_ids([request,order])
  if request in self.records:
   if self.records[request]['order']!=order:raise ValueError('Conflicting request identity')
   return dict(self.records[request])
  self.effects+=1;result=dict(order=order,event=self.effects);self.records[request]=dict(result);return result
if __name__=='__main__':
 values=['A','B','A','C','B','D'];print('Pairwise:',pairwise(values));print('Seen-set:',seen_duplicates(values))
 db=database();print('Totals:',totals(db));db.close()
 fixture=RetryFixture();print('First/retry/new:',fixture.accept('R1','O1'),fixture.accept('R1','O1'),fixture.accept('R2','O2'));print('Effects:',fixture.effects)
