Skip to content

Instantly share code, notes, and snippets.

@reactormonk
Created September 21, 2009 08:40
Show Gist options
  • Save reactormonk/190139 to your computer and use it in GitHub Desktop.
Save reactormonk/190139 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby -Ku
require 'rubygems'
require 'dm-core'
require 'dm-sweatshop'
require 'bacon'
require 'dm-types'
require 'set'
#DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'sqlite3::memory:')
class Game
include DataMapper::Resource
#
# Properties
#
property :id, Serial
property :type, Discriminator
#
# Associations
#
has n, :game_memberships
has n, :players, :through => :game_memberships
def party_set(player, party)
gm(player).party = party
end
def gm(player)
game_memberships.first(:player => player)
end
end
class CaptainGame < Game
has 2, :captain_memberships, 'GameMembership', :child_key => [ :game_id ], :captain => true
has 2, :captains, 'Player', :through => :captain_memberships, :via => :player
#
# Validations
#
#
# Logic
#
after :save, :distribute_captains
def distribute_captains
# different errors (not) reloaded
reload
party1, party2 = [:sentinel, :scourge].shuffle
party_set(captains.first,party1)
party_set(captains.last,party2)
end
end
class GameMembership
include DataMapper::Resource
#
# Properties
#
property :id, Serial
property :party, Enum[:staged, :scourge, :sentinel], :nullable => false, :default => :staged
property :captain, Boolean, :default => false
#
# Associations
#
belongs_to :game
belongs_to :player
end
class Player
include DataMapper::Resource
#
# Properties
#
property :id, Serial
#
# Associations
#
has n, :game_memberships
has n, :games, :through => :game_memberships
#
# Logic
#
end
DataMapper.auto_migrate!
Player.fix {{ }}
Game.fix {{ }}
describe 'Bug' do
it 'should generate captain_membership and league_membership properly' do
players = 5.of {Player.gen}
game = CaptainGame.gen(:captains => players[0..1])
game.distribute_captains
Set.new([game.gm(players[0]).party, game.gm(players[1]).party]).should == Set.new([:scourge, :sentinel])
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment