* Added support for determining all the possibly ways to create a given item * Added full unit test support
This commit is contained in:
@@ -0,0 +1,746 @@
|
||||
// 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", 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", 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("craft: simple", function() {
|
||||
var node = createCraftingNode(1, "Furnace", 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", 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", 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", 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", 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", 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", 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("copy", function() {
|
||||
var node = createCraftingNode(3, "Stick", 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", 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", 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", undefined, __sampleRecipeBooks);
|
||||
var nodeWithAlternatives = node.findNodeWithAlternatives();
|
||||
deepEqual(nodeWithAlternatives.name, "Stick");
|
||||
|
||||
node = createCraftingNode(1, "Stick", undefined, __sampleRecipeBooks);
|
||||
nodeWithAlternatives = node.findNodeWithAlternatives();
|
||||
deepEqual(nodeWithAlternatives.name, "Stick");
|
||||
});
|
||||
|
||||
test("getNodeAt", function() {
|
||||
var node = createCraftingNode(1, "Electronic Circuit", 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", 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", undefined, __sampleRecipeBooks);
|
||||
var furnaceNode = createCraftingNode(1, "Furnace", 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", __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", __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", __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"]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user