Created
February 28, 2012 19:44
-
-
Save rodrigomanhaes/1934653 to your computer and use it in GitHub Desktop.
Soluções para a lista 2 de orientação a objetos (Ruby)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--format nested | |
--color |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--format nested | |
--color |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--format nested | |
--color |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--format nested | |
--color |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--format nested | |
--color |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--format nested | |
--color |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--format nested | |
--color |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--format nested | |
--color |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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