seeseemelk/MockBukkit

View on GitHub
src/main/java/be/seeseemelk/mockbukkit/inventory/meta/EnchantedBookMetaMock.java

Summary

Maintainability
A
1 hr
Test Coverage
package be.seeseemelk.mockbukkit.inventory.meta;

import java.util.HashMap;
import java.util.Map;

import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.jetbrains.annotations.NotNull;

import com.google.common.collect.ImmutableMap;

/**
 * This {@link ItemMetaMock} mocks the implementation of {@link EnchantmentStorageMeta}.
 * It keeps an internal {@link HashMap} for all stored {@link Enchantment Enchantments}.
 * 
 * @author TheBusyBiscuit
 *
 */
public class EnchantedBookMetaMock extends ItemMetaMock implements EnchantmentStorageMeta {

    private Map<Enchantment, Integer> storedEnchantments = new HashMap<>();
    
    public EnchantedBookMetaMock() {
        super();
    }
    
    public EnchantedBookMetaMock(EnchantmentStorageMeta meta) {
        super(meta);
        
        this.storedEnchantments = new HashMap<>(meta.getStoredEnchants());
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = super.hashCode();
        return prime * result + storedEnchantments.hashCode();
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!super.equals(obj)) {
            return false;
        }
        if (!(obj instanceof EnchantedBookMetaMock)) {
            return false;
        }
        EnchantedBookMetaMock other = (EnchantedBookMetaMock) obj;
        return storedEnchantments.equals(other.storedEnchantments);
    }

    @Override
    public EnchantedBookMetaMock clone() {
        EnchantedBookMetaMock mock = (EnchantedBookMetaMock) super.clone();
        mock.storedEnchantments = new HashMap<>(storedEnchantments);
        return mock;
    }

    @Override
    public boolean addStoredEnchant(@NotNull Enchantment ench, int level, boolean ignoreLevelRestriction) {
        if (!ignoreLevelRestriction && level < ench.getStartLevel()) {
            return false;
        }
        
        if (!ignoreLevelRestriction && level > ench.getMaxLevel()) {
            return false;
        }
        
        Integer prev = storedEnchantments.put(ench, level);
        return prev == null || prev.intValue() != level;
    }

    @Override
    public int getStoredEnchantLevel(@NotNull Enchantment ench) {
        return storedEnchantments.getOrDefault(ench, 0);
    }

    @Override
    public @NotNull Map<Enchantment, Integer> getStoredEnchants() {
        // This is inline with CraftBukkit's default implementation, it only returns an
        // immutable copy, never the original.
        return ImmutableMap.copyOf(storedEnchantments);
    }

    @Override
    public boolean hasConflictingStoredEnchant(@NotNull Enchantment ench) {
        for (Enchantment enchantment : storedEnchantments.keySet()) {
            if (enchantment.conflictsWith(ench)) {
                return true;
            }
        }

        return false;
    }

    @Override
    public boolean hasStoredEnchant(@NotNull Enchantment ench) {
        return storedEnchantments.containsKey(ench);
    }

    @Override
    public boolean hasStoredEnchants() {
        return !storedEnchantments.isEmpty();
    }

    @Override
    public boolean removeStoredEnchant(@NotNull Enchantment ench) throws IllegalArgumentException {
        return storedEnchantments.remove(ench) != null;
    }

}