evennia/docs/1.0-dev/_modules/evennia/contrib/crafting/tests.html
2021-02-27 20:21:31 +01:00

783 lines
No EOL
127 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>evennia.contrib.crafting.tests &#8212; Evennia 1.0-dev documentation</title>
<link rel="stylesheet" href="../../../../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script src="../../../../_static/jquery.js"></script>
<script src="../../../../_static/underscore.js"></script>
<script src="../../../../_static/doctools.js"></script>
<script src="../../../../_static/language_data.js"></script>
<link rel="shortcut icon" href="../../../../_static/favicon.ico"/>
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" accesskey="U">evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.crafting.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for evennia.contrib.crafting.tests</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Unit tests for the crafting system contrib.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">unittest</span> <span class="kn">import</span> <span class="n">mock</span>
<span class="kn">from</span> <span class="nn">anything</span> <span class="kn">import</span> <span class="n">Something</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">override_settings</span>
<span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ObjectDoesNotExist</span>
<span class="kn">from</span> <span class="nn">evennia.commands.default.tests</span> <span class="kn">import</span> <span class="n">CommandTest</span>
<span class="kn">from</span> <span class="nn">evennia.utils.test_resources</span> <span class="kn">import</span> <span class="n">TestCase</span><span class="p">,</span> <span class="n">EvenniaTest</span>
<span class="kn">from</span> <span class="nn">evennia.utils.create</span> <span class="kn">import</span> <span class="n">create_object</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">crafting</span><span class="p">,</span> <span class="n">example_recipes</span>
<div class="viewcode-block" id="TestCraftUtils"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftUtils">[docs]</a><span class="k">class</span> <span class="nc">TestCraftUtils</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test helper utils for crafting.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">maxDiff</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="TestCraftUtils.test_load_recipes"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftUtils.test_load_recipes">[docs]</a> <span class="nd">@override_settings</span><span class="p">(</span><span class="n">CRAFT_RECIPE_MODULES</span><span class="o">=</span><span class="p">[])</span>
<span class="k">def</span> <span class="nf">test_load_recipes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;This should only load the example module now&quot;&quot;&quot;</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">_load_recipes</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">_RECIPE_CLASSES</span><span class="p">,</span>
<span class="p">{</span>
<span class="s2">&quot;crucible steel&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">CrucibleSteelRecipe</span><span class="p">,</span>
<span class="s2">&quot;leather&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">LeatherRecipe</span><span class="p">,</span>
<span class="s2">&quot;oak bark&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">OakBarkRecipe</span><span class="p">,</span>
<span class="s2">&quot;pig iron&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">PigIronRecipe</span><span class="p">,</span>
<span class="s2">&quot;rawhide&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">RawhideRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword blade&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordBladeRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword guard&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordGuardRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword handle&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordHandleRecipe</span><span class="p">,</span>
<span class="s2">&quot;sword pommel&quot;</span><span class="p">:</span> <span class="n">example_recipes</span><span class="o">.</span><span class="n">SwordPommelRecipe</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">)</span></div></div>
<span class="k">class</span> <span class="nc">_TestMaterial</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
<div class="viewcode-block" id="TestCraftingRecipeBase"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase">[docs]</a><span class="k">class</span> <span class="nc">TestCraftingRecipeBase</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the parent recipe class.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TestCraftingRecipeBase.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inp1</span> <span class="o">=</span> <span class="n">_TestMaterial</span><span class="p">(</span><span class="s2">&quot;test1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inp2</span> <span class="o">=</span> <span class="n">_TestMaterial</span><span class="p">(</span><span class="s2">&quot;test2&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">inp3</span> <span class="o">=</span> <span class="n">_TestMaterial</span><span class="p">(</span><span class="s2">&quot;test3&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;kw1&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;kw2&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span> <span class="o">=</span> <span class="n">crafting</span><span class="o">.</span><span class="n">CraftingRecipeBase</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp3</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_msg"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_msg">[docs]</a> <span class="k">def</span> <span class="nf">test_msg</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test messaging to crafter&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">msg</span><span class="p">(</span><span class="s2">&quot;message&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="s2">&quot;message&quot;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">})</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_pre_craft"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_pre_craft">[docs]</a> <span class="k">def</span> <span class="nf">test_pre_craft</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test validating hook&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">pre_craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">validated_inputs</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inp1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">inp3</span><span class="p">))</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_pre_craft_fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_pre_craft_fail">[docs]</a> <span class="k">def</span> <span class="nf">test_pre_craft_fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Should rase error if validation fails&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">allow_craft</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">crafting</span><span class="o">.</span><span class="n">CraftingValidationError</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">pre_craft</span><span class="p">()</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_craft_hook__succeed"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_craft_hook__succeed">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_hook__succeed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test craft hook, the main access method.&quot;&quot;&quot;</span>
<span class="n">expected_result</span> <span class="o">=</span> <span class="n">_TestMaterial</span><span class="p">(</span><span class="s2">&quot;test_result&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">do_craft</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="n">expected_result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">allow_craft</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="c1"># check result</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">expected_result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">do_craft</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span><span class="n">kw1</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">kw2</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># since allow_reuse is False, this usage should now be turned off</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">allow_craft</span><span class="p">)</span>
<span class="c1"># trying to re-run again should fail since rerun is False</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">crafting</span><span class="o">.</span><span class="n">CraftingError</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span></div>
<div class="viewcode-block" id="TestCraftingRecipeBase.test_craft_hook__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipeBase.test_craft_hook__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_hook__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test failing the call&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">do_craft</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="c1"># trigger exception</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">crafting</span><span class="o">.</span><span class="n">CraftingError</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">(</span><span class="n">raise_exception</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># reset and try again without exception</span>
<span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">allow_craft</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span></div></div>
<span class="k">class</span> <span class="nc">_MockRecipe</span><span class="p">(</span><span class="n">crafting</span><span class="o">.</span><span class="n">CraftingRecipe</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="s2">&quot;testrecipe&quot;</span>
<span class="n">tool_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;tool1&quot;</span><span class="p">,</span> <span class="s2">&quot;tool2&quot;</span><span class="p">]</span>
<span class="n">consumable_tags</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;cons1&quot;</span><span class="p">,</span> <span class="s2">&quot;cons2&quot;</span><span class="p">,</span> <span class="s2">&quot;cons3&quot;</span><span class="p">]</span>
<span class="n">output_prototypes</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">&quot;key&quot;</span><span class="p">:</span> <span class="s2">&quot;Result1&quot;</span><span class="p">,</span>
<span class="s2">&quot;prototype_key&quot;</span><span class="p">:</span> <span class="s2">&quot;resultprot&quot;</span><span class="p">,</span>
<span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="p">[(</span><span class="s2">&quot;result1&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span>
<span class="p">}</span>
<span class="p">]</span>
<div class="viewcode-block" id="TestCraftingRecipe"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe">[docs]</a><span class="nd">@override_settings</span><span class="p">(</span><span class="n">CRAFT_RECIPE_MODULES</span><span class="o">=</span><span class="p">[])</span>
<span class="k">class</span> <span class="nc">TestCraftingRecipe</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the CraftingRecipe class with one recipe</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">maxDiff</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="TestCraftingRecipe.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tool1</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;tool1&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;tool1&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tool2</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;tool2&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;tool2&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons1</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons1&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons1&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons2</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons2&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons2&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons3</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons3&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons3&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.tearDown"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.tearDown">[docs]</a> <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">except</span> <span class="n">ObjectDoesNotExist</span><span class="p">:</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_error_format"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_error_format">[docs]</a> <span class="k">def</span> <span class="nf">test_error_format</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test the automatic error formatter &quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span>
<span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{missing}</span><span class="s2">,</span><span class="si">{tools}</span><span class="s2">,</span><span class="si">{consumables}</span><span class="s2">,</span><span class="si">{inputs}</span><span class="s2">,</span><span class="si">{outputs}</span><span class="s2">&quot;</span> <span class="s2">&quot;</span><span class="si">{i0}</span><span class="s2">,</span><span class="si">{i1}</span><span class="s2">,</span><span class="si">{o0}</span><span class="s2">&quot;</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;missing&quot;</span><span class="p">:</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span>
<span class="s2">&quot;tools&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;bar&quot;</span><span class="p">,</span> <span class="s2">&quot;bar2&quot;</span><span class="p">,</span> <span class="s2">&quot;bar3&quot;</span><span class="p">],</span>
<span class="s2">&quot;consumables&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;cons1&quot;</span><span class="p">,</span> <span class="s2">&quot;cons2&quot;</span><span class="p">],</span>
<span class="p">}</span>
<span class="n">expected</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;missing&quot;</span><span class="p">:</span> <span class="s2">&quot;foo&quot;</span><span class="p">,</span>
<span class="s2">&quot;i0&quot;</span><span class="p">:</span> <span class="s2">&quot;cons1&quot;</span><span class="p">,</span>
<span class="s2">&quot;i1&quot;</span><span class="p">:</span> <span class="s2">&quot;cons2&quot;</span><span class="p">,</span>
<span class="s2">&quot;i2&quot;</span><span class="p">:</span> <span class="s2">&quot;cons3&quot;</span><span class="p">,</span>
<span class="s2">&quot;o0&quot;</span><span class="p">:</span> <span class="s2">&quot;Result1&quot;</span><span class="p">,</span>
<span class="s2">&quot;tools&quot;</span><span class="p">:</span> <span class="s2">&quot;bar, bar2 and bar3&quot;</span><span class="p">,</span>
<span class="s2">&quot;consumables&quot;</span><span class="p">:</span> <span class="s2">&quot;cons1 and cons2&quot;</span><span class="p">,</span>
<span class="s2">&quot;inputs&quot;</span><span class="p">:</span> <span class="s2">&quot;cons1, cons2 and cons3&quot;</span><span class="p">,</span>
<span class="s2">&quot;outputs&quot;</span><span class="p">:</span> <span class="s2">&quot;Result1&quot;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">_format_message</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">expected</span><span class="p">))</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft__success"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft__success">[docs]</a> <span class="k">def</span> <span class="nf">test_craft__success</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test to create a result from the recipe&quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span>
<span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="s2">&quot;Result1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span> <span class="p">[</span><span class="s2">&quot;result1&quot;</span><span class="p">,</span> <span class="s2">&quot;resultprot&quot;</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">}</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are gone</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_seed__succcess"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_seed__succcess">[docs]</a> <span class="k">def</span> <span class="nf">test_seed__succcess</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test seed helper classmethod&quot;&quot;&quot;</span>
<span class="c1"># needed for other dbs to pass seed</span>
<span class="n">homeroom</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;HomeRoom&quot;</span><span class="p">,</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># call classmethod directly</span>
<span class="k">with</span> <span class="n">override_settings</span><span class="p">(</span><span class="n">DEFAULT_HOME</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;#</span><span class="si">{</span><span class="n">homeroom</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">):</span>
<span class="n">tools</span><span class="p">,</span> <span class="n">consumables</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="o">.</span><span class="n">seed</span><span class="p">()</span>
<span class="c1"># this should be a normal successful crafting</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">tools</span> <span class="o">+</span> <span class="n">consumables</span><span class="p">))</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="s2">&quot;Result1&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">tags</span><span class="o">.</span><span class="n">all</span><span class="p">(),</span> <span class="p">[</span><span class="s2">&quot;result1&quot;</span><span class="p">,</span> <span class="s2">&quot;resultprot&quot;</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">}</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are gone</span>
<span class="k">for</span> <span class="n">cons</span> <span class="ow">in</span> <span class="n">consumables</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">cons</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="k">for</span> <span class="n">tool</span> <span class="ow">in</span> <span class="n">tools</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">tool</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_missing_tool__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_missing_tool__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_missing_tool__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail craft by missing tool2&quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_tool_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;tool2&quot;</span><span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_missing_cons__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_missing_cons__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_missing_cons__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail craft by missing cons3&quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_consumable_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;cons3&quot;</span><span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_missing_cons__always_consume__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_missing_cons__always_consume__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_missing_cons__always_consume__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail craft by missing cons3, with always-consume flag&quot;&quot;&quot;</span>
<span class="n">cons4</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons4&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons4&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="n">cons4</span><span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">consume_on_fail</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_consumable_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;cons3&quot;</span><span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are deleted even though we failed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># the extra should also be gone</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">cons4</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># but cons3 should be fine since it was not included</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain as normal</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_wrong_tool__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_wrong_tool__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_wrong_tool__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail craft by including a wrong tool&quot;&quot;&quot;</span>
<span class="n">wrong</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;wrong&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;wrongtool&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="n">wrong</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_tool_excess_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">excess</span><span class="o">=</span><span class="n">wrong</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_tool_excess__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_tool_excess__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_tool_excess__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail by too many consumables&quot;&quot;&quot;</span>
<span class="c1"># note that this is a valid tag!</span>
<span class="n">tool3</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;tool3&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;tool2&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="n">tool3</span>
<span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_tool_excess_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">excess</span><span class="o">=</span><span class="n">tool3</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">tool3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_cons_excess__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_cons_excess__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_cons_excess__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Fail by too many consumables&quot;&quot;&quot;</span>
<span class="c1"># note that this is a valid tag!</span>
<span class="n">cons4</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons4&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons3&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="n">cons4</span>
<span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_consumable_excess_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">excess</span><span class="o">=</span><span class="n">cons4</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">cons4</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_tool_excess__sucess"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_tool_excess__sucess">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_tool_excess__sucess</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Allow too many consumables&quot;&quot;&quot;</span>
<span class="n">tool3</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;tool3&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;tool2&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_tool&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="n">tool3</span>
<span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">exact_tools</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">}</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are gone</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_cons_excess__sucess"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_cons_excess__sucess">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_cons_excess__sucess</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Allow too many consumables&quot;&quot;&quot;</span>
<span class="n">cons4</span> <span class="o">=</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="s2">&quot;cons4&quot;</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="s2">&quot;cons3&quot;</span><span class="p">,</span> <span class="s2">&quot;crafting_material&quot;</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="n">cons4</span>
<span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">exact_consumables</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span> <span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">}</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are gone</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_tool_order__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_tool_order__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_tool_order__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Strict tool-order recipe fail &quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span>
<span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">exact_tool_order</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_tool_order_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftingRecipe.test_craft_cons_order__fail"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftingRecipe.test_craft_cons_order__fail">[docs]</a> <span class="k">def</span> <span class="nf">test_craft_cons_order__fail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Strict tool-order recipe fail &quot;&quot;&quot;</span>
<span class="n">recipe</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cons1</span>
<span class="p">)</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">exact_consumable_order</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">recipe</span><span class="o">.</span><span class="n">craft</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertFalse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span><span class="o">.</span><span class="n">assert_called_with</span><span class="p">(</span>
<span class="n">recipe</span><span class="o">.</span><span class="n">error_consumable_order_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">get_display_name</span><span class="p">(</span><span class="n">looker</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">)</span>
<span class="p">),</span>
<span class="p">{</span><span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;crafting&quot;</span><span class="p">},</span>
<span class="p">)</span>
<span class="c1"># make sure consumables are still there</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cons3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">tool2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="TestCraftSword"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftSword">[docs]</a><span class="k">class</span> <span class="nc">TestCraftSword</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test the `craft` function by crafting the example sword.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TestCraftSword.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftSword.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">()</span></div>
<div class="viewcode-block" id="TestCraftSword.test_craft_sword"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftSword.test_craft_sword">[docs]</a> <span class="nd">@override_settings</span><span class="p">(</span><span class="n">CRAFT_RECIPE_MODULES</span><span class="o">=</span><span class="p">[],</span> <span class="n">DEFAULT_HOME</span><span class="o">=</span><span class="s2">&quot;#999999&quot;</span><span class="p">)</span>
<span class="nd">@mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.contrib.crafting.example_recipes.random&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">test_craft_sword</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mockrandom</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Craft example sword. For the test, every crafting works.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># make sure every craft succeeds</span>
<span class="n">mockrandom</span><span class="o">.</span><span class="n">random</span> <span class="o">=</span> <span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">(</span><span class="n">return_value</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_co</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">tagkey</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">tagcat</span> <span class="o">=</span> <span class="s2">&quot;crafting_tool&quot;</span> <span class="k">if</span> <span class="n">is_tool</span> <span class="k">else</span> <span class="s2">&quot;crafting_material&quot;</span>
<span class="k">return</span> <span class="n">create_object</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="p">[(</span><span class="n">tagkey</span><span class="p">,</span> <span class="n">tagcat</span><span class="p">)],</span> <span class="n">nohome</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_craft</span><span class="p">(</span><span class="n">recipe_name</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;shortcut to shorten and return only one element&quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">crafting</span><span class="o">.</span><span class="n">craft</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crafter</span><span class="p">,</span> <span class="n">recipe_name</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">,</span> <span class="n">raise_exception</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">result</span>
<span class="c1"># generate base materials</span>
<span class="n">iron_ore1</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Iron ore ingot&quot;</span><span class="p">,</span> <span class="s2">&quot;iron ore&quot;</span><span class="p">)</span>
<span class="n">iron_ore2</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Iron ore ingot&quot;</span><span class="p">,</span> <span class="s2">&quot;iron ore&quot;</span><span class="p">)</span>
<span class="n">iron_ore3</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Iron ore ingot&quot;</span><span class="p">,</span> <span class="s2">&quot;iron ore&quot;</span><span class="p">)</span>
<span class="n">ash1</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of Ash&quot;</span><span class="p">,</span> <span class="s2">&quot;ash&quot;</span><span class="p">)</span>
<span class="n">ash2</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of Ash&quot;</span><span class="p">,</span> <span class="s2">&quot;ash&quot;</span><span class="p">)</span>
<span class="n">ash3</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of Ash&quot;</span><span class="p">,</span> <span class="s2">&quot;ash&quot;</span><span class="p">)</span>
<span class="n">sand1</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of sand&quot;</span><span class="p">,</span> <span class="s2">&quot;sand&quot;</span><span class="p">)</span>
<span class="n">sand2</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of sand&quot;</span><span class="p">,</span> <span class="s2">&quot;sand&quot;</span><span class="p">)</span>
<span class="n">sand3</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of sand&quot;</span><span class="p">,</span> <span class="s2">&quot;sand&quot;</span><span class="p">)</span>
<span class="n">coal01</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal02</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal03</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal04</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal05</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal06</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal07</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal08</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal09</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal10</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal11</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">coal12</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of coal&quot;</span><span class="p">,</span> <span class="s2">&quot;coal&quot;</span><span class="p">)</span>
<span class="n">oak_wood</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Pile of oak wood&quot;</span><span class="p">,</span> <span class="s2">&quot;oak wood&quot;</span><span class="p">)</span>
<span class="n">water</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Bucket of water&quot;</span><span class="p">,</span> <span class="s2">&quot;water&quot;</span><span class="p">)</span>
<span class="n">fur</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Bundle of Animal fur&quot;</span><span class="p">,</span> <span class="s2">&quot;fur&quot;</span><span class="p">)</span>
<span class="c1"># tools</span>
<span class="n">blast_furnace</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Blast furnace&quot;</span><span class="p">,</span> <span class="s2">&quot;blast furnace&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">furnace</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Smithing furnace&quot;</span><span class="p">,</span> <span class="s2">&quot;furnace&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">crucible</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Smelting crucible&quot;</span><span class="p">,</span> <span class="s2">&quot;crucible&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">anvil</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Smithing anvil&quot;</span><span class="p">,</span> <span class="s2">&quot;anvil&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">hammer</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Smithing hammer&quot;</span><span class="p">,</span> <span class="s2">&quot;hammer&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">knife</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Working knife&quot;</span><span class="p">,</span> <span class="s2">&quot;knife&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">cauldron</span> <span class="o">=</span> <span class="n">_co</span><span class="p">(</span><span class="s2">&quot;Cauldron&quot;</span><span class="p">,</span> <span class="s2">&quot;cauldron&quot;</span><span class="p">,</span> <span class="n">is_tool</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># making pig iron</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">iron_ore1</span><span class="p">,</span> <span class="n">coal01</span><span class="p">,</span> <span class="n">coal02</span><span class="p">,</span> <span class="n">blast_furnace</span><span class="p">]</span>
<span class="n">pig_iron1</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;pig iron&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">iron_ore2</span><span class="p">,</span> <span class="n">coal03</span><span class="p">,</span> <span class="n">coal04</span><span class="p">,</span> <span class="n">blast_furnace</span><span class="p">]</span>
<span class="n">pig_iron2</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;pig iron&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">iron_ore3</span><span class="p">,</span> <span class="n">coal05</span><span class="p">,</span> <span class="n">coal06</span><span class="p">,</span> <span class="n">blast_furnace</span><span class="p">]</span>
<span class="n">pig_iron3</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;pig iron&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># making crucible steel</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">pig_iron1</span><span class="p">,</span> <span class="n">ash1</span><span class="p">,</span> <span class="n">sand1</span><span class="p">,</span> <span class="n">coal07</span><span class="p">,</span> <span class="n">coal08</span><span class="p">,</span> <span class="n">crucible</span><span class="p">]</span>
<span class="n">crucible_steel1</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">pig_iron2</span><span class="p">,</span> <span class="n">ash2</span><span class="p">,</span> <span class="n">sand2</span><span class="p">,</span> <span class="n">coal09</span><span class="p">,</span> <span class="n">coal10</span><span class="p">,</span> <span class="n">crucible</span><span class="p">]</span>
<span class="n">crucible_steel2</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">pig_iron3</span><span class="p">,</span> <span class="n">ash3</span><span class="p">,</span> <span class="n">sand3</span><span class="p">,</span> <span class="n">coal11</span><span class="p">,</span> <span class="n">coal12</span><span class="p">,</span> <span class="n">crucible</span><span class="p">]</span>
<span class="n">crucible_steel3</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;crucible steel&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># smithing</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">crucible_steel1</span><span class="p">,</span> <span class="n">hammer</span><span class="p">,</span> <span class="n">anvil</span><span class="p">,</span> <span class="n">furnace</span><span class="p">]</span>
<span class="n">sword_blade</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword blade&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">crucible_steel2</span><span class="p">,</span> <span class="n">hammer</span><span class="p">,</span> <span class="n">anvil</span><span class="p">,</span> <span class="n">furnace</span><span class="p">]</span>
<span class="n">sword_pommel</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword pommel&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">crucible_steel3</span><span class="p">,</span> <span class="n">hammer</span><span class="p">,</span> <span class="n">anvil</span><span class="p">,</span> <span class="n">furnace</span><span class="p">]</span>
<span class="n">sword_guard</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword guard&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># stripping fur</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">fur</span><span class="p">,</span> <span class="n">knife</span><span class="p">]</span>
<span class="n">rawhide</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;rawhide&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># making bark (tannin) and cleaned wood</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">oak_wood</span><span class="p">,</span> <span class="n">knife</span><span class="p">]</span>
<span class="n">oak_bark</span><span class="p">,</span> <span class="n">cleaned_oak_wood</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;oak bark&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># leathermaking</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">rawhide</span><span class="p">,</span> <span class="n">oak_bark</span><span class="p">,</span> <span class="n">water</span><span class="p">,</span> <span class="n">cauldron</span><span class="p">]</span>
<span class="n">leather</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;leather&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># sword handle</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span><span class="n">cleaned_oak_wood</span><span class="p">,</span> <span class="n">knife</span><span class="p">]</span>
<span class="n">sword_handle</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword handle&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="c1"># sword (order matters)</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">sword_blade</span><span class="p">,</span>
<span class="n">sword_guard</span><span class="p">,</span>
<span class="n">sword_pommel</span><span class="p">,</span>
<span class="n">sword_handle</span><span class="p">,</span>
<span class="n">leather</span><span class="p">,</span>
<span class="n">knife</span><span class="p">,</span>
<span class="n">hammer</span><span class="p">,</span>
<span class="n">furnace</span><span class="p">,</span>
<span class="p">]</span>
<span class="n">sword</span> <span class="o">=</span> <span class="n">_craft</span><span class="p">(</span><span class="s2">&quot;sword&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">inputs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">sword</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="s2">&quot;Sword&quot;</span><span class="p">)</span>
<span class="c1"># make sure all materials and intermediaries are deleted</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">iron_ore1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">iron_ore2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">iron_ore3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">ash1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">ash2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">ash3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sand1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sand2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sand3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal01</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal02</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal03</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal04</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal05</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal06</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal07</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal08</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal09</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal10</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal11</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">coal12</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">oak_wood</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">water</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">fur</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">pig_iron1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">pig_iron2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">pig_iron3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">crucible_steel1</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">crucible_steel2</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">crucible_steel3</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sword_blade</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sword_pommel</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sword_guard</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">rawhide</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">oak_bark</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">leather</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNone</span><span class="p">(</span><span class="n">sword_handle</span><span class="o">.</span><span class="n">pk</span><span class="p">)</span>
<span class="c1"># make sure all tools remain</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">blast_furnace</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">furnace</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">crucible</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">anvil</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">hammer</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">knife</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsNotNone</span><span class="p">(</span><span class="n">cauldron</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="TestCraftCommand"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand">[docs]</a><span class="nd">@mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.contrib.crafting.crafting._load_recipes&quot;</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">mock</span><span class="o">.</span><span class="n">MagicMock</span><span class="p">())</span>
<span class="nd">@mock</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="s2">&quot;evennia.contrib.crafting.crafting._RECIPE_CLASSES&quot;</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;testrecipe&quot;</span><span class="p">:</span> <span class="n">_MockRecipe</span><span class="p">})</span>
<span class="nd">@override_settings</span><span class="p">(</span><span class="n">CRAFT_RECIPE_MODULES</span><span class="o">=</span><span class="p">[],</span> <span class="n">DEFAULT_HOME</span><span class="o">=</span><span class="s2">&quot;#999999&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">TestCraftCommand</span><span class="p">(</span><span class="n">CommandTest</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Test the crafting command&quot;&quot;&quot;</span>
<div class="viewcode-block" id="TestCraftCommand.setUp"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand.setUp">[docs]</a> <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">setUp</span><span class="p">()</span>
<span class="n">tools</span><span class="p">,</span> <span class="n">consumables</span> <span class="o">=</span> <span class="n">_MockRecipe</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span>
<span class="n">tool_kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">},</span> <span class="n">consumable_kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;location&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">char1</span><span class="p">}</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftCommand.test_craft__success"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand.test_craft__success">[docs]</a> <span class="k">def</span> <span class="nf">test_craft__success</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">&quot;Successfully craft using command&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">CmdCraft</span><span class="p">(),</span>
<span class="s2">&quot;testrecipe from cons1, cons2, cons3 using tool1, tool2&quot;</span><span class="p">,</span>
<span class="n">_MockRecipe</span><span class="o">.</span><span class="n">success_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">),</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftCommand.test_craft__notools__failure"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand.test_craft__notools__failure">[docs]</a> <span class="k">def</span> <span class="nf">test_craft__notools__failure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">&quot;Craft fail no tools&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">CmdCraft</span><span class="p">(),</span>
<span class="s2">&quot;testrecipe from cons1, cons2, cons3&quot;</span><span class="p">,</span>
<span class="n">_MockRecipe</span><span class="o">.</span><span class="n">error_tool_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;tool1&quot;</span><span class="p">),</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="TestCraftCommand.test_craft__nocons__failure"><a class="viewcode-back" href="../../../../api/evennia.contrib.crafting.tests.html#evennia.contrib.crafting.tests.TestCraftCommand.test_craft__nocons__failure">[docs]</a> <span class="k">def</span> <span class="nf">test_craft__nocons__failure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">call</span><span class="p">(</span>
<span class="n">crafting</span><span class="o">.</span><span class="n">CmdCraft</span><span class="p">(),</span>
<span class="s2">&quot;testrecipe using tool1, tool2&quot;</span><span class="p">,</span>
<span class="n">_MockRecipe</span><span class="o">.</span><span class="n">error_consumable_missing_message</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">outputs</span><span class="o">=</span><span class="s2">&quot;Result1&quot;</span><span class="p">,</span> <span class="n">missing</span><span class="o">=</span><span class="s2">&quot;cons1&quot;</span><span class="p">),</span>
<span class="p">)</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../../../../index.html">
<img class="logo" src="../../../../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h3>Versions</h3>
<ul>
<li><a href="tests.html">1.0-dev (develop branch)</a></li>
<li><a href="../../../../../0.9.5/index.html">0.9.5 (v0.9.5 branch)</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../../../../index.html">Evennia 1.0-dev</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../../../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="../../../evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.contrib.crafting.tests</a></li>
</ul>
<div class="develop">develop branch</div>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2020, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>