def test_add_merit():
    '''
    The usual merit price.
    '''
    ch = CharacterModel()
    builder = CharacterBuilder(ch)

    assert ch.get_value('xp') == 0
    builder.add_merit('large', 1, 'test merit', buy=True)
    assert ch.get_value('xp') == 4
def test_add_merit_special_cost():
    '''
    Crabs pay less for "large" merit.
    '''
    ch = CharacterModel()
    builder = CharacterBuilder(ch)
    builder.set_advancement_value('clan', 'crab')
    builder.set_advancement_value('family', 'crab_hida')
    builder.set_advancement_value('school', 'crab_hida_bushi_school')

    assert ch.get_value('xp') == 0
    builder.add_merit('large', 1, 'test merit', buy=True)
    assert ch.get_value('xp') == 3
def test_load_save(embed_data):
    ch = CharacterModel()
    builder = CharacterBuilder(ch)

    builder.load(embed_data['crab.rokugani'])
    assert builder.get_value('clan') == 'crab'
    assert builder.get_value('family') == 'crab_hida'
    assert builder.get_value('school') == 'crab_hida_bushi_school'
    skills = builder.get_skills()
    assert len(skills) == 8
def test_get_skills():
    ch = CharacterModel()
    builder = CharacterBuilder(ch)
    builder.set_advancement_value('clan', 'crab')
    builder.set_advancement_value('family', 'crab_hida')
    builder.set_advancement_value('school', 'crab_hida_bushi_school')

    skills = builder.get_skills()
    assert len(skills) == 7
    assert skills[0] == {
        'id': 'athletics',
        'model_attr': 'skills.athletics',
        'name': 'Athletics',
        'rank': 1,
        'trait': 'strength',
        'trait_short': 'str',
        'type': 'bugei',
        'obs' : '',
        'roll' : '4k3',
        'school' : 'X',
    }
def test_character_builder():

    ch = CharacterModel()

    builder = CharacterBuilder(ch)
    assert builder.tags == set()

    # Raises an error if trying to set a value that is not available on advancements.
    with pytest.raises(NoAdvancementError):
        builder.set_advancement_value('rubles', 'crab')

    with pytest.raises(KeyError):
        builder.set_advancement_value('clan', 'rubles')

    # We begin with one advancement only: the clan
    assert sorted([i.NAME for i in builder.advancements]) == ['clan']

    # These operations set a value defined by an advancement
    # They raise an error if no advancement is there to set.
    assert builder.get_value('clan') == ''
    builder.set_advancement_value('clan', 'crab')
    assert builder.get_value('clan') == 'crab'
    assert builder.tags == {'crab'}

    # Setting the clan will add the family advancement.
    assert sorted([i.NAME for i in builder.advancements]) == ['clan', 'family', 'school']
    assert builder.get_value('traits.strength') == 2
    builder.set_advancement_value('family', 'crab_hida')
    assert builder.get_value('traits.strength') == 3
    assert builder.tags == {'crab', 'crab_hida'}

    # Setting the family will add the school advancement
    assert sorted([i.NAME for i in builder.advancements]) == ['clan', 'family', 'school']
    assert builder.get_value('traits.stamina') == 2
    builder.set_advancement_value('school', 'crab_hida_bushi_school')

    assert builder.get_value('traits.stamina') == 3
    assert builder.get_value('skills.intimidation') == 1
    assert builder.get_value('skills.athletics') == 1
    assert builder.tags == {'crab', 'crab_hida', 'crab_bushi', 'bushi'}

    builder.add_trait('willpower', 1)
    builder.add_trait('agility', 1)

    builder.add_merit('large', 1)
    builder.add_merit('strength_of_the_earth', 1)
    builder.add_merit('quick_healer', 1)

    assert builder.get_value('skills.heavy_weapons') == 1
    builder.add_skill('heavy_weapons', 2)
    assert builder.get_value('skills.heavy_weapons') == 3

    builder.add_skill('lore_crab', 1)
    assert builder.get_value('skills.lore_crab') == 1
def test_insight_rank():
    ch = CharacterModel()
    builder = CharacterBuilder(ch)
    assert builder.get_value('ranks.insight') == 100
    assert builder.get_value('ranks.rank') == 1

    builder.add_trait('void')
    assert builder.get_value('ranks.insight') == 110
    builder.add_trait('void')
    assert builder.get_value('ranks.insight') == 120
    builder.add_trait('void')
    assert builder.get_value('ranks.insight') == 130
    assert builder.get_value('ranks.rank') == 1
    builder.add_trait('void')
    assert builder.get_value('ranks.insight') == 140
    assert builder.get_value('ranks.rank') == 1

    builder.add_trait('void')
    assert builder.get_value('ranks.insight') == 150
    assert builder.get_value('ranks.rank') == 2

    builder.add_trait('void')
    builder.add_trait('void')
    builder.add_trait('void')
    assert builder.get_value('ranks.insight') == 180
    assert builder.get_value('ranks.rank') == 3