1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/core-module/26-ts.html
2019-09-01 11:50:12 +01:00

842 lines
110 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>26/pc</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '26/ts' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#26">Chapter 26: Compilation Utilities</a></li><li><b>Test Scripts</b></li></ul><p class="purpose">A rudimentary but useful testing system built in to IF produced by Inform, allowing short sequences of commands to be concisely noted in the source text and tried out in the Inform application using the TEST command.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Test scenarios are used for the "TEST" command: they consist of a string of
commands in text format, with a few stipulations on place and possessions
attached.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_LENGTH_OF_SCRIPT</span><span class="plain"> 10000 </span> <span class="comment">including length byte, so the max no of chars is one less</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_LENGTH_OF_COMMAND</span><span class="plain"> 100 </span> <span class="comment">any single command must be this long or shorter</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_POSSESSIONS_PER_SCENARIO</span><span class="plain"> 16</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">test_scenario</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">name</span><span class="plain">; </span> <span class="comment">in fact a single word identifying the test</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">text_of_script</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">place</span><span class="plain">; </span> <span class="comment">room we need to be in to perform test</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_possessions</span><span class="plain">; </span> <span class="comment">number of required possessions of player</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">possessions</span><span class="plain">[</span><span class="constant">MAX_POSSESSIONS_PER_SCENARIO</span><span class="plain">]; </span> <span class="comment">what they are</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">sentence_test_declared_at</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">text_iname</span><span class="plain">; </span> <span class="comment">name at runtime for the text of the commands</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">req_iname</span><span class="plain">; </span> <span class="comment">ditto for the array of requirements</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">test_scenario</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure test_scenario is accessed in 2/sq, 2/si, 5/ins, 5/nv, 8/ed2, 9/ma, 9/pk, 11/sm, 14/lv, 14/ds2, 15/pr, 15/ep, 15/vp, 15/spr, 16/in, 16/cmw, 17/rs, 19/tc, 19/tb, 19/tod, 20/eq, 21/rl, 21/rl2, 21/fao, 21/rps, 21/sv, 21/ac, 22/pu, 22/dptd, 22/po, 22/pav, 22/tp, 25/cii, 25/cp, 26/uo and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">internal_test_case</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">itc_code</span><span class="plain">; </span> <span class="comment">one of the above <code class="display"><span class="extract">*_INTT</span></code> values</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">text_supplying_the_case</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">itc_defined_at</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">internal_test_case</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure internal_test_case is private to this section.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Internal test cases are numbered thus:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">NO_INTT</span><span class="plain"> -2</span>
<span class="definitionkeyword">define</span> <span class="constant">EXTERNAL_INTT</span><span class="plain"> -1</span>
<span class="definitionkeyword">define</span> <span class="constant">HEADLINE_INTT</span><span class="plain"> 0</span>
<span class="definitionkeyword">define</span> <span class="constant">SENTENCE_INTT</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">DESCRIPTION_INTT</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">DIMENSIONS_INTT</span><span class="plain"> 3</span>
<span class="definitionkeyword">define</span> <span class="constant">EVALUATION_INTT</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">EQUATION_INTT</span><span class="plain"> 5</span>
<span class="definitionkeyword">define</span> <span class="constant">VERB_INTT</span><span class="plain"> 6</span>
<span class="definitionkeyword">define</span> <span class="constant">ADJECTIVE_INTT</span><span class="plain"> 7</span>
<span class="definitionkeyword">define</span> <span class="constant">ING_INTT</span><span class="plain"> 8</span>
<span class="definitionkeyword">define</span> <span class="constant">KIND_INTT</span><span class="plain"> 9</span>
<span class="definitionkeyword">define</span> <span class="constant">MAP_INTT</span><span class="plain"> 10</span>
<span class="definitionkeyword">define</span> <span class="constant">DASH_INTT</span><span class="plain"> 11</span>
<span class="definitionkeyword">define</span> <span class="constant">DASHLOG_INTT</span><span class="plain"> 12</span>
</pre>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The following grammar handles Test sentences such as:
</p>
<blockquote>
<p>Test me with "open box/get ball".</p>
</blockquote>
<p class="inwebparagraph">Though it isn't openly documented, Inform also supports internal test cases,
whose names are suffixed by "(internal)". These exist because the test
suite for Inform is made up of end-to-end tests, and sometimes these make
it hard to see what any given component has done.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">internal</span><span class="plain">-</span><span class="identifier">test</span><span class="plain">-</span><span class="reserved">case</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ( </span><span class="identifier">internal</span><span class="plain"> ) | ==&gt; </span><span class="identifier">R</span><span class="plain">[1]</span>
<span class="plain">### ( </span><span class="identifier">internal</span><span class="plain"> ) | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_UnknownInternalTest problem</span> <span class="cwebmacronumber">5.3</span>&gt;
<span class="plain">&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_TestQuoted problem</span> <span class="cwebmacronumber">5.1</span>&gt;
<span class="plain">### | ==&gt; </span><span class="constant">EXTERNAL_INTT</span>
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_TestMultiWord problem</span> <span class="cwebmacronumber">5.2</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>These test case names are in English only and may change at any time
without notice.
</p>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">internal</span><span class="plain">-</span><span class="identifier">test</span><span class="plain">-</span><span class="reserved">case</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt; ::=</span>
<span class="identifier">headline</span><span class="plain"> |</span>
<span class="identifier">sentence</span><span class="plain"> |</span>
<span class="identifier">description</span><span class="plain"> |</span>
<span class="identifier">dimensions</span><span class="plain"> |</span>
<span class="identifier">evaluation</span><span class="plain"> |</span>
<span class="reserved">equation</span><span class="plain"> |</span>
<span class="identifier">verb</span><span class="plain"> |</span>
<span class="identifier">adjective</span><span class="plain"> |</span>
<span class="identifier">participle</span><span class="plain"> |</span>
<span class="identifier">kind</span><span class="plain"> |</span>
<span class="identifier">map</span><span class="plain"> |</span>
<span class="identifier">dash</span><span class="plain"> |</span>
<span class="identifier">dashlog</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">test_scenario</span><span class="plain"> *</span><span class="identifier">ts_being_parsed</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>The object NP is usually just a quoted script, but it can be more elaborate:
</p>
<blockquote>
<p>Test me with "x egg" in Timbuktu holding the egg.</p>
</blockquote>
<pre class="display">
<span class="plain">&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; ::=</span>
<span class="plain">&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; </span>&lt;<span class="cwebmacro">Process the quoted test script</span> <span class="cwebmacronumber">8.1</span>&gt;
<span class="plain">&lt;</span><span class="identifier">quoted</span><span class="plain">-</span><span class="identifier">text</span><span class="plain">&gt; &lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="reserved">case</span><span class="plain">-</span><span class="identifier">circumstance</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; | ==&gt; </span><span class="identifier">TRUE</span><span class="plain">; </span>&lt;<span class="cwebmacro">Process the quoted test script</span> <span class="cwebmacronumber">8.1</span>&gt;
<span class="plain">... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_TestBadRequirements problem</span> <span class="cwebmacronumber">8.4</span>&gt;
<span class="plain">&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="reserved">case</span><span class="plain">-</span><span class="identifier">circumstance</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; ::=</span>
<span class="plain">... | ==&gt; 0; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">preform_lookahead_mode</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="reserved">case</span><span class="plain">-</span><span class="identifier">circumstance</span><span class="plain">-</span><span class="identifier">list</span><span class="plain">&gt; &lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="reserved">case</span><span class="plain">-</span><span class="identifier">circumstance</span><span class="plain">&gt; | ==&gt; 0</span>
<span class="plain">&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="reserved">case</span><span class="plain">-</span><span class="identifier">circumstance</span><span class="plain">&gt; ==&gt; 0</span>
<span class="plain">&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="reserved">case</span><span class="plain">-</span><span class="identifier">circumstance</span><span class="plain">&gt; ::=</span>
<span class="identifier">in</span><span class="plain"> &lt;</span><span class="reserved">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Process the in-test requirement</span> <span class="cwebmacronumber">8.2</span>&gt;
<span class="identifier">holding</span><span class="plain">/</span><span class="identifier">and</span><span class="plain">/, &lt;</span><span class="reserved">instance</span><span class="plain">-</span><span class="identifier">of</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt; | ==&gt; </span>&lt;<span class="cwebmacro">Process the holding requirement</span> <span class="cwebmacronumber">8.3</span>&gt;
<span class="identifier">in</span><span class="plain"> ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_TestBadRequirements problem</span> <span class="cwebmacronumber">8.4</span>&gt;
<span class="identifier">holding</span><span class="plain">/</span><span class="identifier">and</span><span class="plain">/, ... | ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_TestBadRequirements problem</span> <span class="cwebmacronumber">8.4</span>&gt;
<span class="identifier">with</span><span class="plain"> ... ==&gt; </span>&lt;<span class="cwebmacro">Issue PM_TestDoubleWith problem</span> <span class="cwebmacronumber">8.5</span>&gt;
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Process the quoted test script</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">x1</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">[1];</span>
<span class="identifier">Word::dequote</span><span class="plain">(</span><span class="identifier">x1</span><span class="plain">);</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">Lexer::word_text</span><span class="plain">(</span><span class="identifier">x1</span><span class="plain">++);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">individual_command</span><span class="plain">);</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;text_of_script</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Characters::tolower</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">l</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">individual_command</span><span class="plain">) == 0) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">l</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+1; </span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">l</span><span class="plain">]; </span><span class="identifier">l</span><span class="plain">++) </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">l</span><span class="plain">] != </span><span class="character">' '</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">l</span><span class="plain">] == </span><span class="character">'/'</span><span class="plain">) || (</span><span class="identifier">p</span><span class="plain">[</span><span class="identifier">l</span><span class="plain">] == 0)) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'/'</span><span class="plain">) {</span>
<span class="functiontext">PL::Parsing::TestScripts::check_test_command</span><span class="plain">(</span><span class="identifier">individual_command</span><span class="plain">);</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">individual_command</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">individual_command</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;text_of_script</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">individual_command</span><span class="plain">) &gt; 0)</span>
<span class="functiontext">PL::Parsing::TestScripts::check_test_command</span><span class="plain">(</span><span class="identifier">individual_command</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;text_of_script</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;text_of_script</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-1) == </span><span class="character">'/'</span><span class="plain">)</span>
<span class="identifier">Str::put_at</span><span class="plain">(</span><span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;text_of_script</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-1, </span><span class="character">' '</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">individual_command</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a> (twice).</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Process the in-test requirement</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;place</span><span class="plain"> = </span><span class="identifier">RP</span><span class="plain">[1];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_3"></a><b>&#167;8.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Process the holding requirement</span> <span class="cwebmacronumber">8.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;no_possessions</span><span class="plain"> &gt;= </span><span class="constant">MAX_POSSESSIONS_PER_SCENARIO</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Issue PM_TestBadRequirements problem</span> <span class="cwebmacronumber">8.4</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span>
<span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;possessions</span><span class="plain">[</span><span class="identifier">ts_being_parsed</span><span class="plain">-</span><span class="element">&gt;no_possessions</span><span class="plain">++] = </span><span class="identifier">RP</span><span class="plain">[1];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_4"></a><b>&#167;8.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_TestBadRequirements problem</span> <span class="cwebmacronumber">8.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TestBadRequirements</span><span class="plain">),</span>
<span class="string">"I didn't recognise the requirements for this test scenario"</span><span class="plain">,</span>
<span class="string">"which should be 'test ... with ... in ...' or '... "</span>
<span class="string">"holding ...'"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a> (three times), <a href="#SP8_3">&#167;8.3</a>.</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_TestQuoted problem</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TestQuoted</span><span class="plain">),</span>
<span class="string">"test scenarios must have unquoted names"</span><span class="plain">,</span>
<span class="string">"so 'test garden with ...' is allowed but not 'test \</span><span class="plain">"</span><span class="string">garden\</span><span class="plain">"</span><span class="string"> with...'"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_TestMultiWord problem</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TestMultiWord</span><span class="plain">),</span>
<span class="string">"test scenarios must have single-word names"</span><span class="plain">,</span>
<span class="string">"so 'test garden with ...' is allowed but not 'test garden gate with...'"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_3"></a><b>&#167;5.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_UnknownInternalTest problem</span> <span class="cwebmacronumber">5.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">*</span><span class="identifier">X</span><span class="plain"> = </span><span class="constant">NO_INTT</span><span class="plain">;</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_UnknownInternalTest</span><span class="plain">),</span>
<span class="string">"that's an internal test case which I don't know"</span><span class="plain">,</span>
<span class="string">"so I am taking no action."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP8_5"></a><b>&#167;8.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Issue PM_TestDoubleWith problem</span> <span class="cwebmacronumber">8.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TestDoubleWith</span><span class="plain">),</span>
<span class="string">"the second 'with' should be 'holding'"</span><span class="plain">,</span>
<span class="string">"as in 'test frogs with \</span><span class="plain">"</span><span class="string">get frogs\</span><span class="plain">"</span><span class="string"> holding net' rather than "</span>
<span class="string">"'test frogs with \</span><span class="plain">"</span><span class="string">get frogs\</span><span class="plain">"</span><span class="string"> with net'."</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::test_with_SMF</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">task</span><span class="plain">, </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> *</span><span class="identifier">NPs</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[1]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">O2W</span><span class="plain"> = (</span><span class="identifier">NPs</span><span class="plain">)?(</span><span class="identifier">NPs</span><span class="plain">[2]):</span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">task</span><span class="plain">) { </span> <span class="comment">"Test me with..."</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ACCEPT_SMFT</span><span class="plain">:</span>
<span class="identifier">ParseTree::annotate_int</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="constant">verb_id_ANNOT</span><span class="plain">, </span><span class="constant">SPECIAL_MEANING_VB</span><span class="plain">);</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">&gt;(</span><span class="identifier">O2W</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">&lt;</span><span class="identifier">nounphrase</span><span class="plain">&gt;(</span><span class="identifier">OW</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TRAVERSE2_SMFT</span><span class="plain">:</span>
<span class="functiontext">PL::Parsing::TestScripts::new_test_text</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::new_test_text</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">PN</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">))) {</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NO_INTT</span><span class="plain">: </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXTERNAL_INTT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Create a test script</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="functiontext">PL::Parsing::TestScripts::new_internal</span><span class="plain">(&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Parsing::TestScripts::test_with_SMF is used in 6/nv (<a href="6-nv.html#SP16">&#167;16</a>), 7/ns (<a href="7-ns.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::new_test_text appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create a test script</span> <span class="cwebmacronumber">9.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">XW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">subject</span><span class="plain">&gt;, 1);</span>
<span class="reserved">test_scenario</span><span class="plain"> *</span><span class="identifier">test</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">, </span><span class="reserved">test_scenario</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">XW</span><span class="plain">, </span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) {</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(1, </span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;sentence_test_declared_at</span><span class="plain">);</span>
<span class="identifier">Problems::quote_source</span><span class="plain">(2, </span><span class="identifier">current_sentence</span><span class="plain">);</span>
<span class="identifier">Problems::Issue::handmade_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TestDuplicate</span><span class="plain">));</span>
<span class="identifier">Problems::issue_problem_segment</span><span class="plain">(</span>
<span class="string">"Two test scripts have been set up with the same name: "</span>
<span class="string">"%1 and %2."</span><span class="plain">);</span>
<span class="identifier">Problems::issue_problem_end</span><span class="plain">();</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">test</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">test_scenario</span><span class="plain">);</span>
<span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain"> = </span><span class="identifier">XW</span><span class="plain">;</span>
<span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;sentence_test_declared_at</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;place</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;no_possessions</span><span class="plain"> = 0;</span>
<span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;text_of_script</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">package_request</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Hierarchy::local_package</span><span class="plain">(</span><span class="constant">TESTS_HAP</span><span class="plain">);</span>
<span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;text_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">SCRIPT_HL</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;req_iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_in</span><span class="plain">(</span><span class="constant">REQUIREMENTS_HL</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">ts_being_parsed</span><span class="plain"> = </span><span class="identifier">test</span><span class="plain">;</span>
<span class="plain">&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">-</span><span class="identifier">object</span><span class="plain">&gt;(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">));</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::check_test_command</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"undo"</span><span class="plain">)) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TestContainsUndo</span><span class="plain">),</span>
<span class="string">"this test script contains an UNDO command"</span><span class="plain">,</span>
<span class="string">"which the story file has no way to automate the running of. "</span>
<span class="string">"(An UNDO is such a complete reversion to the previous state "</span>
<span class="string">"that it would necessarily lose where it had got to in the "</span>
<span class="string">"script, and might even go round in circles indefinitely.)"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">) &gt; </span><span class="constant">MAX_LENGTH_OF_COMMAND</span><span class="plain">) {</span>
<span class="identifier">Problems::Issue::sentence_problem</span><span class="plain">(</span><span class="identifier">_p_</span><span class="plain">(</span><span class="identifier">PM_TestCommandTooLong</span><span class="plain">),</span>
<span class="string">"this test script contains a command which is too long"</span><span class="plain">,</span>
<span class="string">"and cannot be fed into Inform for automatic testing. "</span>
<span class="string">"(The format for a test script is a sequence of commands, "</span>
<span class="string">"divided up by slashes '/': maybe you forgot these divisions?)"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::write_text</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">test_scenario</span><span class="plain"> *</span><span class="identifier">test</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">, </span><span class="reserved">test_scenario</span><span class="plain">) {</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Emit::named_byte_array_begin</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;text_iname</span><span class="plain">, </span><span class="identifier">K_text</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tttext</span><span class="plain">);</span>
<span class="functiontext">CompiledText::from_stream</span><span class="plain">(</span><span class="identifier">tttext</span><span class="plain">, </span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;text_of_script</span><span class="plain">,</span>
<span class="constant">CT_EXPAND_APOSTROPHES</span><span class="plain"> + </span><span class="constant">CT_RECOGNISE_APOSTROPHE_SUBSTITUTION</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tttext</span><span class="plain">, </span><span class="string">"||||"</span><span class="plain">);</span>
<span class="functiontext">Emit::array_text_entry</span><span class="plain">(</span><span class="identifier">tttext</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">tttext</span><span class="plain">);</span>
<span class="functiontext">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Emit::named_array_begin</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;req_iname</span><span class="plain">, </span><span class="identifier">K_value</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;place</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="functiontext">Instances::iname</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;place</span><span class="plain">));</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;no_possessions</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;possessions</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Emit::array_iname_entry</span><span class="plain">(</span><span class="functiontext">Instances::iname</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;possessions</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">]));</span>
<span class="plain">}</span>
<span class="functiontext">Emit::array_numeric_entry</span><span class="plain">(0);</span>
<span class="functiontext">Emit::array_end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::TestScriptSub_stub_routine</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TESTSCRIPTSUB_HL</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">Produce::rfalse</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::TestScriptSub_routine</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TESTSCRIPTSUB_HL</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">test_scenario</span><span class="plain">) == 0) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"&gt;--&gt; No test scripts exist for this game.\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">SWITCH_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_object</span><span class="plain">, </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">SPECIAL_WORD_HL</span><span class="plain">));</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="reserved">test_scenario</span><span class="plain"> *</span><span class="identifier">test</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">, </span><span class="reserved">test_scenario</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">CASE_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="string">"%w"</span><span class="plain">, </span><span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)));</span>
<span class="identifier">Produce::val_dword</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TESTSTART_HL</span><span class="plain">));</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;text_iname</span><span class="plain">);</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;req_iname</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">l</span><span class="plain"> = 0;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;text_of_script</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0, </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++, </span><span class="identifier">l</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::includes_wide_string_at</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"[']"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">))</span>
<span class="identifier">l</span><span class="plain"> -= 2;</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">l</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">DEFAULT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::code</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"&gt;--&gt; The following tests are available:\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">, </span><span class="reserved">test_scenario</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"'test %w'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">Lexer::word_raw_text</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">test</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)));</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Parsing::TestScripts::check_test_command is used in <a href="#SP8_1">&#167;8.1</a>.</p>
<p class="endnote">The function PL::Parsing::TestScripts::write_text is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::TestScriptSub_stub_routine is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::TestScriptSub_routine is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::new_internal</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">code</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">) {</span>
<span class="reserved">internal_test_case</span><span class="plain"> *</span><span class="identifier">itc</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">internal_test_case</span><span class="plain">);</span>
<span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;itc_code</span><span class="plain"> = </span><span class="identifier">code</span><span class="plain">;</span>
<span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;itc_defined_at</span><span class="plain"> = </span><span class="identifier">current_sentence</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">itc_save_DL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">itc_save_OUT</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::InternalTestCases_routine</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">INTERNALTESTCASES_HL</span><span class="plain">);</span>
<span class="identifier">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">internal_test_case</span><span class="plain"> *</span><span class="identifier">itc</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">itc</span><span class="plain">, </span><span class="reserved">internal_test_case</span><span class="plain">) {</span>
<span class="identifier">n</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;itc_code</span><span class="plain"> == </span><span class="constant">HEADLINE_INTT</span><span class="plain">) {</span>
<span class="identifier">n</span><span class="plain"> = 0;</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STYLEBOLD_BIP</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"\</span><span class="plain">n</span><span class="string">%+W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">STYLEROMAN_BIP</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="string">"%d. %+W\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">, </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">itc_save_OUT</span><span class="plain"> = </span><span class="identifier">OUT</span><span class="plain">;</span>
<span class="identifier">current_sentence</span><span class="plain"> = </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;itc_defined_at</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;itc_code</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SENTENCE_INTT</span><span class="plain">: {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">SV_not_SN</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Perform an internal test of the sentence converter</span> <span class="cwebmacronumber">11.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DESCRIPTION_INTT</span><span class="plain">: {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">SV_not_SN</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Perform an internal test of the sentence converter</span> <span class="cwebmacronumber">11.1</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EVALUATION_INTT</span><span class="plain">: {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">value</span><span class="plain">&gt;(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">)) </span><span class="identifier">spec</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">spec</span><span class="plain"> = </span><span class="functiontext">Specifications::new_UNKNOWN</span><span class="plain">(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">);</span>
<span class="functiontext">Dash::check_value</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Kind of value: "</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">;</span>
<span class="identifier">Kinds::Textual::log</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Behaviour::is_quasinumerical</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">))</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">" scaled at k=%d"</span><span class="plain">, </span><span class="identifier">Kinds::Behaviour::scale_factor</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">Prints as: "</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">INDIRECT1V_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">Kinds::Behaviour::get_iname</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
<span class="functiontext">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Str::clear</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DIMENSIONS_INTT</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">;</span>
<span class="identifier">Kinds::Dimensions::log_unit_analysis</span><span class="plain">();</span>
&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EQUATION_INTT</span><span class="plain">:</span>
<span class="functiontext">Equations::internal_test</span><span class="plain">(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">VERB_INTT</span><span class="plain">:</span>
<span class="identifier">Conjugation::test</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">, </span><span class="identifier">language_of_play</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ADJECTIVE_INTT</span><span class="plain">:</span>
<span class="identifier">Adjectives::test_adjective</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ING_INTT</span><span class="plain">:</span>
<span class="identifier">Conjugation::test_participle</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">KIND_INTT</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">;</span>
<span class="identifier">Kinds::Compare::log_poset</span><span class="plain">(</span>
<span class="identifier">Vocabulary::get_literal_number_value</span><span class="plain">(</span>
<span class="identifier">Lexer::word</span><span class="plain">(</span>
<span class="identifier">Wordings::first_wn</span><span class="plain">(</span>
<span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">))));</span>
&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MAP_INTT</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">;</span>
<span class="identifier">PL::SpatialMap::log_spatial_layout</span><span class="plain">();</span>
&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DASH_INTT</span><span class="plain">:</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">;</span>
<span class="functiontext">Dash::experiment</span><span class="plain">(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DASHLOG_INTT</span><span class="plain">:</span>
<span class="functiontext">Dash::experiment</span><span class="plain">(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::begin_internal_reporting</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::end_internal_reporting</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Parsing::TestScripts::new_internal is used in <a href="#SP9">&#167;9</a>.</p>
<p class="endnote">The function PL::Parsing::TestScripts::InternalTestCases_routine is used in 1/mr (<a href="1-mr.html#SP4_14">&#167;4.14</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::begin_internal_reporting is used in 20/eq (<a href="20-eq.html#SP52">&#167;52</a>).</p>
<p class="endnote">The function PL::Parsing::TestScripts::end_internal_reporting is used in 20/eq (<a href="20-eq.html#SP52">&#167;52</a>).</p>
<p class="inwebparagraph"><a id="SP11_1"></a><b>&#167;11.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform an internal test of the sentence converter</span> <span class="cwebmacronumber">11.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tc</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SV_not_SN</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">&gt;(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">)) </span><span class="identifier">p</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">descriptive</span><span class="plain">-</span><span class="identifier">np</span><span class="plain">&gt;(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">)) </span><span class="identifier">p</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Specifications::to_proposition</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
<span class="identifier">tc</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::Checker::type_check</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::Checker::tc_no_problem_reporting</span><span class="plain">());</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">; </span><span class="identifier">Streams::enable_I6_escapes</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Failed: not a condition"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$D\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tc</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Failed: proposition would not type-check\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">Calculus::Propositions::Checker::type_check</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::Checker::tc_problem_logging</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="identifier">Streams::disable_I6_escapes</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">); </span>&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a> (twice), <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP11_2"></a><b>&#167;11.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">itc_save_DL</span><span class="plain"> = </span><span class="identifier">DL</span><span class="plain">; </span><span class="identifier">DL</span><span class="plain"> = </span><span class="identifier">itc_save_OUT</span><span class="plain">;</span>
<span class="identifier">Streams::enable_debugging</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">); </span> <span class="comment">Streams::enable_I6_escapes(DL);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a> (6 times), <a href="#SP11_1">&#167;11.1</a>, <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP11_3"></a><b>&#167;11.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Streams::disable_debugging</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">); </span> <span class="comment">Streams::disable_I6_escapes(DL);</span>
<span class="identifier">DL</span><span class="plain"> = </span><span class="identifier">itc_save_DL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP11">&#167;11</a> (6 times), <a href="#SP11_1">&#167;11.1</a>, <a href="#SP12">&#167;12</a>, <a href="#SP13">&#167;13</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::emit_showme</span><span class="plain">(</span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">spec</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">itc_save_OUT</span><span class="plain"> = </span><span class="identifier">OUT</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">PROPERTY_VALUE_NT</span><span class="plain">))</span>
<span class="identifier">spec</span><span class="plain"> = </span><span class="functiontext">Lvalues::underlying_property</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain"> = </span><span class="functiontext">Specifications::to_kind</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ParseTree::is</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">, </span><span class="constant">CONSTANT_NT</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">"</span><span class="string">%+W\</span><span class="plain">"</span><span class="string"> = "</span><span class="plain">, </span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">spec</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">;</span>
<span class="identifier">Kinds::Textual::log</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">": "</span><span class="plain">);</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_list_of</span><span class="plain">) {</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">LIST_OF_TY_SAY_HL</span><span class="plain">));</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">Produce::val</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">K_number</span><span class="plain">, </span><span class="identifier">LITERAL_IVAL</span><span class="plain">, 1);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="constant">BEGIN_COMPILATION_MODE</span><span class="plain">;</span>
<span class="identifier">COMPILATION_MODE_EXIT</span><span class="plain">(</span><span class="constant">DEREFERENCE_POINTERS_CMODE</span><span class="plain">);</span>
<span class="identifier">Produce::inv_call_iname</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">Kinds::Behaviour::get_iname</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="functiontext">Specifications::Compiler::emit_as_val</span><span class="plain">(</span><span class="identifier">K_value</span><span class="plain">, </span><span class="identifier">spec</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="constant">END_COMPILATION_MODE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">Produce::inv_primitive</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">PRINT_BIP</span><span class="plain">);</span>
<span class="identifier">Produce::down</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="identifier">Produce::val_text</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">I</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">Produce::up</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">());</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PL::Parsing::TestScripts::emit_showme is used in 25/cii (<a href="25-cii.html#SP3_5_9">&#167;3.5.9</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b><code class="display">
&lt;<span class="cwebmacro">Perform an internal test of the sentence converter</span> <span class="cwebmacronumber">11.1</span>&gt;<span class="plain"> =</span>
</code></p>
<pre class="displaydefn">
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">pcalc_prop</span><span class="plain"> *</span><span class="identifier">prop</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tc</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SV_not_SN</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">sentence</span><span class="plain">&gt;(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">)) </span><span class="identifier">p</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">s</span><span class="plain">-</span><span class="identifier">descriptive</span><span class="plain">-</span><span class="identifier">np</span><span class="plain">&gt;(</span><span class="identifier">itc</span><span class="plain">-</span><span class="element">&gt;text_supplying_the_case</span><span class="plain">)) </span><span class="identifier">p</span><span class="plain"> = &lt;&lt;</span><span class="identifier">rp</span><span class="plain">&gt;&gt;;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain">) {</span>
<span class="identifier">prop</span><span class="plain"> = </span><span class="functiontext">Specifications::to_proposition</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
<span class="identifier">tc</span><span class="plain"> = </span><span class="functiontext">Calculus::Propositions::Checker::type_check</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::Checker::tc_no_problem_reporting</span><span class="plain">());</span>
<span class="plain">}</span>
&lt;<span class="cwebmacro">Begin reporting on the internal test case</span> <span class="cwebmacronumber">11.2</span>&gt;<span class="plain">; </span><span class="identifier">Streams::enable_I6_escapes</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Failed: not a condition"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$D\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">prop</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tc</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Failed: proposition would not type-check\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">Calculus::Propositions::Checker::type_check</span><span class="plain">(</span><span class="identifier">prop</span><span class="plain">, </span><span class="functiontext">Calculus::Propositions::Checker::tc_problem_logging</span><span class="plain">());</span>
<span class="plain">}</span>
<span class="identifier">Streams::disable_I6_escapes</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">); </span>&lt;<span class="cwebmacro">End reporting on the internal test case</span> <span class="cwebmacronumber">11.3</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is .</p>
<hr class="tocbar">
<ul class="toc"><li><a href="26-pc.html">Back to 'Plugin Calls'</a></li><li><i>(This section ends Chapter 26: Compilation Utilities.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>