### Question:
ShapedRecipe extends Recipe { public ShapedRecipe(RecipeBuilder builder) { super(builder.result, builder.plugin, builder.includeData); this.rows = builder.rows; this.ingredientsMap = builder.ingredientsMap; } ShapedRecipe(RecipeBuilder builder); List<List<Character>> getRows(); List<Character> removeRow(int index); int getRowLength(); Map<Character, Material> getIngredientsMap(); List<List<Material>> getIngredientRows(); @Override List<Material> getIngredients(); @Override ShapedRecipe clone(); @Override RecipeBuilder toBuilder(); @Override boolean equals(Object obj); @Override int hashCode();  }### Answer:
@Test public void testShapedRecipe() { RecipeBuilder builder = new RecipeBuilder(); builder.addRow(' ', 'X', ' '); builder.addRow('X', 'X', 'X'); builder.addRow(' ', 'X', ' '); builder.setIngredient('X', BlockMaterial.SOLID_BLUE); builder.setResult(new ItemStack(BlockMaterial.AIR, 1)); final ShapedRecipe recipe = builder.buildShapedRecipe(); SimpleRecipeManager manager = new SimpleRecipeManager(); manager.register(recipe); List<List<Material>> materials = new ArrayList<>(); assertFalse(manager.matchShapedRecipe(materials) != null); materials.add(Arrays.asList(new Material[] {null, BlockMaterial.SOLID_BLUE, null})); materials.add(Arrays.asList(new Material[] {BlockMaterial.SOLID_BLUE, BlockMaterial.SOLID_BLUE, BlockMaterial.SOLID_BLUE})); materials.add(Arrays.asList(new Material[] {null, BlockMaterial.SOLID_BLUE, null})); assertTrue(manager.matchShapedRecipe(materials) != null); }