def test(store):
	from Foo import Foo
	from Bar import Bar
	from BarReq import BarReq

	# Create a Foo and a Bar that refers to it
	f = Foo()
	f.setX(3)

	store.addObject(f)
	store.saveChanges()

	b = Bar()
	b.setFoo(f)
	store.addObject(b)
	store.saveChanges()

	# Test fetching
	store.clear()
	results = store.fetchObjectsOfClass(Bar)
	assert len(results)
	b = results[0]
	f1 = b.foo()
	f2 = b.foo()
	assert f1 is not None, 'got None instead of a Foo'
	assert f1 is f2  # test uniqueness
	assert b.foo().x() == 3

	# Fetch in reverse order
	store.clear()
	f = store.fetchObjectsOfClass(Foo)[0]
	b = store.fetchObjectsOfClass(Bar)[0]
	assert b.foo() is f

	# Test None, set, save and retrieve
	b.setFoo(None)
	store.saveChanges()
	store.clear()
	b = store.fetchObjectsOfClass(Bar)[0]
	assert b.foo() is None

	# Test the assertions in setFoo()
	b = BarReq()
	try:
		b.setFoo(None)
	except Exception:
		pass
	else:
		NoException('b.setFoo(None) # None not allowed')

	try:
		b.setFoo('x')
	except Exception:
		pass
	else:
		NoException('b.setFoo("x") # wrong type not allowed')

	try:
		b.setFoo(Bar())
	except Exception:
		pass
	else:
		NoException('b.setFoo(Bar()) # wrong class not allowed')


def NoException(codeString):
	raise Exception, 'Failed to raise exception for: ' + codeString
