Skip to content

Instantly share code, notes, and snippets.

@rodrigomanhaes
Created February 28, 2012 19:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rodrigomanhaes/1934653 to your computer and use it in GitHub Desktop.
Save rodrigomanhaes/1934653 to your computer and use it in GitHub Desktop.
Soluções para a lista 2 de orientação a objetos (Ruby)
--format nested
--color
--format nested
--color
--format nested
--color
--format nested
--color
--format nested
--color
class Folha
def initialize(*funcionarios)
@funcionarios = funcionarios
end
def calcular
result = {}
@funcionarios.each {|f| result[f.nome] = f.salario_a_receber }
result
end
end
class Funcionario
attr_reader :nome, :salario_total, :filhos
def initialize(nome, salario_total, filhos = 0)
@nome, @salario_total, @filhos = nome, salario_total, filhos
@alteracoes = [DescontoPrevidencia.new(self),
AdicionalGerente.new(self),
AdicionalDiretoria.new(self),
AdicionalAuxilioCreche.new(self),
AdicionalAuxilioAlimentacao.new(self)]
@gerente = false
@diretor = false
end
def salario_a_receber
resultado = salario_total
adicionais_nao_isentos.each {|adicional| resultado = adicional.calcular(resultado) }
descontos.each {|desconto| resultado = desconto.calcular(resultado) }
adicionais_isentos.each {|adicional| resultado = adicional.calcular(resultado) }
resultado
end
def assumir_gerencia
@gerente = true
end
def gerente?
@gerente
end
def assumir_diretoria
@diretor = true
end
def diretor?
@diretor
end
private
def adicionais
@alteracoes.select(&:adicional?)
end
def descontos
@alteracoes.reject(&:adicional?)
end
def adicionais_isentos
adicionais.select(&:isento?)
end
def adicionais_nao_isentos
adicionais.reject(&:isento?)
end
end
class AlteracaoDeSalario
def initialize(funcionario)
@funcionario = funcionario
end
private
attr_reader :funcionario
end
class Desconto < AlteracaoDeSalario
def adicional?
false
end
end
class DescontoPrevidencia < Desconto
def calcular(valor)
valor * 0.9
end
end
class Adicional < AlteracaoDeSalario
def isento?
false
end
def adicional?
true
end
end
class AdicionalGerente < Adicional
def calcular(valor)
funcionario.gerente? ? valor * 1.3 : valor
end
end
class AdicionalDiretoria < Adicional
def calcular(valor)
funcionario.diretor? ? valor * 1.4 : valor
end
end
class AdicionalIsento < Adicional
def isento?
true
end
end
class AdicionalAuxilioCreche < AdicionalIsento
def calcular(valor)
filhos_para_calculo = funcionario.filhos > 3 ? 3 : funcionario.filhos
valor += filhos_para_calculo * 400
end
end
class AdicionalAuxilioAlimentacao < AdicionalIsento
def calcular(valor)
valor + 280
end
end
require './folha'
describe Folha do
it 'retorna uma lista de funcionarios e seus salarios' do
f1 = stub(:nome => 'Linus', :salario_a_receber => 10_000)
f2 = stub(:nome => 'Guido', :salario_a_receber => 8_000)
f3 = stub(:nome => 'Matz', :salario_a_receber => 9_000)
folha = Folha.new(f1, f2, f3)
folha.calcular.should == {
'Guido' => 8_000,
'Linus'=> 10_000,
'Matz'=> 9_000 }
end
end
describe Funcionario do
let(:funcionario) { Funcionario.new('Linus', 10_000) }
let(:alimentacao) { 280 }
it 'possui nome e salario total' do
funcionario.nome.should == 'Linus'
funcionario.salario_total.should == 10_000
end
describe 'alteracoes no salario a receber' do
describe 'descontos' do
it '10% de previdencia' do
(funcionario.salario_a_receber - alimentacao).should == 9_000
end
end
describe 'adicionais com incidencia de previdencia' do
it '30% para gerentes' do
funcionario.assumir_gerencia
(funcionario.salario_a_receber - alimentacao).should == 11_700
end
it '40% para diretores' do
funcionario.assumir_diretoria
(funcionario.salario_a_receber - alimentacao).should == 12_600
end
end
describe 'adicionais sem incidencia de previdencia' do
it '400 por filho ate 3' do
Funcionario.new('Linus', 1_000, 1).salario_a_receber.should == 1_580
Funcionario.new('Linus', 1_000, 2).salario_a_receber.should == 1_980
Funcionario.new('Linus', 1_000, 3).salario_a_receber.should == 2_380
Funcionario.new('Linus', 1_000, 4).salario_a_receber.should == 2_380
end
it 'auxilio alimentacao de 280' do
funcionario.salario_a_receber.should == 9_280
end
end
end
end
--format nested
--color
class JogoDaVelha
attr_reader :jogadores
def initialize
criar_jogadores
criar_casas
distribuir_casas
inicializar_flags
end
def vitoria?
@status == :vitoria
end
def velha?
@casas.values.none?(&:vazia?)
end
def jogar(numero_casa)
@status = @casas[numero_casa].jogar(@vez)
trocar_vez
end
private
def trocar_vez
@vez = @vez == @jogadores[0] ? @jogadores[1] : @jogadores[0]
end
def criar_jogadores
@jogadores = [:x, :o]
@vez = @jogadores.first
end
def criar_casas
@casas = {}
(1..9).each {|n| @casas[n] = Casa.new(n) }
end
def distribuir_casas
[[1, 2, 3], [4, 5, 6], [7, 8, 9]].each {|linha| distribuir_linha(linha) }
[[1, 4, 7], [2, 5, 8], [3, 6, 9]].each {|coluna| distribuir_coluna(coluna) }
distribuir_diagonal1(1, 5, 9)
distribuir_diagonal2(7, 5, 3)
end
def inicializar_flags
@status = nil
end
def distribuir_linha(linha)
definir_fila(linha, :proximo_em_linha=)
end
def distribuir_coluna(coluna)
definir_fila(coluna, :proximo_em_coluna=)
end
def distribuir_diagonal1(*diagonal)
definir_fila(diagonal, :proximo_em_diagonal1=)
end
def distribuir_diagonal2(*diagonal)
definir_fila(diagonal, :proximo_em_diagonal2=)
end
def definir_fila(sequencia, metodo)
sequencia.each_with_index do |n, index|
@casas[n].send(metodo,
@casas[index == 2 ? sequencia.first : sequencia[index + 1]])
end
end
end
class Casa
attr_reader :simbolo, :numero
attr_writer :proximo_em_coluna, :proximo_em_linha,
:proximo_em_diagonal1, :proximo_em_diagonal2
def initialize(numero)
@numero = numero
end
def jogar(simbolo)
@simbolo = simbolo
verificar_jogada
end
def vazia?
@simbolo.nil?
end
private
attr_reader :proximo_em_coluna, :proximo_em_linha,
:proximo_em_diagonal1, :proximo_em_diagonal2
def verificar_jogada
:vitoria if vitoria?
end
def vitoria?
proximo_em_coluna.verificar_vitoria(:proximo_em_coluna, self) ||
proximo_em_linha.verificar_vitoria(:proximo_em_linha, self) ||
(proximo_em_diagonal1 ?
proximo_em_diagonal1.verificar_vitoria(:proximo_em_diagonal1, self) : false) ||
(proximo_em_diagonal2 ?
proximo_em_diagonal2.verificar_vitoria(:proximo_em_diagonal2, self) : false)
end
protected
def verificar_vitoria(direcao, original)
return true if original == self
return false if original.simbolo != simbolo
send(direcao).verificar_vitoria(direcao, original)
end
end
# encoding: utf-8
require './jogo_da_velha'
describe 'jogo da velha' do
let(:jogo) { JogoDaVelha.new }
context 'vitória' do
def certificar_vitoria(*jogadas)
jogadas[0..(jogadas.size - 2)].each do |n|
jogo.jogar(n)
jogo.should_not be_vitoria
end
jogo.jogar(jogadas.last)
jogo.should be_vitoria
end
it '3 casas do mesmo jogador em linha' do
certificar_vitoria(1, 4, 2, 5, 3)
end
it '3 casas do mesmo jogador em coluna' do
certificar_vitoria(1, 2, 4, 5, 7)
end
it '3 casas do mesmo jogador na diagonal' do
certificar_vitoria(1, 2, 5, 3, 9)
end
it '3 casas do mesmo jogador na diagonal 2' do
certificar_vitoria(7, 2, 5, 4, 3)
end
end
context 'velha' do
it 'todas as casas preenchidas sem vitória' do
[1, 2, 3, 4, 8, 5, 6, 9].each do |jogada|
jogo.jogar(jogada)
jogo.should_not be_vitoria
jogo.should_not be_velha
end
jogo.jogar(7)
jogo.should be_velha
end
end
end
--format nested
--color
class Maquina
attr_reader :estado
def initialize(estado_inicial)
@estado = estado_inicial
@transicoes = {}
end
def transicao(evento, mudanca_de_estado)
@transicoes[evento] = mudanca_de_estado
end
def disparar_evento(evento)
mudanca = @transicoes[evento]
raise TransicaoNegada if @estado != mudanca[:de]
@estado = mudanca[:para]
end
end
class TransicaoNegada < Exception
end
class Maquina
attr_reader :estado
def initialize(estado_inicial)
@estado = estado_inicial
@transicoes = {}
end
def transicao(evento, mudanca_de_estado)
@transicoes[evento] = mudanca_de_estado
define_singleton_method evento do
mudanca = @transicoes[evento]
raise TransicaoNegada if @estado != mudanca[:de]
@estado = mudanca[:para]
end
mudanca_de_estado.values.each do |estado|
define_singleton_method "#{estado}?" do
self.estado == estado
end
end
end
end
class TransicaoNegada < Exception
end
# encoding: utf-8
require './maquina_dinamica'
describe Maquina do
let :maquina do
maquina = Maquina.new(:aberta)
maquina.transicao(:fechar, :de => :aberta, :para => :fechada)
maquina
end
it 'retorna estado' do
maquina.should be_aberta
end
it 'permite mudanças de estado de acordo com a transição' do
maquina.should be_aberta
maquina.fechar
maquina.should be_fechada
end
it 'nega mudança de estado se o estado origem não for o correto' do
maquina.transicao(:abrir, :de => :fechada, :para => :aberta)
expect { maquina.abrir }.to raise_error(TransicaoNegada)
end
end
# encoding: utf-8
require './maquina'
describe Maquina do
let :maquina do
maquina = Maquina.new(:aberta)
maquina.transicao(:fechar, :de => :aberta, :para => :fechada)
maquina
end
it 'retorna estado' do
maquina.estado.should == :aberta
end
it 'permite mudanças de estado de acordo com a transição' do
maquina.estado.should == :aberta
maquina.disparar_evento(:fechar)
maquina.estado.should == :fechada
end
it 'nega mudança de estado se o estado origem não for o correto' do
maquina.transicao(:abrir, :de => :fechada, :para => :aberta)
expect { maquina.disparar_evento(:abrir) }.
to raise_error(TransicaoNegada)
end
end
--format nested
--color
class Aluno
def initialize(*disciplinas_cursadas)
@plano = Plano.new(self)
@disciplinas_cursadas = disciplinas_cursadas
end
def incluir_no_plano(disciplina)
@plano.incluir(disciplina)
end
def plano_ok?
@plano.valido?
end
def cursou?(disciplinas)
disciplinas.all? {|disciplina| @disciplinas_cursadas.include?(disciplina) }
end
end
class Disciplina
attr_reader :creditos, :pre_requisito
def initialize(creditos, pre_requisito = nil)
@creditos, @pre_requisito = creditos, pre_requisito
end
end
class Plano
CREDITOS_MINIMOS = 10
CREDITOS_MAXIMOS = 50
def initialize(aluno)
@disciplinas = []
@aluno = aluno
end
def incluir(disciplina)
@disciplinas << disciplina
end
def valido?
verificar_pre_requisitos && verificar_numero_de_creditos
end
private
def verificar_pre_requisitos
pre_requisitos = @disciplinas.map(&:pre_requisito).compact
@aluno.cursou?(pre_requisitos)
end
def verificar_numero_de_creditos
creditos = @disciplinas.map(&:creditos).reduce(:+)
creditos >= CREDITOS_MINIMOS && creditos <= CREDITOS_MAXIMOS
end
end
require './academico'
describe Aluno do
it 'somente pode incluir disciplinas com pre-requisito' do
disciplina_pre = Disciplina.new(20)
disciplina = Disciplina.new(15, disciplina_pre)
aluno = Aluno.new
aluno.incluir_no_plano(disciplina)
aluno.plano_ok?.should == false
aluno = Aluno.new(disciplina_pre)
aluno.incluir_no_plano(disciplina)
aluno.plano_ok?.should == true
end
it 'plano deve ter um numero minimo (10) e maximo (50) de creditos' do
disciplina1 = Disciplina.new(9)
disciplina2 = Disciplina.new(1)
disciplina3 = Disciplina.new(40)
disciplina4 = Disciplina.new(1)
aluno = Aluno.new
aluno.incluir_no_plano(disciplina1)
aluno.plano_ok?.should == false
aluno.incluir_no_plano(disciplina2)
aluno.plano_ok?.should == true
aluno.incluir_no_plano(disciplina3)
aluno.plano_ok?.should == true
aluno.incluir_no_plano(disciplina4)
aluno.plano_ok?.should == false
end
end
class Aluno
def initialize(*disciplinas_cursadas)
@plano = Plano.new(self)
@disciplinas_cursadas = disciplinas_cursadas
end
def incluir_no_plano(disciplina)
@plano.incluir(disciplina)
end
def plano_ok?
@plano.valido?
end
def cursou?(disciplinas)
disciplinas.all? {|disciplina| @disciplinas_cursadas.include?(disciplina) }
end
end
class Disciplina
attr_reader :creditos, :pre_requisito
def initialize(creditos, pre_requisito = nil)
@creditos, @pre_requisito = creditos, pre_requisito
end
end
class Plano
CREDITOS_MINIMOS = 10
CREDITOS_MAXIMOS = 50
def initialize(aluno)
@disciplinas = []
@aluno = aluno
end
def incluir(disciplina)
@disciplinas << disciplina
end
def valido?
verificar_pre_requisitos && verificar_numero_de_creditos
end
private
def verificar_pre_requisitos
pre_requisitos = @disciplinas.map(&:pre_requisito).compact
@aluno.cursou?(pre_requisitos)
end
def verificar_numero_de_creditos
creditos = @disciplinas.map(&:creditos).reduce(:+)
creditos >= CREDITOS_MINIMOS && creditos <= CREDITOS_MAXIMOS
end
end
require './academico'
describe Aluno do
it 'somente pode incluir disciplinas com pre-requisito' do
disciplina_pre = Disciplina.new(20)
disciplina = Disciplina.new(15, disciplina_pre)
aluno = Aluno.new
aluno.incluir_no_plano(disciplina)
aluno.plano_ok?.should == false
aluno = Aluno.new(disciplina_pre)
aluno.incluir_no_plano(disciplina)
aluno.plano_ok?.should == true
end
it 'plano deve ter um numero minimo (10) e maximo (50) de creditos' do
disciplina1 = Disciplina.new(9)
disciplina2 = Disciplina.new(1)
disciplina3 = Disciplina.new(40)
disciplina4 = Disciplina.new(1)
aluno = Aluno.new
aluno.incluir_no_plano(disciplina1)
aluno.plano_ok?.should == false
aluno.incluir_no_plano(disciplina2)
aluno.plano_ok?.should == true
aluno.incluir_no_plano(disciplina3)
aluno.plano_ok?.should == true
aluno.incluir_no_plano(disciplina4)
aluno.plano_ok?.should == false
end
end
class Folha
def initialize(*funcionarios)
@funcionarios = funcionarios
end
def calcular
result = {}
@funcionarios.each {|f| result[f.nome] = f.salario_a_receber }
result
end
end
class Funcionario
attr_reader :nome, :salario_total, :filhos
def initialize(nome, salario_total, filhos = 0)
@nome, @salario_total, @filhos = nome, salario_total, filhos
@alteracoes = [DescontoPrevidencia.new(self),
AdicionalGerente.new(self),
AdicionalDiretoria.new(self),
AdicionalAuxilioCreche.new(self),
AdicionalAuxilioAlimentacao.new(self)]
@gerente = false
@diretor = false
end
def salario_a_receber
resultado = salario_total
adicionais_nao_isentos.each {|adicional| resultado = adicional.calcular(resultado) }
descontos.each {|desconto| resultado = desconto.calcular(resultado) }
adicionais_isentos.each {|adicional| resultado = adicional.calcular(resultado) }
resultado
end
def assumir_gerencia
@gerente = true
end
def gerente?
@gerente
end
def assumir_diretoria
@diretor = true
end
def diretor?
@diretor
end
private
def adicionais
@alteracoes.select(&:adicional?)
end
def descontos
@alteracoes.reject(&:adicional?)
end
def adicionais_isentos
adicionais.select(&:isento?)
end
def adicionais_nao_isentos
adicionais.reject(&:isento?)
end
end
class AlteracaoDeSalario
def initialize(funcionario)
@funcionario = funcionario
end
private
attr_reader :funcionario
end
class Desconto < AlteracaoDeSalario
def adicional?
false
end
end
class DescontoPrevidencia < Desconto
def calcular(valor)
valor * 0.9
end
end
class Adicional < AlteracaoDeSalario
def isento?
false
end
def adicional?
true
end
end
class AdicionalGerente < Adicional
def calcular(valor)
funcionario.gerente? ? valor * 1.3 : valor
end
end
class AdicionalDiretoria < Adicional
def calcular(valor)
funcionario.diretor? ? valor * 1.4 : valor
end
end
class AdicionalIsento < Adicional
def isento?
true
end
end
class AdicionalAuxilioCreche < AdicionalIsento
def calcular(valor)
filhos_para_calculo = funcionario.filhos > 3 ? 3 : funcionario.filhos
valor += filhos_para_calculo * 400
end
end
class AdicionalAuxilioAlimentacao < AdicionalIsento
def calcular(valor)
valor + 280
end
end
require './folha'
describe Folha do
it 'retorna uma lista de funcionarios e seus salarios' do
f1 = stub(:nome => 'Linus', :salario_a_receber => 10_000)
f2 = stub(:nome => 'Guido', :salario_a_receber => 8_000)
f3 = stub(:nome => 'Matz', :salario_a_receber => 9_000)
folha = Folha.new(f1, f2, f3)
folha.calcular.should == {
'Guido' => 8_000,
'Linus'=> 10_000,
'Matz'=> 9_000 }
end
end
describe Funcionario do
let(:funcionario) { Funcionario.new('Linus', 10_000) }
let(:alimentacao) { 280 }
it 'possui nome e salario total' do
funcionario.nome.should == 'Linus'
funcionario.salario_total.should == 10_000
end
describe 'alteracoes no salario a receber' do
describe 'descontos' do
it '10% de previdencia' do
(funcionario.salario_a_receber - alimentacao).should == 9_000
end
end
describe 'adicionais com incidencia de previdencia' do
it '30% para gerentes' do
funcionario.assumir_gerencia
(funcionario.salario_a_receber - alimentacao).should == 11_700
end
it '40% para diretores' do
funcionario.assumir_diretoria
(funcionario.salario_a_receber - alimentacao).should == 12_600
end
end
describe 'adicionais sem incidencia de previdencia' do
it '400 por filho ate 3' do
Funcionario.new('Linus', 1_000, 1).salario_a_receber.should == 1_580
Funcionario.new('Linus', 1_000, 2).salario_a_receber.should == 1_980
Funcionario.new('Linus', 1_000, 3).salario_a_receber.should == 2_380
Funcionario.new('Linus', 1_000, 4).salario_a_receber.should == 2_380
end
it 'auxilio alimentacao de 280' do
funcionario.salario_a_receber.should == 9_280
end
end
end
end
class JogoDaVelha
attr_reader :jogadores
def initialize
criar_jogadores
criar_casas
distribuir_casas
inicializar_flags
end
def vitoria?
@status == :vitoria
end
def velha?
@casas.values.none?(&:vazia?)
end
def jogar(numero_casa)
@status = @casas[numero_casa].jogar(@vez)
trocar_vez
end
private
def trocar_vez
@vez = @vez == @jogadores[0] ? @jogadores[1] : @jogadores[0]
end
def criar_jogadores
@jogadores = [:x, :o]
@vez = @jogadores.first
end
def criar_casas
@casas = {}
(1..9).each {|n| @casas[n] = Casa.new(n) }
end
def distribuir_casas
[[1, 2, 3], [4, 5, 6], [7, 8, 9]].each {|linha| distribuir_linha(linha) }
[[1, 4, 7], [2, 5, 8], [3, 6, 9]].each {|coluna| distribuir_coluna(coluna) }
distribuir_diagonal1(1, 5, 9)
distribuir_diagonal2(7, 5, 3)
end
def inicializar_flags
@status = nil
end
def distribuir_linha(linha)
definir_fila(linha, :proximo_em_linha=)
end
def distribuir_coluna(coluna)
definir_fila(coluna, :proximo_em_coluna=)
end
def distribuir_diagonal1(*diagonal)
definir_fila(diagonal, :proximo_em_diagonal1=)
end
def distribuir_diagonal2(*diagonal)
definir_fila(diagonal, :proximo_em_diagonal2=)
end
def definir_fila(sequencia, metodo)
sequencia.each_with_index do |n, index|
@casas[n].send(metodo,
@casas[index == 2 ? sequencia.first : sequencia[index + 1]])
end
end
end
class Casa
attr_reader :simbolo, :numero
attr_writer :proximo_em_coluna, :proximo_em_linha,
:proximo_em_diagonal1, :proximo_em_diagonal2
def initialize(numero)
@numero = numero
end
def jogar(simbolo)
@simbolo = simbolo
verificar_jogada
end
def vazia?
@simbolo.nil?
end
private
attr_reader :proximo_em_coluna, :proximo_em_linha,
:proximo_em_diagonal1, :proximo_em_diagonal2
def verificar_jogada
:vitoria if vitoria?
end
def vitoria?
proximo_em_coluna.verificar_vitoria(:proximo_em_coluna, self) ||
proximo_em_linha.verificar_vitoria(:proximo_em_linha, self) ||
(proximo_em_diagonal1 ?
proximo_em_diagonal1.verificar_vitoria(:proximo_em_diagonal1, self) : false) ||
(proximo_em_diagonal2 ?
proximo_em_diagonal2.verificar_vitoria(:proximo_em_diagonal2, self) : false)
end
protected
def verificar_vitoria(direcao, original)
return true if original == self
return false if original.simbolo != simbolo
send(direcao).verificar_vitoria(direcao, original)
end
end
# encoding: utf-8
require './jogo_da_velha'
describe 'jogo da velha' do
let(:jogo) { JogoDaVelha.new }
context 'vitória' do
def certificar_vitoria(*jogadas)
jogadas[0..(jogadas.size - 2)].each do |n|
jogo.jogar(n)
jogo.should_not be_vitoria
end
jogo.jogar(jogadas.last)
jogo.should be_vitoria
end
it '3 casas do mesmo jogador em linha' do
certificar_vitoria(1, 4, 2, 5, 3)
end
it '3 casas do mesmo jogador em coluna' do
certificar_vitoria(1, 2, 4, 5, 7)
end
it '3 casas do mesmo jogador na diagonal' do
certificar_vitoria(1, 2, 5, 3, 9)
end
it '3 casas do mesmo jogador na diagonal 2' do
certificar_vitoria(7, 2, 5, 4, 3)
end
end
context 'velha' do
it 'todas as casas preenchidas sem vitória' do
[1, 2, 3, 4, 8, 5, 6, 9].each do |jogada|
jogo.jogar(jogada)
jogo.should_not be_vitoria
jogo.should_not be_velha
end
jogo.jogar(7)
jogo.should be_velha
end
end
end
class Maquina
attr_reader :estado
def initialize(estado_inicial)
@estado = estado_inicial
@transicoes = {}
end
def transicao(evento, mudanca_de_estado)
@transicoes[evento] = mudanca_de_estado
end
def disparar_evento(evento)
mudanca = @transicoes[evento]
raise TransicaoNegada if @estado != mudanca[:de]
@estado = mudanca[:para]
end
end
class TransicaoNegada < Exception
end
class Maquina
attr_reader :estado
def initialize(estado_inicial)
@estado = estado_inicial
@transicoes = {}
end
def transicao(evento, mudanca_de_estado)
@transicoes[evento] = mudanca_de_estado
define_singleton_method evento do
mudanca = @transicoes[evento]
raise TransicaoNegada if @estado != mudanca[:de]
@estado = mudanca[:para]
end
mudanca_de_estado.values.each do |estado|
define_singleton_method "#{estado}?" do
self.estado == estado
end
end
end
end
class TransicaoNegada < Exception
end
# encoding: utf-8
require './maquina_dinamica'
describe Maquina do
let :maquina do
maquina = Maquina.new(:aberta)
maquina.transicao(:fechar, :de => :aberta, :para => :fechada)
maquina
end
it 'retorna estado' do
maquina.should be_aberta
end
it 'permite mudanças de estado de acordo com a transição' do
maquina.should be_aberta
maquina.fechar
maquina.should be_fechada
end
it 'nega mudança de estado se o estado origem não for o correto' do
maquina.transicao(:abrir, :de => :fechada, :para => :aberta)
expect { maquina.abrir }.to raise_error(TransicaoNegada)
end
end
# encoding: utf-8
require './maquina'
describe Maquina do
let :maquina do
maquina = Maquina.new(:aberta)
maquina.transicao(:fechar, :de => :aberta, :para => :fechada)
maquina
end
it 'retorna estado' do
maquina.estado.should == :aberta
end
it 'permite mudanças de estado de acordo com a transição' do
maquina.estado.should == :aberta
maquina.disparar_evento(:fechar)
maquina.estado.should == :fechada
end
it 'nega mudança de estado se o estado origem não for o correto' do
maquina.transicao(:abrir, :de => :fechada, :para => :aberta)
expect { maquina.disparar_evento(:abrir) }.
to raise_error(TransicaoNegada)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment