def test_relationship_descriptor_many_to_many(): class User: pass class Group: pass Group_users = many_relationship_descriptor('users', User) User_groups = many_relationship_descriptor('groups', Group) Group_users.initialize(User_groups) User_groups.initialize(Group_users) Group.users = Group_users User.groups = User_groups groups = [Group() for i in range(10)] users = [User() for i in range(10)] from random import choice def check_group_invariant(group): for user in group.users: assert group in user.groups for i in range(1000): choice(users).groups.add(choice(groups)) choice(groups).users.discard(choice(users)) for g in groups: check_group_invariant(g)
def test_relationship_descriptor_one_to_many(): class Entry: def __init__(self,name): self.name = name def __repr__(self): if self.parent: return repr(self.parent)+"/"+self.name else: return self.name class Directory(Entry): pass class File(Entry): pass Entry.parent = one_relationship_descriptor('parent', Directory) Directory.contents = many_relationship_descriptor('contents', Entry) Entry.parent.initialize(Directory.contents) Directory.contents.initialize(Entry.parent) root = Directory("") etc = Directory("etc") usr = Directory("usr") mnt = Directory("mnt") var = Directory("var") root.contents.add(etc) root.contents.add(usr) root.contents.add(mnt) root.contents.add(var) root.contents = [] assert len(root.contents)==0 root.contents = [mnt,var] assert len(root.contents)==2 root.contents.add(etc) root.contents.add(usr) assert len(root.contents)==4 assert etc.parent == usr.parent == mnt.parent == var.parent == root pwd = File("pwd") pwd.parent=etc bin, lib, man = Directory("bin"), Directory("lib"), Directory("man") bin.parent = man.parent = lib.parent = usr assert usr.contents == set([bin, man, lib]) var.contents.add(lib) assert lib.parent == var assert lib in var.contents assert lib not in usr.contents etc.contents.add(File("f1")) etc.contents.add(File("f2")) etc.contents.add(File("f3")) with pytest.raises(TypeError): etc.contents.add(15) with pytest.raises(ValueError): etc.contents.add(None) with pytest.raises(TypeError): etc.contents.add("adsada") with pytest.raises(KeyError): etc.contents.remove(15) etc.contents.discard(14)
def test_relationship_descriptor_one_to_many(): class Entry: def __init__(self, name): self.name = name def __repr__(self): if self.parent: return repr(self.parent) + "/" + self.name else: return self.name class Directory(Entry): pass class File(Entry): pass Entry.parent = one_relationship_descriptor('parent', Directory) Directory.contents = many_relationship_descriptor('contents', Entry) Entry.parent.initialize(Directory.contents) Directory.contents.initialize(Entry.parent) root = Directory("") etc = Directory("etc") usr = Directory("usr") mnt = Directory("mnt") var = Directory("var") root.contents.add(etc) root.contents.add(usr) root.contents.add(mnt) root.contents.add(var) root.contents = [] assert len(root.contents) == 0 root.contents = [mnt, var] assert len(root.contents) == 2 root.contents.add(etc) root.contents.add(usr) assert len(root.contents) == 4 assert etc.parent == usr.parent == mnt.parent == var.parent == root pwd = File("pwd") pwd.parent = etc bin, lib, man = Directory("bin"), Directory("lib"), Directory("man") bin.parent = man.parent = lib.parent = usr assert usr.contents == set([bin, man, lib]) var.contents.add(lib) assert lib.parent == var assert lib in var.contents assert lib not in usr.contents etc.contents.add(File("f1")) etc.contents.add(File("f2")) etc.contents.add(File("f3")) with pytest.raises(TypeError): etc.contents.add(15) with pytest.raises(ValueError): etc.contents.add(None) with pytest.raises(TypeError): etc.contents.add("adsada") with pytest.raises(KeyError): etc.contents.remove(15) etc.contents.discard(14)