mirror of
https://github.com/evennia/evennia.git
synced 2026-03-28 18:47:16 +01:00
1581 lines
No EOL
218 KiB
HTML
1581 lines
No EOL
218 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>unittest.case — Evennia latest documentation</title>
|
|
<link rel="stylesheet" href="../../_static/nature.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d75fae25" />
|
|
<link rel="stylesheet" type="text/css" href="../../_static/nature.css?v=245aff17" />
|
|
<script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
|
|
<script src="../../_static/documentation_options.js?v=c6e86fd7"></script>
|
|
<script src="../../_static/doctools.js?v=9bcbadda"></script>
|
|
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
|
<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 latest</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">unittest.case</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
|
|
<div class="documentwrapper">
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<search 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" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</search>
|
|
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
|
|
<ul>
|
|
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
|
|
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
|
|
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
|
|
<li><a href="http://games.evennia.com">Game Index</a> </li>
|
|
<li>
|
|
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
|
|
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
|
|
<a href="https://evennia.blogspot.com/">Blog</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for unittest.case</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""Test case implementation"""</span>
|
|
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">functools</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">difflib</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">pprint</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">collections</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">contextlib</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">traceback</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">time</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">types</span>
|
|
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">result</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">.util</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span><span class="n">strclass</span><span class="p">,</span> <span class="n">safe_repr</span><span class="p">,</span> <span class="n">_count_diff_all_purpose</span><span class="p">,</span>
|
|
<span class="n">_count_diff_hashable</span><span class="p">,</span> <span class="n">_common_shorten_repr</span><span class="p">)</span>
|
|
|
|
<span class="n">__unittest</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="n">_subtest_msg_sentinel</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
|
|
|
|
<span class="n">DIFF_OMITTED</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">Diff is </span><span class="si">%s</span><span class="s1"> characters long. '</span>
|
|
<span class="s1">'Set self.maxDiff to None to see it.'</span><span class="p">)</span>
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">SkipTest</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Raise this exception in a test to skip it.</span>
|
|
|
|
<span class="sd"> Usually you can use TestCase.skipTest() or one of the skipping decorators</span>
|
|
<span class="sd"> instead of raising this directly.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_ShouldStop</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> The test should stop.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_UnexpectedSuccess</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> The test was supposed to fail, but it didn't!</span>
|
|
<span class="sd"> """</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_Outcome</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">expecting_failure</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">result</span> <span class="o">=</span> <span class="n">result</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">result_supports_subtests</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s2">"addSubTest"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">success</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">expectedFailure</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="nd">@contextlib</span><span class="o">.</span><span class="n">contextmanager</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">testPartExecutor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_case</span><span class="p">,</span> <span class="n">subTest</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="n">old_success</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">success</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">success</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">yield</span>
|
|
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
|
|
<span class="k">raise</span>
|
|
<span class="k">except</span> <span class="n">SkipTest</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">success</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">_addSkip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="p">,</span> <span class="n">test_case</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
|
|
<span class="k">except</span> <span class="n">_ShouldStop</span><span class="p">:</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">except</span><span class="p">:</span>
|
|
<span class="n">exc_info</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">expecting_failure</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">expectedFailure</span> <span class="o">=</span> <span class="n">exc_info</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">success</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">subTest</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="o">.</span><span class="n">addSubTest</span><span class="p">(</span><span class="n">test_case</span><span class="o">.</span><span class="n">test_case</span><span class="p">,</span> <span class="n">test_case</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">_addError</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="p">,</span> <span class="n">test_case</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">)</span>
|
|
<span class="c1"># explicitly break a reference cycle:</span>
|
|
<span class="c1"># exc_info -> frame -> exc_info</span>
|
|
<span class="n">exc_info</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">subTest</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">success</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">result</span><span class="o">.</span><span class="n">addSubTest</span><span class="p">(</span><span class="n">test_case</span><span class="o">.</span><span class="n">test_case</span><span class="p">,</span> <span class="n">test_case</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">success</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">success</span> <span class="ow">and</span> <span class="n">old_success</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_addSkip</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">test_case</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
|
|
<span class="n">addSkip</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">'addSkip'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">addSkip</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">addSkip</span><span class="p">(</span><span class="n">test_case</span><span class="p">,</span> <span class="n">reason</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"TestResult has no addSkip method, skips not reported"</span><span class="p">,</span>
|
|
<span class="ne">RuntimeWarning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">addSuccess</span><span class="p">(</span><span class="n">test_case</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_addError</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">test</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">exc_info</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">exc_info</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">test</span><span class="o">.</span><span class="n">failureException</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">addFailure</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">addError</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_id</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">obj</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_enter_context</span><span class="p">(</span><span class="n">cm</span><span class="p">,</span> <span class="n">addcleanup</span><span class="p">):</span>
|
|
<span class="c1"># We look up the special methods on the type to match the with</span>
|
|
<span class="c1"># statement.</span>
|
|
<span class="bp">cls</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">cm</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">enter</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="fm">__enter__</span>
|
|
<span class="n">exit</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="fm">__exit__</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"'</span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__module__</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__qualname__</span><span class="si">}</span><span class="s2">' object does "</span>
|
|
<span class="sa">f</span><span class="s2">"not support the context manager protocol"</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">enter</span><span class="p">(</span><span class="n">cm</span><span class="p">)</span>
|
|
<span class="n">addcleanup</span><span class="p">(</span><span class="n">exit</span><span class="p">,</span> <span class="n">cm</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
|
<span class="n">_module_cleanups</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">addModuleCleanup</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Same as addCleanup, except the cleanup items are called even if</span>
|
|
<span class="sd"> setUpModule fails (unlike tearDownModule)."""</span>
|
|
<span class="n">_module_cleanups</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">function</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">enterModuleContext</span><span class="p">(</span><span class="n">cm</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Same as enterContext, but module-wide."""</span>
|
|
<span class="k">return</span> <span class="n">_enter_context</span><span class="p">(</span><span class="n">cm</span><span class="p">,</span> <span class="n">addModuleCleanup</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">doModuleCleanups</span><span class="p">():</span>
|
|
<span class="w"> </span><span class="sd">"""Execute all module cleanup functions. Normally called for you after</span>
|
|
<span class="sd"> tearDownModule."""</span>
|
|
<span class="n">exceptions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">while</span> <span class="n">_module_cleanups</span><span class="p">:</span>
|
|
<span class="n">function</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="n">_module_cleanups</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">function</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
|
|
<span class="n">exceptions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">exceptions</span><span class="p">:</span>
|
|
<span class="c1"># Swallows all but first exception. If a multi-exception handler</span>
|
|
<span class="c1"># gets written we should use that here instead.</span>
|
|
<span class="k">raise</span> <span class="n">exceptions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">skip</span><span class="p">(</span><span class="n">reason</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Unconditionally skip a test.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">decorator</span><span class="p">(</span><span class="n">test_item</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">test_item</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
|
|
<span class="nd">@functools</span><span class="o">.</span><span class="n">wraps</span><span class="p">(</span><span class="n">test_item</span><span class="p">)</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">skip_wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="n">SkipTest</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
|
|
<span class="n">test_item</span> <span class="o">=</span> <span class="n">skip_wrapper</span>
|
|
|
|
<span class="n">test_item</span><span class="o">.</span><span class="n">__unittest_skip__</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="n">test_item</span><span class="o">.</span><span class="n">__unittest_skip_why__</span> <span class="o">=</span> <span class="n">reason</span>
|
|
<span class="k">return</span> <span class="n">test_item</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">reason</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">FunctionType</span><span class="p">):</span>
|
|
<span class="n">test_item</span> <span class="o">=</span> <span class="n">reason</span>
|
|
<span class="n">reason</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">return</span> <span class="n">decorator</span><span class="p">(</span><span class="n">test_item</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">decorator</span>
|
|
|
|
<div class="viewcode-block" id="skipIf">
|
|
<a class="viewcode-back" href="../../api/evennia.contrib.base_systems.awsstorage.tests.html#evennia.contrib.base_systems.awsstorage.tests.skipIf">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">skipIf</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Skip a test if the condition is true.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">condition</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">skip</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">_id</span></div>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">skipUnless</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Skip a test unless the condition is true.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">condition</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">skip</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">_id</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">expectedFailure</span><span class="p">(</span><span class="n">test_item</span><span class="p">):</span>
|
|
<span class="n">test_item</span><span class="o">.</span><span class="n">__unittest_expecting_failure__</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="n">test_item</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_is_subtype</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">basetype</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">_is_subtype</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">basetype</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">expected</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">expected</span><span class="p">,</span> <span class="n">basetype</span><span class="p">)</span>
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_BaseTestCaseContext</span><span class="p">:</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_case</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">test_case</span> <span class="o">=</span> <span class="n">test_case</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_raiseFailure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">):</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">test_case</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">test_case</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_AssertRaisesBaseContext</span><span class="p">(</span><span class="n">_BaseTestCaseContext</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected</span><span class="p">,</span> <span class="n">test_case</span><span class="p">,</span> <span class="n">expected_regex</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="n">_BaseTestCaseContext</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_case</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">expected</span> <span class="o">=</span> <span class="n">expected</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">test_case</span> <span class="o">=</span> <span class="n">test_case</span>
|
|
<span class="k">if</span> <span class="n">expected_regex</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">expected_regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">expected_regex</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">expected_regex</span> <span class="o">=</span> <span class="n">expected_regex</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj_name</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">handle</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="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> If args is empty, assertRaises/Warns is being used as a</span>
|
|
<span class="sd"> context manager, so check for a 'msg' kwarg and return self.</span>
|
|
<span class="sd"> If args is not empty, call a callable passing positional and keyword</span>
|
|
<span class="sd"> arguments.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">_is_subtype</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_base_type</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'</span><span class="si">%s</span><span class="s1">() arg 1 must be </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</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">_base_type_str</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'msg'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">kwargs</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'</span><span class="si">%r</span><span class="s1"> is an invalid keyword argument for '</span>
|
|
<span class="s1">'this function'</span> <span class="o">%</span> <span class="p">(</span><span class="nb">next</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)),))</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
|
|
<span class="n">callable_obj</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj_name</span> <span class="o">=</span> <span class="n">callable_obj</span><span class="o">.</span><span class="vm">__name__</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj_name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">callable_obj</span><span class="p">)</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="n">callable_obj</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="c1"># bpo-23890: manually break a reference cycle</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_AssertRaisesContext</span><span class="p">(</span><span class="n">_AssertRaisesBaseContext</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A context manager used to implement TestCase.assertRaises* methods."""</span>
|
|
|
|
<span class="n">_base_type</span> <span class="o">=</span> <span class="ne">BaseException</span>
|
|
<span class="n">_base_type_str</span> <span class="o">=</span> <span class="s1">'an exception type or tuple of exception types'</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__enter__</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="k">def</span><span class="w"> </span><span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">exc_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">exc_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="o">.</span><span class="vm">__name__</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">exc_name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj_name</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_raiseFailure</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2"> not raised by </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">exc_name</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj_name</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_raiseFailure</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2"> not raised"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">exc_name</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">traceback</span><span class="o">.</span><span class="n">clear_frames</span><span class="p">(</span><span class="n">tb</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">):</span>
|
|
<span class="c1"># let unexpected exceptions pass through</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="c1"># store exception, without traceback, for later retrieval</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">exception</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">with_traceback</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_regex</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="n">expected_regex</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_regex</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">expected_regex</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">exc_value</span><span class="p">)):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_raiseFailure</span><span class="p">(</span><span class="s1">'"</span><span class="si">{}</span><span class="s1">" does not match "</span><span class="si">{}</span><span class="s1">"'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">expected_regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">exc_value</span><span class="p">)))</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="n">__class_getitem__</span> <span class="o">=</span> <span class="nb">classmethod</span><span class="p">(</span><span class="n">types</span><span class="o">.</span><span class="n">GenericAlias</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_AssertWarnsContext</span><span class="p">(</span><span class="n">_AssertRaisesBaseContext</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A context manager used to implement TestCase.assertWarns* methods."""</span>
|
|
|
|
<span class="n">_base_type</span> <span class="o">=</span> <span class="ne">Warning</span>
|
|
<span class="n">_base_type_str</span> <span class="o">=</span> <span class="s1">'a warning type or tuple of warning types'</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="c1"># The __warningregistry__'s need to be in a pristine state for tests</span>
|
|
<span class="c1"># to work properly.</span>
|
|
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
|
|
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s1">'__warningregistry__'</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
|
|
<span class="n">v</span><span class="o">.</span><span class="n">__warningregistry__</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">warnings_manager</span> <span class="o">=</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">(</span><span class="n">record</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">warnings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">warnings_manager</span><span class="o">.</span><span class="fm">__enter__</span><span class="p">()</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s2">"always"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">warnings_manager</span><span class="o">.</span><span class="fm">__exit__</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">exc_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># let unexpected exceptions pass through</span>
|
|
<span class="k">return</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">exc_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="o">.</span><span class="vm">__name__</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">exc_name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span>
|
|
<span class="n">first_matching</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span><span class="p">:</span>
|
|
<span class="n">w</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">message</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">):</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="n">first_matching</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">first_matching</span> <span class="o">=</span> <span class="n">w</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected_regex</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_regex</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">w</span><span class="p">))):</span>
|
|
<span class="k">continue</span>
|
|
<span class="c1"># store warning for later retrieval</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">warning</span> <span class="o">=</span> <span class="n">w</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">filename</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">lineno</span>
|
|
<span class="k">return</span>
|
|
<span class="c1"># Now we simply try to choose a helpful failure message</span>
|
|
<span class="k">if</span> <span class="n">first_matching</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_raiseFailure</span><span class="p">(</span><span class="s1">'"</span><span class="si">{}</span><span class="s1">" does not match "</span><span class="si">{}</span><span class="s1">"'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">expected_regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">first_matching</span><span class="p">)))</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">obj_name</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_raiseFailure</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2"> not triggered by </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">exc_name</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">obj_name</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_raiseFailure</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2"> not triggered"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">exc_name</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_AssertNotWarnsContext</span><span class="p">(</span><span class="n">_AssertWarnsContext</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">warnings_manager</span><span class="o">.</span><span class="fm">__exit__</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">exc_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># let unexpected exceptions pass through</span>
|
|
<span class="k">return</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">exc_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="o">.</span><span class="vm">__name__</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">exc_name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span><span class="p">:</span>
|
|
<span class="n">w</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">message</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_raiseFailure</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">exc_name</span><span class="si">}</span><span class="s2"> triggered"</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_OrderedChainMap</span><span class="p">(</span><span class="n">collections</span><span class="o">.</span><span class="n">ChainMap</span><span class="p">):</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">seen</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">mapping</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">maps</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">mapping</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">seen</span><span class="p">:</span>
|
|
<span class="n">seen</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>
|
|
<span class="k">yield</span> <span class="n">k</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">TestCase</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A class whose instances are single test cases.</span>
|
|
|
|
<span class="sd"> By default, the test code itself should be placed in a method named</span>
|
|
<span class="sd"> 'runTest'.</span>
|
|
|
|
<span class="sd"> If the fixture may be used for many test cases, create as</span>
|
|
<span class="sd"> many test methods as are needed. When instantiating such a TestCase</span>
|
|
<span class="sd"> subclass, specify in the constructor arguments the name of the test method</span>
|
|
<span class="sd"> that the instance is to execute.</span>
|
|
|
|
<span class="sd"> Test authors should subclass TestCase for their own tests. Construction</span>
|
|
<span class="sd"> and deconstruction of the test's environment ('fixture') can be</span>
|
|
<span class="sd"> implemented by overriding the 'setUp' and 'tearDown' methods respectively.</span>
|
|
|
|
<span class="sd"> If it is necessary to override the __init__ method, the base class</span>
|
|
<span class="sd"> __init__ method must always be called. It is important that subclasses</span>
|
|
<span class="sd"> should not change the signature of their __init__ method, since instances</span>
|
|
<span class="sd"> of the classes are instantiated automatically by parts of the framework</span>
|
|
<span class="sd"> in order to be run.</span>
|
|
|
|
<span class="sd"> When subclassing TestCase, you can set these attributes:</span>
|
|
<span class="sd"> * failureException: determines which exception will be raised when</span>
|
|
<span class="sd"> the instance's assertion methods fail; test methods raising this</span>
|
|
<span class="sd"> exception will be deemed to have 'failed' rather than 'errored'.</span>
|
|
<span class="sd"> * longMessage: determines whether long messages (including repr of</span>
|
|
<span class="sd"> objects used in assert methods) will be printed on failure in *addition*</span>
|
|
<span class="sd"> to any explicit message passed.</span>
|
|
<span class="sd"> * maxDiff: sets the maximum length of a diff in failure messages</span>
|
|
<span class="sd"> by assert methods using difflib. It is looked up as an instance</span>
|
|
<span class="sd"> attribute so can be configured by individual tests if required.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">failureException</span> <span class="o">=</span> <span class="ne">AssertionError</span>
|
|
|
|
<span class="n">longMessage</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="n">maxDiff</span> <span class="o">=</span> <span class="mi">80</span><span class="o">*</span><span class="mi">8</span>
|
|
|
|
<span class="c1"># If a string is longer than _diffThreshold, use normal comparison instead</span>
|
|
<span class="c1"># of difflib. See #11763.</span>
|
|
<span class="n">_diffThreshold</span> <span class="o">=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">16</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">__init_subclass__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="c1"># Attribute used by TestSuite for classSetUp</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">_classSetupFailed</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">_class_cleanups</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init_subclass__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">methodName</span><span class="o">=</span><span class="s1">'runTest'</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Create an instance of the class that will use the named test</span>
|
|
<span class="sd"> method when executed. Raises a ValueError if the instance does</span>
|
|
<span class="sd"> not have a method with the specified name.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_testMethodName</span> <span class="o">=</span> <span class="n">methodName</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_outcome</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_testMethodDoc</span> <span class="o">=</span> <span class="s1">'No test'</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">testMethod</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">methodName</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">methodName</span> <span class="o">!=</span> <span class="s1">'runTest'</span><span class="p">:</span>
|
|
<span class="c1"># we allow instantiation with no explicit method name</span>
|
|
<span class="c1"># but not an *incorrect* or missing method name</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"no such test method in </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="n">methodName</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_testMethodDoc</span> <span class="o">=</span> <span class="n">testMethod</span><span class="o">.</span><span class="vm">__doc__</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_cleanups</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_subtest</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># Map types to custom assertEqual functions that will compare</span>
|
|
<span class="c1"># instances of said type in more detail to generate a more useful</span>
|
|
<span class="c1"># error message.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_type_equality_funcs</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">addTypeEqualityFunc</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="s1">'assertDictEqual'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">addTypeEqualityFunc</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="s1">'assertListEqual'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">addTypeEqualityFunc</span><span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="s1">'assertTupleEqual'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">addTypeEqualityFunc</span><span class="p">(</span><span class="nb">set</span><span class="p">,</span> <span class="s1">'assertSetEqual'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">addTypeEqualityFunc</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">,</span> <span class="s1">'assertSetEqual'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">addTypeEqualityFunc</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="s1">'assertMultiLineEqual'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">addTypeEqualityFunc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">typeobj</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Add a type specific assertEqual style function to compare a type.</span>
|
|
|
|
<span class="sd"> This method is for use by TestCase subclasses that need to register</span>
|
|
<span class="sd"> their own type equality functions to provide nicer error messages.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> typeobj: The data type to call this function on when both values</span>
|
|
<span class="sd"> are of the same type in assertEqual().</span>
|
|
<span class="sd"> function: The callable taking two arguments and an optional</span>
|
|
<span class="sd"> msg= argument that raises self.failureException with a</span>
|
|
<span class="sd"> useful error message when the two arguments are not equal.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_type_equality_funcs</span><span class="p">[</span><span class="n">typeobj</span><span class="p">]</span> <span class="o">=</span> <span class="n">function</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">addCleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">function</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Add a function, with arguments, to be called when the test is</span>
|
|
<span class="sd"> completed. Functions added are called on a LIFO basis and are</span>
|
|
<span class="sd"> called after tearDown on test failure or success.</span>
|
|
|
|
<span class="sd"> Cleanup items are called even if setUp fails (unlike tearDown)."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_cleanups</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">function</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">enterContext</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cm</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Enters the supplied context manager.</span>
|
|
|
|
<span class="sd"> If successful, also adds its __exit__ method as a cleanup</span>
|
|
<span class="sd"> function and returns the result of the __enter__ method.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">_enter_context</span><span class="p">(</span><span class="n">cm</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">addCleanup</span><span class="p">)</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">addClassCleanup</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">function</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Same as addCleanup, except the cleanup items are called even if</span>
|
|
<span class="sd"> setUpClass fails (unlike tearDownClass)."""</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">_class_cleanups</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">function</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">))</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">enterClassContext</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">cm</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Same as enterContext, but class-wide."""</span>
|
|
<span class="k">return</span> <span class="n">_enter_context</span><span class="p">(</span><span class="n">cm</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">addClassCleanup</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Hook method for setting up the test fixture before exercising it."</span>
|
|
<span class="k">pass</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="s2">"Hook method for deconstructing the test fixture after testing it."</span>
|
|
<span class="k">pass</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">setUpClass</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
|
|
<span class="s2">"Hook method for setting up class fixture before running tests in the class."</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">tearDownClass</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
|
|
<span class="s2">"Hook method for deconstructing the class fixture after running all tests in the class."</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">countTestCases</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">defaultTestResult</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">TestResult</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">shortDescription</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Returns a one-line description of the test, or None if no</span>
|
|
<span class="sd"> description has been provided.</span>
|
|
|
|
<span class="sd"> The default implementation of this method returns the first line of</span>
|
|
<span class="sd"> the specified test method's docstring.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">doc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_testMethodDoc</span>
|
|
<span class="k">return</span> <span class="n">doc</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">if</span> <span class="n">doc</span> <span class="k">else</span> <span class="kc">None</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">strclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_testMethodName</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">type</span><span class="p">(</span><span class="n">other</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">NotImplemented</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_testMethodName</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">_testMethodName</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">hash</span><span class="p">((</span><span class="nb">type</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">_testMethodName</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_testMethodName</span><span class="p">,</span> <span class="n">strclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_testMethodName</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </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="s2">"<</span><span class="si">%s</span><span class="s2"> testMethod=</span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> \
|
|
<span class="p">(</span><span class="n">strclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_testMethodName</span><span class="p">)</span>
|
|
|
|
<span class="nd">@contextlib</span><span class="o">.</span><span class="n">contextmanager</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">subTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">_subtest_msg_sentinel</span><span class="p">,</span> <span class="o">**</span><span class="n">params</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Return a context manager that will return the enclosed block</span>
|
|
<span class="sd"> of code in a subtest identified by the optional message and</span>
|
|
<span class="sd"> keyword parameters. A failure in the subtest marks the test</span>
|
|
<span class="sd"> case as failed but resumes execution at the end of the enclosed</span>
|
|
<span class="sd"> block, allowing further test code to be executed.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_outcome</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_outcome</span><span class="o">.</span><span class="n">result_supports_subtests</span><span class="p">:</span>
|
|
<span class="k">yield</span>
|
|
<span class="k">return</span>
|
|
<span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subtest</span>
|
|
<span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">params_map</span> <span class="o">=</span> <span class="n">_OrderedChainMap</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">params_map</span> <span class="o">=</span> <span class="n">parent</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">new_child</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_subtest</span> <span class="o">=</span> <span class="n">_SubTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">params_map</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_outcome</span><span class="o">.</span><span class="n">testPartExecutor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_subtest</span><span class="p">,</span> <span class="n">subTest</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="k">yield</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_outcome</span><span class="o">.</span><span class="n">success</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">_outcome</span><span class="o">.</span><span class="n">result</span>
|
|
<span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">result</span><span class="o">.</span><span class="n">failfast</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">_ShouldStop</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_outcome</span><span class="o">.</span><span class="n">expectedFailure</span><span class="p">:</span>
|
|
<span class="c1"># If the test is expecting a failure, we really want to</span>
|
|
<span class="c1"># stop now and register the expected failure.</span>
|
|
<span class="k">raise</span> <span class="n">_ShouldStop</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_subtest</span> <span class="o">=</span> <span class="n">parent</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_addExpectedFailure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">addExpectedFailure</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">addExpectedFailure</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"TestResult has no addExpectedFailure method, reporting as passes"</span><span class="p">,</span>
|
|
<span class="ne">RuntimeWarning</span><span class="p">)</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">addSuccess</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">addExpectedFailure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_addUnexpectedSuccess</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">addUnexpectedSuccess</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">addUnexpectedSuccess</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"TestResult has no addUnexpectedSuccess method, reporting as failure"</span><span class="p">,</span>
|
|
<span class="ne">RuntimeWarning</span><span class="p">)</span>
|
|
<span class="c1"># We need to pass an actual exception and traceback to addFailure,</span>
|
|
<span class="c1"># otherwise the legacy result can choke.</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="n">_UnexpectedSuccess</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
|
|
<span class="k">except</span> <span class="n">_UnexpectedSuccess</span><span class="p">:</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">addFailure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">())</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">addUnexpectedSuccess</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_addDuration</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">,</span> <span class="n">elapsed</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">addDuration</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">addDuration</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">"TestResult has no addDuration method"</span><span class="p">,</span>
|
|
<span class="ne">RuntimeWarning</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">addDuration</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">elapsed</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_callSetUp</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">setUp</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_callTestMethod</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">method</span><span class="p">()</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="sa">f</span><span class="s1">'It is deprecated to return a value that is not None from a '</span>
|
|
<span class="sa">f</span><span class="s1">'test case (</span><span class="si">{</span><span class="n">method</span><span class="si">}</span><span class="s1">)'</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_callTearDown</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">tearDown</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_callCleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">function</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="n">function</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="kc">None</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">defaultTestResult</span><span class="p">()</span>
|
|
<span class="n">startTestRun</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">'startTestRun'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">stopTestRun</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="s1">'stopTestRun'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">startTestRun</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">startTestRun</span><span class="p">()</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">stopTestRun</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="n">result</span><span class="o">.</span><span class="n">startTest</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="n">testMethod</span> <span class="o">=</span> <span class="nb">getattr</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">_testMethodName</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="s2">"__unittest_skip__"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">or</span>
|
|
<span class="nb">getattr</span><span class="p">(</span><span class="n">testMethod</span><span class="p">,</span> <span class="s2">"__unittest_skip__"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)):</span>
|
|
<span class="c1"># If the class or method was skipped.</span>
|
|
<span class="n">skip_why</span> <span class="o">=</span> <span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="s1">'__unittest_skip_why__'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span>
|
|
<span class="ow">or</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">testMethod</span><span class="p">,</span> <span class="s1">'__unittest_skip_why__'</span><span class="p">,</span> <span class="s1">''</span><span class="p">))</span>
|
|
<span class="n">_addSkip</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">skip_why</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="n">expecting_failure</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"__unittest_expecting_failure__"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">or</span>
|
|
<span class="nb">getattr</span><span class="p">(</span><span class="n">testMethod</span><span class="p">,</span> <span class="s2">"__unittest_expecting_failure__"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="n">outcome</span> <span class="o">=</span> <span class="n">_Outcome</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
|
|
<span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">perf_counter</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">_outcome</span> <span class="o">=</span> <span class="n">outcome</span>
|
|
|
|
<span class="k">with</span> <span class="n">outcome</span><span class="o">.</span><span class="n">testPartExecutor</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">_callSetUp</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">outcome</span><span class="o">.</span><span class="n">success</span><span class="p">:</span>
|
|
<span class="n">outcome</span><span class="o">.</span><span class="n">expecting_failure</span> <span class="o">=</span> <span class="n">expecting_failure</span>
|
|
<span class="k">with</span> <span class="n">outcome</span><span class="o">.</span><span class="n">testPartExecutor</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">_callTestMethod</span><span class="p">(</span><span class="n">testMethod</span><span class="p">)</span>
|
|
<span class="n">outcome</span><span class="o">.</span><span class="n">expecting_failure</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">with</span> <span class="n">outcome</span><span class="o">.</span><span class="n">testPartExecutor</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">_callTearDown</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">doCleanups</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_addDuration</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">perf_counter</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">))</span>
|
|
|
|
<span class="k">if</span> <span class="n">outcome</span><span class="o">.</span><span class="n">success</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">expecting_failure</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">outcome</span><span class="o">.</span><span class="n">expectedFailure</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_addExpectedFailure</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">outcome</span><span class="o">.</span><span class="n">expectedFailure</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_addUnexpectedSuccess</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">addSuccess</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="c1"># explicitly break reference cycle:</span>
|
|
<span class="c1"># outcome.expectedFailure -> frame -> outcome -> outcome.expectedFailure</span>
|
|
<span class="n">outcome</span><span class="o">.</span><span class="n">expectedFailure</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">outcome</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># clear the outcome, no more needed</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_outcome</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">stopTest</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">stopTestRun</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">stopTestRun</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">doCleanups</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Execute all cleanup functions. Normally called for you after</span>
|
|
<span class="sd"> tearDown."""</span>
|
|
<span class="n">outcome</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_outcome</span> <span class="ow">or</span> <span class="n">_Outcome</span><span class="p">()</span>
|
|
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanups</span><span class="p">:</span>
|
|
<span class="n">function</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanups</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">with</span> <span class="n">outcome</span><span class="o">.</span><span class="n">testPartExecutor</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">_callCleanup</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="c1"># return this for backwards compatibility</span>
|
|
<span class="c1"># even though we no longer use it internally</span>
|
|
<span class="k">return</span> <span class="n">outcome</span><span class="o">.</span><span class="n">success</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">doClassCleanups</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Execute all class cleanup functions. Normally called for you after</span>
|
|
<span class="sd"> tearDownClass."""</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">tearDown_exceptions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">while</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_class_cleanups</span><span class="p">:</span>
|
|
<span class="n">function</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_class_cleanups</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">function</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">tearDown_exceptions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">())</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">debug</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Run the test without collecting errors in a TestResult"""</span>
|
|
<span class="n">testMethod</span> <span class="o">=</span> <span class="nb">getattr</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">_testMethodName</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="s2">"__unittest_skip__"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">or</span>
|
|
<span class="nb">getattr</span><span class="p">(</span><span class="n">testMethod</span><span class="p">,</span> <span class="s2">"__unittest_skip__"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)):</span>
|
|
<span class="c1"># If the class or method was skipped.</span>
|
|
<span class="n">skip_why</span> <span class="o">=</span> <span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">,</span> <span class="s1">'__unittest_skip_why__'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span>
|
|
<span class="ow">or</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">testMethod</span><span class="p">,</span> <span class="s1">'__unittest_skip_why__'</span><span class="p">,</span> <span class="s1">''</span><span class="p">))</span>
|
|
<span class="k">raise</span> <span class="n">SkipTest</span><span class="p">(</span><span class="n">skip_why</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_callSetUp</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_callTestMethod</span><span class="p">(</span><span class="n">testMethod</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_callTearDown</span><span class="p">()</span>
|
|
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanups</span><span class="p">:</span>
|
|
<span class="n">function</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanups</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_callCleanup</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">skipTest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Skip this test."""</span>
|
|
<span class="k">raise</span> <span class="n">SkipTest</span><span class="p">(</span><span class="n">reason</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">fail</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail immediately, with the given message."""</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertFalse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Check that the expression is false."""</span>
|
|
<span class="k">if</span> <span class="n">expr</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> is not false"</span> <span class="o">%</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertTrue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Check that the expression is true."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">expr</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> is not true"</span> <span class="o">%</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">expr</span><span class="p">))</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_formatMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Honour the longMessage attribute when generating failure messages.</span>
|
|
<span class="sd"> If longMessage is False this means:</span>
|
|
<span class="sd"> * Use only an explicit message if it is provided</span>
|
|
<span class="sd"> * Otherwise use the standard message for the assert</span>
|
|
|
|
<span class="sd"> If longMessage is True:</span>
|
|
<span class="sd"> * Use the standard message</span>
|
|
<span class="sd"> * If an explicit message is provided, plus ' : ' and the explicit message</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">longMessage</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">msg</span> <span class="ow">or</span> <span class="n">standardMsg</span>
|
|
<span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">standardMsg</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="c1"># don't switch to '{}' formatting in Python 2.X</span>
|
|
<span class="c1"># it changes the way unicode input is handled</span>
|
|
<span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> : </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">standardMsg</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">UnicodeDecodeError</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> : </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">standardMsg</span><span class="p">),</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertRaises</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_exception</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail unless an exception of class expected_exception is raised</span>
|
|
<span class="sd"> by the callable when invoked with specified positional and</span>
|
|
<span class="sd"> keyword arguments. If a different type of exception is</span>
|
|
<span class="sd"> raised, it will not be caught, and the test case will be</span>
|
|
<span class="sd"> deemed to have suffered an error, exactly as for an</span>
|
|
<span class="sd"> unexpected exception.</span>
|
|
|
|
<span class="sd"> If called with the callable and arguments omitted, will return a</span>
|
|
<span class="sd"> context object used like this::</span>
|
|
|
|
<span class="sd"> with self.assertRaises(SomeException):</span>
|
|
<span class="sd"> do_something()</span>
|
|
|
|
<span class="sd"> An optional keyword argument 'msg' can be provided when assertRaises</span>
|
|
<span class="sd"> is used as a context object.</span>
|
|
|
|
<span class="sd"> The context manager keeps a reference to the exception as</span>
|
|
<span class="sd"> the 'exception' attribute. This allows you to inspect the</span>
|
|
<span class="sd"> exception after the assertion::</span>
|
|
|
|
<span class="sd"> with self.assertRaises(SomeException) as cm:</span>
|
|
<span class="sd"> do_something()</span>
|
|
<span class="sd"> the_exception = cm.exception</span>
|
|
<span class="sd"> self.assertEqual(the_exception.error_code, 3)</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="n">_AssertRaisesContext</span><span class="p">(</span><span class="n">expected_exception</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="k">return</span> <span class="n">context</span><span class="o">.</span><span class="n">handle</span><span class="p">(</span><span class="s1">'assertRaises'</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">finally</span><span class="p">:</span>
|
|
<span class="c1"># bpo-23890: manually break a reference cycle</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertWarns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_warning</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail unless a warning of class warnClass is triggered</span>
|
|
<span class="sd"> by the callable when invoked with specified positional and</span>
|
|
<span class="sd"> keyword arguments. If a different type of warning is</span>
|
|
<span class="sd"> triggered, it will not be handled: depending on the other</span>
|
|
<span class="sd"> warning filtering rules in effect, it might be silenced, printed</span>
|
|
<span class="sd"> out, or raised as an exception.</span>
|
|
|
|
<span class="sd"> If called with the callable and arguments omitted, will return a</span>
|
|
<span class="sd"> context object used like this::</span>
|
|
|
|
<span class="sd"> with self.assertWarns(SomeWarning):</span>
|
|
<span class="sd"> do_something()</span>
|
|
|
|
<span class="sd"> An optional keyword argument 'msg' can be provided when assertWarns</span>
|
|
<span class="sd"> is used as a context object.</span>
|
|
|
|
<span class="sd"> The context manager keeps a reference to the first matching</span>
|
|
<span class="sd"> warning as the 'warning' attribute; similarly, the 'filename'</span>
|
|
<span class="sd"> and 'lineno' attributes give you information about the line</span>
|
|
<span class="sd"> of Python code from which the warning was triggered.</span>
|
|
<span class="sd"> This allows you to inspect the warning after the assertion::</span>
|
|
|
|
<span class="sd"> with self.assertWarns(SomeWarning) as cm:</span>
|
|
<span class="sd"> do_something()</span>
|
|
<span class="sd"> the_warning = cm.warning</span>
|
|
<span class="sd"> self.assertEqual(the_warning.some_attribute, 147)</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="n">_AssertWarnsContext</span><span class="p">(</span><span class="n">expected_warning</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">context</span><span class="o">.</span><span class="n">handle</span><span class="p">(</span><span class="s1">'assertWarns'</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_assertNotWarns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_warning</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The opposite of assertWarns. Private due to low demand."""</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="n">_AssertNotWarnsContext</span><span class="p">(</span><span class="n">expected_warning</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">context</span><span class="o">.</span><span class="n">handle</span><span class="p">(</span><span class="s1">'_assertNotWarns'</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertLogs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail unless a log message of level *level* or higher is emitted</span>
|
|
<span class="sd"> on *logger_name* or its children. If omitted, *level* defaults to</span>
|
|
<span class="sd"> INFO and *logger* defaults to the root logger.</span>
|
|
|
|
<span class="sd"> This method must be used as a context manager, and will yield</span>
|
|
<span class="sd"> a recording object with two attributes: `output` and `records`.</span>
|
|
<span class="sd"> At the end of the context manager, the `output` attribute will</span>
|
|
<span class="sd"> be a list of the matching formatted log messages and the</span>
|
|
<span class="sd"> `records` attribute will be a list of the corresponding LogRecord</span>
|
|
<span class="sd"> objects.</span>
|
|
|
|
<span class="sd"> Example::</span>
|
|
|
|
<span class="sd"> with self.assertLogs('foo', level='INFO') as cm:</span>
|
|
<span class="sd"> logging.getLogger('foo').info('first message')</span>
|
|
<span class="sd"> logging.getLogger('foo.bar').error('second message')</span>
|
|
<span class="sd"> self.assertEqual(cm.output, ['INFO:foo:first message',</span>
|
|
<span class="sd"> 'ERROR:foo.bar:second message'])</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># Lazy import to avoid importing logging if it is not needed.</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">._log</span><span class="w"> </span><span class="kn">import</span> <span class="n">_AssertLogsContext</span>
|
|
<span class="k">return</span> <span class="n">_AssertLogsContext</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">no_logs</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertNoLogs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">""" Fail unless no log messages of level *level* or higher are emitted</span>
|
|
<span class="sd"> on *logger_name* or its children.</span>
|
|
|
|
<span class="sd"> This method must be used as a context manager.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">._log</span><span class="w"> </span><span class="kn">import</span> <span class="n">_AssertLogsContext</span>
|
|
<span class="k">return</span> <span class="n">_AssertLogsContext</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">no_logs</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_getAssertEqualityFunc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Get a detailed comparison function for the types of the two args.</span>
|
|
|
|
<span class="sd"> Returns: A callable accepting (first, second, msg=None) that will</span>
|
|
<span class="sd"> raise a failure exception if first != second with a useful human</span>
|
|
<span class="sd"> readable error message for those types.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1">#</span>
|
|
<span class="c1"># NOTE(gregory.p.smith): I considered isinstance(first, type(second))</span>
|
|
<span class="c1"># and vice versa. I opted for the conservative approach in case</span>
|
|
<span class="c1"># subclasses are not intended to be compared in detail to their super</span>
|
|
<span class="c1"># class instances using a type equality func. This means testing</span>
|
|
<span class="c1"># subtypes won't automagically use the detailed comparison. Callers</span>
|
|
<span class="c1"># should use their type specific assertSpamEqual method to compare</span>
|
|
<span class="c1"># subclasses if the detailed comparison is desired and appropriate.</span>
|
|
<span class="c1"># See the discussion in http://bugs.python.org/issue2578.</span>
|
|
<span class="c1">#</span>
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">first</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">type</span><span class="p">(</span><span class="n">second</span><span class="p">):</span>
|
|
<span class="n">asserter</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_type_equality_funcs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">first</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">asserter</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">asserter</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">asserter</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asserter</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">asserter</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_baseAssertEqual</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_baseAssertEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""The default assertEqual implementation, not type specific."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">first</span> <span class="o">==</span> <span class="n">second</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> != </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">_common_shorten_repr</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">)</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail if the two objects are unequal as determined by the '=='</span>
|
|
<span class="sd"> operator.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">assertion_func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getAssertEqualityFunc</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">)</span>
|
|
<span class="n">assertion_func</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertNotEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail if the two objects are equal as determined by the '!='</span>
|
|
<span class="sd"> operator.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">first</span> <span class="o">!=</span> <span class="n">second</span><span class="p">:</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> == </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">first</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">second</span><span class="p">)))</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertAlmostEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">places</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">delta</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail if the two objects are unequal as determined by their</span>
|
|
<span class="sd"> difference rounded to the given number of decimal places</span>
|
|
<span class="sd"> (default 7) and comparing to zero, or by comparing that the</span>
|
|
<span class="sd"> difference between the two objects is more than the given</span>
|
|
<span class="sd"> delta.</span>
|
|
|
|
<span class="sd"> Note that decimal places (from zero) are usually not the same</span>
|
|
<span class="sd"> as significant digits (measured from the most significant digit).</span>
|
|
|
|
<span class="sd"> If the two objects compare equal then they will automatically</span>
|
|
<span class="sd"> compare almost equal.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">first</span> <span class="o">==</span> <span class="n">second</span><span class="p">:</span>
|
|
<span class="c1"># shortcut</span>
|
|
<span class="k">return</span>
|
|
<span class="k">if</span> <span class="n">delta</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">places</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"specify delta or places not both"</span><span class="p">)</span>
|
|
|
|
<span class="n">diff</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">first</span> <span class="o">-</span> <span class="n">second</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">delta</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">diff</span> <span class="o"><=</span> <span class="n">delta</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> != </span><span class="si">%s</span><span class="s1"> within </span><span class="si">%s</span><span class="s1"> delta (</span><span class="si">%s</span><span class="s1"> difference)'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">first</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">second</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">delta</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">diff</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">places</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">places</span> <span class="o">=</span> <span class="mi">7</span>
|
|
|
|
<span class="k">if</span> <span class="nb">round</span><span class="p">(</span><span class="n">diff</span><span class="p">,</span> <span class="n">places</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> != </span><span class="si">%s</span><span class="s1"> within </span><span class="si">%r</span><span class="s1"> places (</span><span class="si">%s</span><span class="s1"> difference)'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">first</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">second</span><span class="p">),</span>
|
|
<span class="n">places</span><span class="p">,</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">diff</span><span class="p">))</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertNotAlmostEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">places</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">delta</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail if the two objects are equal as determined by their</span>
|
|
<span class="sd"> difference rounded to the given number of decimal places</span>
|
|
<span class="sd"> (default 7) and comparing to zero, or by comparing that the</span>
|
|
<span class="sd"> difference between the two objects is less than the given delta.</span>
|
|
|
|
<span class="sd"> Note that decimal places (from zero) are usually not the same</span>
|
|
<span class="sd"> as significant digits (measured from the most significant digit).</span>
|
|
|
|
<span class="sd"> Objects that are equal automatically fail.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">delta</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">places</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"specify delta or places not both"</span><span class="p">)</span>
|
|
<span class="n">diff</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">first</span> <span class="o">-</span> <span class="n">second</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">delta</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">first</span> <span class="o">==</span> <span class="n">second</span><span class="p">)</span> <span class="ow">and</span> <span class="n">diff</span> <span class="o">></span> <span class="n">delta</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> == </span><span class="si">%s</span><span class="s1"> within </span><span class="si">%s</span><span class="s1"> delta (</span><span class="si">%s</span><span class="s1"> difference)'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">first</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">second</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">delta</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">diff</span><span class="p">))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">places</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">places</span> <span class="o">=</span> <span class="mi">7</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">first</span> <span class="o">==</span> <span class="n">second</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">round</span><span class="p">(</span><span class="n">diff</span><span class="p">,</span> <span class="n">places</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> == </span><span class="si">%s</span><span class="s1"> within </span><span class="si">%r</span><span class="s1"> places'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">first</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">second</span><span class="p">),</span>
|
|
<span class="n">places</span><span class="p">)</span>
|
|
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertSequenceEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">seq1</span><span class="p">,</span> <span class="n">seq2</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">seq_type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""An equality assertion for ordered sequences (like lists and tuples).</span>
|
|
|
|
<span class="sd"> For the purposes of this function, a valid ordered sequence type is one</span>
|
|
<span class="sd"> which can be indexed, has a length, and has an equality operator.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> seq1: The first sequence to compare.</span>
|
|
<span class="sd"> seq2: The second sequence to compare.</span>
|
|
<span class="sd"> seq_type: The expected datatype of the sequences, or None if no</span>
|
|
<span class="sd"> datatype should be enforced.</span>
|
|
<span class="sd"> msg: Optional message to use on failure instead of a list of</span>
|
|
<span class="sd"> differences.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">seq_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">seq_type_name</span> <span class="o">=</span> <span class="n">seq_type</span><span class="o">.</span><span class="vm">__name__</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">seq1</span><span class="p">,</span> <span class="n">seq_type</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="s1">'First sequence is not a </span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">seq_type_name</span><span class="p">,</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">seq1</span><span class="p">)))</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">seq2</span><span class="p">,</span> <span class="n">seq_type</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="s1">'Second sequence is not a </span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span>
|
|
<span class="o">%</span> <span class="p">(</span><span class="n">seq_type_name</span><span class="p">,</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">seq2</span><span class="p">)))</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">seq_type_name</span> <span class="o">=</span> <span class="s2">"sequence"</span>
|
|
|
|
<span class="n">differing</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">len1</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">seq1</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">NotImplementedError</span><span class="p">):</span>
|
|
<span class="n">differing</span> <span class="o">=</span> <span class="s1">'First </span><span class="si">%s</span><span class="s1"> has no length. Non-sequence?'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="n">seq_type_name</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">differing</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">len2</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">seq2</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">NotImplementedError</span><span class="p">):</span>
|
|
<span class="n">differing</span> <span class="o">=</span> <span class="s1">'Second </span><span class="si">%s</span><span class="s1"> has no length. Non-sequence?'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="n">seq_type_name</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">differing</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">seq1</span> <span class="o">==</span> <span class="n">seq2</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">differing</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">s differ: </span><span class="si">%s</span><span class="s1"> != </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="p">(</span><span class="n">seq_type_name</span><span class="o">.</span><span class="n">capitalize</span><span class="p">(),)</span> <span class="o">+</span>
|
|
<span class="n">_common_shorten_repr</span><span class="p">(</span><span class="n">seq1</span><span class="p">,</span> <span class="n">seq2</span><span class="p">))</span>
|
|
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">len1</span><span class="p">,</span> <span class="n">len2</span><span class="p">)):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">item1</span> <span class="o">=</span> <span class="n">seq1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">,</span> <span class="ne">NotImplementedError</span><span class="p">):</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">Unable to index element </span><span class="si">%d</span><span class="s1"> of first </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">seq_type_name</span><span class="p">))</span>
|
|
<span class="k">break</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">item2</span> <span class="o">=</span> <span class="n">seq2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">,</span> <span class="ne">NotImplementedError</span><span class="p">):</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">Unable to index element </span><span class="si">%d</span><span class="s1"> of second </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">seq_type_name</span><span class="p">))</span>
|
|
<span class="k">break</span>
|
|
|
|
<span class="k">if</span> <span class="n">item1</span> <span class="o">!=</span> <span class="n">item2</span><span class="p">:</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">First differing element </span><span class="si">%d</span><span class="s1">:</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">((</span><span class="n">i</span><span class="p">,)</span> <span class="o">+</span> <span class="n">_common_shorten_repr</span><span class="p">(</span><span class="n">item1</span><span class="p">,</span> <span class="n">item2</span><span class="p">)))</span>
|
|
<span class="k">break</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">len1</span> <span class="o">==</span> <span class="n">len2</span> <span class="ow">and</span> <span class="n">seq_type</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="n">seq1</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">type</span><span class="p">(</span><span class="n">seq2</span><span class="p">)):</span>
|
|
<span class="c1"># The sequences are the same, but have differing types.</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">if</span> <span class="n">len1</span> <span class="o">></span> <span class="n">len2</span><span class="p">:</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">First </span><span class="si">%s</span><span class="s1"> contains </span><span class="si">%d</span><span class="s1"> additional '</span>
|
|
<span class="s1">'elements.</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">seq_type_name</span><span class="p">,</span> <span class="n">len1</span> <span class="o">-</span> <span class="n">len2</span><span class="p">))</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'First extra element </span><span class="si">%d</span><span class="s1">:</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="n">len2</span><span class="p">,</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">seq1</span><span class="p">[</span><span class="n">len2</span><span class="p">])))</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">,</span> <span class="ne">NotImplementedError</span><span class="p">):</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'Unable to index element </span><span class="si">%d</span><span class="s1"> '</span>
|
|
<span class="s1">'of first </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">len2</span><span class="p">,</span> <span class="n">seq_type_name</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="n">len1</span> <span class="o"><</span> <span class="n">len2</span><span class="p">:</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">Second </span><span class="si">%s</span><span class="s1"> contains </span><span class="si">%d</span><span class="s1"> additional '</span>
|
|
<span class="s1">'elements.</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">seq_type_name</span><span class="p">,</span> <span class="n">len2</span> <span class="o">-</span> <span class="n">len1</span><span class="p">))</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'First extra element </span><span class="si">%d</span><span class="s1">:</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span>
|
|
<span class="p">(</span><span class="n">len1</span><span class="p">,</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">seq2</span><span class="p">[</span><span class="n">len1</span><span class="p">])))</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">,</span> <span class="ne">NotImplementedError</span><span class="p">):</span>
|
|
<span class="n">differing</span> <span class="o">+=</span> <span class="p">(</span><span class="s1">'Unable to index element </span><span class="si">%d</span><span class="s1"> '</span>
|
|
<span class="s1">'of second </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">len1</span><span class="p">,</span> <span class="n">seq_type_name</span><span class="p">))</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="n">differing</span>
|
|
<span class="n">diffMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
|
<span class="n">difflib</span><span class="o">.</span><span class="n">ndiff</span><span class="p">(</span><span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">seq1</span><span class="p">)</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(),</span>
|
|
<span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">seq2</span><span class="p">)</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()))</span>
|
|
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_truncateMessage</span><span class="p">(</span><span class="n">standardMsg</span><span class="p">,</span> <span class="n">diffMsg</span><span class="p">)</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_truncateMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">diff</span><span class="p">):</span>
|
|
<span class="n">max_diff</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxDiff</span>
|
|
<span class="k">if</span> <span class="n">max_diff</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span> <span class="o"><=</span> <span class="n">max_diff</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">message</span> <span class="o">+</span> <span class="n">diff</span>
|
|
<span class="k">return</span> <span class="n">message</span> <span class="o">+</span> <span class="p">(</span><span class="n">DIFF_OMITTED</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">diff</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertListEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">list1</span><span class="p">,</span> <span class="n">list2</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A list-specific equality assertion.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> list1: The first list to compare.</span>
|
|
<span class="sd"> list2: The second list to compare.</span>
|
|
<span class="sd"> msg: Optional message to use on failure instead of a list of</span>
|
|
<span class="sd"> differences.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">assertSequenceEqual</span><span class="p">(</span><span class="n">list1</span><span class="p">,</span> <span class="n">list2</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">seq_type</span><span class="o">=</span><span class="nb">list</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertTupleEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tuple1</span><span class="p">,</span> <span class="n">tuple2</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A tuple-specific equality assertion.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> tuple1: The first tuple to compare.</span>
|
|
<span class="sd"> tuple2: The second tuple to compare.</span>
|
|
<span class="sd"> msg: Optional message to use on failure instead of a list of</span>
|
|
<span class="sd"> differences.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">assertSequenceEqual</span><span class="p">(</span><span class="n">tuple1</span><span class="p">,</span> <span class="n">tuple2</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">seq_type</span><span class="o">=</span><span class="nb">tuple</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertSetEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">set1</span><span class="p">,</span> <span class="n">set2</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A set-specific equality assertion.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> set1: The first set to compare.</span>
|
|
<span class="sd"> set2: The second set to compare.</span>
|
|
<span class="sd"> msg: Optional message to use on failure instead of a list of</span>
|
|
<span class="sd"> differences.</span>
|
|
|
|
<span class="sd"> assertSetEqual uses ducktyping to support different types of sets, and</span>
|
|
<span class="sd"> is optimized for sets specifically (parameters must support a</span>
|
|
<span class="sd"> difference method).</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">difference1</span> <span class="o">=</span> <span class="n">set1</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">set2</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="s1">'invalid type when attempting set difference: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="s1">'first argument does not support set difference: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">difference2</span> <span class="o">=</span> <span class="n">set2</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">set1</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="s1">'invalid type when attempting set difference: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">AttributeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="s1">'second argument does not support set difference: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">difference1</span> <span class="ow">or</span> <span class="n">difference2</span><span class="p">):</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="n">difference1</span><span class="p">:</span>
|
|
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'Items in the first set but not the second:'</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">difference1</span><span class="p">:</span>
|
|
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">difference2</span><span class="p">:</span>
|
|
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'Items in the second set but not the first:'</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">difference2</span><span class="p">:</span>
|
|
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
|
|
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertIn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">member</span><span class="p">,</span> <span class="n">container</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Just like self.assertTrue(a in b), but with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="n">member</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">container</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> not found in </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">member</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">container</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertNotIn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">member</span><span class="p">,</span> <span class="n">container</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Just like self.assertTrue(a not in b), but with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="n">member</span> <span class="ow">in</span> <span class="n">container</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> unexpectedly found in </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">member</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">container</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertIs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr1</span><span class="p">,</span> <span class="n">expr2</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Just like self.assertTrue(a is b), but with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="n">expr1</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">expr2</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> is not </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">expr1</span><span class="p">),</span>
|
|
<span class="n">safe_repr</span><span class="p">(</span><span class="n">expr2</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertIsNot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expr1</span><span class="p">,</span> <span class="n">expr2</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Just like self.assertTrue(a is not b), but with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="n">expr1</span> <span class="ow">is</span> <span class="n">expr2</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'unexpectedly identical: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">expr1</span><span class="p">),)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertDictEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">d1</span><span class="p">,</span> <span class="n">d2</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsInstance</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="nb">dict</span><span class="p">,</span> <span class="s1">'First argument is not a dictionary'</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsInstance</span><span class="p">(</span><span class="n">d2</span><span class="p">,</span> <span class="nb">dict</span><span class="p">,</span> <span class="s1">'Second argument is not a dictionary'</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">d1</span> <span class="o">!=</span> <span class="n">d2</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> != </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">_common_shorten_repr</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span> <span class="n">d2</span><span class="p">)</span>
|
|
<span class="n">diff</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">difflib</span><span class="o">.</span><span class="n">ndiff</span><span class="p">(</span>
|
|
<span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">d1</span><span class="p">)</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(),</span>
|
|
<span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">d2</span><span class="p">)</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())))</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_truncateMessage</span><span class="p">(</span><span class="n">standardMsg</span><span class="p">,</span> <span class="n">diff</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertCountEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Asserts that two iterables have the same elements, the same number of</span>
|
|
<span class="sd"> times, without regard to order.</span>
|
|
|
|
<span class="sd"> self.assertEqual(Counter(list(first)),</span>
|
|
<span class="sd"> Counter(list(second)))</span>
|
|
|
|
<span class="sd"> Example:</span>
|
|
<span class="sd"> - [0, 1, 1] and [1, 0, 1] compare equal.</span>
|
|
<span class="sd"> - [0, 0, 1] and [0, 1] compare unequal.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="n">first_seq</span><span class="p">,</span> <span class="n">second_seq</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">first</span><span class="p">),</span> <span class="nb">list</span><span class="p">(</span><span class="n">second</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">first</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">Counter</span><span class="p">(</span><span class="n">first_seq</span><span class="p">)</span>
|
|
<span class="n">second</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">Counter</span><span class="p">(</span><span class="n">second_seq</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
|
|
<span class="c1"># Handle case with unhashable elements</span>
|
|
<span class="n">differences</span> <span class="o">=</span> <span class="n">_count_diff_all_purpose</span><span class="p">(</span><span class="n">first_seq</span><span class="p">,</span> <span class="n">second_seq</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">first</span> <span class="o">==</span> <span class="n">second</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="n">differences</span> <span class="o">=</span> <span class="n">_count_diff_hashable</span><span class="p">(</span><span class="n">first_seq</span><span class="p">,</span> <span class="n">second_seq</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">differences</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'Element counts were not equal:</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'First has </span><span class="si">%d</span><span class="s1">, Second has </span><span class="si">%d</span><span class="s1">: </span><span class="si">%r</span><span class="s1">'</span> <span class="o">%</span> <span class="n">diff</span> <span class="k">for</span> <span class="n">diff</span> <span class="ow">in</span> <span class="n">differences</span><span class="p">]</span>
|
|
<span class="n">diffMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_truncateMessage</span><span class="p">(</span><span class="n">standardMsg</span><span class="p">,</span> <span class="n">diffMsg</span><span class="p">)</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertMultiLineEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Assert that two multi-line strings are equal."""</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsInstance</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="s2">"First argument is not a string"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">assertIsInstance</span><span class="p">(</span><span class="n">second</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="s2">"Second argument is not a string"</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">first</span> <span class="o">!=</span> <span class="n">second</span><span class="p">:</span>
|
|
<span class="c1"># Don't use difflib if the strings are too long</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">first</span><span class="p">)</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">_diffThreshold</span> <span class="ow">or</span>
|
|
<span class="nb">len</span><span class="p">(</span><span class="n">second</span><span class="p">)</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">_diffThreshold</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_baseAssertEqual</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Append \n to both strings if either is missing the \n.</span>
|
|
<span class="c1"># This allows the final ndiff to show the \n difference. The</span>
|
|
<span class="c1"># exception here is if the string is empty, in which case no</span>
|
|
<span class="c1"># \n should be added</span>
|
|
<span class="n">first_presplit</span> <span class="o">=</span> <span class="n">first</span>
|
|
<span class="n">second_presplit</span> <span class="o">=</span> <span class="n">second</span>
|
|
<span class="k">if</span> <span class="n">first</span> <span class="ow">and</span> <span class="n">second</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">first</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span> <span class="ow">or</span> <span class="n">second</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">:</span>
|
|
<span class="n">first_presplit</span> <span class="o">+=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="n">second_presplit</span> <span class="o">+=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="k">elif</span> <span class="n">second</span> <span class="ow">and</span> <span class="n">second</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">:</span>
|
|
<span class="n">second_presplit</span> <span class="o">+=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="k">elif</span> <span class="n">first</span> <span class="ow">and</span> <span class="n">first</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">:</span>
|
|
<span class="n">first_presplit</span> <span class="o">+=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
|
|
|
|
<span class="n">firstlines</span> <span class="o">=</span> <span class="n">first_presplit</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="n">keepends</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="n">secondlines</span> <span class="o">=</span> <span class="n">second_presplit</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="n">keepends</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Generate the message and diff, then raise the exception</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> != </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">_common_shorten_repr</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">second</span><span class="p">)</span>
|
|
<span class="n">diff</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span> <span class="o">+</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">difflib</span><span class="o">.</span><span class="n">ndiff</span><span class="p">(</span><span class="n">firstlines</span><span class="p">,</span> <span class="n">secondlines</span><span class="p">))</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_truncateMessage</span><span class="p">(</span><span class="n">standardMsg</span><span class="p">,</span> <span class="n">diff</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertLess</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Just like self.assertTrue(a < b), but with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">a</span> <span class="o"><</span> <span class="n">b</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> not less than </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertLessEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Just like self.assertTrue(a <= b), but with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">a</span> <span class="o"><=</span> <span class="n">b</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> not less than or equal to </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertGreater</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Just like self.assertTrue(a > b), but with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">a</span> <span class="o">></span> <span class="n">b</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> not greater than </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertGreaterEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Just like self.assertTrue(a >= b), but with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">a</span> <span class="o">>=</span> <span class="n">b</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> not greater than or equal to </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">safe_repr</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertIsNone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Same as self.assertTrue(obj is None), with a nicer default message."""</span>
|
|
<span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> is not None'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">obj</span><span class="p">),)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertIsNotNone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Included for symmetry with assertIsNone."""</span>
|
|
<span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'unexpectedly None'</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertIsInstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Same as self.assertTrue(isinstance(obj, cls)), with a nicer</span>
|
|
<span class="sd"> default message."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">):</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> is not an instance of </span><span class="si">%r</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span> <span class="bp">cls</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertNotIsInstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Included for symmetry with assertIsInstance."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">cls</span><span class="p">):</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1"> is an instance of </span><span class="si">%r</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">safe_repr</span><span class="p">(</span><span class="n">obj</span><span class="p">),</span> <span class="bp">cls</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">fail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertRaisesRegex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_exception</span><span class="p">,</span> <span class="n">expected_regex</span><span class="p">,</span>
|
|
<span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Asserts that the message in a raised exception matches a regex.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> expected_exception: Exception class expected to be raised.</span>
|
|
<span class="sd"> expected_regex: Regex (re.Pattern object or string) expected</span>
|
|
<span class="sd"> to be found in error message.</span>
|
|
<span class="sd"> args: Function to be called and extra positional args.</span>
|
|
<span class="sd"> kwargs: Extra kwargs.</span>
|
|
<span class="sd"> msg: Optional message used in case of failure. Can only be used</span>
|
|
<span class="sd"> when assertRaisesRegex is used as a context manager.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="n">_AssertRaisesContext</span><span class="p">(</span><span class="n">expected_exception</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">expected_regex</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">context</span><span class="o">.</span><span class="n">handle</span><span class="p">(</span><span class="s1">'assertRaisesRegex'</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertWarnsRegex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expected_warning</span><span class="p">,</span> <span class="n">expected_regex</span><span class="p">,</span>
|
|
<span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Asserts that the message in a triggered warning matches a regexp.</span>
|
|
<span class="sd"> Basic functioning is similar to assertWarns() with the addition</span>
|
|
<span class="sd"> that only warnings whose messages also match the regular expression</span>
|
|
<span class="sd"> are considered successful matches.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> expected_warning: Warning class expected to be triggered.</span>
|
|
<span class="sd"> expected_regex: Regex (re.Pattern object or string) expected</span>
|
|
<span class="sd"> to be found in error message.</span>
|
|
<span class="sd"> args: Function to be called and extra positional args.</span>
|
|
<span class="sd"> kwargs: Extra kwargs.</span>
|
|
<span class="sd"> msg: Optional message used in case of failure. Can only be used</span>
|
|
<span class="sd"> when assertWarnsRegex is used as a context manager.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="n">_AssertWarnsContext</span><span class="p">(</span><span class="n">expected_warning</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">expected_regex</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">context</span><span class="o">.</span><span class="n">handle</span><span class="p">(</span><span class="s1">'assertWarnsRegex'</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertRegex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">expected_regex</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail the test unless the text matches the regular expression."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected_regex</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">)):</span>
|
|
<span class="k">assert</span> <span class="n">expected_regex</span><span class="p">,</span> <span class="s2">"expected_regex must not be empty."</span>
|
|
<span class="n">expected_regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">expected_regex</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">expected_regex</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s2">"Regex didn't match: </span><span class="si">%r</span><span class="s2"> not found in </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="n">expected_regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
|
|
<span class="c1"># _formatMessage ensures the longMessage option is respected</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">assertNotRegex</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">unexpected_regex</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Fail the test if the text matches the regular expression."""</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">unexpected_regex</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">)):</span>
|
|
<span class="n">unexpected_regex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">unexpected_regex</span><span class="p">)</span>
|
|
<span class="n">match</span> <span class="o">=</span> <span class="n">unexpected_regex</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">match</span><span class="p">:</span>
|
|
<span class="n">standardMsg</span> <span class="o">=</span> <span class="s1">'Regex matched: </span><span class="si">%r</span><span class="s1"> matches </span><span class="si">%r</span><span class="s1"> in </span><span class="si">%r</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span>
|
|
<span class="n">text</span><span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">start</span><span class="p">()</span> <span class="p">:</span> <span class="n">match</span><span class="o">.</span><span class="n">end</span><span class="p">()],</span>
|
|
<span class="n">unexpected_regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span>
|
|
<span class="n">text</span><span class="p">)</span>
|
|
<span class="c1"># _formatMessage ensures the longMessage option is respected</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_formatMessage</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">standardMsg</span><span class="p">)</span>
|
|
<span class="k">raise</span> <span class="bp">self</span><span class="o">.</span><span class="n">failureException</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">FunctionTestCase</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A test case that wraps a test function.</span>
|
|
|
|
<span class="sd"> This is useful for slipping pre-existing test functions into the</span>
|
|
<span class="sd"> unittest framework. Optionally, set-up and tidy-up functions can be</span>
|
|
<span class="sd"> supplied. As with TestCase, the tidy-up ('tearDown') function will</span>
|
|
<span class="sd"> always be called if the set-up ('setUp') function ran successfully.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">testFunc</span><span class="p">,</span> <span class="n">setUp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tearDown</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="nb">super</span><span class="p">(</span><span class="n">FunctionTestCase</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_setUpFunc</span> <span class="o">=</span> <span class="n">setUp</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_tearDownFunc</span> <span class="o">=</span> <span class="n">tearDown</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_testFunc</span> <span class="o">=</span> <span class="n">testFunc</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_description</span> <span class="o">=</span> <span class="n">description</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setUpFunc</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_setUpFunc</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tearDownFunc</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_tearDownFunc</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">runTest</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">_testFunc</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">id</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">_testFunc</span><span class="o">.</span><span class="vm">__name__</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">NotImplemented</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_setUpFunc</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">_setUpFunc</span> <span class="ow">and</span> \
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_tearDownFunc</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">_tearDownFunc</span> <span class="ow">and</span> \
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_testFunc</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">_testFunc</span> <span class="ow">and</span> \
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_description</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">_description</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">hash</span><span class="p">((</span><span class="nb">type</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">_setUpFunc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tearDownFunc</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_testFunc</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_description</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">)"</span> <span class="o">%</span> <span class="p">(</span><span class="n">strclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_testFunc</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </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="s2">"<</span><span class="si">%s</span><span class="s2"> tec=</span><span class="si">%s</span><span class="s2">>"</span> <span class="o">%</span> <span class="p">(</span><span class="n">strclass</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="p">),</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_testFunc</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">shortDescription</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_description</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_description</span>
|
|
<span class="n">doc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_testFunc</span><span class="o">.</span><span class="vm">__doc__</span>
|
|
<span class="k">return</span> <span class="n">doc</span> <span class="ow">and</span> <span class="n">doc</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="ow">or</span> <span class="kc">None</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_SubTest</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">test_case</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">params</span><span class="p">):</span>
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">message</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">test_case</span> <span class="o">=</span> <span class="n">test_case</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">params</span> <span class="o">=</span> <span class="n">params</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">failureException</span> <span class="o">=</span> <span class="n">test_case</span><span class="o">.</span><span class="n">failureException</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">runTest</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">"subtests cannot be run directly"</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_subDescription</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">parts</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_subtest_msg_sentinel</span><span class="p">:</span>
|
|
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"[</span><span class="si">{}</span><span class="s2">]"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="p">:</span>
|
|
<span class="n">params_desc</span> <span class="o">=</span> <span class="s1">', '</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
|
|
<span class="s2">"</span><span class="si">{}</span><span class="s2">=</span><span class="si">{!r}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
|
|
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"(</span><span class="si">{}</span><span class="s2">)"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">params_desc</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">'(<subtest>)'</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">test_case</span><span class="o">.</span><span class="n">id</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subDescription</span><span class="p">())</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">shortDescription</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Returns a one-line description of the subtest, or None if no</span>
|
|
<span class="sd"> description has been provided.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">test_case</span><span class="o">.</span><span class="n">shortDescription</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"</span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">test_case</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subDescription</span><span class="p">())</span>
|
|
</pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
</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 latest</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">unittest.case</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2024, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
|
|
</div>
|
|
</body>
|
|
</html> |