This implements a builder pattern for RPG game characters. Is this a valid builder pattern implementation?
- There are 3 characters: Paladin, Wizard and Elfo.
- There are 3 items: Potion, Sword, Arch.
using System;
using System.Collections.Generic;
using NUnit.Framework;
namespace RPGEngine.Tests
{
[TestFixture]
public class RPGEngineTest
{
[Test]
public void GivenAPaladin_WithSword_Return()
{
//Arrange
var paladin = new
CharacterBuilder()
.Init(new Paladin())
.WithSword()
.Named("Conan")
.Build();
//Act
var result = paladin.Attack();
//Assert
Assert.AreEqual("Conan has splitted the enemy in two", result);
}
[Test]
public void GivenAPaladin_WithArch_Return()
{
//Arrange
var paladin = new
CharacterBuilder()
.Init(new Paladin())
.WithArch()
.Named("Conan")
.Build();
//Act
var result = paladin.Attack();
//Assert
Assert.AreEqual("Conan has hitted the enemy's heart", result);
}
[Test]
public void GivenAnElfo_WithArch_Return()
{
//Arrange
var elfo = new
CharacterBuilder()
.Init(new Elfo())
.WithArch()
.Named("Légolas")
.Build();
//Act
var result = elfo.Attack();
//Assert
Assert.AreEqual("Légolas has hitted the enemy's heart", result);
}
[Test]
public void GivenAnElfo_WithPotion_Return()
{
//Arrange
var elfo = new
CharacterBuilder()
.Init(new Elfo())
.WithPotion()
.Named("Légolas")
.Build();
//Act
var result = elfo.Attack();
//Act
//Assert
Assert.AreEqual("Légolas has converted the enemy in monkey", result);
}
[Test]
public void GivenAWizard_WithPotion_Return()
{
//Arrange
var Wizard = new
CharacterBuilder()
.Init(new Wizard())
.WithPotion()
.Named("Merlín")
.Build();
//Act
var result = Wizard.Attack();
//Assert
Assert.AreEqual("Merlín has converted the enemy in monkey", result);
}
[Test]
public void GivenAWizard_WithSword_Return()
{
//Arrange
var Wizard = new
CharacterBuilder()
.Init(new Wizard())
.WithSword()
.Named("Merlín")
.Build();
//Act
var result = Wizard.Attack();
//Assert
Assert.AreEqual("Merlín has splitted the enemy in two", result);
}
}
public static class Message
{
private const String MessageForSword = "{0} has splitted the enemy in two";
private const String MessageForArch = "{0} has hitted the enemy's heart";
private const String MessageForPotion = "{0} has converted the enemy in monkey";
private static Dictionary<AttackType, String> messageTypes = new Dictionary<AttackType, String>()
{
{ AttackType.Sword , MessageForSword },
{ AttackType.Arch, MessageForArch },
{ AttackType.Potion, MessageForPotion }
};
public static string GetResultOf(AttackType typeOfAttack)
{
return messageTypes[typeOfAttack];
}
}
public enum AttackType
{
Sword,
Arch,
Potion
}
public interface Item
{
string Use();
}
public class Sword : Item
{
public string Use()
{
return Message.GetResultOf(AttackType.Sword);
}
}
public class Arch : Item
{
public string Use()
{
return Message.GetResultOf(AttackType.Arch);
}
}
public class Potion : Item
{
public string Use()
{
return Message.GetResultOf(AttackType.Potion);
}
}
public interface ICharacter
{
String Attack();
Item Item { get; set; }
String Name { get; set; }
}
public class Paladin : ICharacter
{
public String Name { get; set; }
public Item Item { get; set; }
public String Attack()
{
return string.Format(Item.Use(), this.Name);
}
}
public class Elfo : ICharacter
{
public String Name { get; set; }
public Item Item { get; set; }
public String Attack()
{
return string.Format(Item.Use(), this.Name);
}
}
public class Wizard : ICharacter
{
public String Name { get; set; }
public Item Item { get; set; }
public String Attack()
{
return string.Format(Item.Use(), this.Name);
}
}
public class CharacterBuilder
{
private ICharacter _Personaje;
public CharacterBuilder Init(ICharacter personaje)
{
_Personaje = personaje;
return this;
}
public CharacterBuilder WithSword()
{
this._Personaje.Item = new Sword();
return this;
}
public CharacterBuilder WithArch()
{
this._Personaje.Item = new Arch();
return this;
}
public CharacterBuilder WithPotion()
{
this._Personaje.Item = new Potion();
return this;
}
public CharacterBuilder Named(string name)
{
this._Personaje.Name = name;
return this;
}
public ICharacter Build()
{
return this._Personaje;
}
}