// Fixtures /////////////////////////////////////////////////////////////////////////////////////////////////////////// var __sampleRecipe = '{ ' + ' "output": [[1, "Cake"], [1, "Bucket"]], ' + ' "input": [[3, "Milk"], [2, "Sugar"], [3, "Wheat"], [1, "Egg"]], ' + ' "tools": ["Crafting Table"] ' + '} '; var __vanillaRecipeBookSample = '{ ' + ' "name": "Vanilla Recipes", ' + ' "description": "Crafting recipes from vanilla Minecraft", ' + ' "recipes": [ ' + ' { ' + ' "output": [[4, "Birch Plank"]], ' + ' "input": [[1, "Birch Log"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[1, "Crafting Table"]], ' + ' "input": [[4, "Birch Plank"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[1, "Crafting Table"]], ' + ' "input": [[4, "Oak Plank"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[1, "Furnace"]], ' + ' "input": [[8, "Cobblestone"]], ' + ' "tools": ["Crafting Table"] ' + ' }, { ' + ' "output": [[1, "Iron Ingot"]], ' + ' "input": [[1, "Iron Ore"], [125, "milli-coal"]], ' + ' "tools": ["Furnace"] ' + ' }, { ' + ' "output": [[4, "Oak Plank"]], ' + ' "input": [[1, "Oak Log"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[4, "Stick"]], ' + ' "input": [[2, "Birch Plank"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[4, "Stick"]], ' + ' "input": [[2, "Oak Plank"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[1, "Book"]], ' + ' "input": [[1, "Leather"], [3, "Paper"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[1, "Bookshelf"]], ' + ' "input": [[6, "Oak Plank"], [3, "Book"]], ' + ' "tools": ["Crafting Table"] ' + ' }, { ' + ' "output": [[3, "Paper"]], ' + ' "input": [[3, "Sugar Cane"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[1, "Iron Pickaxe"]], ' + ' "input": [[3, "Iron Ingot"], [2, "Stick"]], ' + ' "tools": [] ' + ' } ' + ' ] ' + '} '; var __extraVanillaRecipeBookSample = '{ ' + ' "name": "Extra Vanilla Recipes", ' + ' "description": "Extra crafting recipes from vanilla Minecraft", ' + ' "recipes": [ ' + ' { ' + ' "output": [[4, "Spruce Plank"]], ' + ' "input": [[1, "Spruce Log"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[4, "Stick"]], ' + ' "input": [[2, "Spruce Plank"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[1, "Crafting Table"]], ' + ' "input": [[4, "Spruce Plank"]], ' + ' "tools": [] ' + ' } ' + ' ] ' + '} '; var __buildCraftRecipeBookSample = '{ ' + ' "name": "BuildCraft", ' + ' "description": "Crafting recipes from BuildCraft 3, by SpaceToad", ' + ' "recipes": [ ' + ' { ' + ' "output": [[1, "Wooden Gear"]], ' + ' "input": [[4, "Stick"]], ' + ' "tools": ["Crafting Table"] ' + ' }, { ' + ' "output": [[1, "Stone Gear"]], ' + ' "input": [[4, "Cobblestone"], [1, "Wooden Gear"]], ' + ' "tools": ["Crafting Table"] ' + ' }, { ' + ' "output": [[1, "Iron Gear"]], ' + ' "input": [[4, "Iron Ingot"], [1, "Stone Gear"]], ' + ' "tools": ["Crafting Table"] ' + ' }, { ' + ' "output": [[1, "Mining Well"]], ' + ' "input": [[6, "Iron Ingot"], [1, "Iron Pickaxe"], [1, "Iron Gear"], [1, "Redstone"]], ' + ' "tools": ["Crafting Table"] ' + ' } ' + ' ] ' + '} '; var __industrialCraftRecipeBookSample = '{ ' + ' "name": "Industrial Craft", ' + ' "description": "Crafting recipes from IndustrialCraft 2, by Alblaka (in progress)", ' + ' "recipes": [ ' + ' { ' + ' "output": [[1, "Electronic Circuit"]], ' + ' "input": [[6, "Insulated Copper Cable"], [2, "Redstone"], [1, "Refined Iron"]], ' + ' "tools": ["Crafting Table"] ' + ' }, { ' + ' "output": [[1, "Insulated Copper Cable"]], ' + ' "input": [[1, "Copper Cable"], [1, "Rubber"]], ' + ' "tools": [] ' + ' }, { ' + ' "output": [[6, "Copper Cable"]], ' + ' "input": [[3, "Copper Ingot"]], ' + ' "tools": ["Crafting Table"] ' + ' }, { ' + ' "output": [[1, "Copper Ingot"]], ' + ' "input": [[1, "Copper Ore"], [125, "milli-coal"]], ' + ' "tools": ["Furnace"] ' + ' }, { ' + ' "output": [[1, "Refined Iron"]], ' + ' "input": [[1, "Iron Ingot"], [125, "milli-coal"]], ' + ' "tools": ["Furnace"] ' + ' }, { ' + ' "output": [[1, "Rubber"]], ' + ' "input": [[1, "Resin"], [125, "milli-coal"]], ' + ' "tools": ["Furnace"] ' + ' } ' + ' ] ' + '} '; var __sampleRecipeBooks = undefined; QUnit.testStart(function(name, module) { __sampleRecipeBooks = [ createRecipeBook("inline://vanilla", JSON.parse(__vanillaRecipeBookSample)), createRecipeBook("inline://extra", JSON.parse(__extraVanillaRecipeBookSample)), createRecipeBook("inline://buildcraft", JSON.parse(__buildCraftRecipeBookSample)), createRecipeBook("inline://industrialcraft", JSON.parse(__industrialCraftRecipeBookSample)) ]; }); module("Extensions"); ///////////////////////////////////////////////////////////////////////////////////////////////// test("Array.copy", function() { var sample = [ "alpha", "bravo", "charlie" ]; var copiedSample = sample.copy(); deepEqual(sample, copiedSample); notStrictEqual(sample, copiedSample); sample.push("delta"); notDeepEqual(sample, copiedSample); sample = [ createIngredient(1, "alpha"), createIngredient(2, "bravo"), createIngredient(3, "charlie") ]; copiedSample = sample.copy(); deepEqual(sample[0].name, copiedSample[0].name); deepEqual(sample[2].name, copiedSample[2].name); deepEqual(sample.length, copiedSample.length); notStrictEqual(sample, copiedSample); }); module("CraftingNode"); /////////////////////////////////////////////////////////////////////////////////////////////// test("create: simple", function() { var node = createCraftingNode(12, "Furnace", false, undefined, __sampleRecipeBooks); deepEqual(node.alternatives.length, 0); deepEqual(node.children.length, 0); deepEqual(node.count, 12); deepEqual(node.name, "Furnace"); deepEqual(node.parentNode, undefined); deepEqual(node.recipe.name, "Furnace"); }); test("create: complex", function() { var node = createCraftingNode(1, "Iron Gear", false, undefined, __sampleRecipeBooks); deepEqual(node.name, "Iron Gear"); deepEqual(node.children.length, 2); deepEqual(node.children[0].name, "Iron Ingot"); deepEqual(node.children[1].name, "Stone Gear"); node = node.children[1]; deepEqual(node.name, "Stone Gear"); deepEqual(node.children.length, 1); deepEqual(node.children[0].name, "Wooden Gear"); node = node.children[0]; deepEqual(node.name, "Wooden Gear"); deepEqual(node.children.length, 1); deepEqual(node.children[0].name, "Stick"); node = node.children[0]; deepEqual(node.name, "Stick"); deepEqual(node.recipe.input[0].name, "Birch Plank"); deepEqual(node.alternatives.length, 2); deepEqual(node.alternatives[0].input[0].name, "Oak Plank"); deepEqual(node.alternatives[1].input[0].name, "Spruce Plank"); node = node.children[0]; deepEqual(node.name, "Birch Plank"); deepEqual(node.alternatives, []); deepEqual(node.children, []); }); test("create: with tool", function() { var node = createCraftingNode(1, "Iron Ingot", true, undefined, __sampleRecipeBooks); deepEqual(node.alternatives.length, 0, JSON.stringify(node.alternatives)); deepEqual(node.children.length, 1); deepEqual(node.children[0].name, "Furnace"); deepEqual(node.name, "Iron Ingot"); }); test("craft: simple", function() { var node = createCraftingNode(1, "Furnace", false, undefined, __sampleRecipeBooks); var result = node.craft(); deepEqual(result.inventory.materials["Furnace"], 1); deepEqual(result.inventory.length, 1); deepEqual(result.missingMaterials.materials["Cobblestone"], 8); deepEqual(result.missingMaterials.length, 1); deepEqual(result.stepList.length, 1); deepEqual(result.stepList[0].count, 1); deepEqual(result.stepList[0].name, "Furnace"); node = createCraftingNode(2, "Furnace", false, undefined, __sampleRecipeBooks); result = node.craft(); deepEqual(result.inventory.materials["Furnace"], 2, JSON.stringify(result.inventory)); deepEqual(result.inventory.length, 1, JSON.stringify(result.inventory)); deepEqual(result.missingMaterials.materials["Cobblestone"], 16); deepEqual(result.missingMaterials.length, 1); deepEqual(result.stepList.length, 1); deepEqual(result.stepList[0].count, 2); deepEqual(result.stepList[0].name, "Furnace"); }); test("craft: with initial inventory", function() { var inventory = createManifest(); inventory.add(4, "Cobblestone"); var result = createCraftingResult(inventory); var node = createCraftingNode(2, "Furnace", false, undefined, __sampleRecipeBooks); node.craft(result); deepEqual(result.inventory.materials["Furnace"], 2); deepEqual(result.inventory.length, 1); deepEqual(result.missingMaterials.materials["Cobblestone"], 12); deepEqual(result.missingMaterials.length, 1); deepEqual(result.stepList.length, 1); deepEqual(result.stepList[0].count, 2); deepEqual(result.stepList[0].name, "Furnace"); }); test("craft: no-op", function() { var inventory = createManifest(); inventory.add(1, "Furnace"); var result = createCraftingResult(inventory); var node = createCraftingNode(1, "Furnace", false, undefined, __sampleRecipeBooks); node.craft(result); deepEqual(result.inventory.materials["Furnace"], 1, JSON.stringify(result.inventory)); deepEqual(result.inventory.length, 1, JSON.stringify(result.inventory)); deepEqual(result.missingMaterials.length, 0, JSON.stringify(result.missingMaterials)); deepEqual(result.stepList.length, 0, JSON.stringify(result.stepList)); }); test("craft: deep tree", function() { var node = createCraftingNode(1, "Iron Gear", false, undefined, __sampleRecipeBooks); var result = node.craft(); deepEqual(result.inventory.materials["Iron Gear"], 1); deepEqual(result.inventory.materials["Birch Plank"], 2); deepEqual(result.inventory.length, 2, JSON.stringify(result)); deepEqual(result.missingMaterials.materials["Birch Log"], 1); deepEqual(result.missingMaterials.materials["Cobblestone"], 4); deepEqual(result.missingMaterials.materials["Iron Ore"], 4); deepEqual(result.missingMaterials.materials["milli-coal"], 500); deepEqual(result.missingMaterials.length, 4); deepEqual(result.stepList[0].count, 4); deepEqual(result.stepList[0].name, "Iron Ingot"); deepEqual(result.stepList[1].count, 4); deepEqual(result.stepList[1].name, "Birch Plank"); deepEqual(result.stepList[2].count, 4); deepEqual(result.stepList[2].name, "Stick"); deepEqual(result.stepList[3].count, 1); deepEqual(result.stepList[3].name, "Wooden Gear"); deepEqual(result.stepList[4].count, 1); deepEqual(result.stepList[4].name, "Stone Gear"); deepEqual(result.stepList[5].count, 1); deepEqual(result.stepList[5].name, "Iron Gear"); deepEqual(result.stepList.length, 6); }); test("craft: repeatedly craft ingredient", function() { var node = createCraftingNode(1, "Bookshelf", false, undefined, __sampleRecipeBooks); var result = node.craft(); deepEqual(result.inventory.materials["Bookshelf"], 1, JSON.stringify(result.inventory)); deepEqual(result.inventory.materials["Oak Plank"], 2, JSON.stringify(result.inventory)); deepEqual(result.inventory.length, 2, JSON.stringify(result.inventory)); deepEqual(result.missingMaterials.materials["Oak Log"], 2, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["Sugar Cane"], 9, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["Leather"], 3, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.length, 3, JSON.stringify(result.missingMaterials)); deepEqual(result.stepList[0].count, 8, JSON.stringify(result.stepList)); deepEqual(result.stepList[0].name, "Oak Plank", JSON.stringify(result.stepList)); deepEqual(result.stepList[1].count, 9, JSON.stringify(result.stepList)); deepEqual(result.stepList[1].name, "Paper", JSON.stringify(result.stepList)); deepEqual(result.stepList[2].count, 3, JSON.stringify(result.stepList)); deepEqual(result.stepList[2].name, "Book", JSON.stringify(result.stepList)); deepEqual(result.stepList[3].count, 1, JSON.stringify(result.stepList)); deepEqual(result.stepList[3].name, "Bookshelf", JSON.stringify(result.stepList)); deepEqual(result.stepList.length, 4, JSON.stringify(result.stepList)); }); test("craft: same item used multiple places", function() { var node = createCraftingNode(1, "Mining Well", false, undefined, __sampleRecipeBooks); var result = node.craft(); deepEqual(result.inventory.materials["Mining Well"], 1, JSON.stringify(result.inventory)); deepEqual(result.inventory.materials["Stick"], 2, JSON.stringify(result.inventory)); deepEqual(result.inventory.length, 2, JSON.stringify(result.inventory)); deepEqual(result.missingMaterials.materials["Redstone"], 1, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["Iron Ore"], 13, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["milli-coal"], 1625, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["Cobblestone"], 4, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["Birch Log"], 1, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.length, 5, JSON.stringify(result.missingMaterials)); deepEqual(result.stepList[0].count, 13, JSON.stringify(result.stepList)); deepEqual(result.stepList[0].name, "Iron Ingot", JSON.stringify(result.stepList)); deepEqual(result.stepList[1].count, 4, JSON.stringify(result.stepList)); deepEqual(result.stepList[1].name, "Birch Plank", JSON.stringify(result.stepList)); deepEqual(result.stepList[2].count, 8, JSON.stringify(result.stepList)); deepEqual(result.stepList[2].name, "Stick", JSON.stringify(result.stepList)); deepEqual(result.stepList[3].count, 1, JSON.stringify(result.stepList)); deepEqual(result.stepList[3].name, "Iron Pickaxe", JSON.stringify(result.stepList)); deepEqual(result.stepList[4].count, 1, JSON.stringify(result.stepList)); deepEqual(result.stepList[4].name, "Wooden Gear", JSON.stringify(result.stepList)); deepEqual(result.stepList[5].count, 1, JSON.stringify(result.stepList)); deepEqual(result.stepList[5].name, "Stone Gear", JSON.stringify(result.stepList)); deepEqual(result.stepList[6].count, 1, JSON.stringify(result.stepList)); deepEqual(result.stepList[6].name, "Iron Gear", JSON.stringify(result.stepList)); deepEqual(result.stepList[7].count, 1, JSON.stringify(result.stepList)); deepEqual(result.stepList[7].name, "Mining Well", JSON.stringify(result.stepList)); deepEqual(result.stepList.length, 8, JSON.stringify(result.stepList)); }); test("craft: multiple tools needed", function() { var node = createCraftingNode(1, "Iron Pickaxe", true, undefined, __sampleRecipeBooks); var result = node.craft(); deepEqual(result.inventory.materials["Iron Pickaxe"], 1, JSON.stringify(result.inventory)); deepEqual(result.inventory.materials["Birch Plank"], 2, JSON.stringify(result.inventory)); deepEqual(result.inventory.materials["Stick"], 2, JSON.stringify(result.inventory)); deepEqual(result.inventory.materials["Furnace"], 1, JSON.stringify(result.inventory)); deepEqual(result.inventory.materials["Crafting Table"], 1, JSON.stringify(result.inventory)); deepEqual(result.inventory.length, 5, JSON.stringify(result.inventory)); deepEqual(result.missingMaterials.materials["Birch Log"], 2, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["Iron Ore"], 3, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["Cobblestone"], 8, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.materials["milli-coal"], 375, JSON.stringify(result.missingMaterials)); deepEqual(result.missingMaterials.length, 4, JSON.stringify(result.missingMaterials)); }); test("copy", function() { var node = createCraftingNode(3, "Stick", false, undefined, __sampleRecipeBooks); var copiedNode = node.copy(); deepEqual(copiedNode.alternatives.length, 2); deepEqual(copiedNode.children.length, 1); deepEqual(copiedNode.count, 3); deepEqual(copiedNode.name, "Stick"); deepEqual(copiedNode.parentNode, undefined); deepEqual(copiedNode.recipe.name, "Stick"); notStrictEqual(node.children[0], copiedNode.children[0]); }); test("createNextAlternative", function() { var node = createCraftingNode(1, "Stick", false, undefined, __sampleRecipeBooks); deepEqual(node.alternatives.length, 2); var firstAlternate = node.createNextAlternative(__sampleRecipeBooks); var secondAlternate = firstAlternate.createNextAlternative(__sampleRecipeBooks); deepEqual(node.alternatives, []); deepEqual(node.name, "Stick"); deepEqual(node.recipe.input[0].name, "Birch Plank"); deepEqual(node.createNextAlternative(__sampleRecipeBooks), undefined); deepEqual(firstAlternate.alternatives, []); deepEqual(firstAlternate.name, "Stick"); deepEqual(firstAlternate.recipe.input[0].name, "Oak Plank"); deepEqual(firstAlternate.createNextAlternative(__sampleRecipeBooks), undefined); deepEqual(secondAlternate.alternatives, []); deepEqual(secondAlternate.name, "Stick"); deepEqual(secondAlternate.recipe.input[0].name, "Spruce Plank"); deepEqual(secondAlternate.createNextAlternative(__sampleRecipeBooks), undefined); }); test("depthFirstTraversal", function() { var node = createCraftingNode(1, "Iron Gear", false, undefined, __sampleRecipeBooks); var expectedNames = ["Iron Ingot", "Birch Plank", "Stick", "Wooden Gear", "Stone Gear", "Iron Gear"]; var names = []; node.depthFirstTraversal(function(node) { names.push(node.name); }); deepEqual(names, expectedNames); }); test("findNodeWithAlternatives", function() { var node = createCraftingNode(1, "Iron Gear", false, undefined, __sampleRecipeBooks); var nodeWithAlternatives = node.findNodeWithAlternatives(); deepEqual(nodeWithAlternatives.name, "Stick"); node = createCraftingNode(1, "Stick", false, undefined, __sampleRecipeBooks); nodeWithAlternatives = node.findNodeWithAlternatives(); deepEqual(nodeWithAlternatives.name, "Stick"); }); test("getNodeAt", function() { var node = createCraftingNode(1, "Electronic Circuit", false, undefined, __sampleRecipeBooks); deepEqual(node.getNodeAt([0]).name, "Insulated Copper Cable"); deepEqual(node.getNodeAt([1]).name, "Refined Iron"); deepEqual(node.getNodeAt([0, 0]).name, "Copper Cable"); deepEqual(node.getNodeAt([0, 1]).name, "Rubber"); deepEqual(node.getNodeAt([0, 0, 0]).name, "Copper Ingot"); }); test("getPosition", function() { var node = createCraftingNode(1, "Electronic Circuit", false, undefined, __sampleRecipeBooks); deepEqual(node.getNodeAt([0]).getPosition(), [0]); deepEqual(node.getNodeAt([1]).getPosition(), [1]); deepEqual(node.getNodeAt([0, 0]).getPosition(), [0, 0]); deepEqual(node.getNodeAt([0, 1]).getPosition(), [0, 1]); deepEqual(node.getNodeAt([0, 0, 0]).getPosition(), [0, 0, 0]); }); test("setNodeAt", function() { var ironGearNode = createCraftingNode(1, "Iron Gear", false, undefined, __sampleRecipeBooks); var furnaceNode = createCraftingNode(1, "Furnace", false, undefined, __sampleRecipeBooks); ironGearNode.setNodeAt([1, 0, 0], furnaceNode); deepEqual(ironGearNode.children[1].children[0].children[0].name, "Furnace"); deepEqual(furnaceNode.parentNode, ironGearNode.children[1].children[0]); }); module("CraftingPlan"); /////////////////////////////////////////////////////////////////////////////////////////////// test("create: single complex plan", function() { var plan = createCraftingPlan(1, "Electronic Circuit", false, __sampleRecipeBooks); deepEqual(plan.count, 1); deepEqual(plan.recipeName, "Electronic Circuit"); deepEqual(plan.alternatives.length, 1); deepEqual(plan.alternatives[0].getNodeAt([0, 0, 0]).name, "Copper Ingot"); }); test("create: multiple simple plans", function() { var plan = createCraftingPlan(1, "Stick", false, __sampleRecipeBooks); deepEqual(plan.count, 1); deepEqual(plan.recipeName, "Stick"); deepEqual(plan.alternatives[0].recipe.input[0].name, "Birch Plank"); deepEqual(plan.alternatives[1].recipe.input[0].name, "Oak Plank"); deepEqual(plan.alternatives[2].recipe.input[0].name, "Spruce Plank"); deepEqual(plan.alternatives.length, 3); }); test("create: multiple complex plans", function() { var plan = createCraftingPlan(1, "Iron Gear", false, __sampleRecipeBooks); var firstResult = plan.alternatives[0].craft(); var secondResult = plan.alternatives[1].craft(); var thirdResult = plan.alternatives[2].craft(); deepEqual(firstResult.missingMaterials.materials["Birch Log"], 1, JSON.stringify(firstResult.missingMaterials)); deepEqual(secondResult.missingMaterials.materials["Oak Log"], 1, JSON.stringify(secondResult.missingMaterials)); deepEqual(thirdResult.missingMaterials.materials["Spruce Log"], 1, JSON.stringify(thirdResult.missingMaterials)); }); module("CraftingResult"); ///////////////////////////////////////////////////////////////////////////////////////////// test("create", function() { var result = createCraftingResult(); deepEqual(result.inventory.length, 0); deepEqual(result.missingMaterials.length, 0); deepEqual(result.stepList.length, 0); var startingInventory = createManifest(); startingInventory.add(1, "Furnace"); startingInventory.add(10, "Iron Ingot"); result = createCraftingResult(startingInventory); deepEqual(result.inventory.contains(1, "Furnace"), true); deepEqual(result.inventory.contains(10, "Iron Ingot"), true); deepEqual(result.missingMaterials.length, 0); deepEqual(result.stepList.length, 0); result.inventory.add(1, "Oak Log"); deepEqual(startingInventory.materials["Oak Log"], undefined); startingInventory.removeAll(); deepEqual(result.inventory.materials["Iron Ingot"], 10); }); test("addCraftingResult", function() { var startingInventory = createManifest(); startingInventory.add(10, "Furnace"); var result = createCraftingResult(startingInventory); result.addMissingMaterial("Furnace"); result.addCraftingResult(1, "Furnace"); deepEqual(result.stepList.length, 1); deepEqual(result.stepList[0].name, "Furnace"); deepEqual(result.stepList[0].count, 1); deepEqual(result.inventory.materials["Furnace"], 10); deepEqual(result.missingMaterials.contains(1, "Furnace"), false); result.addCraftingResult(3, "Bucket"); deepEqual(result.stepList.length, 2, JSON.stringify(result.stepList)); deepEqual(result.stepList[0].name, "Bucket", JSON.stringify(result.stepList)); deepEqual(result.stepList[0].count, 3, JSON.stringify(result.stepList)); deepEqual(result.inventory.materials["Bucket"], 3, JSON.stringify(result.inventory)); result.addCraftingResult(10, "Furnace"); deepEqual(result.stepList.length, 2); deepEqual(result.stepList[1].name, "Furnace"); deepEqual(result.stepList[1].count, 11); deepEqual(result.inventory.materials["Furnace"], 20); }); test("copy", function() { var result = createCraftingResult(); result.addMissingMaterial("Oak Log"); result.addCraftingResult(4, "Oak Plank"); deepEqual(result.inventory.materials["Oak Plank"], 4); deepEqual(result.stepList[0].name, "Oak Plank"); deepEqual(result.missingMaterials.materials["Oak Log"], 1); var copiedResult = result.copy(); deepEqual(copiedResult.inventory.materials["Oak Plank"], 4); deepEqual(copiedResult.stepList[0].name, "Oak Plank"); deepEqual(copiedResult.missingMaterials.materials["Oak Log"], 1); }); module("Ingredient"); ///////////////////////////////////////////////////////////////////////////////////////////////// test("create", function() { var ingredient = createIngredient(12, "Furnace"); deepEqual(ingredient.count, 12); deepEqual(ingredient.name, "Furnace"); }); test("copy", function() { var ingredient = createIngredient(12, "Furnace"); var copiedIngredient = ingredient.copy(); deepEqual(copiedIngredient.count, 12); deepEqual(copiedIngredient.name, "Furnace"); }); module("Manifest"); /////////////////////////////////////////////////////////////////////////////////////////////////// test("create", function() { var manifest = createManifest(); deepEqual(manifest.materials, {}); }); test("add / contains", function() { var manifest = createManifest(); deepEqual(manifest.contains(1, "Furnace"), false); manifest.add(1, "Furnace"); deepEqual(manifest.contains(1, "Furnace"), true); deepEqual(manifest.contains(2, "Furnace"), false); manifest.add(3, "Furnace"); manifest.add(10, "Iron Ingot"); deepEqual(manifest.contains(1, "Furnace"), true); deepEqual(manifest.contains(4, "Furnace"), true); deepEqual(manifest.contains(5, "Furnace"), false); deepEqual(manifest.contains(9, "Iron Ingot"), true); deepEqual(manifest.contains(10, "Iron Ingot"), true); deepEqual(manifest.contains(11, "Iron Ingot"), false); }); test("copy", function() { var manifest = createManifest(); manifest.add(10, "Furnace", JSON.stringify(manifest)); manifest.add(10, "Iron Ingot", JSON.stringify(manifest)); deepEqual(manifest.materials["Furnace"], 10, JSON.stringify(manifest)); deepEqual(manifest.materials["Iron Ingot"], 10, JSON.stringify(manifest)); deepEqual(manifest.length, 2, JSON.stringify(manifest)); var copiedManifest = manifest.copy(); deepEqual(copiedManifest.materials["Furnace"], 10, JSON.stringify(copiedManifest)); deepEqual(copiedManifest.materials["Iron Ingot"], 10, JSON.stringify(copiedManifest)); deepEqual(copiedManifest.length, 2, JSON.stringify(copiedManifest)); }); test("remove", function() { var manifest = createManifest(); manifest.add(10, "Furnace"); manifest.add(10, "Iron Ingot"); deepEqual(manifest.materials["Furnace"], 10); deepEqual(manifest.materials["Iron Ingot"], 10); manifest.remove(1, "Furnace"); deepEqual(manifest.materials["Furnace"], 9); deepEqual(manifest.materials["Iron Ingot"], 10); manifest.remove(9, "Furnace"); deepEqual(manifest.materials["Furnace"], undefined); deepEqual(manifest.materials["Iron Ingot"], 10); throws( function() { manifest.remove(12, "Iron Ingot"); }, "Only 10 Iron Ingot, cannot remove 12", JSON.stringify(manifest) ); deepEqual(manifest.materials["Iron Ingot"], 10); throws( function() { manifest.remove(1, "Jellybean"); }, "No Jellybean, cannot remove 1", JSON.stringify(manifest) ); deepEqual(manifest.materials["Iron Ingot"], 10); }); test("removeAll", function() { var manifest = createManifest(); manifest.add(10, "Furnace"); manifest.add(10, "Iron Ingot"); deepEqual(manifest.materials["Furnace"], 10); deepEqual(manifest.materials["Iron Ingot"], 10); manifest.removeAll(); deepEqual(manifest.materials["Furnace"], undefined); deepEqual(manifest.materials["Iron Ingot"], undefined); }); module("Recipe"); ///////////////////////////////////////////////////////////////////////////////////////////////////// test("create", function() { var recipe = createRecipe(JSON.parse(__sampleRecipe)); deepEqual(recipe.name, "Cake"); deepEqual(recipe.output.length, 2); deepEqual(recipe.input.length, 4); deepEqual(recipe.tools, ["Crafting Table"]); }); test("copy", function() { var recipe = createRecipe(JSON.parse(__sampleRecipe)); var recipe2 = recipe.copy(); notStrictEqual(recipe, recipe2); deepEqual(recipe2.name, "Cake"); deepEqual(recipe2.output.length, 2); deepEqual(recipe2.input.length, 4); deepEqual(recipe2.tools, ["Crafting Table"]); }); module("RecipeBook"); ///////////////////////////////////////////////////////////////////////////////////////////////// test("create", function() { var recipeBook = __sampleRecipeBooks[0]; deepEqual(recipeBook.name, "Vanilla Recipes"); deepEqual(recipeBook.description, "Crafting recipes from vanilla Minecraft"); deepEqual(recipeBook.sourceUrl, "inline://vanilla"); deepEqual(recipeBook.recipes.length, 12); deepEqual(recipeBook.recipes[3].name, "Furnace"); }); test("findAllRecipes", function() { var recipeBook = __sampleRecipeBooks[0]; var recipes = undefined; recipes = recipeBook.findAllRecipes("Furnace"); deepEqual(recipes.length, 1); deepEqual(recipes[0].name, "Furnace"); recipes = recipeBook.findAllRecipes("Stick"); deepEqual(recipes.length, 2); deepEqual(recipes[0].input[0].name, "Birch Plank"); deepEqual(recipes[1].input[0].name, "Oak Plank"); recipes = recipeBook.findAllRecipes("iRoN INGot"); deepEqual(recipes.length, 1); deepEqual(recipes[0].name, "Iron Ingot"); recipes = recipeBook.findAllRecipes("Jellybean"); deepEqual(recipes.length, 0); }); test("getAllRecipeNames", function() { var names = __sampleRecipeBooks[1].getAllRecipeNames(); deepEqual(names, ["Crafting Table", "Spruce Plank", "Stick"]); }); test("hasRecipe", function() { var recipeBook = __sampleRecipeBooks[0]; deepEqual(recipeBook.hasRecipe("Furnace"), true); deepEqual(recipeBook.hasRecipe("Crafting Table"), true); deepEqual(recipeBook.hasRecipe("IRon InGoT"), true); deepEqual(recipeBook.hasRecipe("Jellybean"), false); }); module("RecipeBook (globals)"); /////////////////////////////////////////////////////////////////////////////////////// test("hasRecipe", function() { var recipeBooks = __sampleRecipeBooks; deepEqual(hasRecipe("Furnace", recipeBooks), true); deepEqual(hasRecipe("Crafting Table", recipeBooks), true); deepEqual(hasRecipe("irON inGot", recipeBooks), true); deepEqual(hasRecipe("Wooden Gear", recipeBooks), true); deepEqual(hasRecipe("Jellybean", recipeBooks), false); }); test("findAllRecipes", function() { var recipeBooks = __sampleRecipeBooks; var recipes = undefined; recipes = findAllRecipes("Furnace", recipeBooks); deepEqual(recipes.length, 1); deepEqual(recipes[0].name, "Furnace"); recipes = findAllRecipes("Stick", recipeBooks); deepEqual(recipes.length, 3); deepEqual(recipes[0].input[0].name, "Birch Plank"); deepEqual(recipes[1].input[0].name, "Oak Plank"); deepEqual(recipes[2].input[0].name, "Spruce Plank"); recipes = findAllRecipes("IRON ingot", recipeBooks); deepEqual(recipes.length, 1); deepEqual(recipes[0].name, "Iron Ingot"); recipes = findAllRecipes("Wooden Gear", recipeBooks); deepEqual(recipes.length, 1); deepEqual(recipes[0].name, "Wooden Gear"); }); test("getAllRecipeNames", function() { var recipeBooks = [__sampleRecipeBooks[1], __sampleRecipeBooks[2]]; var names = getAllRecipeNames(recipeBooks); deepEqual(names, ["Crafting Table", "Iron Gear", "Mining Well", "Spruce Plank", "Stick", "Stone Gear", "Wooden Gear"]); });